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

# Atualizar privacidade

> Atualiza configurações de privacidade (last seen, online, foto, status, leitura, chamadas, grupos)

**Auth:** `TokenAccount` ou `TokenInstance` • **Rate-limit:** `Global` (100/min) • **Idempotente:** sim (setar o mesmo valor e no-op)

## Descrição

Atualiza uma ou mais configurações de privacidade. Update **parcial**, apenas os campos enviados são alterados. Pelo menos uma das três subseções (`visibility`, `privacy`, `permissions`) precisa ser enviada. A resposta retorna as configurações **completas** após o update.

## Exemplos

### Tudo restritivo

Aplica um perfil de privacidade fechado em uma única chamada: esconde `lastSeen`, restringe status / foto a contatos, desliga read receipts e limita chamadas a contatos conhecidos. Cada subseção envia um campo, totalizando várias stanzas no WhatsApp.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://ryzeapi.cloud/api/profile/privacy/$Instance_Name" \
    -H "token: $Token_Instance" \
    -H "Content-Type: application/json" \
    -d '{
      "visibility": {
        "lastSeen": "none",
        "status": "contacts",
        "profile": "contacts",
        "online": "match_last_seen"
      },
      "privacy": {
        "readReceipts": "none"
      },
      "permissions": {
        "callAdd": "known",
        "groupAdd": "contacts"
      }
    }'
  ```

  ```javascript JavaScript theme={null}
  await fetch(`https://ryzeapi.cloud/api/profile/privacy/${process.env.Instance_Name}`, {
    method: "POST",
    headers: {
      "token":        process.env.Token_Instance,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      visibility: {
        lastSeen: "none",
        status:   "contacts",
        profile:  "contacts",
        online:   "match_last_seen"
      },
      privacy: {
        readReceipts: "none"
      },
      permissions: {
        callAdd:  "known",
        groupAdd: "contacts"
      }
    })
  });
  ```

  ```python Python theme={null}
  import os, requests

  requests.post(
      f"https://ryzeapi.cloud/api/profile/privacy/{os.environ['Instance_Name']}",
      headers={
          "token":        os.environ["Token_Instance"],
          "Content-Type": "application/json"
      },
      json={
          "visibility": {
              "lastSeen": "none",
              "status":   "contacts",
              "profile":  "contacts",
              "online":   "match_last_seen"
          },
          "privacy": {
              "readReceipts": "none"
          },
          "permissions": {
              "callAdd":  "known",
              "groupAdd": "contacts"
          }
      }
  )
  ```

  ```go Go theme={null}
  package main

  import (
      "net/http"
      "os"
      "strings"
  )

  func main() {
      body := strings.NewReader(`{
          "visibility": {
              "lastSeen": "none",
              "status":   "contacts",
              "profile":  "contacts",
              "online":   "match_last_seen"
          },
          "privacy": {
              "readReceipts": "none"
          },
          "permissions": {
              "callAdd":  "known",
              "groupAdd": "contacts"
          }
      }`)
      req, _ := http.NewRequest("POST", "https://ryzeapi.cloud/api/profile/privacy/"+os.Getenv("Instance_Name"), body)
      req.Header.Set("token", os.Getenv("Token_Instance"))
      req.Header.Set("Content-Type", "application/json")
      http.DefaultClient.Do(req)
  }
  ```
</CodeGroup>

### Só groupAdd

Atualiza somente `permissions.groupAdd` para `contacts`, impedindo que desconhecidos adicionem a conta a grupos. As demais configurações ficam inalteradas.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://ryzeapi.cloud/api/profile/privacy/$Instance_Name" \
    -H "token: $Token_Instance" \
    -H "Content-Type: application/json" \
    -d '{
      "permissions": { "groupAdd": "contacts" }
    }'
  ```

  ```javascript JavaScript theme={null}
  await fetch(`https://ryzeapi.cloud/api/profile/privacy/${process.env.Instance_Name}`, {
    method: "POST",
    headers: {
      "token":        process.env.Token_Instance,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      permissions: { groupAdd: "contacts" }
    })
  });
  ```

  ```python Python theme={null}
  import os, requests

  requests.post(
      f"https://ryzeapi.cloud/api/profile/privacy/{os.environ['Instance_Name']}",
      headers={
          "token":        os.environ["Token_Instance"],
          "Content-Type": "application/json"
      },
      json={
          "permissions": {"groupAdd": "contacts"}
      }
  )
  ```

  ```go Go theme={null}
  package main

  import (
      "net/http"
      "os"
      "strings"
  )

  func main() {
      body := strings.NewReader(`{
          "permissions": { "groupAdd": "contacts" }
      }`)
      req, _ := http.NewRequest("POST", "https://ryzeapi.cloud/api/profile/privacy/"+os.Getenv("Instance_Name"), body)
      req.Header.Set("token", os.Getenv("Token_Instance"))
      req.Header.Set("Content-Type", "application/json")
      http.DefaultClient.Do(req)
  }
  ```
</CodeGroup>

### Desligar read receipts

Define `privacy.readReceipts` como `none` para parar de enviar o "duplo check azul". A conta deixa de confirmar leitura, e também deixa de ver a confirmação dos outros (efeito recíproco do WhatsApp).

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://ryzeapi.cloud/api/profile/privacy/$Instance_Name" \
    -H "token: $Token_Instance" \
    -H "Content-Type: application/json" \
    -d '{
      "privacy": { "readReceipts": "none" }
    }'
  ```

  ```javascript JavaScript theme={null}
  await fetch(`https://ryzeapi.cloud/api/profile/privacy/${process.env.Instance_Name}`, {
    method: "POST",
    headers: {
      "token":        process.env.Token_Instance,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      privacy: { readReceipts: "none" }
    })
  });
  ```

  ```python Python theme={null}
  import os, requests

  requests.post(
      f"https://ryzeapi.cloud/api/profile/privacy/{os.environ['Instance_Name']}",
      headers={
          "token":        os.environ["Token_Instance"],
          "Content-Type": "application/json"
      },
      json={
          "privacy": {"readReceipts": "none"}
      }
  )
  ```

  ```go Go theme={null}
  package main

  import (
      "net/http"
      "os"
      "strings"
  )

  func main() {
      body := strings.NewReader(`{
          "privacy": { "readReceipts": "none" }
      }`)
      req, _ := http.NewRequest("POST", "https://ryzeapi.cloud/api/profile/privacy/"+os.Getenv("Instance_Name"), body)
      req.Header.Set("token", os.Getenv("Token_Instance"))
      req.Header.Set("Content-Type", "application/json")
      http.DefaultClient.Do(req)
  }
  ```
</CodeGroup>

### Apenas lastSeen e online

Esconde o `lastSeen` e amarra o `online` ao mesmo nível (`match_last_seen`). Resultado: ninguém vê quando a conta esteve online pela última vez nem se ela está ativa agora.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://ryzeapi.cloud/api/profile/privacy/$Instance_Name" \
    -H "token: $Token_Instance" \
    -H "Content-Type: application/json" \
    -d '{
      "visibility": {
        "lastSeen": "none",
        "online": "match_last_seen"
      }
    }'
  ```

  ```javascript JavaScript theme={null}
  await fetch(`https://ryzeapi.cloud/api/profile/privacy/${process.env.Instance_Name}`, {
    method: "POST",
    headers: {
      "token":        process.env.Token_Instance,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      visibility: {
        lastSeen: "none",
        online:   "match_last_seen"
      }
    })
  });
  ```

  ```python Python theme={null}
  import os, requests

  requests.post(
      f"https://ryzeapi.cloud/api/profile/privacy/{os.environ['Instance_Name']}",
      headers={
          "token":        os.environ["Token_Instance"],
          "Content-Type": "application/json"
      },
      json={
          "visibility": {
              "lastSeen": "none",
              "online":   "match_last_seen"
          }
      }
  )
  ```

  ```go Go theme={null}
  package main

  import (
      "net/http"
      "os"
      "strings"
  )

  func main() {
      body := strings.NewReader(`{
          "visibility": {
              "lastSeen": "none",
              "online":   "match_last_seen"
          }
      }`)
      req, _ := http.NewRequest("POST", "https://ryzeapi.cloud/api/profile/privacy/"+os.Getenv("Instance_Name"), body)
      req.Header.Set("token", os.Getenv("Token_Instance"))
      req.Header.Set("Content-Type", "application/json")
      http.DefaultClient.Do(req)
  }
  ```
</CodeGroup>

## Resposta de sucesso

Após aplicar os updates, o handler refaz um `GetPrivacySettings` e devolve o snapshot **completo** atual em `settings`, agrupado em `visibility` (`lastSeen`, `status`, `profile`, `online`), `privacy` (`readReceipts`) e `permissions` (`callAdd`, `groupAdd`). Use o response como fonte da verdade do estado pós-update, é o que o WhatsApp confirmou, não apenas o que você enviou.

```json 200 OK theme={null}
{
  "success": true,
  "message": "Privacy settings updated successfully",
  "settings": {
    "visibility": {
      "lastSeen": "none",
      "status": "contacts",
      "profile": "contacts",
      "online": "match_last_seen"
    },
    "privacy": {
      "readReceipts": "none"
    },
    "permissions": {
      "callAdd": "known",
      "groupAdd": "contacts"
    }
  }
}
```

## Parâmetros de rota

<ParamField path="instance" type="string" required>
  Nome da instância.
</ParamField>

## Headers

<ParamField header="token" type="string" required>
  `TokenAccount` ou `TokenInstance`.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  `application/json`
</ParamField>

## Request body

Cada subseção é opcional, mas pelo menos uma deve estar presente.

<ParamField body="visibility" type="object">
  Subcampos: `lastSeen`, `status`, `profile`, `online`.
</ParamField>

<ParamField body="privacy" type="object">
  Subcampos: `readReceipts`.
</ParamField>

<ParamField body="permissions" type="object">
  Subcampos: `callAdd`, `groupAdd`.
</ParamField>

### Valores aceitos por campo

| Campo                             | Valores                                           |
| --------------------------------- | ------------------------------------------------- |
| `lastSeen` / `status` / `profile` | `all` / `contacts` / `contact_blacklist` / `none` |
| `online`                          | `all` / `match_last_seen`                         |
| `readReceipts`                    | `all` / `none`                                    |
| `callAdd`                         | `all` / `known`                                   |
| `groupAdd`                        | `all` / `contacts` / `contact_blacklist`          |

## Notas

<Warning>
  **Validação para antes do primeiro erro.** Se você envia `visibility.lastSeen = "X"` (inválido) + `visibility.status = "contacts"` (válido), **nada** é aplicado, o handler aborta no primeiro campo inválido. Valide enums no cliente antes de chamar.
</Warning>

<Note>
  * Operações não são **transacionais**: se o terceiro `SetPrivacySetting` falhar, os dois primeiros **já foram aplicados**, o cliente recebe `500` mas o estado parcial persiste. Verifique via `GET` após erros.
  * Cada campo dispara uma stanza separada, um update com 7 campos faz 7 chamadas + 1 `GetPrivacySettings` final = **8 stanzas**. Pode somar latência.
  * O response sempre traz as configurações **completas** atuais (não só os campos alterados).
</Note>

## Erros

| HTTP | Mensagem                                                                                |
| ---- | --------------------------------------------------------------------------------------- |
| 400  | `At least one privacy setting must be provided`                                         |
| 400  | `Invalid lastSeen value: <value>. Valid values: all, contacts, contact_blacklist, none` |
| 400  | `Invalid status value: <value>. Valid values: all, contacts, contact_blacklist, none`   |
| 400  | `Invalid profile value: <value>. Valid values: all, contacts, contact_blacklist, none`  |
| 400  | `Invalid online value: <value>. Valid values: all, match_last_seen`                     |
| 400  | `Invalid readReceipts value: <value>. Valid values: all, none`                          |
| 400  | `Invalid callAdd value: <value>. Valid values: all, known`                              |
| 400  | `Invalid groupAdd value: <value>. Valid values: all, contacts, contact_blacklist`       |
| 400  | `Instance is not connected to WhatsApp`                                                 |
| 500  | `failed to update <field> privacy: <reason>`                                            |

Envelope:

```json theme={null}
{
  "success": false,
  "error": { "message": "Invalid lastSeen value: everyone. Valid values: all, contacts, contact_blacklist, none" }
}
```
