> ## Documentation Index
> Fetch the complete documentation index at: https://zapo.to/llms.txt
> Use this file to discover all available pages before exploring further.

# Perfil, privacidade e business

> Gerencie seu perfil do WhatsApp, mude configurações de privacidade, edite a lista de bloqueio e leia perfis business e horários pelo zapo.

<h2 id="profile">
  Perfil
</h2>

O `client.profile` ([`WaProfileCoordinator`](/pt-br/reference/client#profile)) lê e grava campos de perfil da sua conta e os consulta para terceiros.

<h3 id="profile-picture">
  Foto de perfil
</h3>

```ts theme={null}
import { readFile } from 'node:fs/promises'

// Ler a foto de alguém (ou a sua) — default é o preview de baixa resolução
const pic = await client.profile.getProfilePicture(jid)

// Original em alta resolução (o avatar full-size que o usuário subiu)
const fullPic = await client.profile.getProfilePicture(jid, 'image')

// Definir a sua
await client.profile.setProfilePicture(await readFile('./avatar.jpg'))

// Removê-la
await client.profile.deleteProfilePicture()
```

`getProfilePicture(jid, type?, existingId?)` retorna um `WaProfilePictureResult` — `{ url?, directPath?, id?, type? }`. O segundo argumento escolhe entre a variante compacta **`'preview'`** (default) e o original em alta resolução **`'image'`**; ambos vêm no mesmo envelope, só os bytes por trás de `url` / `directPath` diferem. Passe o `existingId` cacheado para o servidor fazer short-circuit quando a foto não mudou (o resultado então volta sem o novo `url`/`directPath`).

<h3 id="about--status-text">
  Recado / texto de status
</h3>

```ts theme={null}
const about = await client.profile.getStatus(jid)
await client.profile.setStatus('Available')
```

<h3 id="push-name">
  Push name
</h3>

O `pushName` é o nome de exibição que os contatos veem para a sua conta em chats e listas de participantes de grupo. A mudança é aplicada às credenciais **locais** imediatamente (então `client.getCredentials()?.pushName` já reflete o novo valor) e é roteada por uma mutação de app-state; os contatos veem o novo nome na sua próxima mensagem enviada.

```ts theme={null}
await client.profile.setPushName('Alice')
```

Passar string vazia restaura o nome para o padrão de fingerprint do dispositivo.

<h3 id="default-disappearing-mode">
  Modo temporário padrão
</h3>

O `setDisappearingMode` define a duração padrão de modo temporário aplicada a **novos** chats 1:1 iniciados por você. Chats existentes mantêm a configuração por chat.

```ts theme={null}
// 0 desliga, 86400 = 24h, 604800 = 7d, 7776000 = 90d
await client.profile.setDisappearingMode(604_800)

// Desligar
await client.profile.setDisappearingMode(0)
```

Para mensagens temporárias por grupo, veja [Grupos → mensagens temporárias](/pt-br/guides/groups#disappearing-messages).

<h3 id="batched-lookups">
  Consultas em lote
</h3>

```ts theme={null}
const profiles = await client.profile.getProfiles([jidA, jidB])
const usernames = await client.profile.getUsernames([jidA, jidB])
const modes = await client.profile.getDisappearingMode([jidA, jidB])
```

<h3 id="check-if-a-number-is-on-whatsapp">
  Checar se um número está no WhatsApp
</h3>

Resolva números de telefone para o [LID](/pt-br/concepts/identities) e descubra se cada um está registrado no WhatsApp:

```ts theme={null}
const results = await client.profile.getLidsByPhoneNumbers(['+55 11 99999-9999'])
// → [{ phoneJid: '5511999999999@s.whatsapp.net', lidJid: '…@lid', exists: true }]

for (const r of results) {
  if (r.exists) console.log(r.phoneJid, 'está no WhatsApp →', r.lidJid)
}
```

<h3 id="usernames">
  Nomes de usuário
</h3>

```ts theme={null}
const mine = await client.profile.getOwnUsername()
const available = await client.profile.checkUsernameAvailability('myhandle')

await client.profile.setUsername({ username: 'myhandle' })
await client.profile.deleteUsername()
```

<h2 id="privacy">
  Privacidade
</h2>

O `client.privacy` ([`WaPrivacyCoordinator`](/pt-br/reference/client#privacy)) controla as categorias de privacidade e a lista de bloqueios.

<h3 id="privacy-settings">
  Configurações de privacidade
</h3>

```ts theme={null}
const settings = await client.privacy.getPrivacySettings()

// Atualizar uma única configuração
await client.privacy.setPrivacySetting('last', 'contacts')
```

Os nomes e valores das configurações vêm das constantes `WA_PRIVACY_*` (`last`, `online`, `profile`, `status`, `readreceipts`, `groupadd`, …). Veja a [referência de JID e constantes](/pt-br/reference/jid-helpers#constants).

<h3 id="blocklist">
  Lista de bloqueios
</h3>

```ts theme={null}
const { jids } = await client.privacy.getBlocklist()

await client.privacy.blockUser(jid)
await client.privacy.unblockUser(jid)
```

<h3 id="disallowed-lists">
  Listas de exceção
</h3>

Para configurações escopadas a uma lista específica de contatos (por exemplo, "compartilhar com todos, exceto…"):

```ts theme={null}
const result = await client.privacy.getDisallowedList(category)
```

<h2 id="business">
  Business
</h2>

O `client.business` ([`WaBusinessCoordinator`](/pt-br/reference/client#business)) lê perfis business e nomes verificados, e gerencia o seu próprio perfil business.

<Badge color="purple" icon="briefcase">Conta business</Badge> — necessária para **editar** seu próprio perfil ou foto de capa; os métodos de leitura funcionam para qualquer conta.

```ts theme={null}
// Ler perfis business (em lote)
const profiles = await client.business.getBusinessProfile([jidA, jidB])

// Consultas de nome verificado
const name = await client.business.getVerifiedName(jid)
const names = await client.business.getVerifiedNames([jidA, jidB])

// Editar seu próprio perfil business
await client.business.editBusinessProfile({ /* WaEditBusinessProfileInput */ })

// Foto de capa
await client.business.updateCoverPhoto(mediaSource)
await client.business.deleteCoverPhoto(coverId)
```

<h3 id="typed-business-hours">
  Business hours tipados
</h3>

`WaBusinessHoursDay` e `WaBusinessHoursMode` são aliases de union (`'sun' | 'mon' | …`, `'open_24h' | 'specific_hours' | 'appointment_only'`). Os valores também estão congelados em `WA_BUSINESS_HOURS_DAYS` e `WA_BUSINESS_HOURS_MODES`. Passar um `mode` desconhecido para `editBusinessProfile` agora lança um erro local claro em vez de o servidor responder `406 not-acceptable` — dias fechados continuam sendo expressos **omitindo-os** da `config`, não por um mode dedicado.

```ts theme={null}
import { WA_BUSINESS_HOURS_DAYS, WA_BUSINESS_HOURS_MODES } from 'zapo-js'

await client.business.editBusinessProfile({
  businessHours: {
    timezone: 'America/Sao_Paulo',
    config: [
      {
        dayOfWeek: WA_BUSINESS_HOURS_DAYS.MON,
        mode: WA_BUSINESS_HOURS_MODES.SPECIFIC_HOURS,
        openTime: 540,  // minutos desde meia-noite; 540 = 09:00
        closeTime: 1080 // 18:00
      },
      { dayOfWeek: WA_BUSINESS_HOURS_DAYS.SAT, mode: WA_BUSINESS_HOURS_MODES.OPEN_24H }
      // dom é fechado — omitir
    ]
  }
})
```

<h2 id="chat-settings">
  Configurações de chat
</h2>

As configurações por chat — silenciar, fixar, arquivar, lido, lock, favoritar, limpar, excluir — ficam em `client.chat` e sincronizam entre seus dispositivos. Elas têm um guia próprio:

<Card title="Gerenciando chats" icon="comments" href="/pt-br/guides/chats" arrow>
  Silencie, fixe, arquive, marque como lido, trave, favorite mensagens, limpe e exclua chats.
</Card>
