> ## 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.

# Actualizar privacidad

> Actualiza la configuración de privacidad (visto por última vez, en línea, foto, estado, confirmaciones de lectura, llamadas, grupos)

**Auth:** `TokenAccount` o `TokenInstance` • **Rate limit:** `Global` (100/min) • **Idempotente:** sí (establecer el mismo valor no produce efecto)

## Descripción

Actualiza una o más configuraciones de privacidad. Actualización **parcial**, solo se cambian los campos que envías. Al menos una de las tres subsecciones (`visibility`, `privacy`, `permissions`) debe enviarse. La respuesta devuelve la configuración **completa** después de la actualización.

## Ejemplos

### Totalmente restrictivo

Aplica un perfil de privacidad cerrado en una sola llamada: oculta `lastSeen`, restringe estado / foto a contactos, desactiva las confirmaciones de lectura y limita las llamadas a contactos conocidos. Cada subsección envía un campo, totalizando varias stanzas en 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>

### Solo groupAdd

Actualiza solo `permissions.groupAdd` a `contacts`, impidiendo que desconocidos agreguen la cuenta a grupos. Las demás configuraciones permanecen sin cambios.

<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>

### Desactivar confirmaciones de lectura

Establece `privacy.readReceipts` en `none` para dejar de enviar el "doble check azul". La cuenta deja de confirmar lecturas, y también deja de ver las confirmaciones de los demás (efecto recíproco de 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>

### Solo lastSeen y online

Oculta `lastSeen` y enlaza `online` al mismo nivel (`match_last_seen`). Resultado: nadie ve cuándo la cuenta estuvo en línea por última vez, ni si está activa en este momento.

<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>

## Respuesta exitosa

Después de aplicar las actualizaciones, el handler vuelve a ejecutar `GetPrivacySettings` y devuelve el snapshot **completo** actual en `settings`, agrupado en `visibility` (`lastSeen`, `status`, `profile`, `online`), `privacy` (`readReceipts`) y `permissions` (`callAdd`, `groupAdd`). Usa la respuesta como fuente de verdad del estado posterior a la actualización, es lo que WhatsApp confirmó, no solo lo que enviaste.

```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 ruta

<ParamField path="instance" type="string" required>
  Nombre de la instancia.
</ParamField>

## Cabeceras

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

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

## Cuerpo de la solicitud

Cada subsección es opcional, pero al menos una debe 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 aceptados 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>
  **La validación se detiene en el primer error.** Si envías `visibility.lastSeen = "X"` (inválido) + `visibility.status = "contacts"` (válido), **nada** se aplica, el handler aborta en el primer campo inválido. Valida los enums en el cliente antes de llamar.
</Warning>

<Note>
  * Las operaciones no son **transaccionales**: si el tercer `SetPrivacySetting` falla, las dos primeras **ya fueron aplicadas**, el cliente recibe un `500` pero el estado parcial persiste. Verifica vía `GET` después de errores.
  * Cada campo dispara una stanza separada, una actualización con 7 campos hace 7 llamadas + 1 `GetPrivacySettings` final = **8 stanzas**. La latencia puede acumularse.
  * La respuesta siempre devuelve la configuración **completa** actual (no solo los campos cambiados).
</Note>

## Errores

| HTTP | Mensaje                                                                                 |
| ---- | --------------------------------------------------------------------------------------- |
| 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>`                                            |

Envoltorio:

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