{
  "openapi": "3.0.3",
  "info": {
    "title": "GoZAP API",
    "description": "API WhatsApp (web/mobile) da GoZAP. Autenticação por header token (instância) ou admintoken (admin).",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://{subdomain}.gozap.dev",
      "variables": {
        "subdomain": {
          "default": "example"
        }
      }
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "summary": "Verificar saúde da API",
        "tags": [
          "Sistema"
        ],
        "operationId": "sistema_get_health",
        "description": "# Verificar saúde da API\n\nConfirma se a API está no ar e respondendo. Use em monitoramento, probes de infraestrutura e checagens rápidas de disponibilidade.\n\n## Endpoint\n\n`GET {{baseUrl}}/health`\n\n## Autenticação\n\nNão requer autenticação.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/health'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"status\": \"ok\",\n  \"client_name\": \"develop\"\n}\n```\n\n## Erros comuns\n\n- Sem resposta / timeout: a API ou a rede estão indisponíveis.\n- Código diferente de `200`: o serviço pode estar em falha parcial — verifique logs e `/health/overview`.\n\n## Observações\n\n- Resposta leve, sem dados de sessões ou métricas.\n- Ideal para liveness/readiness probes."
      }
    },
    "/health/overview": {
      "get": {
        "summary": "Health check detalhado",
        "tags": [
          "Sistema"
        ],
        "operationId": "sistema_get_health_overview",
        "description": "# Health check detalhado\n\nRetorna status da API com métricas operacionais: sessões conectadas, totais de mensagens, latência e erros de descriptografia.\n\n## Endpoint\n\n``` http\nGET {{baseUrl}}/health/overview\n```\n\n## Autenticação\n\n``` http\nNenhuma (rota pública).\n```\n\n## Resposta\n\n``` json\n{\n  \"status\": \"ok\",\n  \"client_name\": \"develop\",\n  \"overview\": { \"connected_sessions\": 1, \"total_sessions\": 3 }\n}\n```\n\n## Observações\n\nRota pública, útil para monitoramento interno do pod/servidor."
      }
    },
    "/": {
      "get": {
        "summary": "Informações da raiz da API",
        "tags": [
          "Sistema"
        ],
        "operationId": "sistema_get_root",
        "description": "# Informações da raiz da API\n\nRetorna metadados básicos do serviço e os caminhos dos endpoints de health. Use para descobrir rapidamente se a base URL aponta para a GoZap API.\n\n## Endpoint\n\n`GET {{baseUrl}}/`\n\n## Autenticação\n\nNão requer autenticação.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"name\": \"GoZap API\",\n  \"status\": \"ok\",\n  \"client_name\": \"develop\",\n  \"health\": \"/health\",\n  \"health_overview\": \"/health/overview\"\n}\n```\n\n## Erros comuns\n\n- Sem resposta / timeout: a base URL está incorreta ou o serviço está offline.\n- JSON inesperado: você pode estar apontando para outro serviço na mesma URL."
      }
    },
    "/instance/create": {
      "post": {
        "summary": "Criar instância",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_post_instance_create",
        "description": "# Criar instância\n\nCria uma nova instância WhatsApp no tenant. Use quando for provisionar um número/conta novo; a instância nasce desconectada e recebe um `token` exclusivo na resposta.\n\n## Endpoint\n\n`POST {{baseUrl}}/instance/create`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Não | Nome amigável da instância. |\n| `connection_mode` | string | Não | `companion` (padrão, QR/pair code), `mobile` (socket nativo) ou `migration`. |\n| `phone` / `owner` | string | Condicional | Número com DDI, só dígitos (ex.: `5511999999999`). Obrigatório quando `connection_mode` é `mobile`. `phone` preenche `owner` se este estiver vazio. |\n| `adminField01` | string | Não | Metadado administrativo livre. |\n| `adminField02` | string | Não | Metadado administrativo livre. |\n| `token` | string | Não | Se omitido, a API gera um token automaticamente. |\n| `proxy_mode` | string | Não | Padrão `dynamic`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/instance/create' \\\n  --header 'admintoken: {{adminToken}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"minha-instancia\",\n  \"connection_mode\": \"companion\",\n  \"adminField01\": \"cliente-premium\",\n  \"adminField02\": \"plano-enterprise\"\n}'\n```\n\n## Resposta de Sucesso\n\n**Status:** `201 Created`\n\n```json\n{\n  \"success\": true,\n  \"token\": \"inst_abc123\",\n  \"instance\": {\n    \"id\": \"uuid-da-instancia\",\n    \"name\": \"minha-instancia\",\n    \"status\": \"disconnected\",\n    \"token\": \"inst_abc123\",\n    \"connection_mode\": \"companion\",\n    \"proxy_mode\": \"dynamic\",\n    \"proxy_enabled\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `400 Bad Request`: modo mobile sem `phone`/`owner` válido.\n- `403 Forbidden`: cota de instâncias esgotada (`quota exceeded`).\n\n## Observações\n\n- Guarde o `token` retornado: ele autentica as demais rotas da instância.\n- Em `mobile`, o número precisa ter DDI e só dígitos; a plataforma padrão é `ios` e `isBusiness` fica `true`.\n- Depois de criar, conecte com `POST /instance/connect` (ou o fluxo mobile correspondente).",
        "security": [
          {
            "admintoken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "minha-instancia",
                "connection_mode": "companion",
                "adminField01": "cliente-premium",
                "adminField02": "plano-enterprise"
              }
            }
          }
        }
      }
    },
    "/instance/all": {
      "get": {
        "summary": "Listar todas as instâncias",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_get_instance_all",
        "description": "# Listar todas as instâncias\n\nRetorna todas as instâncias do tenant. Use para inventário, painéis admin e para descobrir `id`/`token` de instâncias existentes.\n\n## Endpoint\n\n`GET {{baseUrl}}/instance/all`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/instance/all' \\\n  --header 'admintoken: {{adminToken}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"instances\": [\n    {\n      \"id\": \"uuid-da-instancia\",\n      \"name\": \"minha-instancia\",\n      \"status\": \"connected\",\n      \"token\": \"inst_abc123\",\n      \"connection_mode\": \"companion\",\n      \"proxy_mode\": \"dynamic\",\n      \"proxy_enabled\": true\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `500 Internal Server Error`: falha ao consultar o banco de instâncias.\n\n## Observações\n\n- Detalhes internos de proxy dinâmico (URL/IP) são omitidos na resposta pública.",
        "security": [
          {
            "admintoken": []
          }
        ]
      }
    },
    "/instance/updateAdminFields": {
      "post": {
        "summary": "Atualizar campos administrativos",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_post_instance_updateadminfields",
        "description": "# Atualizar campos administrativos\n\nAtualiza `adminField01` e `adminField02` de uma instância identificada pelo `token`. Use para gravar metadados do seu CRM/painel sem alterar a conexão WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/instance/updateAdminFields`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `token` | string | Sim | Token da instância a atualizar. |\n| `adminField01` | string | Não | Metadado administrativo. |\n| `adminField02` | string | Não | Metadado administrativo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/instance/updateAdminFields' \\\n  --header 'admintoken: {{adminToken}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"token\": \"{{token}}\",\n  \"adminField01\": \"{{instanceName}}\",\n  \"adminField02\": \"\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `400 Bad Request`: JSON inválido ou `token` omitido.\n- `500 Internal Server Error`: falha ao persistir os campos.",
        "security": [
          {
            "admintoken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "token": "{{token}}",
                "adminField01": "{{instanceName}}",
                "adminField02": ""
              }
            }
          }
        }
      }
    },
    "/globalwebhook": {
      "get": {
        "summary": "Ver webhook global",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_get_globalwebhook",
        "description": "# Ver webhook global\n\nLista os webhooks globais do tenant (valem para todas as instâncias). Use para conferir a configuração atual antes de alterar.\n\n## Endpoint\n\n`GET {{baseUrl}}/globalwebhook`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/globalwebhook' \\\n  --header 'admintoken: {{adminToken}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"webhooks\": [\n    {\n      \"id\": \"uuid-webhook\",\n      \"enabled\": true,\n      \"url\": \"https://seu-servidor.com/webhook\",\n      \"events\": [\"messages\", \"connection\"],\n      \"excludeMessages\": [\"wasSentByApi\"],\n      \"addUrlTypesMessages\": false,\n      \"addUrlEvents\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `500 Internal Server Error`: falha ao listar webhooks no banco.",
        "security": [
          {
            "admintoken": []
          }
        ]
      },
      "post": {
        "summary": "Configurar webhook global",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_post_globalwebhook",
        "description": "# Configurar webhook global\n\nSubstitui a lista de webhooks globais do tenant. Aceita um objeto, um array ou `{ \"webhooks\": [...] }`. Use para receber eventos de todas as instâncias em um endpoint central.\n\n## Endpoint\n\n`POST {{baseUrl}}/globalwebhook`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `url` | string | Sim | URL de destino (`webhookUrl` / `webhook` também são aceitos). |\n| `enabled` | boolean | Não | Padrão `true` se omitido. |\n| `events` | string[] | Não | Categorias a enviar (ex.: `messages`, `connection`, `chats`). |\n| `excludeMessages` | string[] | Não | Filtros como `wasSentByApi`, `fromMeYes`, `isGroupYes`. |\n| `addUrlTypesMessages` | boolean | Não | Acrescenta o tipo da mensagem na URL. |\n| `addUrlEvents` | boolean | Não | Acrescenta a categoria do evento na URL. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/globalwebhook' \\\n  --header 'admintoken: {{adminToken}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"enabled\": true,\n  \"url\": \"{{globalWebhook}}\",\n  \"events\": [\"messages\", \"connection\"],\n  \"excludeMessages\": [\"wasSentByApi\"]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"webhooks\": [\n    {\n      \"id\": \"uuid-gerado\",\n      \"enabled\": true,\n      \"url\": \"https://seu-servidor.com/webhook\",\n      \"events\": [\"messages\", \"connection\"],\n      \"excludeMessages\": [\"wasSentByApi\"],\n      \"addUrlTypesMessages\": false,\n      \"addUrlEvents\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `400 Bad Request`: payload vazio ou sem `url`.\n- `500 Internal Server Error`: falha ao substituir os registros no banco.\n\n## Observações\n\n- A operação **substitui** todos os webhooks globais existentes (delete + insert).\n- Para evitar loop de automação, use `excludeMessages: [\"wasSentByApi\"]`.",
        "security": [
          {
            "admintoken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "enabled": true,
                "url": "{{globalWebhook}}",
                "events": [
                  "messages",
                  "connection"
                ],
                "excludeMessages": [
                  "wasSentByApi"
                ],
                "addUrlTypesMessages": false,
                "addUrlEvents": false
              }
            }
          }
        }
      }
    },
    "/globalwebhook/errors": {
      "get": {
        "summary": "Ver erros do webhook global",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_get_globalwebhook_errors",
        "description": "# Ver erros do webhook global\n\nLista as falhas recentes de entrega dos webhooks globais. Use para diagnosticar URLs fora do ar, timeouts e respostas HTTP inválidas.\n\n## Endpoint\n\n`GET {{baseUrl}}/globalwebhook/errors`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `limit` | integer | Não | Máximo de registros (padrão `100`, teto `500`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/globalwebhook/errors?limit=100' \\\n  --header 'admintoken: {{adminToken}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"errors\": [\n    {\n      \"id\": \"uuid-erro\",\n      \"webhook_id\": \"uuid-webhook\",\n      \"instance_id\": \"uuid-instancia\",\n      \"category\": \"messages\",\n      \"attempt\": 3,\n      \"error\": \"connection refused\",\n      \"url\": \"https://seu-servidor.com/webhook\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `500 Internal Server Error`: falha ao consultar o banco de erros.",
        "security": [
          {
            "admintoken": []
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "100"
          }
        ]
      }
    },
    "/admin/restart": {
      "post": {
        "summary": "Reiniciar conexões das instâncias",
        "tags": [
          "Administração"
        ],
        "operationId": "administracao_post_admin_restart",
        "description": "# Reiniciar conexões das instâncias\n\nAgenda o reinício das conexões WhatsApp de todas as instâncias do tenant. Use após mudanças de infraestrutura, deploy ou quando várias sessões ficarem inconsistentes.\n\n## Endpoint\n\n`POST {{baseUrl}}/admin/restart`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Corpo da requisição\n\nNão há corpo.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/admin/restart' \\\n  --header 'admintoken: {{adminToken}}'\n```\n\n## Resposta de Sucesso\n\n**Status:** `202 Accepted`\n\n```json\n{\n  \"success\": true,\n  \"message\": \"restart scheduled\",\n  \"instances_attempted\": 5\n}\n```\n\nSe alguma instância falhar ao agendar o restart, a resposta inclui `errors` com o detalhe.\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `500 Internal Server Error`: falha geral ao iniciar o restart.\n\n## Observações\n\n- A resposta `202` indica que o restart foi **agendado**, não que todas as sessões já reconectaram.",
        "security": [
          {
            "admintoken": []
          }
        ]
      }
    },
    "/instance/connect": {
      "post": {
        "summary": "Conectar instância ao WhatsApp",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_connect",
        "description": "# Conectar instância ao WhatsApp\n\nInicia a conexão da instância autenticada ao WhatsApp (QR Code/pareamento no modo companion, ou retoma o fluxo mobile se a conta já estiver registrada).\n\nUse quando a instância estiver desconectada e você quiser autenticar ou reconectar a sessão.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/connect\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `phone` | string | Não* | Número com DDI. Alias: `number`, `phoneNumber`. Em mobile, deve coincidir com o telefone vinculado. |\n| `browser` | string | Não | Identidade do cliente companion (ex.: `chrome`). Ignorado no modo mobile. |\n| `systemName` | string | Não | Nome do dispositivo exibido no WhatsApp. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/connect\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"phone\": \"5511999999999\",\n  \"browser\": \"chrome\",\n  \"systemName\": \"GoZap Desktop\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"instance\": {\n    \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"token\": \"inst_abc123\",\n    \"name\": \"Atendimento\",\n    \"status\": \"qr\",\n    \"owner\": \"5511999999999\",\n    \"connection_mode\": \"companion\",\n    \"qrcode\": \"data:image/png;base64,...\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": false,\n    \"logged_in\": false\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `403` — cota de instâncias excedida (`quota exceeded`)\n- `409` — telefone diferente do já vinculado à instância (`phone_bound`)\n- `400` — payload JSON inválido\n\n## Observações\n\n*Em instâncias mobile já vinculadas, o telefone pode ser omitido e a API usa o `owner` salvo. Body é opcional (`bindOptionalJSON`).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "phone": "5511999999999",
                "browser": "chrome",
                "systemName": "GoZap Desktop"
              }
            }
          }
        }
      }
    },
    "/instance/disconnect": {
      "post": {
        "summary": "Desconectar instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_disconnect",
        "description": "# Desconectar instância\n\nEncerra a sessão ativa da instância e remove o registro do scheduler/fila assíncrona.\n\nUse para tirar a conta do ar sem apagar a instância nem o token.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/disconnect\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/disconnect\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"status\": \"disconnected\"\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- Instância já desconectada ainda retorna sucesso",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/instance/status": {
      "get": {
        "summary": "Verificar status da instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_status",
        "description": "# Verificar status da instância\n\nRetorna o registro da instância (sanitizado) e o estado de runtime da ponte (conectado, logado, passkey, etc.).\n\nUse para monitorar se a sessão está online antes de enviar mensagens.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/status\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/status\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"instance\": {\n    \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"token\": \"inst_abc123\",\n    \"name\": \"Atendimento\",\n    \"status\": \"connected\",\n    \"owner\": \"5511999999999\",\n    \"connection_mode\": \"companion\",\n    \"profileName\": \"GoZap Bot\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": true,\n    \"logged_in\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — falha ao reconciliar status no bridge",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/instance/updateInstanceName": {
      "post": {
        "summary": "Atualizar nome da instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_updateinstancename",
        "description": "# Atualizar nome da instância\n\nAltera apenas o nome amigável da instância no painel/API (não muda o nome de perfil do WhatsApp).\n\nUse para organizar instâncias em ambientes com vários números.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/updateInstanceName\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `name` | string | Sim | Novo nome interno da instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/updateInstanceName\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Suporte N1\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"instance\": {\n    \"id\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"name\": \"Suporte N1\",\n    \"status\": \"connected\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido ou campo `name` ausente no bind\n- `500` — falha ao persistir no banco",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Suporte N1"
              }
            }
          }
        }
      }
    },
    "/instance": {
      "delete": {
        "summary": "Deletar instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_delete_instance",
        "description": "# Deletar instância\n\nRemove permanentemente a instância autenticada (sessão, dados associados e token).\n\nUse com cuidado: a operação não tem undo; a limpeza completa segue em background.\n\n## Endpoint\n\n```http\nDELETE {{baseUrl}}/instance\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X DELETE \"{{baseUrl}}/instance\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — falha ao iniciar a remoção\n\n## Observações\n\nA resposta `200` indica que a exclusão foi aceita; a limpeza de device/histórico pode continuar em background.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/instance/privacy": {
      "get": {
        "summary": "Buscar configurações de privacidade",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_privacy",
        "description": "# Buscar configurações de privacidade\n\nLê as configurações de privacidade da conta WhatsApp conectada (visto por último, foto, status, recibos de leitura, etc.).\n\nUse antes de alterar privacidade ou para auditar a conta.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/privacy\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/privacy\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"privacy\": {\n    \"GroupAdd\": \"contacts\",\n    \"LastSeen\": \"contacts\",\n    \"Status\": \"contacts\",\n    \"Profile\": \"contacts\",\n    \"ReadReceipts\": \"all\",\n    \"Online\": \"match_last_seen\",\n    \"CallAdd\": \"all\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — instância offline ou bridge indisponível",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Alterar configurações de privacidade",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_privacy",
        "description": "# Alterar configurações de privacidade\n\nAltera **uma** configuração de privacidade por chamada e devolve o conjunto atualizado.\n\nUse para restringir quem vê último acesso, foto, status, etc.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/privacy\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `name` | string | Sim* | Tipo da configuração. Alias: `type`. Valores: `groupadd`, `last`, `status`, `profile`, `readreceipts`, `online`, `calladd`, `messages`, `defense`, `stickers`. |\n| `value` | string | Sim | Novo valor. Exemplos: `all`, `contacts`, `contact_blacklist`, `none`, `known`, `match_last_seen` (depende do `name`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/privacy\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"last\",\n  \"value\": \"contacts\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"privacy\": {\n    \"GroupAdd\": \"contacts\",\n    \"LastSeen\": \"contacts\",\n    \"Status\": \"contacts\",\n    \"Profile\": \"contacts\",\n    \"ReadReceipts\": \"all\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido\n- `500` — valor/`name` rejeitado pelo WhatsApp ou sessão offline\n\n## Observações\n\n*Se `name` estiver vazio, a API usa `type`. Não envie várias chaves de privacidade no mesmo body — o handler aceita apenas `name`/`type` + `value`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "last",
                "value": "contacts"
              }
            }
          }
        }
      }
    },
    "/instance/username": {
      "get": {
        "summary": "Obter @username",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_username",
        "description": "# Obter @username\n\nRetorna o @username da conta (se reservado), status e alias vinculado via WAPI.\n\nFunciona em companion e mobile (usa o cliente WhatsApp unificado).\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/username\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/username\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"username\": {\n    \"username\": \"minhaempresa\",\n    \"status\": \"available\",\n    \"linked_alias\": \"\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — sessão não conectada / bridge indisponível",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Definir @username",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_username",
        "description": "# Definir @username\n\nReserva ou altera o @username da conta. Reutiliza automaticamente a sessão do último `check` do mesmo username.\n\nPrefira sempre checar disponibilidade antes.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/username\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `username` | string | Sim | Username desejado sem `@`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/username\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"username\": \"minhaempresa\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"username\": \"minhaempresa\"\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — `username` ausente\n- `500` — username indisponível, sessão expirada ou conta offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "username": "minhaempresa"
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Remover @username",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_delete_instance_username",
        "description": "# Remover @username\n\nRemove o @username atualmente reservado na conta.\n\nUse quando quiser liberar o handle ou trocar o fluxo de claim.\n\n## Endpoint\n\n```http\nDELETE {{baseUrl}}/instance/username\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X DELETE \"{{baseUrl}}/instance/username\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — sem username ativo ou sessão offline",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/instance/username/check": {
      "post": {
        "summary": "Verificar disponibilidade de @username",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_username_check",
        "description": "# Verificar disponibilidade de @username\n\nValida se um @username candidato está disponível. A API guarda internamente o `session_id` do WhatsApp por ~30 minutos para o próximo set.\n\nChame este endpoint antes de `POST /instance/username`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/username/check\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `username` | string | Sim | Username sem `@` (ex.: `minhaempresa`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/username/check\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"username\": \"minhaempresa\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"check\": {\n    \"result\": \"available\",\n    \"username\": \"minhaempresa\",\n    \"ok\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — `username` ausente\n- `500` — sessão offline ou username inválido no WhatsApp",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "username": "minhaempresa"
              }
            }
          }
        }
      }
    },
    "/instance/username/pin": {
      "post": {
        "summary": "Verificar PIN do @username",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_username_pin",
        "description": "# Verificar PIN do @username\n\nValida o PIN exigido pelo WhatsApp em algumas mutações de username.\n\nUse quando a API/WhatsApp solicitar PIN antes de set/remove.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/username/pin\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `pin` | string | Sim | PIN numérico exigido pelo fluxo de username. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/username/pin\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"pin\": \"123456\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — `pin` ausente\n- `500` — PIN inválido ou sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "pin": "123456"
              }
            }
          }
        }
      }
    },
    "/instance/account/email": {
      "get": {
        "summary": "Mobile - Obter e-mail da conta",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_account_email",
        "description": "# Obter e-mail da conta\n\nRetorna o e-mail vinculado à conta WhatsApp e se está verificado.\n\nExclusivo de instâncias em modo mobile (socket nativo).\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/account/email\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/account/email\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"email\": {\n    \"email\": \"contato@empresa.com\",\n    \"verified\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — `account email/2fa requires mobile connection mode` ou mobile bridge indisponível\n- `500` — sessão mobile não conectada\n\n## Observações\n\nDiferente do OTP de registro (`/instance/mobile/two-factor/email*`). Esta rota gerencia o e-mail da conta já logada.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Mobile - Definir e-mail da conta",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_account_email",
        "description": "# Definir e-mail da conta\n\nDefine o endereço de e-mail da conta WhatsApp no modo mobile.\n\nDepois, use verify/confirm para validar o endereço.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/account/email\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `email` | string | Sim | E-mail a vincular (ex.: `contato@empresa.com`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/account/email\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"email\": \"contato@empresa.com\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido\n- `500` — instância não está em modo mobile ou socket offline\n\n## Observações\n\nRequer `connection_mode: mobile` e cliente socket ativo.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "email": "contato@empresa.com"
              }
            }
          }
        }
      }
    },
    "/instance/account/email/verify": {
      "post": {
        "summary": "Mobile - Solicitar verificação de e-mail",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_account_email_verify",
        "description": "# Solicitar verificação de e-mail\n\nDispara o envio do código de verificação para o e-mail já definido na conta.\n\nUse após `POST /instance/account/email`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/account/email/verify\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `lg` | string | Não | Código de idioma (ex.: `pt`). |\n| `lc` | string | Não | Código de país/locale (ex.: `BR`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/account/email/verify\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"lg\": \"pt\",\n  \"lc\": \"BR\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — e-mail não definido, modo não-mobile ou socket offline\n\n## Observações\n\nBody é opcional; `lg`/`lc` só influenciam o idioma da mensagem do WhatsApp.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "lg": "pt",
                "lc": "BR"
              }
            }
          }
        }
      }
    },
    "/instance/account/email/confirm": {
      "post": {
        "summary": "Mobile - Confirmar código do e-mail",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_account_email_confirm",
        "description": "# Confirmar código do e-mail\n\nConfirma o código recebido no e-mail e marca o endereço como verificado.\n\nUse após solicitar a verificação.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/account/email/confirm\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código numérico recebido no e-mail. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/account/email/confirm\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — `code` ausente\n- `500` — código inválido/expirado ou modo não-mobile",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456"
              }
            }
          }
        }
      }
    },
    "/instance/account/2fa": {
      "get": {
        "summary": "Mobile - Obter status 2FA da conta",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_account_2fa",
        "description": "# Obter status 2FA da conta\n\nConsulta se a verificação em duas etapas (PIN) da conta está ativa no socket mobile.\n\nNão confundir com o 2FA do fluxo de **registro** (`/instance/mobile/two-factor`).\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/account/2fa\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/account/2fa\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"two_factor\": {\n    \"tag\": \"2fa\",\n    \"has_code_node\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — `account email/2fa requires mobile connection mode` ou socket offline\n\n## Observações\n\nExclusivo mobile. `has_code_node` indica presença do nó de código na resposta do WhatsApp.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Mobile - Definir/limpar PIN 2FA da conta",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_account_2fa",
        "description": "# Definir ou limpar PIN 2FA da conta\n\nDefine o PIN de verificação em duas etapas da conta mobile. Envie `code` vazio para limpar/desativar.\n\nUse para proteger a conta ou remover o PIN existente.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/account/2fa\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim* | PIN de 6 dígitos. String vazia limpa o 2FA. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/account/2fa\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido\n- `500` — modo não-mobile ou socket offline\n\n## Observações\n\n*O campo é obrigatório no JSON; valor `\"\"` desativa o PIN.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456"
              }
            }
          }
        }
      }
    },
    "/instance/account/accept_pay": {
      "post": {
        "summary": "Mobile - Aceitar notice de pagamento",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_account_accept_pay",
        "description": "# Aceitar notice de pagamento\n\nAceita um aviso/termo de pagamento (ex.: FBPay) exigido pelo WhatsApp na conta mobile.\n\nUse quando a conta bloquear recursos até o aceite do notice.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/account/accept_pay\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `service` | string | Não* | Identificador do serviço (ex.: `FBPAY`). |\n| `notice` | string | Não* | Nome do notice (ex.: `br_pay_privacy_policy`). |\n| `version` | int | Não* | Versão do notice. |\n| `tos_version` | int | Não* | Versão dos termos de serviço. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/account/accept_pay\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"service\": \"FBPAY\",\n  \"notice\": \"br_pay_privacy_policy\",\n  \"version\": 3,\n  \"tos_version\": 1\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — modo não-mobile, socket offline ou notice inválido\n\n## Observações\n\n*O handler faz bind opcional; na prática envie os quatro campos conforme o notice exigido pelo WhatsApp. Requer modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "service": "FBPAY",
                "notice": "br_pay_privacy_policy",
                "version": 3,
                "tos_version": 1
              }
            }
          }
        }
      }
    },
    "/instance/disappearing_mode": {
      "get": {
        "summary": "Obter disappearing mode padrão",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_disappearing_mode",
        "description": "# Obter disappearing mode padrão\n\nRetorna o timer padrão de mensagens temporárias da **conta** (não de um chat específico).\n\nFunciona em companion e mobile via cliente unificado.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/disappearing_mode\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/disappearing_mode\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"disappearing_mode\": {\n    \"duration_seconds\": 86400,\n    \"duration\": \"24h0m0s\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `500` — sessão offline / bridge indisponível",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Definir disappearing mode padrão",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_disappearing_mode",
        "description": "# Definir disappearing mode padrão\n\nDefine o timer padrão de mensagens temporárias para novos chats da conta.\n\nUse `0` para desativar o padrão.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/disappearing_mode\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `seconds` | int64 | Sim* | Duração em segundos (ex.: `86400` = 24h). Alias: `duration`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/disappearing_mode\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"seconds\": 86400\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"seconds\": 86400\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido\n- `500` — sessão offline ou valor rejeitado\n\n## Observações\n\n*Se `seconds` for `0`, a API usa `duration`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "seconds": 86400
              }
            }
          }
        }
      }
    },
    "/instance/presence": {
      "post": {
        "summary": "Atualizar status de presença da instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_presence",
        "description": "# Atualizar status de presença da instância\n\nDefine a presença global da conta (`available` / `unavailable`).\n\nUse para aparecer online/offline sem enviar mensagem.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/presence\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `presence` | string | Não | Valores: `available` (padrão se vazio) ou `unavailable`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/presence\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"presence\": \"available\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"presence\": \"available\"\n}\n```\n\n## Erros comuns\n\n- `401` — header `token` ausente ou inválido\n- `400` — JSON inválido\n- `500` — sessão offline / bridge indisponível",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "presence": "available"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/verification-options": {
      "get": {
        "summary": "Mobile - Consultar opções de verificação",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_mobile_verification_options",
        "description": "# Consultar opções de verificação (GET)\n\nSincroniza e devolve os métodos disponíveis para registrar/sincronizar o número no protocolo mobile (`call`, `sms`, `otp`), com waits e elegibilidade.\n\nUse no início do fluxo de registro mobile. O telefone também pode ir no body (POST) ou query.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/mobile/verification-options\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `phone` | string | Não* | Query. Alias: `number`, `owner`. Se omitido, usa o telefone vinculado à instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/mobile/verification-options?phone=5511999999999\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"verificationOptions\": {\n    \"phone\": \"5511999999999\",\n    \"registeredInInstance\": false,\n    \"whatsappAccountExists\": true,\n    \"smsEligible\": true,\n    \"otpEligible\": true,\n    \"recommendedMethod\": \"sms\",\n    \"methods\": [\n      {\"id\": \"sms\", \"label\": \"SMS\", \"recommended\": true, \"available\": true, \"waitSeconds\": 0},\n      {\"id\": \"call\", \"label\": \"Ligação\", \"recommended\": false, \"available\": true, \"waitSeconds\": 60},\n      {\"id\": \"otp\", \"label\": \"WhatsApp\", \"recommended\": false, \"available\": true, \"waitSeconds\": 0}\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — instância não está em modo mobile\n- `401` — token inválido\n- `409` — telefone diferente do vinculado (`phone_bound`)\n- `503` — mobile bridge indisponível\n\n## Observações\n\nMesmo handler do POST. Prefira GET com query para leitura; use POST quando preferir JSON no body.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "5511999999999"
          }
        ]
      },
      "post": {
        "summary": "Mobile - Sincronizar opções de verificação",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_verification_options",
        "description": "# Sincronizar opções de verificação (POST)\n\nMesmo handler do GET: sincroniza opções de verificação mobile enviando o telefone no JSON.\n\nUse quando preferir body em vez de query string.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/verification-options\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `phone` | string | Não* | Número com DDI. Alias: `number`. Se omitido, usa o telefone vinculado. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/verification-options\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"verificationOptions\": {\n    \"phone\": \"5511999999999\",\n    \"whatsappAccountExists\": true,\n    \"recommendedMethod\": \"sms\",\n    \"methods\": [\n      {\"id\": \"sms\", \"label\": \"SMS\", \"recommended\": true, \"available\": true, \"waitSeconds\": 0}\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — instância não está em modo mobile\n- `409` — telefone divergente do vinculado\n- `503` — mobile bridge indisponível\n\n## Observações\n\nGET e POST apontam para `MobileVerificationOptions`. Body é opcional.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/request-code": {
      "post": {
        "summary": "Mobile - Solicitar código de verificação",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_request_code",
        "description": "# Solicitar código de verificação\n\nPede o envio do código de registro mobile pelo método escolhido (`sms`, `call` ou `otp`).\n\nChame após consultar as opções/waits.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/request-code\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `phone` | string | Não* | Número com DDI. Alias: `number`. Deve bater com o telefone vinculado. |\n| `method` | string | Não | `sms`, `call` (padrão) ou `otp`/`whatsapp`. |\n| `name` | string | Não | Nome de exibição usado no registro. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/request-code\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"phone\": \"5511999999999\",\n  \"method\": \"sms\",\n  \"name\": \"GoZap\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"codeSent\": true,\n  \"message\": \"Codigo solicitado com sucesso.\",\n  \"instance\": {\n    \"status\": \"needs_verification\",\n    \"verification_state\": \"code_requested\",\n    \"owner\": \"5511999999999\",\n    \"connection_mode\": \"mobile\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": false,\n    \"logged_in\": false,\n    \"pendingVerification\": true\n  },\n  \"waits\": {\"call\": 60, \"sms\": 0, \"otp\": 0}\n}\n```\n\n## Erros comuns\n\n- `400` — instância não está em modo mobile / telefone ausente\n- `409` — rate limit WhatsApp, telefone vinculado diferente, ou método em espera\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "phone": "5511999999999",
                "method": "sms",
                "name": "GoZap"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/verify-code": {
      "post": {
        "summary": "Mobile - Verificar código de sincronização",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_verify_code",
        "description": "# Verificar código de sincronização\n\nConfirma o código SMS/ligação/OTP e conclui o vínculo da conta mobile (ou avança para 2FA se a conta exigir).\n\nUse após receber o código do `request-code`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/verify-code\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código de verificação recebido. |\n| `phone` | string | Não | Número com DDI; se omitido, usa o `owner` da instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/verify-code\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\",\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Conta vinculada e conectada. Use POST /send/text para enviar mensagens.\",\n  \"instance\": {\n    \"status\": \"connected\",\n    \"verification_state\": \"verified\",\n    \"owner\": \"5511999999999\",\n    \"connection_mode\": \"mobile\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": true,\n    \"logged_in\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — `code` ausente ou instância não-mobile\n- `409` — código inválido, 2FA necessário (`twoFactorRequired`) ou telefone divergente\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`. Se a conta tiver 2FA, a API pode responder com `twoFactorRequired` e métodos disponíveis.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456",
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/two-factor": {
      "post": {
        "summary": "Mobile - Verificar PIN 2FA no registro",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_two_factor",
        "description": "# Verificar PIN 2FA no registro\n\nConclui o registro mobile quando a conta exige o PIN de verificação em duas etapas.\n\nUse o **mesmo** `code` do SMS/OTP original + o PIN de 6 dígitos da conta.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/two-factor\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código original da verificação (SMS/call/otp). |\n| `pin` | string | Sim | PIN 2FA de 6 dígitos da conta. |\n| `phone` | string | Não | Número com DDI; padrão = `owner`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/two-factor\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\",\n  \"pin\": \"654321\",\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Verificacao 2FA concluida. Conta vinculada e conectada.\",\n  \"instance\": {\n    \"status\": \"connected\",\n    \"verification_state\": \"verified\",\n    \"connection_mode\": \"mobile\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": true,\n    \"logged_in\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — `code`/`pin` ausente ou modo não-mobile\n- `409` — PIN inválido / tentativas esgotadas / wipe necessário\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`. Diferente de `POST /instance/account/2fa` (gerência do PIN na conta já logada).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456",
                "pin": "654321",
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/two-factor/email": {
      "post": {
        "summary": "Mobile - Solicitar OTP por e-mail (2FA)",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_two_factor_email",
        "description": "# Solicitar OTP por e-mail (2FA de registro)\n\nPede o envio do código OTP para o e-mail vinculado quando o segundo fator do **registro** exige e-mail.\n\nUse quando `second_factor_methods` incluir e-mail após o verify-code.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/two-factor/email\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código original da verificação (SMS/call/otp). |\n| `phone` | string | Não | Número com DDI; padrão = `owner`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/two-factor/email\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\",\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Email OTP solicitado. Verifique o email e use POST /instance/mobile/two-factor/email/verify\",\n  \"raw\": {}\n}\n```\n\n## Erros comuns\n\n- `400` — `code` ausente ou modo não-mobile\n- `409` — conta sem e-mail / rate limit WhatsApp\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`. Em seguida chame `/two-factor/email/verify`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456",
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/two-factor/email/verify": {
      "post": {
        "summary": "Mobile - Confirmar OTP do e-mail (2FA)",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_two_factor_email_verify",
        "description": "# Confirmar OTP do e-mail (2FA de registro)\n\nConfirma o código recebido por e-mail junto com o código original de verificação e finaliza o login mobile.\n\nUse após `POST /instance/mobile/two-factor/email`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/two-factor/email/verify\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código original da verificação. |\n| `email_code` | string | Sim | Código recebido no e-mail. |\n| `phone` | string | Não | Número com DDI; padrão = `owner`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/two-factor/email/verify\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\",\n  \"email_code\": \"998877\",\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Verificacao via email concluida. Conta vinculada e conectada.\",\n  \"instance\": {\n    \"status\": \"connected\",\n    \"verification_state\": \"verified\",\n    \"connection_mode\": \"mobile\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": true,\n    \"logged_in\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — `code`/`email_code` ausente ou modo não-mobile\n- `409` — códigos inválidos\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456",
                "email_code": "998877",
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/mobile/two-factor/wipe": {
      "post": {
        "summary": "Mobile - Wipe da conta (2FA)",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_mobile_two_factor_wipe",
        "description": "# Wipe da conta (2FA de registro)\n\nInicia o wipe (geralmente offline) para remover o 2FA quando o PIN foi esquecido, usando o `wipe_token` retornado pelo WhatsApp.\n\nUse só quando o fluxo de security_code indicar wipe.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/instance/mobile/two-factor/wipe\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `code` | string | Sim | Código original da verificação. |\n| `wipe_token` | string | Sim | Token retornado na resposta de security_code do WhatsApp. |\n| `wipe_type` | string | Não | Padrão: `offline`. |\n| `phone` | string | Não | Número com DDI; padrão = `owner`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/mobile/two-factor/wipe\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"123456\",\n  \"wipe_token\": \"1782243493\",\n  \"wipe_type\": \"offline\",\n  \"phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Wipe solicitado. Se a conta nao foi registrada imediatamente, aguarde o periodo de wipe_wait e registre novamente.\",\n  \"instance\": {\n    \"status\": \"needs_verification\",\n    \"verification_state\": \"wipe_pending\",\n    \"connection_mode\": \"mobile\"\n  },\n  \"runtime\": {\n    \"present\": true,\n    \"connected\": false,\n    \"logged_in\": false\n  },\n  \"raw\": {}\n}\n```\n\n## Erros comuns\n\n- `400` — `code`/`wipe_token` ausente ou modo não-mobile\n- `409` — token inválido / wipe ainda em espera\n- `503` — mobile bridge indisponível\n\n## Observações\n\nResposta HTTP `202 Accepted`. Pode ser necessário aguardar `wipe_wait` e repetir o registro.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "123456",
                "wipe_token": "1782243493",
                "wipe_type": "offline",
                "phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/instance/connect/migration": {
      "post": {
        "summary": "Conectar via migração de sessão",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_connect_migration",
        "description": "# Conectar via migração de sessão\n\nImporta uma sessão enviada pela extensão GoZAP Session Migrator (Chrome Web Store) e inicia a conexão sem QR Code ou paircode.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/instance/connect/migration\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"session\": \"<payload-exportado-pela-extensão>\"\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"instance\": {},\n  \"runtime\": {}\n}\n```\n\n## Observações\n\nO corpo é o JSON bruto exportado pela extensão — não um wrapper adicional. Requer instância previamente criada com `connection_mode: migration`. Extensão: https://chromewebstore.google.com/detail/gozap-session-migrator/ipjnppdelbcbbfbjmdccmhellpbdmdaa",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "session": "<payload-exportado-pela-extensão>"
              }
            }
          }
        }
      }
    },
    "/instance/reset": {
      "post": {
        "summary": "Resetar instância",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_reset",
        "description": "# Resetar instância\n\nDesconecta a instância autenticada e retorna o estado para reset, sem apagar o registro nem o token.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/instance/reset\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"status\": \"reset\"\n}\n```",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {}
            }
          }
        }
      }
    },
    "/instance/passkey": {
      "get": {
        "summary": "Obter opções de passkey",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_passkey",
        "description": "# Obter opções de passkey\n\nRetorna as opções WebAuthn (passkey) para conexão companion quando o WhatsApp exige verificação adicional.\n\n## Endpoint\n\n``` http\nGET {{baseUrl}}/instance/passkey\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"passkey\": {}\n}\n```\n\n## Observações\n\nUse antes de `POST /instance/passkey` no fluxo de pareamento companion.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Enviar resposta de passkey",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_passkey",
        "description": "# Enviar resposta de passkey\n\nEnvia a resposta WebAuthn gerada pelo navegador após o usuário autorizar a passkey.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/instance/passkey\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"id\": \"...\",\n  \"rawId\": \"...\",\n  \"response\": { \"authenticatorData\": \"...\", \"clientDataJSON\": \"...\", \"signature\": \"...\" },\n  \"type\": \"public-key\"\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true\n}\n```\n\n## Observações\n\nO corpo aceita o JSON completo retornado pelo `navigator.credentials.get()`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "id": "...",
                "rawId": "...",
                "response": {},
                "type": "public-key"
              }
            }
          }
        }
      }
    },
    "/instance/passkey/confirm": {
      "post": {
        "summary": "Confirmar passkey",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_post_instance_passkey_confirm",
        "description": "# Confirmar passkey\n\nConfirma a etapa final da autenticação por passkey após o envio da resposta WebAuthn.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/instance/passkey/confirm\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true\n}\n```",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {}
            }
          }
        }
      }
    },
    "/instance/mobile/verification-waits": {
      "get": {
        "summary": "Mobile - Consultar espera de verificação",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_mobile_verification_waits",
        "description": "# Consultar espera de verificação\n\nRetorna os segundos restantes de cooldown por método (`call`, `sms`, `otp`) antes de poder solicitar novo código.\n\nUse para evitar `409` por rate limit ao chamar `request-code`.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/mobile/verification-waits\n```\n\n## Autenticação\n\nHeader da instância:\n\n```http\ntoken: {{token}}\n```\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `phone` | string | Não* | Query. Alias: `number`, `owner`. Se omitido, usa o `owner` da instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/mobile/verification-waits?phone=5511999999999\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"phone\": \"5511999999999\",\n  \"waits\": {\n    \"call\": 45,\n    \"sms\": 0,\n    \"otp\": 0\n  }\n}\n```\n\n## Erros comuns\n\n- `400` — modo não-mobile ou telefone não vinculado\n- `401` — token inválido\n- `409` — telefone divergente\n- `503` — mobile bridge indisponível\n\n## Observações\n\nValores em segundos. `0` significa que o método pode ser solicitado agora.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "5511999999999"
          }
        ]
      }
    },
    "/instance/mobile/registration-otp": {
      "get": {
        "summary": "Mobile - Obter OTP recente",
        "tags": [
          "Instancia"
        ],
        "operationId": "instancia_get_instance_mobile_registration_otp",
        "description": "# Obter OTP wa_old recente\n\nRetorna o último código `wa_old_registration` recebido na sessão mobile primary (notificação `type=registration`), com TTL calculado a partir de `expiry_t`.\n\nQuando o OTP chega, o mesmo payload também é enviado no webhook `connection` com `status=registration_otp`. No reconnect, se ainda válido, entra em `connection` com `status=connected`.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/instance/mobile/registration-otp\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/instance/mobile/registration-otp\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso (OTP válido)\n\n```json\n{\n  \"success\": true,\n  \"registration_otp\": {\n    \"code\": \"472876\",\n    \"ttl\": 14400,\n    \"expires_at\": 1784333186,\n    \"ts\": 1784318786,\n    \"notification_id\": \"3399395297\"\n  }\n}\n```\n\n## Resposta (sem OTP / expirado)\n\n```json\n{\n  \"success\": true,\n  \"registration_otp\": null\n}\n```\n\n## Erros comuns\n\n- `400` — instância não é mobile\n- `409` — socket mobile não conectado\n- `503` — mobile bridge indisponível\n\n## Observações\n\nExclusivo mobile. O OTP fica em memória na sessão conectada; `ttl` zera após `expires_at`.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/devices": {
      "get": {
        "summary": "Mobile - Listar dispositivos adicionais",
        "tags": [
          "Dispositivos (Mobile)"
        ],
        "operationId": "dispositivos_mobile_get_devices",
        "description": "# Mobile - Listar dispositivos adicionais\n\nLista companions vinculados à conta primary (instância mobile). Device id `0` (o próprio celular) não entra na lista.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/devices\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/devices\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"devices\": [\n    {\n      \"jid\": \"5511999999999:1@s.whatsapp.net\",\n      \"device_id\": 1,\n      \"user\": \"5511999999999\"\n    }\n  ]\n}\n```\n\n## Observações\n\n- Só funciona em `connection_mode=mobile`.\n- Use o `jid` em `DELETE /devices` para desconectar.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "delete": {
        "summary": "Mobile - Desconectar dispositivo adicional",
        "tags": [
          "Dispositivos (Mobile)"
        ],
        "operationId": "dispositivos_mobile_delete_devices",
        "description": "# Mobile - Desconectar dispositivo adicional\n\nRemove um companion (`remove-companion-device` com `reason=user_initiated`).\n\n## Endpoint\n\n```http\nDELETE {{baseUrl}}/devices\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Corpo\n\n```json\n{\n  \"jid\": \"5511999999999:1@s.whatsapp.net\"\n}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X DELETE \"{{baseUrl}}/devices\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jid\": \"5511999999999:1@s.whatsapp.net\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Observações\n\n- `jid` deve ser `phone:device@s.whatsapp.net` (device ≠ 0).\n- Mobile only.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/device/pair/qr": {
      "post": {
        "summary": "Mobile - Vincular dispositivo via QR",
        "tags": [
          "Dispositivos (Mobile)"
        ],
        "operationId": "dispositivos_mobile_post_device_pair_qr",
        "description": "# Mobile - Vincular dispositivo via QR\n\nAprova o QR de um companion (WhatsApp Web / outra API companion) na instância mobile primary.\n\nCole a URL completa do QR (`https://wa.me/settings/linked_devices#…`).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/device/pair/qr\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Corpo\n\n```json\n{\n  \"qr\": \"https://wa.me/settings/linked_devices#2@…,noise,identity,adv,1\"\n}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/device/pair/qr\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"qr\": \"https://wa.me/settings/linked_devices#2@ref,AAA,BBB,CCC,1\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"device\": {\n    \"jid\": \"5511999999999:1@s.whatsapp.net\"\n  }\n}\n```\n\n## Observações\n\n- O companion gera o QR; o mobile aprova.\n- Mobile only.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "qr": "https://wa.me/settings/linked_devices#2@ref,noiseB64,identityB64,advB64,1"
              }
            }
          }
        }
      }
    },
    "/device/pair/code": {
      "post": {
        "summary": "Mobile - Vincular dispositivo via paircode",
        "tags": [
          "Dispositivos (Mobile)"
        ],
        "operationId": "dispositivos_mobile_post_device_pair_code",
        "description": "# Mobile - Vincular dispositivo via paircode\n\nConfirma o código de 8 caracteres depois que o companion inicia o link (`companion_hello`).\n\nFluxo: companion chama PairPhone → evento `companion_hello` no mobile → `POST /device/pair/code` → evento `device_paired`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/device/pair/code\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Corpo\n\n```json\n{\n  \"code\": \"ABCD-EFGH\"\n}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/device/pair/code\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"code\": \"ABCD-EFGH\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"pending\": true\n}\n```\n\n## Observações\n\n- Sem `companion_hello` pendente, a API retorna erro.\n- Mobile only.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "ABCD-EFGH"
              }
            }
          }
        }
      }
    },
    "/chat/editLead": {
      "post": {
        "summary": "Editar informações de lead",
        "tags": [
          "CRM"
        ],
        "operationId": "crm_post_chat_editlead",
        "description": "# Editar informações de lead\n\nAtualiza os campos de CRM do chat (`lead_name`, `lead_email`, `lead_status`, `lead_tags`) no banco da API. Use para sincronizar dados do seu funil/CRM com a conversa do WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/editLead`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\nIdentifique o chat com **um** de: `id`, `chatid` ou `number`.\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string | Condicional | ID interno do registro de chat. |\n| `chatid` | string | Condicional | JID do chat (ex.: `5511...@s.whatsapp.net`). |\n| `number` | string | Condicional | Número do contato (alternativa ao `chatid`). |\n| `lead_name` | string | Não | Nome do lead. |\n| `lead_email` | string | Não | E-mail do lead. |\n| `lead_status` | string | Não | Status no funil (texto livre). |\n| `lead_tags` | string[] | Não | Lista de tags do lead. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/chat/editLead' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"chatid\": \"5511999999999@s.whatsapp.net\",\n  \"lead_name\": \"João Silva\",\n  \"lead_email\": \"joao@exemplo.com\",\n  \"lead_status\": \"qualificado\",\n  \"lead_tags\": [\"vip\", \"suporte\"]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: JSON malformado.\n- `500 Internal Server Error`: falha ao atualizar o chat no banco.\n\n## Observações\n\n- Somente `lead_name`, `lead_email`, `lead_status` e `lead_tags` são persistidos por este endpoint.\n- Outros campos de CRM/ticket enviados no body são ignorados.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "lead_name": "João Silva",
                "lead_email": "joao@exemplo.com",
                "lead_status": "qualificado",
                "lead_tags": [
                  "vip",
                  "suporte"
                ]
              }
            }
          }
        }
      }
    },
    "/instance/updateFieldsMap": {
      "post": {
        "summary": "Atualizar mapa de campos personalizados",
        "tags": [
          "CRM"
        ],
        "operationId": "crm_post_instance_updatefieldsmap",
        "description": "# Atualizar mapa de campos personalizados\n\nGrava o JSON `fieldsMap` da instância, usado para rotular/mapear campos customizados de leads no seu CRM. O corpo inteiro é salvo como o mapa.\n\n## Endpoint\n\n`POST {{baseUrl}}/instance/updateFieldsMap`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| *(objeto JSON)* | object | Sim | Mapa livre chave → rótulo/valor. Ex.: `{ \"lead_field01\": \"nome\" }`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/instance/updateFieldsMap' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"lead_field01\": \"nome\",\n  \"lead_field02\": \"email\",\n  \"lead_field03\": \"telefone\",\n  \"lead_field04\": \"cidade\",\n  \"lead_field05\": \"status\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Custom fields updated successfully\",\n  \"instance\": {\n    \"id\": \"uuid-da-instancia\",\n    \"token\": \"inst_abc123\",\n    \"fieldsMap\": {\n      \"lead_field01\": \"nome\",\n      \"lead_field02\": \"email\"\n    }\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: corpo que não é JSON válido.\n- `500 Internal Server Error`: falha ao persistir ou recarregar a instância.\n\n## Observações\n\n- O payload substitui o `fieldsMap` anterior da instância.\n- A resposta inclui a instância atualizada (com status reconciliado).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "lead_field01": "nome",
                "lead_field02": "email",
                "lead_field03": "telefone",
                "lead_field04": "cidade",
                "lead_field05": "status"
              }
            }
          }
        }
      }
    },
    "/instance/proxy": {
      "get": {
        "summary": "Obter configuração de proxy",
        "tags": [
          "Proxy"
        ],
        "operationId": "proxy_get_instance_proxy",
        "description": "# Obter configuração de proxy\n\nRetorna o modo e o estado do proxy da instância. Use para conferir se a saída está em `dynamic`, `global`, `custom` ou `managed` antes de alterar.\n\n## Endpoint\n\n`GET {{baseUrl}}/instance/proxy`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/instance/proxy' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\nModo dinâmico (padrão / mobile):\n\n```json\n{\n  \"success\": true,\n  \"proxy\": {\n    \"mode\": \"dynamic\",\n    \"enabled\": true\n  }\n}\n```\n\nModo custom/global (exemplo):\n\n```json\n{\n  \"success\": true,\n  \"proxy\": {\n    \"mode\": \"custom\",\n    \"enabled\": true,\n    \"proxy_url\": \"socks5://user:pass@proxy.exemplo.com:1080\",\n    \"url\": \"socks5://user:pass@proxy.exemplo.com:1080\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n\n## Observações\n\n- Em instâncias mobile o modo efetivo exposto é tratado como `dynamic`.\n- Em `global`, a resposta pode incluir `resolved` com a URL normalizada do proxy do servidor.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Configurar proxy da instância",
        "tags": [
          "Proxy"
        ],
        "operationId": "proxy_post_instance_proxy",
        "description": "# Configurar proxy da instância\n\nDefine o modo de proxy da instância e, se necessário, a URL customizada. Após salvar, a API valida o alcance ao WhatsApp e pode solicitar restart da conexão.\n\n## Endpoint\n\n`POST {{baseUrl}}/instance/proxy`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `mode` | string | Não | `dynamic` (padrão), `global`, `custom` ou `managed`. |\n| `proxy_url` / `url` | string | Condicional | URL do proxy. Obrigatória quando `mode` é `custom`. |\n| `enabled` | boolean | Não | Liga/desliga o uso de proxy. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/instance/proxy' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"mode\": \"dynamic\",\n  \"enabled\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"proxy\": {\n    \"mode\": \"dynamic\",\n    \"enabled\": true\n  },\n  \"restart_requested\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: modo inválido, `proxy_url` ausente em `custom`, proxy global não configurado no servidor, ou validação de alcance ao WhatsApp falhou.\n- `500 Internal Server Error`: falha ao persistir ou reiniciar a sessão.\n\n## Observações\n\n- Modos: `dynamic` (WARP/egress gerenciado), `global` (PROXY_URL do servidor), `custom` (sua URL), `managed`.\n- A resposta pode incluir `restart_error` se o restart automático falhar.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "mode": "dynamic",
                "enabled": true
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Remover proxy customizado",
        "tags": [
          "Proxy"
        ],
        "operationId": "proxy_delete_instance_proxy",
        "description": "# Remover proxy customizado\n\nRemove a URL de proxy customizada e volta a instância para `dynamic` ou `global`. Use quando quiser abandonar um proxy próprio e retornar ao egress gerenciado.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/instance/proxy`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `mode` | string | Não | Destino após limpar: `dynamic` (padrão) ou `global`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/instance/proxy?mode=dynamic' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"custom proxy removed\",\n  \"proxy\": {\n    \"mode\": \"dynamic\",\n    \"enabled\": true\n  },\n  \"restart_requested\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: `mode` diferente de `dynamic`/`global`, ou validação de alcance falhou.\n- `500 Internal Server Error`: falha ao atualizar ou reiniciar.\n\n## Observações\n\n- Limpa `proxy_url`, define `proxy_mode` para o `mode` informado e mantém `proxy_enabled: true`.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "mode",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "dynamic"
          }
        ]
      }
    },
    "/instance/proxy/check": {
      "get": {
        "summary": "Verificar IP de saída do proxy",
        "tags": [
          "Proxy"
        ],
        "operationId": "proxy_get_instance_proxy_check",
        "description": "# Verificar IP de saída do proxy\n\nTesta o egress atual da instância: IP público visto através do proxy e se `web.whatsapp.com:443` é alcançável. Use para validar proxy custom/global antes ou depois de configurar.\n\n## Endpoint\n\n`GET {{baseUrl}}/instance/proxy/check`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/instance/proxy/check' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"check\": {\n    \"mode\": \"custom\",\n    \"ip\": \"203.0.113.10\",\n    \"whatsapp_reachable\": true\n  }\n}\n```\n\nSe o WhatsApp não for alcançável, `whatsapp_reachable` será `false` e `whatsapp_error` trará o detalhe.\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: modo `dynamic` não permite este check da forma esperada, ou falha de validação específica do modo.\n- `500 Internal Server Error`: falha inesperada ao testar o egress.\n\n## Observações\n\n- Em modo `dynamic`, erros de check costumam retornar `400` em vez de `500`.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/profile/name": {
      "post": {
        "summary": "Alterar nome do perfil",
        "tags": [
          "Perfil"
        ],
        "operationId": "perfil_post_profile_name",
        "description": "# Alterar nome do perfil\n\nAtualiza o nome de exibição (push name) da conta WhatsApp conectada. Use quando quiser mudar como o contato aparece para outras pessoas.\n\n## Endpoint\n\n`POST {{baseUrl}}/profile/name`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Sim | Novo nome (máximo 25 caracteres). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/profile/name' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"GoZAP | API For Developer\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Nome do perfil alterado com sucesso\",\n  \"profile\": {\n    \"name\": \"GoZAP | API For Developer\",\n    \"updated_at\": 1710000000\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: nome vazio/longo demais, ou falha ao sincronizar com o WhatsApp.\n\n## Observações\n\n- Funciona com companion e mobile (app state + broadcast do push name).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "GoZAP | API For Developer"
              }
            }
          }
        }
      }
    },
    "/profile/image": {
      "post": {
        "summary": "Alterar imagem do perfil",
        "tags": [
          "Perfil"
        ],
        "operationId": "perfil_post_profile_image",
        "description": "# Alterar imagem do perfil\n\nDefine ou remove a foto de perfil da conta conectada. Aceita URL HTTP(S), base64 (com ou sem prefixo `data:`) ou os valores `remove`/`delete` para limpar.\n\n## Endpoint\n\n`POST {{baseUrl}}/profile/image`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `image` | string | Sim | URL, base64, ou `remove`/`delete` para remover a foto. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/profile/image' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"image\": \"https://cdn.exemplo.com/perfil.jpg\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Imagem do perfil alterada com sucesso\",\n  \"profile\": {\n    \"image_updated\": true,\n    \"image_removed\": false,\n    \"updated_at\": 1710000000\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: instância sem pareamento, imagem inválida, download falhou, ou WhatsApp recusou a foto.\n\n## Observações\n\n- A instância precisa estar pareada (`Store` com JID).\n- Em mobile, após sucesso a API pode refrescar o cache da foto de perfil.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "image": "https://cdn.exemplo.com/perfil.jpg"
              }
            }
          }
        }
      }
    },
    "/profile/status": {
      "post": {
        "summary": "Alterar status (About) do perfil",
        "tags": [
          "Perfil"
        ],
        "operationId": "perfil_post_profile_status",
        "description": "# Alterar status (About) do perfil\n\nAtualiza o texto de status / About da conta WhatsApp. Use para mudar a mensagem curta exibida no perfil. Funciona em companion e mobile (não é exclusivo de mobile).\n\n## Endpoint\n\n`POST {{baseUrl}}/profile/status`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `status` | string | Condicional | Novo texto de About. |\n| `text` | string | Condicional | Alternativa a `status` (usado se `status` estiver vazio). |\n\nInforme `status` ou `text`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/profile/status' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"status\": \"Disponível para conversar\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Status do perfil alterado com sucesso\",\n  \"profile\": {\n    \"status\": \"Disponível para conversar\",\n    \"updated_at\": 1710000000\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: cliente WhatsApp indisponível ou a alteração foi recusada.\n\n## Observações\n\n- Não confundir com stories (`POST /status/text` / `POST /send/status`): este endpoint altera apenas o About do perfil.\n- Internamente usa `SetStatusMessage` via cliente WhatsApp da instância, sem checagem de modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "status": "Disponível para conversar"
              }
            }
          }
        }
      }
    },
    "/send/text": {
      "post": {
        "summary": "Enviar mensagem de texto",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_text",
        "description": "# Enviar mensagem de texto\n\nEnvia uma mensagem de texto simples para um contato, grupo ou canal (`@newsletter`). Use quando só precisa de texto — sem mídia nem botões.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/text\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário: telefone (ex. 5511999999999), JID `@s.whatsapp.net`, grupo `@g.us` ou canal `@newsletter` |\n| chatid | string | Sim* | Alternativa a number (mesmo significado) |\n| text | string | Sim | Conteúdo da mensagem |\n| spoiler | bool | Não | Envolve a mensagem em spoiler |\n| ai | bool | Não | Marca como mensagem AI (ícone; só DM no modo web) |\n| secure_meta_service_label | bool | Não | Força label de qualidade Meta (web) |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| is_lottie | bool | Não | Não se aplica a texto puro; ignorado na prática |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/text\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"text\": \"Olá! Tudo bem?\", \"spoiler\": false, \"ai\": false, \"secure_meta_service_label\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `text is required` — campo text vazio\n- `missing token` / 401 — header token ausente ou inválido\n- Instância desconectada — conecte antes de enviar\n- Número inválido / não existe no WhatsApp\n\n## Observações\n\n- Informe `number` ou `chatid` (pelo menos um).\n- Para canal, use o JID completo: `120363...@newsletter`.\n- Resposta padrão: `{ success, message: { id, timestamp, sender } }`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "text": "Olá! Tudo bem?",
                "spoiler": false,
                "ai": false,
                "secure_meta_service_label": false
              }
            }
          }
        }
      }
    },
    "/send/media": {
      "post": {
        "summary": "Enviar mídia",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_media",
        "description": "# Enviar mídia\n\nEnvia imagem, vídeo, áudio, documento ou figurinha para um chat. Use `/send/media` quando o tipo de arquivo varia; para só imagem há também `/send/image`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/media\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário (telefone ou JID). Alternativa: chatid |\n| chatid | string | Sim* | JID do chat. Use number OU chatid |\n| type | string | Não | image, video, audio, document, sticker, ptt/voice (padrão: image) |\n| url | string | Sim* | URL pública da mídia |\n| base64 | string | Sim* | Mídia em base64 / data URI (alternativa a url) |\n| mimetype | string | Não | MIME type (ex.: image/jpeg) |\n| caption | string | Não | Legenda |\n| text | string | Não | Alias de caption |\n| fileName | string | Não | Nome do arquivo (documentos) |\n| ptt | bool | Não | Enviar áudio como mensagem de voz (PTT) |\n| view_once | bool | Não | Visualização única (image/video/audio) |\n| image | string | Não | Alias de url para imagem |\n| imageUrl | string | Não | Alias de url para imagem |\n| video | string | Não | Alias de url para vídeo |\n| videoUrl | string | Não | Alias de url para vídeo |\n| audio | string | Não | Alias de url para áudio |\n| audioUrl | string | Não | Alias de url para áudio |\n| file | string | Não | Alias de url para documento |\n| media | string | Não | Alias genérico de url |\n| spoiler | bool | Não | Envolve em spoilerMessage |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| ai | bool | Não | Ícone AI (DM, modo web) |\n| secure_meta_service_label | bool | Não | Força nó quality_control (web) |\n| is_lottie | bool | Não | Marca figurinha como Lottie |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/media\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"type\": \"image\", \"url\": \"https://exemplo.com/foto.jpg\", \"caption\": \"Confira esta foto\", \"view_once\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Falha ao baixar a URL da mídia\n- `view_once is only supported for image, video, and audio`\n- Tipo MIME incompatível ou arquivo corrompido\n- Instância desconectada\n\n## Observações\n\n- Informe `url` ou `base64` (pelo menos um).\n- Tipos: `image`, `video`, `audio`, `document`, `sticker`, `ptt`/`voice`.\n- `view_once` só para image/video/audio.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "type": "image",
                "url": "https://exemplo.com/foto.jpg",
                "caption": "Confira esta foto",
                "view_once": false
              }
            }
          }
        }
      }
    },
    "/send/contact": {
      "post": {
        "summary": "Enviar cartão de contato",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_contact",
        "description": "# Enviar cartão de contato\n\nEnvia um cartão de contato (vCard) para o chat. Útil para compartilhar telefone e nome de uma pessoa.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/contact\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário do cartão |\n| chatid | string | Sim* | Alternativa a number |\n| displayName | string | Não | Nome exibido no cartão |\n| name | string | Não | Alias de displayName |\n| fullName | string | Não | Alias de displayName |\n| phone | string | Não | Telefone do contato no vCard |\n| phoneNumber | string | Não | Alias de phone |\n| contact | string | Não | Alias de phone |\n| vcard | string | Não | vCard completo (se omitido, a API monta a partir do nome/telefone) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/contact\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"fullName\": \"João Silva\", \"phoneNumber\": \"5511999999999\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Destinatário ausente (`number`/`chatid`)\n- Instância desconectada\n- Token inválido\n\n## Observações\n\n- Se `vcard` estiver vazio, a API gera um vCard com `displayName`/`name`/`fullName` e o telefone informado (ou o próprio destinatário).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "fullName": "João Silva",
                "phoneNumber": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/send/location": {
      "post": {
        "summary": "Enviar localização",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_location",
        "description": "# Enviar localização\n\nEnvia um pin de localização geográfica (latitude/longitude) com nome e endereço opcionais.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/location\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| latitude | number | Sim | Latitude (ex.: -23.5505) |\n| longitude | number | Sim | Longitude (ex.: -46.6333) |\n| name | string | Não | Nome do local |\n| address | string | Não | Endereço textual |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/location\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"latitude\": -23.5505, \"longitude\": -46.6333, \"name\": \"Av. Paulista\", \"address\": \"Av. Paulista, São Paulo - SP\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Coordenadas inválidas\n- Destinatário ausente\n- Instância desconectada",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "latitude": -23.5505,
                "longitude": -46.6333,
                "name": "Av. Paulista",
                "address": "Av. Paulista, São Paulo - SP"
              }
            }
          }
        }
      }
    },
    "/message/presence": {
      "post": {
        "summary": "Enviar presença no chat",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_message_presence",
        "description": "# Enviar presença no chat\n\nMostra no chat o indicador de \"digitando…\" ou \"gravando áudio…\". Use antes de responder para parecer mais humano. Não envia mensagem de texto.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/message/presence\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Chat alvo |\n| chatid | string | Sim* | Alternativa a number |\n| state | string | Sim* | composing / typing / digitando, recording / gravando / audio, paused / pause / parado |\n| presence | string | Sim* | Alias de state |\n| media | string | Não | audio / recording / voice / ptt para indicar gravação de áudio |\n| isAudio | bool | Não | Se true e media vazio, usa media=audio |\n| delay | number | Não | Segundos (ou valor numérico) mantendo a presença antes de enviar paused automaticamente |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/presence\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"state\": \"composing\", \"delay\": 3}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Destinatário ausente\n- Instância desconectada\n- Token inválido\n\n## Observações\n\n- Resposta de sucesso: apenas `{ \"success\": true }` (sem objeto message).\n- Aliases: `typing`/`digitando` → composing; `recording`/`gravando` → composing + áudio.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "state": "composing",
                "delay": 3
              }
            }
          }
        }
      }
    },
    "/send/status": {
      "post": {
        "summary": "Enviar status (stories)",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_status",
        "description": "# Enviar status (stories)\n\nPublica um status/stories no WhatsApp (texto, imagem, vídeo, áudio ou GIF). Não envia para um chat específico — publica no broadcast de status.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/status\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| type | string | Sim | text, image, video, audio/voice, gif |\n| content | object | Não | Conteúdo tipado (text, background_color, font, image/video/audio/file, caption, text_color) |\n| text | string | Não | Atalho flat para content.text (type=text) |\n| caption | string | Não | Atalho flat para content.caption |\n| background_color | string|number | Não | Preset (ex. solid_blue) ou ARGB |\n| font | string|number | Não | none, serif, sans_serif, norse, bubble, italic, bold, script/dancing |\n| file / image / video / audio | string | Não | Atalhos flat de URL de mídia em content |\n| status_jid_list | string[] | Não | Audiência privada deste status (JIDs) |\n| recipients | string[] | Não | Alias de status_jid_list |\n| mentions | string[] | Não | Até 5 contatos notificados sobre o status |\n| status_setting | string | Não | contacts | whitelist | blacklist (omitir no Web com mentions) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/status\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"type\": \"text\", \"text\": \"Novidades chegando!\", \"background_color\": \"solid_blue\", \"font\": \"sans_serif\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"result\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `type is required`\n- `text is required for text status`\n- `media url or base64 is required` (tipos de mídia)\n- `mentions limited to N contacts`\n\n## Observações\n\n- A resposta usa `result` (não `message`).\n- Presets de cor: solid_green, solid_blue, solid_red, solid_purple, solid_orange, solid_teal, solid_pink, solid_indigo, solid_yellow, solid_cyan, solid_black, solid_white, gradient_*.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "type": "text",
                "text": "Novidades chegando!",
                "background_color": "solid_blue",
                "font": "sans_serif"
              }
            }
          }
        }
      }
    },
    "/send/image": {
      "post": {
        "summary": "Enviar imagem",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_image",
        "description": "# Enviar imagem\n\nAtalho de `/send/media` que força `type=image`. Use para enviar só fotos com legenda opcional.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/image\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário (telefone ou JID). Alternativa: chatid |\n| chatid | string | Sim* | JID do chat. Use number OU chatid |\n| url | string | Sim* | URL pública da mídia |\n| base64 | string | Sim* | Mídia em base64 / data URI (alternativa a url) |\n| mimetype | string | Não | MIME type (ex.: image/jpeg) |\n| caption | string | Não | Legenda |\n| text | string | Não | Alias de caption |\n| fileName | string | Não | Nome do arquivo (documentos) |\n| ptt | bool | Não | Enviar áudio como mensagem de voz (PTT) |\n| view_once | bool | Não | Visualização única (image/video/audio) |\n| image | string | Não | Alias de url para imagem |\n| imageUrl | string | Não | Alias de url para imagem |\n| video | string | Não | Alias de url para vídeo |\n| videoUrl | string | Não | Alias de url para vídeo |\n| audio | string | Não | Alias de url para áudio |\n| audioUrl | string | Não | Alias de url para áudio |\n| file | string | Não | Alias de url para documento |\n| media | string | Não | Alias genérico de url |\n| spoiler | bool | Não | Envolve em spoilerMessage |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| ai | bool | Não | Ícone AI (DM, modo web) |\n| secure_meta_service_label | bool | Não | Força nó quality_control (web) |\n| is_lottie | bool | Não | Marca figurinha como Lottie |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/image\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"url\": \"https://exemplo.com/imagem.jpg\", \"caption\": \"Produto em destaque\", \"view_once\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- URL/base64 ausente ou inacessível\n- Arquivo não é imagem válida\n- Instância desconectada\n\n## Observações\n\n- O handler define `type=image` automaticamente; não precisa enviar `type`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "url": "https://exemplo.com/imagem.jpg",
                "caption": "Produto em destaque",
                "view_once": false
              }
            }
          }
        }
      }
    },
    "/send/button": {
      "post": {
        "summary": "Enviar botões interativos",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_button",
        "description": "# Enviar botões interativos\n\nEnvia mensagem com botões de resposta rápida, link, chamada, copiar código ou PIX. Ideal para menus curtos (até 3 reply).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/button\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| text | string | Sim* | Corpo da mensagem |\n| title | string | Não | Alias/complemento do texto |\n| description | string | Não | Alias/complemento do texto |\n| footer / footerText | string | Não | Rodapé |\n| buttons | array | Sim* | Lista de botões interativos |\n| choices | string[] | Sim* | Formato curto: `Texto|id` ou `Texto|url:https://...` (alternativa a buttons) |\n| type / menuType / kind | string | Não | Ignorado neste endpoint (sempre botões) |\n| buttons[].type | string | Não | reply, url, call, copy, pix (padrão: reply) |\n| buttons[].displayText / text | string | Sim* | Texto exibido no botão |\n| buttons[].id | string | Não | ID da ação (reply) ou fallback |\n| buttons[].url | string | Não | URL (type=url) |\n| buttons[].phoneNumber | string | Não | Telefone (type=call) |\n| buttons[].copyCode | string | Não | Código a copiar (type=copy) |\n| buttons[].currency | string | Não | Moeda PIX (padrão BRL) |\n| buttons[].name | string | Não | Nome do merchant (PIX) / item |\n| buttons[].key | string | Não | Chave PIX |\n| buttons[].keyType | string | Não | PHONE, EMAIL, CPF, CNPJ, EVP |\n| buttons[].amount / value | int | Não | Valor em centavos (PIX) |\n| buttons[].itemName | string | Não | Nome do item no pedido PIX |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/button\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"text\": \"Como podemos ajudar?\", \"footer\": \"GoZAP\", \"buttons\": [{\"id\": \"vendas\", \"text\": \"Vendas\", \"type\": \"reply\"}, {\"id\": \"suporte\", \"text\": \"Suporte\", \"type\": \"reply\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `buttons or choices are required`\n- `text, title, or description is required`\n- `at most 3 reply buttons are allowed`\n- `reply buttons cannot be mixed with other button types`\n\n## Observações\n\n- Há cooldown por contato para mensagens interativas (evita spam).\n- PIX: no máximo 1 botão e não misture com outros tipos.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "text": "Como podemos ajudar?",
                "footer": "GoZAP",
                "buttons": [
                  {
                    "id": "vendas",
                    "text": "Vendas",
                    "type": "reply"
                  },
                  {
                    "id": "suporte",
                    "text": "Suporte",
                    "type": "reply"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/list": {
      "post": {
        "summary": "Enviar lista interativa",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_list",
        "description": "# Enviar lista interativa\n\nEnvia uma mensagem com lista expansível de opções (seções e linhas). Melhor que botões quando há muitas escolhas.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/list\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| text / title / description | string | Sim | Texto do corpo da lista |\n| footer / footerText | string | Não | Rodapé |\n| buttonText / listButton | string | Não | Texto do botão que abre a lista |\n| sections | array | Sim* | Seções com `title` e `rows` |\n| sections[].rows[].title | string | Sim | Título da linha |\n| sections[].rows[].description | string | Não | Descrição da linha |\n| sections[].rows[].rowId / id | string | Não | ID retornado ao selecionar |\n| choices | string[] | Sim* | Formato curto: `[Seção]` e `Título|descrição|id` |\n| type / menuType / kind | string | Não | Opcional; neste endpoint o envio é sempre lista |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/list\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"type\": \"list\", \"text\": \"Escolha uma categoria:\", \"buttonText\": \"Ver opções\", \"sections\": [{\"title\": \"Atendimento\", \"rows\": [{\"title\": \"Suporte\", \"description\": \"Ajuda técnica\", \"rowId\": \"support\"}, {\"title\": \"Financeiro\", \"description\": \"Pagamentos\", \"rowId\": \"billing\"}]}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `sections or choices are required`\n- Texto do corpo vazio\n- Cooldown interativo por contato",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "type": "list",
                "text": "Escolha uma categoria:",
                "buttonText": "Ver opções",
                "sections": [
                  {
                    "title": "Atendimento",
                    "rows": [
                      {
                        "title": "Suporte",
                        "description": "Ajuda técnica",
                        "rowId": "support"
                      },
                      {
                        "title": "Financeiro",
                        "description": "Pagamentos",
                        "rowId": "billing"
                      }
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/menu": {
      "post": {
        "summary": "Enviar menu interativo",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_menu",
        "description": "# Enviar menu interativo\n\nEndpoint unificado que envia botões, lista ou carrossel conforme `type`/`menuType`/`kind`. Se omitir o tipo, a API infere por `sections`, `carousel`/`cards` ou cai em botões.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/menu\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| type / menuType / kind | string | Não | buttons, list, carousel (poll redireciona para /send/poll) |\n| text / title / description | string | Condicional | Corpo da mensagem |\n| footer / footerText | string | Não | Rodapé |\n| buttonText / listButton | string | Não | Texto do botão da lista |\n| buttons | array | Condicional | Botões (type=buttons) |\n| choices | string[] | Condicional | Atalho para botões ou lista |\n| sections | array | Condicional | Seções da lista |\n| carousel / cards | array | Condicional | Cards do carrossel |\n| imageButton | string | Não | Texto auxiliar de botão com imagem |\n| buttons[].type | string | Não | reply, url, call, copy, pix (padrão: reply) |\n| buttons[].displayText / text | string | Sim* | Texto exibido no botão |\n| buttons[].id | string | Não | ID da ação (reply) ou fallback |\n| buttons[].url | string | Não | URL (type=url) |\n| buttons[].phoneNumber | string | Não | Telefone (type=call) |\n| buttons[].copyCode | string | Não | Código a copiar (type=copy) |\n| buttons[].currency | string | Não | Moeda PIX (padrão BRL) |\n| buttons[].name | string | Não | Nome do merchant (PIX) / item |\n| buttons[].key | string | Não | Chave PIX |\n| buttons[].keyType | string | Não | PHONE, EMAIL, CPF, CNPJ, EVP |\n| buttons[].amount / value | int | Não | Valor em centavos (PIX) |\n| buttons[].itemName | string | Não | Nome do item no pedido PIX |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/menu\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"type\": \"buttons\", \"text\": \"Selecione uma opção:\", \"buttons\": [{\"id\": \"demo\", \"text\": \"Agendar demo\", \"type\": \"reply\"}, {\"id\": \"site\", \"text\": \"Abrir site\", \"type\": \"url\", \"url\": \"https://gozap.dev\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `use POST /send/poll instead of menu type poll`\n- Campos obrigatórios do subtipo escolhido ausentes\n- Cooldown interativo\n\n## Observações\n\n- Prefira `/send/button`, `/send/list` ou `/send/carousel` quando souber o formato.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "type": "buttons",
                "text": "Selecione uma opção:",
                "buttons": [
                  {
                    "id": "demo",
                    "text": "Agendar demo",
                    "type": "reply"
                  },
                  {
                    "id": "site",
                    "text": "Abrir site",
                    "type": "url",
                    "url": "https://gozap.dev"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/carousel": {
      "post": {
        "summary": "Enviar carrossel",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_carousel",
        "description": "# Enviar carrossel\n\nEnvia um carrossel de cards com mídia e botões. Útil para catálogos, planos ou produtos.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/carousel\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| text / body | string | Não | Texto introdutório acima do carrossel |\n| footer | string | Não | Rodapé geral |\n| cards | array | Sim* | Lista de cards |\n| carousel | array | Sim* | Formato alternativo: `{ text, image, video, buttons }` |\n| cards[].header.title | string | Não | Título do header |\n| cards[].header.subtitle | string | Não | Subtítulo |\n| cards[].header.image / imageUrl | string | Não | Imagem do card |\n| cards[].header.video / videoUrl | string | Não | Vídeo do card |\n| cards[].body.text | string | Sim | Texto do corpo do card |\n| cards[].footer | string | Não | Rodapé do card |\n| cards[].buttons | array | Não | Botões do card (sem PIX) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/carousel\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"text\": \"Conheça nossos planos\", \"cards\": [{\"header\": {\"title\": \"Starter\", \"imageUrl\": \"https://exemplo.com/starter.png\"}, \"body\": {\"text\": \"Ideal para começar\"}, \"footer\": \"A partir de R$ 29\", \"buttons\": [{\"id\": \"starter\", \"text\": \"Quero este\", \"type\": \"reply\"}]}, {\"header\": {\"title\": \"Pro\", \"imageUrl\": \"https://exemplo.com/pro.png\"}, \"body\": {\"text\": \"Para times em crescimento\"}, \"buttons\": [{\"id\": \"pro\", \"text\": \"Quero este\", \"type\": \"reply\"}]}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `cards or carousel are required`\n- `card N body text is required`\n- `pix buttons are not supported in carousel cards`\n- Falha ao baixar mídia do header",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "text": "Conheça nossos planos",
                "cards": [
                  {
                    "header": {
                      "title": "Starter",
                      "imageUrl": "https://exemplo.com/starter.png"
                    },
                    "body": {
                      "text": "Ideal para começar"
                    },
                    "footer": "A partir de R$ 29",
                    "buttons": [
                      {
                        "id": "starter",
                        "text": "Quero este",
                        "type": "reply"
                      }
                    ]
                  },
                  {
                    "header": {
                      "title": "Pro",
                      "imageUrl": "https://exemplo.com/pro.png"
                    },
                    "body": {
                      "text": "Para times em crescimento"
                    },
                    "buttons": [
                      {
                        "id": "pro",
                        "text": "Quero este",
                        "type": "reply"
                      }
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/location-button": {
      "post": {
        "summary": "Solicitar localização",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_location_button",
        "description": "# Solicitar localização\n\nEnvia uma mensagem interativa pedindo que o usuário compartilhe a localização (botão nativo `send_location`).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/location-button\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| text | string | Sim* | Texto do pedido |\n| title | string | Sim* | Alias de text |\n| footer | string | Não | Rodapé |\n| buttonText | string | Não | Texto do botão (padrão: Compartilhar localização) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/location-button\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"text\": \"Por favor, compartilhe sua localização\", \"buttonText\": \"Compartilhar localização\", \"footer\": \"GoZAP\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `text is required`\n- Cooldown interativo\n- Instância desconectada",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "text": "Por favor, compartilhe sua localização",
                "buttonText": "Compartilhar localização",
                "footer": "GoZAP"
              }
            }
          }
        }
      }
    },
    "/send/request-payment": {
      "post": {
        "summary": "Solicitar pagamento",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_request_payment",
        "description": "# Solicitar pagamento\n\nEnvia um pedido de pagamento (compatível UAZAPI) com PIX, boleto e/ou link. Use para cobrar um valor em BRL com instruções claras.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/request-payment\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| amount | number | Sim | Valor em reais (ex.: 149.90) |\n| title | string | Não | Título do pedido |\n| text | string | Não | Texto/descrição |\n| footer | string | Não | Rodapé |\n| itemName | string | Não | Nome do item cobrado |\n| invoiceNumber | string | Não | Número da fatura |\n| pixKey | string | Condicional | Chave PIX |\n| pixType | string | Não | PHONE, EMAIL, CPF, CNPJ, EVP/RANDOM |\n| pixName | string | Não | Nome do recebedor PIX |\n| paymentLink | string | Condicional | Link de pagamento |\n| boletoCode | string | Condicional | Linha digitável do boleto |\n| additionalNote | string | Não | Nota adicional |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/request-payment\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"amount\": 149.9, \"title\": \"Plano Pro\", \"text\": \"Confirme o pagamento para ativar a assinatura.\", \"itemName\": \"Assinatura Pro\", \"invoiceNumber\": \"INV-2026-001\", \"pixKey\": \"financeiro@empresa.com\", \"pixType\": \"EMAIL\", \"pixName\": \"Empresa LTDA\", \"additionalNote\": \"Liberação automática após confirmação\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `amount must be greater than zero`\n- `missing pixKey, boletoCode or paymentLink`\n- Destinatário ausente\n\n## Observações\n\n- É obrigatório informar pelo menos um meio: `pixKey`, `boletoCode` ou `paymentLink`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "amount": 149.9,
                "title": "Plano Pro",
                "text": "Confirme o pagamento para ativar a assinatura.",
                "itemName": "Assinatura Pro",
                "invoiceNumber": "INV-2026-001",
                "pixKey": "financeiro@empresa.com",
                "pixType": "EMAIL",
                "pixName": "Empresa LTDA",
                "additionalNote": "Liberação automática após confirmação"
              }
            }
          }
        }
      }
    },
    "/send/pix-button": {
      "post": {
        "summary": "Enviar botão PIX",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_pix_button",
        "description": "# Enviar botão PIX\n\nEnvia um botão interativo de pagamento PIX (`payment_info`). Por baixo dos panos usa o mesmo fluxo de `/send/button` com `type=pix`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/pix-button\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| title / text / description | string | Não | Se buttons vazio, title vira o nome do merchant |\n| footer / footerText | string | Não | Rodapé (ignorado no fluxo PIX puro) |\n| buttons | array | Recomendado | Um botão com type=pix (se vazio, cria um com Name=title) |\n| buttons[].type | string | Não | Forçado para pix se vazio |\n| buttons[].name | string | Sim | Nome do merchant/recebedor |\n| buttons[].key | string | Sim | Chave PIX |\n| buttons[].keyType | string | Não | PHONE, EMAIL, CPF, CNPJ, EVP |\n| buttons[].currency | string | Não | Padrão BRL |\n| buttons[].amount / value | int | Não | Valor em centavos |\n| buttons[].itemName | string | Não | Nome do item |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/pix-button\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"title\": \"Pagamento via PIX\", \"buttons\": [{\"type\": \"pix\", \"name\": \"GoZAP Pagamentos\", \"key\": \"pix@gozap.dev\", \"keyType\": \"EMAIL\", \"currency\": \"BRL\", \"amount\": 9900, \"itemName\": \"Pedido #1234\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `pix buttons cannot be combined with other buttons`\n- Chave PIX ausente (`key`)\n- Cooldown interativo\n\n## Observações\n\n- Não use campos `pixKey`/`pixType` soltos no root — eles não existem em MenuInput. Passe dentro de `buttons[]`.\n- Apenas 1 botão PIX por mensagem.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "title": "Pagamento via PIX",
                "buttons": [
                  {
                    "type": "pix",
                    "name": "GoZAP Pagamentos",
                    "key": "pix@gozap.dev",
                    "keyType": "EMAIL",
                    "currency": "BRL",
                    "amount": 9900,
                    "itemName": "Pedido #1234"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/rich": {
      "post": {
        "summary": "Enviar mensagem rica (AI rich)",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_rich",
        "description": "# Enviar mensagem rica\n\nEnvia uma mensagem AI Rich composta por vários blocos (texto, código, tabela, LaTeX) em uma única mensagem.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/rich\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| jid | string | Sim* | Alternativa a number/chatid |\n| items | array | Sim | Lista de blocos ricos |\n| items[].type | string | Sim | text | code | table | latex |\n| items[].text | string | Condicional | Para type=text ou latex |\n| items[].code | string | Condicional | Para type=code |\n| items[].language | string | Condicional | Linguagem do code |\n| items[].headers | string[] | Condicional | Cabeçalhos (table) |\n| items[].rows | string[][] | Condicional | Linhas (table) |\n| items[].expressions | string[] | Condicional | Expressões LaTeX |\n| native_rich | bool | Não | Usa renderização nativa rica quando disponível |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/rich\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"native_rich\": false, \"items\": [{\"type\": \"text\", \"text\": \"Resultado da análise\"}, {\"type\": \"table\", \"headers\": [\"Métrica\", \"Valor\"], \"rows\": [[\"CPU\", \"12%\"], [\"RAM\", \"512Mi\"]]}, {\"type\": \"code\", \"language\": \"go\", \"code\": \"fmt.Println(\\\"ok\\\")\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `chatid, number or jid is required`\n- `unsupported rich item type: ...`\n- `items` ausente",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "native_rich": false,
                "items": [
                  {
                    "type": "text",
                    "text": "Resultado da análise"
                  },
                  {
                    "type": "table",
                    "headers": [
                      "Métrica",
                      "Valor"
                    ],
                    "rows": [
                      [
                        "CPU",
                        "12%"
                      ],
                      [
                        "RAM",
                        "512Mi"
                      ]
                    ]
                  },
                  {
                    "type": "code",
                    "language": "javascript",
                    "code": "console.log('ok')"
                  },
                  {
                    "type": "latex",
                    "text": "Fórmula",
                    "expressions": [
                      "E=mc^2"
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/table": {
      "post": {
        "summary": "Enviar tabela",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_table",
        "description": "# Enviar tabela\n\nEnvia uma tabela formatada (mensagem rica) com título, cabeçalhos e linhas.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/table\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| jid | string | Sim* | Alternativa a number/chatid |\n| title | string | Não | Título da tabela |\n| headers | string[] | Sim | Cabeçalhos das colunas |\n| rows | string[][] | Sim | Linhas de dados |\n| header_text | string | Não | Texto acima da tabela |\n| footer | string | Não | Rodapé |\n| native_rich | bool | Não | Renderização nativa rica |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/table\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"title\": \"Pedidos\", \"header_text\": \"Resumo do dia\", \"headers\": [\"ID\", \"Status\"], \"rows\": [[\"1001\", \"pago\"], [\"1002\", \"pendente\"]], \"footer\": \"Atualizado agora\", \"native_rich\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `chatid, number or jid is required`\n- headers/rows inconsistentes\n- Instância desconectada",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "title": "Pedidos",
                "header_text": "Resumo do dia",
                "headers": [
                  "ID",
                  "Status"
                ],
                "rows": [
                  [
                    "1001",
                    "pago"
                  ],
                  [
                    "1002",
                    "pendente"
                  ]
                ],
                "footer": "Atualizado agora",
                "native_rich": false
              }
            }
          }
        }
      }
    },
    "/send/code-block": {
      "post": {
        "summary": "Enviar bloco de código",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_code_block",
        "description": "# Enviar bloco de código\n\nEnvia um trecho de código formatado (syntax highlight) como mensagem rica.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/code-block\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| jid | string | Sim* | Alternativa a number/chatid |\n| code | string | Sim | Código-fonte |\n| language | string | Sim | Linguagem (ex.: go, python, javascript) |\n| title | string | Não | Título do bloco |\n| footer | string | Não | Rodapé |\n| native_rich | bool | Não | Renderização nativa rica |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/code-block\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"title\": \"Exemplo\", \"language\": \"go\", \"code\": \"package main\\n\\nfunc main() {\\n  println(\\\"hello\\\")\\n}\", \"footer\": \"GoZAP\", \"native_rich\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `code` obrigatório\n- `language` obrigatório\n- `chatid, number or jid is required`",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "title": "Exemplo",
                "language": "go",
                "code": "package main\n\nimport \"fmt\"\n\nfunc main() {\n  fmt.Println(\"hello\")\n}",
                "footer": "GoZAP",
                "native_rich": false
              }
            }
          }
        }
      }
    },
    "/send/latex": {
      "post": {
        "summary": "Enviar LaTeX / fórmula",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_latex",
        "description": "# Enviar fórmula LaTeX\n\nEnvia texto com expressões matemáticas em LaTeX renderizadas como mensagem rica.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/latex\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| jid | string | Sim* | Alternativa a number/chatid |\n| text | string | Não | Texto de contexto |\n| expressions | string[] | Não | Lista de expressões LaTeX |\n| native_rich | bool | Não | Renderização nativa rica |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/latex\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"text\": \"Equação de Einstein\", \"expressions\": [\"E=mc^2\"], \"native_rich\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `chatid, number or jid is required`\n- Expressão LaTeX inválida\n- Instância desconectada",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "text": "Equação de Einstein",
                "expressions": [
                  "E=mc^2"
                ],
                "native_rich": false
              }
            }
          }
        }
      }
    },
    "/send/sticker": {
      "post": {
        "summary": "Enviar figurinha",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_sticker",
        "description": "# Enviar figurinha\n\nEnvia uma figurinha (sticker). Aceita webp, gif, png ou jpeg — a API converte para WebP quando necessário.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/sticker\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário (telefone ou JID). Alternativa: chatid |\n| chatid | string | Sim* | JID do chat. Use number OU chatid |\n| url | string | Sim* | URL pública da mídia |\n| base64 | string | Sim* | Mídia em base64 / data URI (alternativa a url) |\n| mimetype | string | Não | MIME type (ex.: image/jpeg) |\n| image | string | Não | Alias de url para imagem |\n| imageUrl | string | Não | Alias de url para imagem |\n| video | string | Não | Alias de url para vídeo |\n| videoUrl | string | Não | Alias de url para vídeo |\n| audio | string | Não | Alias de url para áudio |\n| audioUrl | string | Não | Alias de url para áudio |\n| file | string | Não | Alias de url para documento |\n| media | string | Não | Alias genérico de url |\n| spoiler | bool | Não | Envolve em spoilerMessage |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| ai | bool | Não | Ícone AI (DM, modo web) |\n| secure_meta_service_label | bool | Não | Força nó quality_control (web) |\n| is_lottie | bool | Não | Marca figurinha como Lottie |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/sticker\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"url\": \"https://exemplo.com/figurinha.webp\", \"is_lottie\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Falha na conversão para WebP\n- URL/base64 ausente\n- Instância desconectada\n\n## Observações\n\n- O handler força `type=sticker`. Use `is_lottie=true` para figurinhas Lottie.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "url": "https://exemplo.com/figurinha.webp",
                "is_lottie": false
              }
            }
          }
        }
      }
    },
    "/send/sticker-pack": {
      "post": {
        "summary": "Enviar pack de figurinhas",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_sticker_pack",
        "description": "# Enviar pack de figurinhas\n\nMonta e envia um pacote de figurinhas (capa + stickers). Disponível apenas no modo web (companion).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/sticker-pack\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| name | string | Sim | Nome do pack |\n| publisher | string | Não | Editora/autor |\n| description | string | Não | Descrição |\n| cover.url / cover.base64 | string | Sim | Capa do pack |\n| stickers | array | Sim | Lista de figurinhas |\n| stickers[].url / base64 | string | Sim | Arquivo da figurinha |\n| stickers[].emojis | string[] | Não | Emojis associados |\n| stickers[].accessibility_label | string | Não | Rótulo de acessibilidade |\n| stickers[].is_lottie | bool | Não | Figurinha Lottie |\n| spoiler / ai / group_status / channel_status / external_ad_reply / ... | vários | Não | MessageExtras opcionais |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/sticker-pack\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"name\": \"Meu Pack\", \"publisher\": \"GoZAP\", \"description\": \"Figurinhas de demonstração\", \"cover\": {\"url\": \"https://exemplo.com/cover.webp\"}, \"stickers\": [{\"url\": \"https://exemplo.com/a.webp\", \"emojis\": [\"😀\"]}, {\"url\": \"https://exemplo.com/b.webp\", \"emojis\": [\"🔥\"], \"accessibility_label\": \"fogo\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `number or chatid is required`\n- `sticker pack send is web-only (mobile does not support MediaStickerPack upload yet)`\n- Falha ao baixar/converter capa ou stickers\n\n## Observações\n\n- Web-only: não funciona em instâncias no modo mobile de conexão.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "name": "Meu Pack",
                "publisher": "GoZAP",
                "description": "Figurinhas de demonstração",
                "cover": {
                  "url": "https://exemplo.com/cover.webp"
                },
                "stickers": [
                  {
                    "url": "https://exemplo.com/a.webp",
                    "emojis": [
                      "😀"
                    ]
                  },
                  {
                    "url": "https://exemplo.com/b.webp",
                    "emojis": [
                      "🔥"
                    ],
                    "accessibility_label": "fogo"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/group-status": {
      "post": {
        "summary": "Enviar status de grupo",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_group_status",
        "description": "# Enviar status de grupo\n\nEnvia uma mídia como status de grupo (group status). O destinatário deve ser um JID `@g.us`.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/group-status\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário (telefone ou JID). Alternativa: chatid |\n| chatid | string | Sim* | JID do chat. Use number OU chatid |\n| type | string | Não | image, video, audio, document, sticker, ptt/voice (padrão: image) |\n| url | string | Sim* | URL pública da mídia |\n| base64 | string | Sim* | Mídia em base64 / data URI (alternativa a url) |\n| mimetype | string | Não | MIME type (ex.: image/jpeg) |\n| caption | string | Não | Legenda |\n| text | string | Não | Alias de caption |\n| fileName | string | Não | Nome do arquivo (documentos) |\n| ptt | bool | Não | Enviar áudio como mensagem de voz (PTT) |\n| view_once | bool | Não | Visualização única (image/video/audio) |\n| image | string | Não | Alias de url para imagem |\n| imageUrl | string | Não | Alias de url para imagem |\n| video | string | Não | Alias de url para vídeo |\n| videoUrl | string | Não | Alias de url para vídeo |\n| audio | string | Não | Alias de url para áudio |\n| audioUrl | string | Não | Alias de url para áudio |\n| file | string | Não | Alias de url para documento |\n| media | string | Não | Alias genérico de url |\n| spoiler | bool | Não | Envolve em spoilerMessage |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| ai | bool | Não | Ícone AI (DM, modo web) |\n| secure_meta_service_label | bool | Não | Força nó quality_control (web) |\n| is_lottie | bool | Não | Marca figurinha como Lottie |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/group-status\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"chatid\": \"120363123456789012@g.us\", \"type\": \"image\", \"url\": \"https://exemplo.com/foto.jpg\", \"caption\": \"Aviso do grupo\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Destinatário não é `@g.us`\n- Mídia inválida\n- Instância desconectada\n\n## Observações\n\n- O handler força `group_status=true` automaticamente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "120363123456789012@g.us",
                "type": "image",
                "url": "https://exemplo.com/foto.jpg",
                "caption": "Aviso do grupo"
              }
            }
          }
        }
      }
    },
    "/send/channel-status": {
      "post": {
        "summary": "Enviar status de canal",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_channel_status",
        "description": "# Enviar status de canal\n\nEnvia uma mídia como Channel Status (24h) para um canal/newsletter (`@newsletter`).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/channel-status\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário (telefone ou JID). Alternativa: chatid |\n| chatid | string | Sim* | JID do chat. Use number OU chatid |\n| type | string | Não | image, video, audio, document, sticker, ptt/voice (padrão: image) |\n| url | string | Sim* | URL pública da mídia |\n| base64 | string | Sim* | Mídia em base64 / data URI (alternativa a url) |\n| mimetype | string | Não | MIME type (ex.: image/jpeg) |\n| caption | string | Não | Legenda |\n| text | string | Não | Alias de caption |\n| fileName | string | Não | Nome do arquivo (documentos) |\n| ptt | bool | Não | Enviar áudio como mensagem de voz (PTT) |\n| view_once | bool | Não | Visualização única (image/video/audio) |\n| image | string | Não | Alias de url para imagem |\n| imageUrl | string | Não | Alias de url para imagem |\n| video | string | Não | Alias de url para vídeo |\n| videoUrl | string | Não | Alias de url para vídeo |\n| audio | string | Não | Alias de url para áudio |\n| audioUrl | string | Não | Alias de url para áudio |\n| file | string | Não | Alias de url para documento |\n| media | string | Não | Alias genérico de url |\n| spoiler | bool | Não | Envolve em spoilerMessage |\n| group_status | bool | Não | Envia como status de grupo (prefira /send/group-status) |\n| channel_status | bool | Não | Envia como status de canal (prefira /send/channel-status) |\n| ai | bool | Não | Ícone AI (DM, modo web) |\n| secure_meta_service_label | bool | Não | Força nó quality_control (web) |\n| is_lottie | bool | Não | Marca figurinha como Lottie |\n| external_ad_reply | object | Não | Preview estilo anúncio/CTWA no ContextInfo |\n| external_ad_reply.title | string | Não | Título do card |\n| external_ad_reply.body | string | Não | Subtítulo/descrição |\n| external_ad_reply.source_url | string | Não | Link ao tocar |\n| external_ad_reply.media_url | string | Não | URL da mídia do ad (fallback: source_url) |\n| external_ad_reply.media_type | int | Não | 1=imagem (padrão), 2=vídeo |\n| external_ad_reply.thumbnail_url | string | Não | URL da miniatura |\n| external_ad_reply.thumbnail_base64 | string | Não | Miniatura em base64 ou data URI |\n| external_ad_reply.render_larger_thumbnail | bool | Não | Exibe thumbnail grande |\n| external_ad_reply.show_ad_attribution | bool | Não | Mostra badge de anúncio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/channel-status\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"120363123456789012@newsletter\", \"type\": \"image\", \"url\": \"https://exemplo.com/status.jpg\", \"caption\": \"Status do canal\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Destinatário não é `@newsletter`\n- Mídia inválida\n- Instância desconectada\n\n## Observações\n\n- O handler força `channel_status=true` automaticamente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "120363123456789012@newsletter",
                "type": "image",
                "url": "https://exemplo.com/status.jpg",
                "caption": "Status do canal"
              }
            }
          }
        }
      }
    },
    "/send/event": {
      "post": {
        "summary": "Enviar evento / convite",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_event",
        "description": "# Enviar convite de evento\n\nEnvia um convite de evento/calendário do WhatsApp (nome, horário, local, link e lembrete).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/event\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| name | string | Sim | Nome do evento |\n| description | string | Não | Descrição |\n| startTime | int | Sim | Início em Unix timestamp (segundos) |\n| endTime | int | Não | Fim em Unix timestamp (segundos) |\n| latitude | number | Não | Latitude do local (com longitude) |\n| longitude | number | Não | Longitude do local (com latitude) |\n| locationName | string | Não | Nome do local |\n| locationAddress | string | Não | Endereço do local |\n| joinLink | string | Não | Link de entrada (call/meet) |\n| extraGuestsAllowed | bool | Não | Permite convidados extras |\n| isScheduleCall | bool | Não | Marca como chamada agendada |\n| hasReminder | bool | Não | Ativa lembrete |\n| reminderOffsetSec | int | Não | Antecedência do lembrete em segundos |\n| isCanceled | bool | Não | Marca evento como cancelado |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/event\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"name\": \"Reunião de time\", \"description\": \"Alinhamento semanal\", \"startTime\": 1784500000, \"endTime\": 1784503600, \"latitude\": -23.55, \"longitude\": -46.63, \"locationName\": \"Escritório\", \"locationAddress\": \"Av. Paulista, 1000\", \"joinLink\": \"https://meet.exemplo.com/abc\", \"hasReminder\": true, \"reminderOffsetSec\": 900, \"extraGuestsAllowed\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `name is required`\n- `startTime is required`\n- Destinatário ausente",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{number}}",
                "name": "Reunião de time",
                "description": "Alinhamento semanal",
                "startTime": 1752800000,
                "endTime": 1752806400,
                "latitude": -23.55,
                "longitude": -46.63,
                "locationName": "Escritório",
                "joinLink": "https://meet.example.com/abc",
                "hasReminder": true,
                "reminderOffsetSec": 3600
              }
            }
          }
        }
      }
    },
    "/send/event-response": {
      "post": {
        "summary": "Responder convite de evento (RSVP)",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_event_response",
        "description": "# Responder convite de evento (RSVP)\n\nResponde a um convite de evento já recebido (vou / não vou / talvez), referenciando o `messageid` do evento original.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/event-response\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Não* | Chat do evento (pode ser inferido do histórico) |\n| chatid | string | Não* | Alternativa a number |\n| messageid | string | Sim* | ID da mensagem do evento |\n| messageId | string | Sim* | Alias camelCase de messageid |\n| eventMessageId | string | Sim* | Alias de messageid |\n| response | string | Sim | going | not_going | maybe (também GOING/NOT_GOING/MAYBE) |\n| extraGuestCount | int | Não | Quantidade de convidados extras |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/event-response\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"messageid\": \"3EB0EVENTMSGID001\", \"response\": \"going\", \"extraGuestCount\": 0}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `messageid is required`\n- response inválido\n- Evento original não encontrado no histórico\n\n## Observações\n\n- O prefixo `WAID:` no messageid é removido automaticamente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "messageid": "3EB0EVENTMSGID001",
                "response": "going",
                "extraGuestCount": 0
              }
            }
          }
        }
      }
    },
    "/send/poll": {
      "post": {
        "summary": "Enviar enquete",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_poll",
        "description": "# Enviar enquete\n\nCria e envia uma enquete (poll) com pergunta e opções. Para votar em uma enquete existente use `/message/poll-vote` (outro grupo).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/poll\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Sim* | Destinatário |\n| chatid | string | Sim* | Alternativa a number |\n| name | string | Sim | Pergunta da enquete |\n| options | string[] | Sim | Opções (mínimo 2) |\n| selectableCount | int | Não | Quantas opções o usuário pode marcar (0 ou omitido = 1) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/poll\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"{{remoteJid}}\", \"name\": \"Qual horário prefere?\", \"options\": [\"Manhã\", \"Tarde\", \"Noite\"], \"selectableCount\": 1}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `name is required`\n- `at least 2 options are required`\n- Instância desconectada",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{remoteJid}}",
                "name": "Qual horário prefere?",
                "options": [
                  "Manhã",
                  "Tarde",
                  "Noite"
                ],
                "selectableCount": 1
              }
            }
          }
        }
      }
    },
    "/send/comment": {
      "post": {
        "summary": "Comentar em uma mensagem",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_comment",
        "description": "# Comentar em uma mensagem\n\nEnvia um comentário criptografado em uma mensagem raiz de anúncio de comunidade. Use o `messageid` da mensagem anunciada.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/comment\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| number | string | Não* | Chat (pode ser inferido do histórico pelo messageid) |\n| chatid | string | Não* | Alternativa a number |\n| messageid | string | Sim* | ID da mensagem raiz |\n| messageId | string | Sim* | Alias camelCase |\n| rootMessageId | string | Sim* | Alias de messageid |\n| sender | string | Não | Remetente original da mensagem raiz (ajuda a resolver o contexto) |\n| text | string | Sim | Texto do comentário |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/comment\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"number\": \"120363123456789012@g.us\", \"messageid\": \"3EB0ROOTMSGID001\", \"sender\": \"5511999999999@s.whatsapp.net\", \"text\": \"Concordo com o anúncio!\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `text is required`\n- `messageid is required`\n- Mensagem raiz não encontrada / não é anúncio de comunidade",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "120363123456789012@g.us",
                "messageid": "3EB0ROOTMSGID001",
                "sender": "5511999999999@s.whatsapp.net",
                "text": "Concordo com o anúncio!"
              }
            }
          }
        }
      }
    },
    "/send/payment-request": {
      "post": {
        "summary": "Enviar botão de pagamento",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_payment_request",
        "description": "# Enviar botão de pagamento (review_and_pay)\n\nEnvia o botão nativo `review_and_pay` com pedido, itens e valor total. Diferente de `/send/request-payment` (fluxo UAZAPI/PIX).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/payment-request\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | Destinatário (JID ou número) |\n| currency | string | Sim | Moeda (ex.: BRL, USD) |\n| total_amount | int | Sim | Total na menor unidade (centavos se offset=100) |\n| offset | int | Não | Divisor monetário (padrão 100) |\n| reference_id | string | Sim | ID de referência do pagamento |\n| type | string | Não | Padrão: physical-goods |\n| payment_method | string | Não | Padrão: confirm |\n| payment_status | string | Não | Padrão: captured |\n| order | object | Sim | Pedido |\n| order.status | string | Sim | completed | pending | partially_shipped (ou valor aceito pelo WA) |\n| order.description | string | Não | Descrição |\n| order.additional_note | string | Não | Nota adicional |\n| order.items | array | Sim | Itens do pedido |\n| order.items[].retailer_id | string | Não | SKU/ID interno |\n| order.items[].name | string | Sim | Nome do item |\n| order.items[].amount | int | Sim | Preço unitário (mesma escala de total_amount) |\n| order.items[].quantity | int | Sim | Quantidade |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/payment-request\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jid\": \"{{remoteJid}}\", \"currency\": \"BRL\", \"total_amount\": 9900, \"offset\": 100, \"reference_id\": \"REF-2026-0001\", \"type\": \"physical-goods\", \"payment_method\": \"confirm\", \"payment_status\": \"captured\", \"order\": {\"status\": \"pending\", \"description\": \"Pedido #1001\", \"additional_note\": \"Entrega em 3 dias\", \"items\": [{\"retailer_id\": \"sku-001\", \"name\": \"Plano Pro\", \"amount\": 9900, \"quantity\": 1}]}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"result\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- Campos binding required ausentes (jid, currency, total_amount, reference_id, order)\n- Instância desconectada\n- JID inválido\n\n## Observações\n\n- A resposta usa `result` (não `message`).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "{{remoteJid}}",
                "currency": "BRL",
                "total_amount": 9900,
                "offset": 100,
                "reference_id": "REF-2026-0001",
                "type": "physical-goods",
                "payment_method": "confirm",
                "payment_status": "captured",
                "order": {
                  "status": "pending",
                  "description": "Pedido #1001",
                  "additional_note": "Entrega em 3 dias",
                  "items": [
                    {
                      "retailer_id": "sku-001",
                      "name": "Plano Pro",
                      "amount": 9900,
                      "quantity": 1
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/send/album": {
      "post": {
        "summary": "Enviar álbum de imagens",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_album",
        "description": "# Enviar álbum de imagens\n\nEnvia várias imagens em sequência para o mesmo chat. O WhatsApp agrupa automaticamente em um álbum (máx. 20 itens).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/album\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | Destinatário |\n| caption | string | Não | Legenda aplicada ao primeiro item se ele não tiver caption |\n| items | array | Sim | Itens do álbum (1–20) |\n| items[].type | string | Não | Apenas `image` (outros tipos são ignorados) |\n| items[].url | string | Sim | URL da imagem |\n| items[].caption | string | Não | Legenda do item |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/album\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jid\": \"{{remoteJid}}\", \"caption\": \"Fotos do produto\", \"items\": [{\"type\": \"image\", \"url\": \"https://exemplo.com/1.jpg\", \"caption\": \"Frente\"}, {\"type\": \"image\", \"url\": \"https://exemplo.com/2.jpg\"}, {\"type\": \"image\", \"url\": \"https://exemplo.com/3.jpg\"}]}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"result\": {\n    \"results\": [\n      {\n        \"id\": \"3EB0AAA111\",\n        \"timestamp\": \"2026-07-17T12:34:56Z\"\n      },\n      {\n        \"id\": \"3EB0BBB222\",\n        \"timestamp\": \"2026-07-17T12:34:57Z\"\n      }\n    ],\n    \"sent\": 2,\n    \"failed\": 0\n  }\n}\n```\n\n## Erros comuns\n\n- `album must have at least 1 item`\n- `album exceeds max 20 items`\n- `jid` ausente\n\n## Observações\n\n- Somente imagens. Itens com type diferente de image (ou vazio tratado como image) são contados como failed.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "{{remoteJid}}",
                "caption": "Fotos do produto",
                "items": [
                  {
                    "type": "image",
                    "url": "https://exemplo.com/1.jpg",
                    "caption": "Frente"
                  },
                  {
                    "type": "image",
                    "url": "https://exemplo.com/2.jpg"
                  },
                  {
                    "type": "image",
                    "url": "https://exemplo.com/3.jpg"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/send/product": {
      "post": {
        "summary": "Enviar mensagem de produto",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_product",
        "description": "# Enviar mensagem de produto\n\nEnvia uma mensagem de produto do catálogo da instância para um chat. O `product_id` deve existir no catálogo.\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/product\n```\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | Destinatário |\n| product_id | string | Sim | ID do produto no catálogo |\n| caption | string | Não | Legenda |\n| title | string | Não | Título exibido (override) |\n| subtitle | string | Não | Subtítulo |\n| footer | string | Não | Rodapé |\n| business_owner_jid | string | Não | JID do dono do catálogo/negócio |\n| view_once | bool | Não | Visualização única |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/product\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jid\": \"{{remoteJid}}\", \"product_id\": \"prod-123\", \"caption\": \"Confira este produto\", \"title\": \"Camiseta Premium\", \"subtitle\": \"Algodão egípcio\", \"footer\": \"Loja GoZAP\", \"business_owner_jid\": \"5511888888888@s.whatsapp.net\", \"view_once\": false}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"result\": {\n    \"id\": \"3EB0A1B2C3D4E5F6\",\n    \"timestamp\": \"2026-07-17T12:34:56Z\",\n    \"sender\": \"5511888888888@s.whatsapp.net\"\n  }\n}\n```\n\n## Erros comuns\n\n- `jid` / `product_id` ausentes\n- Produto não encontrado no catálogo\n- Instância desconectada\n\n## Observações\n\n- A resposta usa `result` (não `message`). Cadastre produtos em `/catalog` antes.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "{{remoteJid}}",
                "product_id": "prod-123",
                "caption": "Confira este produto",
                "title": "Camiseta Premium",
                "subtitle": "Algodão egípcio",
                "footer": "Loja GoZAP",
                "business_owner_jid": "5511888888888@s.whatsapp.net",
                "view_once": false
              }
            }
          }
        }
      }
    },
    "/send/call-link": {
      "post": {
        "summary": "Enviar link de chamada",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_call_link",
        "description": "# Enviar link de chamada\n\nCria um link de chamada e envia ao chat: texto com a URL, ou evento/convite quando `name` + `event_start_time` estão presentes. Funciona em mobile e companion.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/send/call-link\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"number\": \"{{number}}\",\n  \"media\": \"audio\",\n  \"waiting_room\": false,\n  \"text\": \"Entre na chamada:\"\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"link\": {\n    \"token\": \"AbCtoken\",\n    \"media\": \"audio\",\n    \"url\": \"https://call.whatsapp.com/voice/AbCtoken\"\n  },\n  \"message\": {}\n}\n```\n\n## Observações\n\nDestinatário: `number` ou `chatid`. Sem `name`/`event_start_time`, envia texto (`text` opcional; a URL é anexada se faltar). Com `name` + `event_start_time`, envia EventMessage com `joinLink`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "{{number}}",
                "media": "audio",
                "waiting_room": false,
                "text": "Entre na chamada:"
              }
            }
          }
        }
      }
    },
    "/send/meta-ai": {
      "post": {
        "summary": "Enviar prompt Meta AI",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_post_send_meta_ai",
        "description": "# Enviar prompt Meta AI\n\nEnvia um texto para o Meta AI (`867051314767696@bot`). Funciona em mobile e companion. A resposta do bot chega depois em mensagens inbound (streaming com `bot edit=first|inner|last`).\n\n## Endpoint\n\n```http\nPOST {{baseUrl}}/send/meta-ai\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| text | string | Sim | Prompt para o Meta AI |\n| destination_id | string | Não | UUID da thread; omita para iniciar conversa nova |\n| bot_jid | string | Não | Padrão: `867051314767696@bot` |\n| persona_type | string | Não | Padrão: `default` |\n| async | bool | Não | Enfileira o envio se `true` |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/meta-ai\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\": \"Olá, quem é você?\"}'\n```\n\nContinuar a mesma thread:\n\n```bash\ncurl -X POST \"{{baseUrl}}/send/meta-ai\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\": \"E o que você consegue fazer?\", \"destination_id\": \"064627fb-adf7-46ac-8b9b-02ce825b0e5e\"}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"ACC7455AF44ECE28BE404CB9975693FB\",\n    \"timestamp\": \"2026-07-17T15:00:00Z\",\n    \"bot_jid\": \"867051314767696@bot\",\n    \"destination_id\": \"064627fb-adf7-46ac-8b9b-02ce825b0e5e\"\n  }\n}\n```\n\n## Erros comuns\n\n- `text` ausente\n- Instância desconectada\n- `bot_jid` sem sufixo `@bot`\n\n## Observações\n\n- Guarde `destination_id` para continuar o mesmo chat com o Meta AI.\n- A resposta do bot não vem neste endpoint; escute webhooks/SSE de mensagens do JID `@bot`.\n- Liste bots disponíveis em `GET /bots`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "text": "Olá, quem é você?"
              }
            }
          }
        }
      }
    },
    "/bots": {
      "get": {
        "summary": "Listar bots (Meta AI)",
        "tags": [
          "Enviar Mensagem"
        ],
        "operationId": "enviar_mensagem_get_bots",
        "description": "# Listar bots\n\nRetorna os bots disponíveis na conta (incluindo Meta AI) via IQ `xmlns=bot` v=2. Funciona em mobile e companion.\n\n## Endpoint\n\n```http\nGET {{baseUrl}}/bots\n```\n\n## Autenticação\n\n```http\ntoken: {{token}}\n```\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/bots\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"bots\": [\n    {\n      \"jid\": \"867051314767696@bot\",\n      \"persona_id\": \"867051314767696$760019659443059\"\n    }\n  ]\n}\n```\n\n## Observações\n\n- Use o `jid` em `POST /send/meta-ai` (`bot_jid`) se quiser outro bot que não o Meta AI padrão.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/message/async": {
      "get": {
        "summary": "Consultar fila de envio assíncrono",
        "tags": [
          "Mensagem Async"
        ],
        "operationId": "mensagem_async_get_message_async",
        "description": "# Consultar fila de envio assíncrono\n\nRetorna o status da fila interna de mensagens enviadas com `async=true` na instância autenticada. Use para monitorar backlog e se a sessão está pronta.\n\n## Endpoint\n\n`GET {{baseUrl}}/message/async`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Parâmetros\n\nNenhum. A instância vem do token.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/message/async\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": \"Async queue status\",\n  \"instanceId\": \"r183e2ef9597845\",\n  \"queue\": {\n    \"status\": \"queued\",\n    \"pending\": 12,\n    \"processingNow\": true,\n    \"acceptingNewMessages\": true,\n    \"sessionReady\": true,\n    \"resetting\": false\n  }\n}\n```\n\nStatus possíveis de `queue.status`: `idle`, `queued`, `processing`, `waiting_connection`, `resetting`.\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — fila indisponível (`async queue not accepting`)\n\n## Observações\n\n- Esta fila é só de envio `async=true` da GoZap — não lista webhooks nem filas externas.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "delete": {
        "summary": "Limpar fila de envio assíncrono",
        "tags": [
          "Mensagem Async"
        ],
        "operationId": "mensagem_async_delete_message_async",
        "description": "# Limpar fila de envio assíncrono\n\nCancela/drena jobs pendentes da fila `async` da instância. Use com cuidado: mensagens ainda não enviadas serão descartadas/canceladas.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/message/async`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Parâmetros\n\nNenhum. A instância vem do token.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X DELETE \"{{baseUrl}}/message/async\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": \"Async queue cleared\",\n  \"instanceId\": \"r183e2ef9597845\",\n  \"stats\": {\n    \"trackedJobsCleared\": 10,\n    \"bufferedJobsMarkedCanceled\": 2,\n    \"drainedChannelJobs\": 8,\n    \"clearedOverflowJobs\": 0,\n    \"persistedQueuedCanceled\": 10\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `409` — fila ainda não drenou (`async queue not drained`), com `stats` no body\n- `500` — fila indisponível\n\n## Observações\n\n- Durante o clear, `acceptingNewMessages` pode ficar `false` temporariamente (`resetting`).",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/instance/updateDelaySettings": {
      "post": {
        "summary": "Configurar delay entre mensagens async",
        "tags": [
          "Mensagem Async"
        ],
        "operationId": "mensagem_async_post_instance_updatedelaysettings",
        "description": "# Configurar delay entre mensagens async\n\nAjusta o intervalo aleatório entre envios da fila assíncrona e os parâmetros de presença automática (\"digitando…\"). Valores negativos são normalizados para `0`; se `max < min`, o max é elevado ao min.\n\n## Endpoint\n\n`POST {{baseUrl}}/instance/updateDelaySettings`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| msg_delay_min_ms | integer | Não | Delay mínimo entre mensagens async (ms) |\n| msg_delay_max_ms | integer | Não | Delay máximo entre mensagens async (ms) |\n| auto_presence_delay | boolean | Não | Ativa presença automática antes do envio |\n| presence_ms_per_char | integer | Não | Ms de \"digitando\" por caractere do texto |\n| presence_jitter_min_ms | integer | Não | Jitter mínimo da presença (ms) |\n| presence_jitter_max_ms | integer | Não | Jitter máximo da presença (ms) |\n\nCorpo opcional: campos omitidos podem ser gravados como zero/`false` conforme o bind.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/instance/updateDelaySettings\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"msg_delay_min_ms\": 1000,\n    \"msg_delay_max_ms\": 3000,\n    \"auto_presence_delay\": true,\n    \"presence_ms_per_char\": 50,\n    \"presence_jitter_min_ms\": 100,\n    \"presence_jitter_max_ms\": 500\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"instance\": {\n    \"id\": \"r183e2ef9597845\",\n    \"msg_delay_min_ms\": 1000,\n    \"msg_delay_max_ms\": 3000,\n    \"auto_presence_delay\": true\n  },\n  \"runtime\": {\n    \"connected\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — falha ao persistir configurações",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "msg_delay_min_ms": 1000,
                "msg_delay_max_ms": 3000,
                "auto_presence_delay": true,
                "presence_ms_per_char": 50,
                "presence_jitter_min_ms": 100,
                "presence_jitter_max_ms": 500
              }
            }
          }
        }
      }
    },
    "/message/download": {
      "post": {
        "summary": "Baixar mídia de uma mensagem",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_download",
        "description": "# Baixar mídia de uma mensagem\n\nBaixa o arquivo (imagem, vídeo, áudio, documento, sticker etc.) associado a uma mensagem já registrada no histórico da instância. Use quando precisar da URL pública temporária ou do binário da mídia.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/download`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}` (token da instância).\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não* | JID do chat (`5511...@s.whatsapp.net` ou grupo `@g.us`) |\n| messageid | string | Não* | ID da mensagem no histórico |\n\n* Informe `chatid`, `messageid` ou ambos. Pelo menos um é obrigatório.\n\nQuery opcional: `?download=1` — em vez de JSON, a API responde com o arquivo binário (`Content-Disposition: attachment`).\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/download\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"7EB0F01D7244B421048F0706368376E0\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"mimetype\": \"image/jpeg\",\n  \"media_url\": \"https://develop.gozap.dev/media/r183e2ef9597845/7EB0F01D7244B421048F0706368376E0.jpg\",\n  \"media_url_expires_at\": \"2026-07-17T12:00:00Z\"\n}\n```\n\n## Erros comuns\n\n- `400` — nenhum de `chatid`/`messageid` informado\n- `401` — token ausente ou inválido\n- `404` — mídia expirada (`media expired`)\n- `500` — falha ao recuperar a mídia no storage/WhatsApp\n\n## Observações\n\n- A mensagem precisa existir no histórico da instância.\n- `media_url` é um link público temporário (sem token) servido por `GET /media/:instanceID/:messageID`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "7EB0F01D7244B421048F0706368376E0"
              }
            }
          }
        }
      }
    },
    "/message/find": {
      "post": {
        "summary": "Buscar mensagens no histórico",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_find",
        "description": "# Buscar mensagens no histórico\n\nConsulta mensagens já persistidas no banco da instância (não pede histórico novo ao WhatsApp). Use para listar o histórico local de um chat, paginar ou buscar uma mensagem pelo ID.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/find`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não | Filtra por chat (JID canônico) |\n| messageid | string | Não | Filtra por ID exato da mensagem |\n| limit | integer | Não | Quantidade máxima (padrão/teto aplicados pela API; tipicamente até 500) |\n| offset | integer | Não | Deslocamento para paginação (mínimo 0) |\n\nCorpo JSON é opcional: sem filtros, retorna as mensagens mais recentes da instância.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/find\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"limit\": 20,\n    \"offset\": 0\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"messageid\": \"7EB0F01D7244B421048F0706368376E0\",\n      \"chatid\": \"5511999999999@s.whatsapp.net\",\n      \"fromMe\": false,\n      \"messageTimestamp\": 1721200000,\n      \"type\": \"conversation\",\n      \"body\": \"Olá\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — erro ao consultar o histórico\n\n## Observações\n\n- Ordenação: `messageTimestamp` decrescente (mais recentes primeiro).\n- Para pedir mensagens antigas que ainda não estão no banco, use `POST /message/history-sync`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "limit": 20,
                "offset": 0
              }
            }
          }
        }
      }
    },
    "/message/history-sync": {
      "post": {
        "summary": "Solicitar histórico sob demanda",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_history_sync",
        "description": "# Solicitar histórico sob demanda\n\nPede aos seus próprios dispositivos WhatsApp mensagens **mais antigas** que uma mensagem-cursor. A resposta HTTP só confirma o pedido; as mensagens chegam depois via evento de History Sync (ON_DEMAND) e são gravadas no histórico.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/history-sync`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Condicional | JID do chat. Aceita também `number` ou `jid` (mesmo valor) |\n| number | string | Condicional | Alternativa a `chatid` |\n| jid | string | Condicional | Alternativa a `chatid` |\n| messageid | string | Sim | ID da mensagem-cursor (a mais antiga conhecida; prefixo `WAID:` é removido) |\n| messageId | string | Não | Alias camelCase de `messageid` |\n| fromMe | boolean | Condicional | Se a mensagem-cursor foi enviada por você. Obrigatório se ela **não** estiver no histórico local |\n| timestamp | integer | Condicional | Unix (segundos ou ms) da mensagem-cursor. Obrigatório se ela **não** estiver no histórico local |\n| count | integer | Não | Quantidade a pedir (padrão `50`, máximo `300`) |\n\nSe a mensagem-cursor já existir no histórico, `chatid`/`fromMe`/`timestamp` podem ser inferidos (ou sobrescritos). Se não existir, informe `chatid` (ou `number`/`jid`) + `timestamp` (+ `fromMe` se for sua).\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/history-sync\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB01234567890ABCDEF\",\n    \"fromMe\": false,\n    \"timestamp\": 1721200000,\n    \"count\": 50\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0PEERMSGID\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n(Em instâncias mobile o `id` do peer message pode vir vazio; o pedido ainda é enviado.)\n\n## Erros comuns\n\n- `400`/`500` — `messageid is required`\n- `500` — `chatid is required when message is not in history`\n- `500` — `timestamp is required when message is not in history`\n- `500` — `chatid does not match stored message` (chat informado diverge do histórico)\n\n## Observações\n\n- Não existe campo `mode` (`history`/`exact`): o endpoint sempre pede mensagens anteriores ao cursor.\n- Após o sucesso, acompanhe webhooks/SSE/histórico local — as mensagens não vêm no body desta resposta.\n- Funciona em modo companion e mobile (peer HISTORY_SYNC_ON_DEMAND).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB01234567890ABCDEF",
                "fromMe": false,
                "timestamp": 1721200000,
                "count": 50
              }
            }
          }
        }
      }
    },
    "/message/markread": {
      "post": {
        "summary": "Marcar mensagens como lidas",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_markread",
        "description": "# Marcar mensagens como lidas\n\nEnvia recibimento de leitura (ticks azuis) para uma ou mais mensagens de um chat. Use após processar mensagens recebidas no seu sistema.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/markread`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| sender | string | Não | Remetente (útil em grupos / LID) |\n| messageid | string | Não* | ID único; é acrescentado à lista `ids` |\n| ids | array[string] | Não* | Lista de IDs de mensagem |\n\n* Se `messageid` e `ids` estiverem vazios, a API responde `{\"success\":true}` sem chamar o WhatsApp.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/markread\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"ids\": [\"3EB01234567890ABCDEF\", \"3EB0FEDCBA0987654321\"]\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — instância desconectada ou falha no MarkRead\n\n## Observações\n\n- Diferente de `POST /chat/read`, que marca o **chat** como lido/não lido no app state; este endpoint marca **mensagens** específicas.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "ids": [
                  "3EB01234567890ABCDEF"
                ]
              }
            }
          }
        }
      }
    },
    "/message/react": {
      "post": {
        "summary": "Reagir a uma mensagem",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_react",
        "description": "# Reagir a uma mensagem\n\nEnvia (ou remove) uma reação emoji em uma mensagem existente. Para remover a reação, envie `reaction` como string vazia `\"\"`.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/react`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim | JID do chat |\n| messageid | string | Sim | ID da mensagem alvo |\n| reaction | string | Sim | Emoji (ex.: `👍`) ou `\"\"` para remover |\n| sender | string | Não | JID do autor da mensagem (recomendado em grupos) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/react\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB0538DA65A59F6D8A251\",\n    \"reaction\": \"👍\",\n    \"sender\": \"5511999999999@s.whatsapp.net\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0REACTID\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — mensagem/chat inválidos ou sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB0538DA65A59F6D8A251",
                "reaction": "👍",
                "sender": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/message/delete": {
      "post": {
        "summary": "Apagar mensagem para todos",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_delete",
        "description": "# Apagar mensagem para todos\n\nRevoga uma mensagem no WhatsApp (delete for everyone). Em geral só funciona para mensagens enviadas por você, dentro da janela permitida pelo WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/delete`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim | JID do chat |\n| messageid | string | Sim | ID da mensagem a revogar |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/delete\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB0538DA65A59F6D8A251\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0REVOKEID\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — mensagem não encontrada / fora do prazo / sessão offline\n\n## Observações\n\n- Para apagar **somente na sua conta** (sem revogar para os outros), use `POST /message/delete-for-me`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB0538DA65A59F6D8A251"
              }
            }
          }
        }
      }
    },
    "/message/edit": {
      "post": {
        "summary": "Editar mensagem enviada",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_edit",
        "description": "# Editar mensagem enviada\n\nAltera o texto de uma mensagem que você já enviou. Só mensagens de texto próprias, dentro das regras do WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/edit`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim | JID do chat |\n| messageid | string | Sim | ID da mensagem original |\n| text | string | Sim | Novo conteúdo de texto |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/edit\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3A12345678901234567890123456789012\",\n    \"text\": \"Texto editado da mensagem\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3A12345678901234567890123456789012\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — mensagem não editável ou sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3A12345678901234567890123456789012",
                "text": "Texto editado da mensagem"
              }
            }
          }
        }
      }
    },
    "/message/pin": {
      "post": {
        "summary": "Fixar ou desafixar mensagem",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_pin",
        "description": "# Fixar ou desafixar mensagem\n\nFixa (ou remove o pin) de uma mensagem no chat para todos os participantes (`PinInChatMessage`).\n\n## Endpoint\n\n`POST {{baseUrl}}/message/pin`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| messageid | string | Sim | ID da mensagem (`messageId` também aceito) |\n| sender | string | Não | Autor da mensagem (recomendado em grupos) |\n| pin | boolean | Não | `true` fixa (padrão), `false` desafixa |\n\n* Informe `chatid` ou `number`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/pin\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3A12345678901234567890123456789012\",\n    \"pin\": true\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0PINMSG\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — `messageid is required` / `chatid is required`\n- `500` — sessão offline\n\n## Observações\n\n- Não existe campo `duration` neste endpoint: o pin é PIN_FOR_ALL / UNPIN_FOR_ALL.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3A12345678901234567890123456789012",
                "pin": true
              }
            }
          }
        }
      }
    },
    "/media/{instanceID}/{messageID}": {
      "get": {
        "summary": "Servir mídia temporária",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_get_media_instanceid_messageid",
        "description": "# Servir mídia temporária\n\nServe arquivo em cache temporário associado a uma mensagem. Usado após download de mídia ou envio assíncrono.\n\n## Endpoint\n\n``` http\nGET {{baseUrl}}/media/{{instanceID}}/{{messageID}}\n```\n\n## Autenticação\n\n``` http\nNenhuma (rota pública).\n```\n\n## Observações\n\nNão exige token. Retorna 404 se a mídia expirou ou não existe."
      }
    },
    "/message/delete-for-me": {
      "post": {
        "summary": "Apagar mensagem só para mim",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_delete_for_me",
        "description": "# Apagar mensagem só para mim\n\nRemove a mensagem apenas na sua conta (app state DeleteForMe). Os outros participantes continuam vendo a mensagem. Diferente de `POST /message/delete` (revoke para todos).\n\n## Endpoint\n\n`POST {{baseUrl}}/message/delete-for-me`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| messageid | string | Sim | ID da mensagem (`messageId` também aceito) |\n| sender | string | Não | Remetente (em grupos); se omitido e a msg estiver no histórico, a API completa |\n| deleteMedia | boolean | Não | Se `true`, também remove mídia associada no app state |\n\n* Informe `chatid` ou `number`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/delete-for-me\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB0538DA65A59F6D8A251\",\n    \"deleteMedia\": false\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `messageid is required`\n- `401` — token ausente ou inválido\n- `500` — sessão offline / falha no app state",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB0538DA65A59F6D8A251",
                "deleteMedia": false
              }
            }
          }
        }
      }
    },
    "/message/star": {
      "post": {
        "summary": "Favoritar ou desfavoritar mensagem",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_star",
        "description": "# Favoritar ou desfavoritar mensagem\n\nMarca (ou remove a estrela de) uma mensagem via app state, sincronizando entre seus dispositivos.\n\n## Endpoint\n\n`POST {{baseUrl}}/message/star`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| messageid | string | Sim | ID da mensagem (`messageId` também aceito) |\n| sender | string | Não | Remetente; se omitido, usa o próprio chat |\n| fromMe | boolean | Não | Se a mensagem foi enviada por você (padrão `false`) |\n| starred | boolean | Não | `true` favorita (padrão), `false` remove a estrela |\n\n* Informe `chatid` ou `number`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/star\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB0538DA65A59F6D8A251\",\n    \"fromMe\": false,\n    \"starred\": true\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — `messageid is required` / sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB0538DA65A59F6D8A251",
                "fromMe": false,
                "starred": true
              }
            }
          }
        }
      }
    },
    "/message/poll-vote": {
      "post": {
        "summary": "Votar em enquete",
        "tags": [
          "Ações na mensagem e Buscar"
        ],
        "operationId": "acoes_na_mensagem_e_buscar_post_message_poll_vote",
        "description": "# Votar em enquete\n\nEnvia voto em uma enquete já existente no histórico. A mensagem da enquete precisa estar salva localmente (a API monta o voto a partir do registro).\n\n## Endpoint\n\n`POST {{baseUrl}}/message/poll-vote`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat da enquete |\n| number | string | Sim* | Alternativa a `chatid` |\n| messageid | string | Sim | ID da mensagem da enquete (`messageId` também aceito) |\n| options | array[string] | Sim | Texto(s) da(s) opção(ões) escolhida(s), exatamente como na enquete |\n\n* Informe `chatid` ou `number`.\n\nSuporta `async=true` no payload (fila assíncrona), como outros envios.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/message/poll-vote\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"messageid\": \"3EB0POLLMSGID00000001\",\n    \"options\": [\"Opção A\"]\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0VOTEID\",\n    \"timestamp\": \"2026-07-17T06:45:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `500` — `messageid is required` / `options are required`\n- `500` — `poll message not found` (enquete ausente no histórico)\n- `401` — token ausente ou inválido\n- `202` — enfileirado se `async=true` (`queued: true`)",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "messageid": "3EB0POLLMSGID00000001",
                "options": [
                  "Opção A"
                ]
              }
            }
          }
        }
      }
    },
    "/group/create": {
      "post": {
        "summary": "Criar um novo grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_create",
        "description": "# Criar um novo grupo\n\nCria um grupo no WhatsApp e adiciona os participantes informados. Use quando precisar abrir um grupo novo pela API (atendimento, equipe, campanha).\n\n## Endpoint\n\n`POST {{baseUrl}}/group/create`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| name | string | Sim | Nome do grupo |\n| participants | array de string | Sim | Números dos participantes iniciais (somente dígitos, com DDI) |\n| isCommunity | boolean | Não | Se `true`, cria como comunidade (prefira `/community/create`) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/create\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Meu Novo Grupo\",\n  \"participants\": [\n    \"5521987905995\"\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"group\": {\n    \"JID\": \"120363123456789012@g.us\",\n    \"OwnerJID\": \"5511999999999@s.whatsapp.net\",\n    \"Name\": \"Meu Novo Grupo\",\n    \"GroupCreated\": \"2026-07-17T12:00:00Z\",\n    \"ParticipantVersionID\": \"1234567890\",\n    \"Participants\": [\n      {\"JID\": \"5511999999999@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": true},\n      {\"JID\": \"5521987905995@s.whatsapp.net\", \"IsAdmin\": false, \"IsSuperAdmin\": false}\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- Instância desconectada ou token inválido (401).\n- Participante sem WhatsApp ou número mal formatado.\n- WhatsApp pode limitar quantos membros dá para adicionar de uma vez.\n\n## Observações\n\n- O criador do grupo é a conta da instância autenticada.\n- Números sem `+`, espaços ou pontuação — ex.: `5521987905995`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Meu Novo Grupo",
                "participants": [
                  "5521987905995"
                ]
              }
            }
          }
        }
      }
    },
    "/group/info": {
      "post": {
        "summary": "Obter informações detalhadas de um grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_info",
        "description": "# Obter informações do grupo\n\nRetorna metadados e participantes de um grupo pelo JID. Use para auditar membros, configs e sincronizar com sistemas externos.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/info`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo (`...@g.us`) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/info\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363153742561022@g.us\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"group\": {\n    \"JID\": \"120363153742561022@g.us\",\n    \"OwnerJID\": \"5511999999999@s.whatsapp.net\",\n    \"Name\": \"Equipe Comercial\",\n    \"Topic\": \"Grupo oficial da equipe comercial\",\n    \"GroupCreated\": \"2026-01-10T15:00:00Z\",\n    \"IsAnnounce\": false,\n    \"IsLocked\": true,\n    \"IsJoinApprovalRequired\": false,\n    \"Participants\": [\n      {\"JID\": \"5511999999999@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": true},\n      {\"JID\": \"5511888888888@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": false}\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `jid` ausente ou inválido.\n- Grupo inacessível para a instância (não é membro).\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- A instância precisa ter acesso ao grupo consultado.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363153742561022@g.us"
              }
            }
          }
        }
      }
    },
    "/group/inviteInfo": {
      "post": {
        "summary": "Obter informações de um grupo pelo código de convite",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_inviteinfo",
        "description": "# Consultar grupo pelo convite\n\nConsulta dados públicos de um grupo a partir do código ou do link de convite, sem precisar já ser membro. Útil para validar o convite antes de entrar.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/inviteInfo`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| code | string | Condicional | Código de convite (ex.: `KmvQZbTYtUeDT88FYJN1aC`) |\n| link | string | Condicional | URL completa `https://chat.whatsapp.com/...` — usada se `code` estiver vazio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/inviteInfo\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"link\": \"https://chat.whatsapp.com/KmvQZbTYtUeDT88FYJN1aC\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"group\": {\n    \"JID\": \"120363153742561022@g.us\",\n    \"Name\": \"Equipe Comercial\",\n    \"Topic\": \"Grupo oficial da equipe comercial\",\n    \"GroupCreated\": \"2026-01-10T15:00:00Z\",\n    \"ParticipantCount\": 87\n  }\n}\n```\n\n## Erros comuns\n\n- Informe `code` ou `link` (pelo menos um).\n- Convite expirado, revogado ou inválido.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Se enviar os dois, a API prioriza `code`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "link": "https://chat.whatsapp.com/KmvQZbTYtUeDT88FYJN1aC"
              }
            }
          }
        }
      }
    },
    "/group/join": {
      "post": {
        "summary": "Entrar em um grupo usando código de convite",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_join",
        "description": "# Entrar em um grupo por convite\n\nFaz a instância entrar no grupo usando código ou link de convite. Use após validar o convite com `/group/inviteInfo`, se quiser.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/join`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| code | string | Condicional | Código de convite ou URL completa do convite |\n| link | string | Condicional | URL completa do convite — usada se `code` estiver vazio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/join\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"code\": \"KmvQZbTYtUeDT88FYJN1aC\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"jid\": \"120363153742561022@g.us\"\n}\n```\n\n## Erros comuns\n\n- Convite inválido, expirado ou revogado.\n- Grupo com aprovação de entrada: a entrada pode ficar pendente.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Informe `code` ou `link`. A resposta de sucesso traz o JID do grupo.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "code": "KmvQZbTYtUeDT88FYJN1aC"
              }
            }
          }
        }
      }
    },
    "/group/leave": {
      "post": {
        "summary": "Sair de um grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_leave",
        "description": "# Sair de um grupo\n\nRemove a instância do grupo informado. Depois disso ela deixa de receber mensagens e eventos daquele grupo.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/leave`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo (`...@g.us`) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/leave\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363324255083289@g.us\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Grupo não encontrado ou JID inválido.\n- Instância não é participante do grupo.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Operação irreversível sem um novo convite.\n- Se a instância for admin, o WhatsApp aplica as regras nativas de administração.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363324255083289@g.us"
              }
            }
          }
        }
      }
    },
    "/group/member-label": {
      "post": {
        "summary": "Definir etiqueta de membro do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_member_label",
        "description": "# Definir etiqueta de membro do grupo\n\nDefine ou remove a etiqueta de membro (`member_tag`) da própria conta autenticada dentro do grupo. É o recurso nativo do WhatsApp Business, não labels de CRM.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/member-label`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo (`...@g.us`) |\n| label | string | Não | Texto da etiqueta. String vazia remove a etiqueta |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/member-label\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363324255083289@g.us\",\n  \"label\": \"Atendimento\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"id\": \"3EB0ABCDEF0123456789\",\n  \"label\": \"Atendimento\"\n}\n```\n\n## Erros comuns\n\n- `jid` obrigatório.\n- Conta ou grupo sem suporte ao recurso `member_tag`.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Altera apenas a etiqueta da própria conta no grupo.\n- Não confundir com endpoints de labels de conversa/CRM.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363324255083289@g.us",
                "label": "Atendimento"
              }
            }
          }
        }
      }
    },
    "/group/list": {
      "get": {
        "summary": "Listar todos os grupos",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_get_group_list",
        "description": "# Listar todos os grupos\n\nRetorna os grupos em que a instância participa. Use para sincronizar inventário de grupos ou montar painéis administrativos.\n\n## Endpoint\n\n`GET {{baseUrl}}/group/list`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\nEsta rota é `GET` e **não possui corpo nem query params**. O handler chama `GetJoinedGroups` diretamente.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X GET \"{{baseUrl}}/group/list\" \\\n  -H \"token: {{token}}\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"groups\": [\n    {\n      \"JID\": \"120363324255083289@g.us\",\n      \"Name\": \"Equipe Comercial\",\n      \"Topic\": \"Grupo oficial\",\n      \"GroupCreated\": \"2026-01-10T15:00:00Z\",\n      \"IsAnnounce\": false,\n      \"IsLocked\": true,\n      \"Participants\": []\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- Instância desconectada ou token inválido.\n- Contas com muitos grupos podem demorar mais para responder.\n- Somente grupos acessíveis pela instância são retornados.\n\n## Observações\n\n- A resposta pode incluir comunidades e grupos vinculados, conforme o WhatsApp.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/group/resetInviteCode": {
      "post": {
        "summary": "Resetar código de convite do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_resetinvitecode",
        "description": "# Resetar código de convite do grupo\n\nGera um novo link/código de convite e invalida o anterior. Use para revogar acessos compartilhados por engano.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/resetInviteCode`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo (`...@g.us`) |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/resetInviteCode\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"link\": \"https://chat.whatsapp.com/AbCdEfGhIjKlMnOpQrStUv\"\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- Grupo não encontrado ou JID inválido.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Links antigos deixam de funcionar imediatamente.\n- Participantes já no grupo não são afetados.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us"
              }
            }
          }
        }
      }
    },
    "/group/updateAnnounce": {
      "post": {
        "summary": "Configurar permissões de envio de mensagens no grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updateannounce",
        "description": "# Configurar modo anúncio do grupo\n\nDefine se apenas administradores podem enviar mensagens (`value: true`) ou se todos os membros podem (`value: false`).\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateAnnounce`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| value | boolean | Sim | `true` = só admins enviam; `false` = todos enviam |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateAnnounce\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"value\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- `value` ausente ou inválido.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Exige permissão de admin. A mudança é aplicada pelo WhatsApp de imediato.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "value": true
              }
            }
          }
        }
      }
    },
    "/group/updateJoinApproval": {
      "post": {
        "summary": "Configurar aprovação para entrada no grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatejoinapproval",
        "description": "# Configurar aprovação de entrada\n\nAtiva ou desativa a aprovação administrativa para novos membros. Com aprovação ligada, quem entra por link fica pendente até um admin decidir.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateJoinApproval`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| value | boolean | Sim | `true` = exige aprovação; `false` = entrada automática |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateJoinApproval\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"value\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- Grupo sem suporte a aprovação de entrada.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Pedidos pendentes: liste com `/group/join-requests` e aprove/rejeite com `/group/join-requests/update`.\n- Membros já presentes não são afetados.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "value": true
              }
            }
          }
        }
      }
    },
    "/group/updateMemberAddMode": {
      "post": {
        "summary": "Configurar quem pode adicionar novos membros ao grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatememberaddmode",
        "description": "# Configurar quem pode adicionar membros\n\nDefine se só admins ou qualquer membro pode adicionar participantes. Aceita `mode` ou o alias genérico `value`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateMemberAddMode`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| mode | string | Condicional | `admin_add` ou `all_member_add` |\n| value | string | Condicional | Alias de `mode` — usado se `mode` estiver vazio |\n\n### Valores aceitos\n\n| Valor | Efeito |\n| --- | --- |\n| `admin_add` | Só administradores adicionam membros |\n| `all_member_add` | Qualquer membro pode adicionar |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateMemberAddMode\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"mode\": \"admin_add\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- Modo inválido (use `admin_add` ou `all_member_add`).\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Informe `mode` ou `value` com um dos valores aceitos.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "mode": "admin_add"
              }
            }
          }
        }
      }
    },
    "/group/updateDescription": {
      "post": {
        "summary": "Atualizar descrição do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatedescription",
        "description": "# Atualizar descrição do grupo\n\nAltera a descrição do grupo via `SetGroupDescription`. Use para regras, avisos e informações permanentes. Para o fluxo com topic-ID, veja `/group/updateTopic`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateDescription`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| description | string | Condicional | Nova descrição |\n| value | string | Condicional | Alias de `description` — usado se `description` estiver vazio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateDescription\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"description\": \"Grupo oficial de suporte\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador (e grupo não bloqueado para edição por não-admins).\n- Descrição vazia ou acima do limite do WhatsApp.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Diferente de `/group/updateTopic`, que usa `SetGroupTopic` (fluxo com topic-ID).\n- Informe `description` ou `value`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "description": "Grupo oficial de suporte"
              }
            }
          }
        }
      }
    },
    "/group/ephemeral": {
      "post": {
        "summary": "Configurar mensagens temporárias em grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_ephemeral",
        "description": "# Configurar mensagens temporárias no grupo\n\nDefine o temporizador de mensagens que desaparecem (Disappearing Messages) para o grupo. Afeta apenas mensagens enviadas depois da alteração.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/ephemeral`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Condicional | JID do grupo — usado se `chatid`/`number` estiverem vazios |\n| chatid | string | Condicional | Alias de destino (prioridade sobre `number` e `jid`) |\n| number | string | Condicional | Alias de destino |\n| seconds | integer | Condicional | Tempo em segundos (`0` desativa; `86400` = 24h; `604800` = 7d; `7776000` = 90d) |\n| timer | integer | Condicional | Alias de `seconds` se `seconds` for 0 |\n| duration | string ou number | Condicional | Atalhos: `off`/`0`, `1d`, `7d`, `90d`, ou número em segundos |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/ephemeral\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"seconds\": 86400\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Informe `jid`, `chatid` ou `number`.\n- Valor de duração não suportado.\n- Exige permissão de admin no grupo.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Prioridade do destino: `chatid` → `number` → `jid`.\n- Prioridade do tempo: `seconds` → `timer` → `duration`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "seconds": 86400
              }
            }
          }
        }
      }
    },
    "/group/updateImage": {
      "post": {
        "summary": "Atualizar imagem do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updateimage",
        "description": "# Atualizar imagem do grupo\n\nDefine ou remove a foto do grupo. Aceita URL pública, Base64/data-URI, ou `remove`/`delete`/vazio para limpar.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateImage`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo (`...@g.us`) |\n| image | string | Sim | URL, Base64/data-URI, ou `remove`/`delete` para remover |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateImage\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\",\n  \"image\": \"https://meusite.com/imagem.jpg\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"picture_id\": \"1234567890\",\n  \"image_updated\": true,\n  \"image_removed\": false\n}\n```\n\n## Erros comuns\n\n- `jid` obrigatório.\n- Imagem inválida ou inacessível.\n- Exige ser administrador do grupo.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- O campo correto é `jid` (não `groupjid`).\n- Na remoção, `picture_id` costuma ser `remove` e `image_removed` fica `true`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us",
                "image": "https://meusite.com/imagem.jpg"
              }
            }
          }
        }
      }
    },
    "/group/updateTopic": {
      "post": {
        "summary": "Atualizar tópico do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatetopic",
        "description": "# Atualizar tópico do grupo\n\nAtualiza o tópico/descrição via `SetGroupTopic` (fluxo com topic-ID). Diferente de `/group/updateDescription`, que usa `SetGroupDescription`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateTopic`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| topic | string | Condicional | Novo tópico |\n| value | string | Condicional | Alias de `topic` — usado se `topic` estiver vazio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateTopic\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"topic\": \"Avisos importantes da semana\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `jid` obrigatório.\n- Exige ser administrador do grupo.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Prefira este endpoint quando o fluxo de topic-ID importar.\n- Informe `topic` ou `value`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "topic": "Avisos importantes da semana"
              }
            }
          }
        }
      }
    },
    "/group/updateLocked": {
      "post": {
        "summary": "Configurar permissão de edição do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatelocked",
        "description": "# Configurar edição das informações do grupo\n\nQuando `value` é `true`, só admins editam nome, descrição e foto. Com `false`, qualquer membro pode editar essas informações.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateLocked`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| value | boolean | Sim | `true` = só admins editam; `false` = qualquer membro |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateLocked\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\",\n  \"value\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- `value` ausente ou inválido.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Não controla adição de membros, anúncio ou aprovação de entrada — use os endpoints específicos.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us",
                "value": true
              }
            }
          }
        }
      }
    },
    "/group/updateName": {
      "post": {
        "summary": "Atualizar nome do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updatename",
        "description": "# Atualizar nome do grupo\n\nAltera o nome (subject) do grupo. A mudança é sincronizada para todos os participantes.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateName`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| name | string | Condicional | Novo nome do grupo |\n| value | string | Condicional | Alias de `name` — usado se `name` estiver vazio |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateName\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363339858396166@g.us\",\n  \"name\": \"Grupo de Suporte\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador (e grupo não bloqueado para não-admins).\n- Nome vazio ou acima do limite do WhatsApp.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Informe `name` ou `value`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363339858396166@g.us",
                "name": "Grupo de Suporte"
              }
            }
          }
        }
      }
    },
    "/group/updateParticipants": {
      "post": {
        "summary": "Gerenciar participantes do grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_updateparticipants",
        "description": "# Gerenciar participantes do grupo\n\nAdiciona, remove, promove ou rebaixa participantes em lote. Para aprovar/rejeitar pedidos de entrada, use `/group/join-requests/update`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/updateParticipants`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| action | string | Não* | `add` (padrão se vazio), `remove`, `promote` ou `demote` |\n| participants | array de string | Sim | Números ou JIDs dos participantes |\n\n### Ações\n\n| action | Efeito |\n| --- | --- |\n| `add` | Adiciona participantes |\n| `remove` | Remove participantes |\n| `promote` | Promove a administrador |\n| `demote` | Remove privilégio de administrador |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/updateParticipants\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\",\n  \"participants\": [\n    \"5521987654321\",\n    \"5511999887766\"\n  ],\n  \"action\": \"promote\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"participants\": [\n    {\"JID\": \"5521987654321@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": false},\n    {\"JID\": \"5511999887766@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": false}\n  ]\n}\n```\n\n## Erros comuns\n\n- Exige ser administrador do grupo.\n- Ação inválida ou participante inacessível.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Ações deste endpoint: `add`, `remove`, `promote`, `demote`.\n- Aprovar/rejeitar pedidos: `/group/join-requests/update` com `approve`/`reject`.\n- *Se `action` vier vazio, o backend assume `add`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us",
                "participants": [
                  "5521987654321",
                  "5511999887766"
                ],
                "action": "promote"
              }
            }
          }
        }
      }
    },
    "/group/join-requests": {
      "post": {
        "summary": "Listar pedidos de entrada no grupo",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_join_requests",
        "description": "# Listar pedidos de entrada no grupo\n\nLista solicitações pendentes de entrada quando o grupo está com aprovação ativada. Use antes de aprovar ou rejeitar com `/group/join-requests/update`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/join-requests`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/join-requests\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"requests\": [\n    {\n      \"JID\": \"5511888777666@s.whatsapp.net\",\n      \"RequestedAt\": \"2026-07-17T10:30:00Z\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `jid` obrigatório.\n- Grupo sem aprovação de entrada ou sem pedidos pendentes (lista vazia).\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Exige acesso administrativo para gerenciar os pedidos em seguida.\n- Ative aprovação com `/group/updateJoinApproval` (`value: true`).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us"
              }
            }
          }
        }
      }
    },
    "/group/join-requests/update": {
      "post": {
        "summary": "Aprovar ou rejeitar pedidos de entrada",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_group_join_requests_update",
        "description": "# Aprovar ou rejeitar pedidos de entrada\n\nDecide pedidos pendentes de entrada no grupo. `action` aceita apenas `approve` ou `reject`.\n\n## Endpoint\n\n`POST {{baseUrl}}/group/join-requests/update`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Sim | JID do grupo |\n| action | string | Sim | `approve` ou `reject` |\n| participants | array de string | Sim | Números/JIDs dos solicitantes |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/group/join-requests/update\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363308883996631@g.us\",\n  \"action\": \"approve\",\n  \"participants\": [\n    \"5511888777666\"\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"participants\": [\n    {\"JID\": \"5511888777666@s.whatsapp.net\", \"IsAdmin\": false, \"IsSuperAdmin\": false}\n  ]\n}\n```\n\n## Erros comuns\n\n- `jid` e `participants` são obrigatórios.\n- Ação diferente de `approve`/`reject`.\n- Pedido inexistente ou já processado.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Exige ser administrador do grupo.\n- Liste os pendentes antes com `/group/join-requests`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363308883996631@g.us",
                "action": "approve",
                "participants": [
                  "5511888777666"
                ]
              }
            }
          }
        }
      }
    },
    "/community/create": {
      "post": {
        "summary": "Criar uma comunidade",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_community_create",
        "description": "# Criar uma comunidade\n\nCria uma comunidade no WhatsApp (mesmo handler de criação de grupo, com `isCommunity: true`). O WhatsApp gera a estrutura de comunidade/grupo pai.\n\n## Endpoint\n\n`POST {{baseUrl}}/community/create`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| name | string | Sim | Nome da comunidade |\n| participants | array de string | Não | Participantes iniciais (números com DDI) |\n| isCommunity | boolean | Sim | Deve ser `true` para criar comunidade |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/community/create\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"name\": \"Comunidade do Bairro\",\n  \"participants\": [\n    \"5511999999999\"\n  ],\n  \"isCommunity\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"group\": {\n    \"JID\": \"120363456789012345@g.us\",\n    \"Name\": \"Comunidade do Bairro\",\n    \"IsParent\": true,\n    \"OwnerJID\": \"5511999999999@s.whatsapp.net\",\n    \"Participants\": [\n      {\"JID\": \"5511999999999@s.whatsapp.net\", \"IsAdmin\": true, \"IsSuperAdmin\": true}\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `isCommunity` deve ser `true`.\n- Conta sem suporte a comunidades.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Depois vincule grupos com `/community/editgroups`.\n- Liste subgrupos com `/community/subgroups`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Comunidade do Bairro",
                "participants": [
                  "5511999999999"
                ],
                "isCommunity": true
              }
            }
          }
        }
      }
    },
    "/community/editgroups": {
      "post": {
        "summary": "Gerenciar grupos em uma comunidade",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_community_editgroups",
        "description": "# Vincular ou desvincular grupo da comunidade\n\nAssocia (`link`/`add`) ou remove (`unlink`/`remove`) **um** grupo filho de uma comunidade. Exige ser admin da comunidade.\n\n## Endpoint\n\n`POST {{baseUrl}}/community/editgroups`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| parent | string | Condicional | JID da comunidade |\n| parentJid | string | Condicional | Alias de `parent` |\n| communityJid | string | Condicional | Alias de `parent` |\n| child | string | Condicional | JID do grupo a vincular/desvincular |\n| childJid | string | Condicional | Alias de `child` |\n| groupJid | string | Condicional | Alias de `child` |\n| action | string | Sim | `link` ou `unlink` (aliases: `add` / `remove`) |\n\n### Ações\n\n| action | Alias | Efeito |\n| --- | --- | --- |\n| `link` | `add` | Vincula o grupo à comunidade |\n| `unlink` | `remove` | Remove o vínculo |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/community/editgroups\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"parent\": \"120363153742561022@g.us\",\n  \"child\": \"120363324255083289@g.us\",\n  \"action\": \"link\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"action\": \"link\",\n  \"parent\": \"120363153742561022@g.us\",\n  \"child\": \"120363324255083289@g.us\"\n}\n```\n\n## Erros comuns\n\n- Informe o JID da comunidade (`parent`/`parentJid`/`communityJid`).\n- Informe o JID do grupo (`child`/`childJid`/`groupJid`).\n- `action` fora de `link`/`unlink`/`add`/`remove`.\n- Sem permissão de admin na comunidade.\n\n## Observações\n\n- A operação é **um grupo por requisição** (não envie array `groupjids`).\n- Desvincular não apaga o grupo — só remove o vínculo com a comunidade.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "parent": "120363153742561022@g.us",
                "child": "120363324255083289@g.us",
                "action": "link"
              }
            }
          }
        }
      }
    },
    "/community/subgroups": {
      "post": {
        "summary": "Listar subgrupos da comunidade",
        "tags": [
          "Grupos e Comunidades"
        ],
        "operationId": "grupos_e_comunidades_post_community_subgroups",
        "description": "# Listar subgrupos da comunidade\n\nRetorna os grupos vinculados a uma comunidade. Use para inventariar a estrutura após criar ou editar vínculos.\n\n## Endpoint\n\n`POST {{baseUrl}}/community/subgroups`\n\n## Autenticação\n\nEnvie o token da instância no header:\n\n`token: {{token}}`\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| jid | string | Condicional | JID da comunidade |\n| communityJid | string | Condicional | Alias de `jid` |\n| parent | string | Condicional | Alias de `jid` |\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/community/subgroups\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n  \"jid\": \"120363153742561022@g.us\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"groups\": [\n    {\n      \"JID\": \"120363324255083289@g.us\",\n      \"Name\": \"Segurança\",\n      \"IsParent\": false\n    },\n    {\n      \"JID\": \"120363308883996631@g.us\",\n      \"Name\": \"Eventos\",\n      \"IsParent\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- Informe `jid`, `communityJid` ou `parent`.\n- Comunidade inexistente ou inacessível.\n- Instância desconectada ou token inválido.\n\n## Observações\n\n- Prioridade do identificador: `jid` → `communityJid` → `parent`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363153742561022@g.us"
              }
            }
          }
        }
      }
    },
    "/newsletter/create": {
      "post": {
        "summary": "Criar canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_create",
        "description": "# Criar canal\n\nCria um novo canal do WhatsApp para a conta conectada. Use quando a própria conta será dona e publicará conteúdo no canal.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/create`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Sim | Nome público do canal. |\n| `description` | string | Não | Descrição pública do canal; envie uma string vazia para criar sem descrição. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/create' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"Canal de Promoções\",\n  \"description\": \"Ofertas e novidades da loja\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\",\n    \"name\": \"Canal de Promoções\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Canal de Promoções",
                "description": "Ofertas e novidades da loja"
              }
            }
          }
        }
      }
    },
    "/newsletter/list": {
      "get": {
        "summary": "Listar canais seguidos",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_get_newsletter_list",
        "description": "# Listar canais seguidos\n\nLista os canais que a conta conectada segue ou nos quais está inscrita. Use para descobrir os JIDs que podem ser usados nas demais operações.\n\n## Endpoint\n\n`GET {{baseUrl}}/newsletter/list`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/newsletter/list' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletters\": [\n    {\n      \"jid\": \"120363123456789012@newsletter\",\n      \"name\": \"Canal de Promoções\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/newsletter/info": {
      "post": {
        "summary": "Consultar informações do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_info",
        "description": "# Consultar informações do canal\n\nRetorna os metadados de um canal a partir do JID. Use para consultar nome, descrição e demais informações conhecidas pelo WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/info`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal, terminado em `@newsletter`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/info' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\",\n    \"name\": \"Canal de Promoções\",\n    \"description\": \"Ofertas e novidades\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/link": {
      "post": {
        "summary": "Consultar canal por convite",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_link",
        "description": "# Consultar canal por convite\n\nObtém as informações de um canal usando a chave ou o link de convite. É útil quando você ainda não conhece o JID do canal.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/link`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `link` | string | Condicional | Link ou chave do convite. Obrigatório se `key` não for enviado. |\n| `key` | string | Condicional | Alias de `link`; usado somente quando `link` está vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/link' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"link\": \"https://whatsapp.com/channel/AbCdEfGhIjKlMn\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\",\n    \"name\": \"Canal de Promoções\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEnvie `link` ou `key`. Se ambos forem enviados, `link` tem prioridade.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "link": "https://whatsapp.com/channel/AbCdEfGhIjKlMn"
              }
            }
          }
        }
      }
    },
    "/newsletter/subscribe": {
      "post": {
        "summary": "Assinar atualizações temporárias do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_subscribe",
        "description": "# Assinar atualizações temporárias do canal\n\nSolicita ao WhatsApp uma assinatura temporária de atualizações em tempo real, como contadores de visualizações e reações. Use durante períodos em que sua aplicação precisa acompanhar essas mudanças.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/subscribe`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal, terminado em `@newsletter`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/subscribe' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"duration_seconds\": 300\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEsta operação **não segue o canal**. Para seguir e manter a associação ao canal, use `POST /newsletter/follow`; a duração retornada informa por quantos segundos os live updates permanecem ativos.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/messages": {
      "post": {
        "summary": "Listar mensagens do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_messages",
        "description": "# Listar mensagens do canal\n\nBusca mensagens publicadas em um canal. Use `before` para paginar para mensagens anteriores.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/messages`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `count` | integer | Não | Quantidade de mensagens solicitada. |\n| `before` | integer (int64) | Não | ID de servidor usado como cursor para buscar mensagens anteriores. |\n| `after` | integer (int64) | Não | Campo aceito pelo handler, mas atualmente não é aplicado por esta rota. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/messages' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"count\": 20,\n  \"before\": 987654\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"server_id\": 987653,\n      \"text\": \"Nova promoção disponível\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nPara buscar novidades depois de um ID, use `POST /newsletter/updates`. O campo `after` desta rota é lido pelo handler, mas não é repassado ao serviço.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "count": 20,
                "before": 987654
              }
            }
          }
        }
      }
    },
    "/newsletter/messages/edit": {
      "post": {
        "summary": "Editar mensagem do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_messages_edit",
        "description": "# Editar mensagem do canal\n\nEdita o texto de uma mensagem recente publicada no canal. Use apenas em mensagens que a conta tenha permissão para alterar.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/messages/edit`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `messageid` | string | Sim | ID da mensagem a editar. |\n| `text` | string | Sim | Novo conteúdo textual da mensagem. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/messages/edit' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"messageid\": \"3EB0B4302B3A8A52F7A1\",\n  \"text\": \"Post atualizado\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0B4302B3A8A52F7A1\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "messageid": "3EB0B4302B3A8A52F7A1",
                "text": "Post atualizado"
              }
            }
          }
        }
      }
    },
    "/newsletter/messages/delete": {
      "post": {
        "summary": "Excluir mensagem do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_messages_delete",
        "description": "# Excluir mensagem do canal\n\nRevoga uma mensagem publicada no canal. Use quando uma publicação precisa deixar de aparecer para os participantes.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/messages/delete`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `messageid` | string | Sim | ID da mensagem a revogar. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/messages/delete' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"messageid\": \"3EB0B4302B3A8A52F7A1\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"3EB0B4302B3A8A52F7A1\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "messageid": "3EB0B4302B3A8A52F7A1"
              }
            }
          }
        }
      }
    },
    "/newsletter/updates": {
      "post": {
        "summary": "Buscar atualizações de mensagens",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_updates",
        "description": "# Buscar atualizações de mensagens\n\nBusca atualizações do canal posteriores a um ID de servidor. Use para sincronização incremental sem baixar novamente todo o histórico.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/updates`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `count` | integer | Não | Quantidade máxima de atualizações solicitada. |\n| `after` | integer (int64) | Não | ID de servidor a partir do qual buscar atualizações. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/updates' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"count\": 50,\n  \"after\": 12345\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"server_id\": 12346,\n      \"text\": \"Nova publicação\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "count": 50,
                "after": 12345
              }
            }
          }
        }
      }
    },
    "/newsletter/viewed": {
      "post": {
        "summary": "Marcar mensagens como visualizadas",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_viewed",
        "description": "# Marcar mensagens como visualizadas\n\nInforma ao WhatsApp que uma ou mais mensagens do canal foram visualizadas. Use para atualizar os indicadores de leitura e visualização.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/viewed`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `server_id` | integer (int64) | Condicional | Um único ID de servidor; é acrescentado a `server_ids`. |\n| `server_ids` | array<integer> | Condicional | Lista de IDs de servidor visualizados. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/viewed' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"server_ids\": [\n    12345,\n    12346\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEnvie `server_id`, `server_ids` ou ambos. Quando ambos são enviados, todos os IDs são marcados como visualizados.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "server_ids": [
                  12345,
                  12346
                ]
              }
            }
          }
        }
      }
    },
    "/newsletter/reaction": {
      "post": {
        "summary": "Reagir a uma mensagem do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_reaction",
        "description": "# Reagir a uma mensagem do canal\n\nAdiciona ou atualiza a reação da conta em uma mensagem do canal. Use uma string vazia em `reaction` para solicitar a remoção da reação.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/reaction`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `server_id` | integer (int64) | Sim | ID de servidor da mensagem. |\n| `reaction` | string | Sim | Emoji da reação, ou string vazia para remover a reação. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/reaction' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"server_id\": 12345,\n  \"reaction\": \"❤️\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "server_id": 12345,
                "reaction": "❤️"
              }
            }
          }
        }
      }
    },
    "/newsletter/follow": {
      "post": {
        "summary": "Seguir canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_follow",
        "description": "# Seguir canal\n\nFaz a conta conectada seguir um canal. Use quando quiser manter o canal na lista de canais seguidos e receber suas publicações.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/follow`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/follow' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nSeguir é diferente de assinar live updates temporários em `POST /newsletter/subscribe`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/unfollow": {
      "post": {
        "summary": "Deixar de seguir canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_unfollow",
        "description": "# Deixar de seguir canal\n\nRemove o canal da lista de canais seguidos pela conta conectada. Use quando a conta não quiser mais acompanhar suas publicações.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/unfollow`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/unfollow' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/mute": {
      "post": {
        "summary": "Silenciar notificações do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_mute",
        "description": "# Silenciar notificações do canal\n\nSilencia as notificações de um canal sem deixar de segui-lo. Use para continuar recebendo publicações sem alertas.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/mute`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/mute' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/unmute": {
      "post": {
        "summary": "Reativar notificações do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_unmute",
        "description": "# Reativar notificações do canal\n\nRemove o silêncio das notificações de um canal. Use para voltar a receber alertas das novas publicações.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/unmute`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/unmute' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/delete": {
      "post": {
        "summary": "Sair do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_delete",
        "description": "# Sair do canal\n\nFaz a conta conectada deixar de seguir o canal. Esta rota representa a saída do assinante, e não a exclusão do canal no WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/delete`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/delete' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEsta operação é equivalente ao unfollow de `POST /newsletter/unfollow`. Ela **não apaga um canal próprio** nem remove seu conteúdo.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/picture": {
      "post": {
        "summary": "Atualizar foto do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_picture",
        "description": "# Atualizar foto do canal\n\nDefine ou remove a foto de um canal administrado pela conta. Use uma URL, Base64 ou data URI para atualizar a imagem.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/picture`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `image` | string | Sim | URL, conteúdo Base64, data URI ou `remove` para excluir a foto atual. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/picture' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"image\": \"https://example.com/newsletter.png\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\"\n  },\n  \"image_updated\": true,\n  \"image_removed\": false\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nPara remover a foto, envie `\"image\": \"remove\"`; a resposta indica a ação em `image_updated` e `image_removed`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "image": "https://example.com/newsletter.png"
              }
            }
          }
        }
      }
    },
    "/newsletter/name": {
      "post": {
        "summary": "Atualizar nome do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_name",
        "description": "# Atualizar nome do canal\n\nAltera o nome público de um canal administrado pela conta. Use para renomear o canal sem recriá-lo.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/name`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `name` | string | Sim | Novo nome; não pode ficar vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/name' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"name\": \"Canal de Promoções VIP\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\",\n    \"name\": \"Canal de Promoções VIP\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "name": "Canal de Promoções VIP"
              }
            }
          }
        }
      }
    },
    "/newsletter/description": {
      "post": {
        "summary": "Atualizar descrição do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_description",
        "description": "# Atualizar descrição do canal\n\nAltera a descrição pública de um canal administrado pela conta. Envie uma string vazia para remover o texto atual, se o WhatsApp permitir.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/description`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `description` | string | Sim | Nova descrição do canal; pode ser vazia. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/description' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"description\": \"Atualizações, ofertas e novidades\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\",\n    \"description\": \"Atualizações, ofertas e novidades\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "description": "Atualizações, ofertas e novidades"
              }
            }
          }
        }
      }
    },
    "/newsletter/settings": {
      "post": {
        "summary": "Atualizar configurações do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_settings",
        "description": "# Atualizar configurações do canal\n\nAtualiza as configurações de um canal administrado pela conta, principalmente o modo de reações. Use `updates` apenas para alterações avançadas aceitas pelo WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/settings`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `reaction_codes` | string | Condicional | Modo de reações: `all`, `basic`, `none` ou `blocklist`. |\n| `reactions` | string | Condicional | Alias de `reaction_codes`, usado quando ele estiver vazio. |\n| `updates` | object | Condicional | Mapa de atualizações avançadas enviado ao WhatsApp. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/settings' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"reaction_codes\": \"basic\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletter\": {\n    \"jid\": \"120363123456789012@newsletter\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEnvie `reaction_codes`/`reactions` ou um objeto `updates` não vazio. Se `reaction_codes` e `reactions` forem enviados, `reaction_codes` tem prioridade.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "reaction_codes": "basic"
              }
            }
          }
        }
      }
    },
    "/newsletter/search": {
      "post": {
        "summary": "Pesquisar e descobrir canais",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_search",
        "description": "# Pesquisar e descobrir canais\n\nPesquisa canais públicos por texto ou navega pelo diretório do WhatsApp. Também permite obter recomendações e continuar uma página anterior.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/search`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `query` | string | Não | Texto da pesquisa. Quando preenchido e sem modo especial, executa busca por palavra-chave. |\n| `limit` | integer | Não | Quantidade de resultados solicitada. |\n| `country_codes` | array<string> | Não | Códigos de país, como `BR`, para filtrar resultados. |\n| `categories` | array<string> | Não | Categorias usadas como filtro. |\n| `cursor_token` | string | Não | Cursor retornado pela página anterior. |\n| `view` | string | Não | Visão do diretório; sem valor, o padrão é `RECOMMENDED`. |\n| `mode` | string | Não | Modo: `search`, `recommended`, `directory` ou `browse`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/search' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"query\": \"promo\",\n  \"limit\": 20,\n  \"country_codes\": [\n    \"BR\"\n  ],\n  \"categories\": [],\n  \"cursor_token\": \"\",\n  \"view\": \"RECOMMENDED\",\n  \"mode\": \"search\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"newsletters\": [\n    {\n      \"jid\": \"120363123456789012@newsletter\",\n      \"name\": \"Canal de Promoções\"\n    }\n  ],\n  \"page_info\": {\n    \"has_next_page\": true,\n    \"end_cursor\": \"cursor-da-proxima-pagina\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEsta rota não exige modo mobile. `mode: recommended` busca recomendações; `directory`/`browse` abre o diretório. Sem `query`, a API também navega pelo diretório.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "query": "promo",
                "limit": 20,
                "country_codes": [
                  "BR"
                ],
                "categories": [],
                "cursor_token": "",
                "view": "RECOMMENDED",
                "mode": "search"
              }
            }
          }
        }
      }
    },
    "/newsletter/admin/invite": {
      "post": {
        "summary": "Convidar administrador do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_admin_invite",
        "description": "# Convidar administrador do canal\n\nConvida um usuário para se tornar administrador de um canal. Use esta rota como dono ou administrador com permissão para gerenciar a equipe.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/admin/invite`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `user` | string | Condicional | JID do usuário convidado. Obrigatório se `to` não for enviado. |\n| `to` | string | Condicional | Alias de `user`, usado quando `user` estiver vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/admin/invite' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"user\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEnvie o usuário como JID do WhatsApp em `user` ou `to`. Se ambos forem enviados, `user` tem prioridade.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "user": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/newsletter/admin/accept": {
      "post": {
        "summary": "Aceitar convite de administrador",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_admin_accept",
        "description": "# Aceitar convite de administrador\n\nAceita, para a conta conectada, um convite pendente para administrar o canal. Use na conta que recebeu o convite.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/admin/accept`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal cujo convite será aceito. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/admin/accept' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter"
              }
            }
          }
        }
      }
    },
    "/newsletter/admin/remove": {
      "post": {
        "summary": "Remover administrador do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_admin_remove",
        "description": "# Remover administrador do canal\n\nRemove a função de administrador de um usuário do canal. Use para rebaixar um administrador existente sem removê-lo do WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/admin/remove`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `user` | string | Condicional | JID do administrador a remover. Obrigatório se `to` não for enviado. |\n| `to` | string | Condicional | Alias de `user`, usado quando `user` estiver vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/admin/remove' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"user\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEsta operação gerencia o papel de administrador. Ela não é a mesma coisa que revogar um convite ainda pendente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "user": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/newsletter/admin/revoke": {
      "post": {
        "summary": "Revogar convite de administrador",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_admin_revoke",
        "description": "# Revogar convite de administrador\n\nCancela um convite de administrador que ainda está pendente. Use antes de o usuário aceitar o convite.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/admin/revoke`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `user` | string | Condicional | JID do usuário cujo convite será revogado. Obrigatório se `to` não for enviado. |\n| `to` | string | Condicional | Alias de `user`, usado quando `user` estiver vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/admin/revoke' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"user\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nO serviço exige o usuário: envie `user` ou seu alias `to`. Esta rota não remove um administrador que já aceitou; para isso, use `/newsletter/admin/remove`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "user": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/newsletter/owner/transfer": {
      "post": {
        "summary": "Transferir propriedade do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_owner_transfer",
        "description": "# Transferir propriedade do canal\n\nTransfere a propriedade do canal para outro usuário. Use apenas quando o destinatário já for administrador do canal.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/owner/transfer`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `user` | string | Condicional | JID do novo proprietário. Obrigatório se `to` não for enviado. |\n| `to` | string | Condicional | Alias de `user`, usado quando `user` estiver vazio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/owner/transfer' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"user\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nO novo proprietário deve já ser administrador. O handler não aceita `quitAdmin`; envie somente `jid` e `user` (ou `to`).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "user": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/newsletter/statuses": {
      "post": {
        "summary": "Listar status do canal",
        "tags": [
          "Newsletters e Canais"
        ],
        "operationId": "newsletters_e_canais_post_newsletter_statuses",
        "description": "# Listar status do canal\n\nBusca mensagens do canal no formato usado pela visualização de status. Use para carregar esse recorte com paginação e papel de visualização.\n\n## Endpoint\n\n`POST {{baseUrl}}/newsletter/statuses`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID completo do canal. |\n| `count` | integer | Não | Quantidade de mensagens solicitada. |\n| `before` | integer (int64) | Não | ID de servidor para buscar itens anteriores. |\n| `view_role` | string | Não | Papel de visualização encaminhado ao WhatsApp. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/newsletter/statuses' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"120363123456789012@newsletter\",\n  \"count\": 20,\n  \"before\": 987654,\n  \"view_role\": \"subscriber\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"server_id\": 987653,\n      \"text\": \"Atualização do canal\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado ou contém um identificador inválido.\n- `500 Internal Server Error`: a conexão com o WhatsApp falhou ou a operação foi recusada.\n\n## Observações\n\nEsta rota não exige modo mobile; ela usa o mesmo cliente de WhatsApp das demais operações de newsletter.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "120363123456789012@newsletter",
                "count": 20,
                "before": 987654,
                "view_role": "subscriber"
              }
            }
          }
        }
      }
    },
    "/webhook": {
      "get": {
        "summary": "Ver webhook da instância",
        "tags": [
          "Webhooks e SSE"
        ],
        "operationId": "webhooks_e_sse_get_webhook",
        "description": "# Ver webhook da instância\n\nLista os webhooks configurados para a instância autenticada. Use para conferir URL, eventos e filtros antes de alterar.\n\n## Endpoint\n\n`GET {{baseUrl}}/webhook`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/webhook' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"webhooks\": [\n    {\n      \"id\": \"uuid-webhook\",\n      \"instance_id\": \"uuid-instancia\",\n      \"enabled\": true,\n      \"url\": \"https://seu-servidor.com/webhook\",\n      \"events\": [\"messages\", \"connection\"],\n      \"excludeMessages\": [\"wasSentByApi\"],\n      \"addUrlTypesMessages\": false,\n      \"addUrlEvents\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `500 Internal Server Error`: falha ao listar webhooks.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Configurar webhook da instância",
        "tags": [
          "Webhooks e SSE"
        ],
        "operationId": "webhooks_e_sse_post_webhook",
        "description": "# Configurar webhook da instância\n\nSubstitui os webhooks da instância. Aceita um objeto, um array ou `{ \"webhooks\": [...] }`. Use para receber eventos HTTP no seu servidor (mensagens, conexão, chats, etc.).\n\n## Endpoint\n\n`POST {{baseUrl}}/webhook`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `url` | string | Sim | URL de destino (`webhookUrl` / `webhook` também aceitos). |\n| `enabled` | boolean | Não | Padrão `true` se omitido. |\n| `events` | string[] | Não | Categorias: `messages`, `connection`, `chats`, `groups`, `call`, `contacts`, `presence`, `labels`, `history`, `messages_update`, `newsletter_messages`, `chat_labels`, `blocks`, etc. |\n| `excludeMessages` | string[] | Não | Filtros: `wasSentByApi`, `wasNotSentByApi`, `fromMeYes`, `fromMeNo`, `isGroupYes`, `isGroupNo`. |\n| `addUrlTypesMessages` | boolean | Não | Acrescenta o tipo da mensagem na URL. |\n| `addUrlEvents` | boolean | Não | Acrescenta a categoria do evento na URL. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/webhook' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"enabled\": true,\n  \"url\": \"https://seu-servidor.com/webhook\",\n  \"events\": [\"messages\", \"connection\"],\n  \"excludeMessages\": [\"wasSentByApi\"]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"webhooks\": [\n    {\n      \"enabled\": true,\n      \"url\": \"https://seu-servidor.com/webhook\",\n      \"events\": [\"messages\", \"connection\"],\n      \"excludeMessages\": [\"wasSentByApi\"],\n      \"addUrlTypesMessages\": false,\n      \"addUrlEvents\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `400 Bad Request`: payload vazio ou sem `url`.\n- `500 Internal Server Error`: falha ao substituir os webhooks.\n\n## Observações\n\n- A operação **substitui** todos os webhooks da instância.\n- Para evitar loop de automação, use `excludeMessages: [\"wasSentByApi\"]`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "enabled": true,
                "url": "https://seu-servidor.com/webhook",
                "events": [
                  "messages",
                  "connection"
                ],
                "excludeMessages": [
                  "wasSentByApi"
                ],
                "addUrlTypesMessages": false,
                "addUrlEvents": false
              }
            }
          }
        }
      }
    },
    "/webhook/errors": {
      "get": {
        "summary": "Ver erros do webhook da instância",
        "tags": [
          "Webhooks e SSE"
        ],
        "operationId": "webhooks_e_sse_get_webhook_errors",
        "description": "# Ver erros do webhook da instância\n\nLista falhas recentes de entrega dos webhooks desta instância. Use para diagnosticar endpoint fora do ar, timeouts e respostas inválidas.\n\n## Endpoint\n\n`GET {{baseUrl}}/webhook/errors`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `limit` | integer | Não | Máximo de registros (padrão `100`, teto `500`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/webhook/errors?limit=100' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"errors\": [\n    {\n      \"id\": \"uuid-erro\",\n      \"webhook_id\": \"uuid-webhook\",\n      \"instance_id\": \"uuid-instancia\",\n      \"category\": \"messages\",\n      \"attempt\": 2,\n      \"error\": \"timeout\",\n      \"url\": \"https://seu-servidor.com/webhook\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: header `token` ausente ou inválido.\n- `500 Internal Server Error`: falha ao consultar erros.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "100"
          }
        ]
      }
    },
    "/sse": {
      "get": {
        "summary": "Receber eventos via SSE",
        "tags": [
          "Webhooks e SSE"
        ],
        "operationId": "webhooks_e_sse_get_sse",
        "description": "# Receber eventos via SSE\n\nAbre um stream **Server-Sent Events** com eventos em tempo real da instância autenticada. Use em painéis, CRMs e monitores que precisam de push contínuo sem polling. Alternativa aos webhooks quando o consumidor é o próprio cliente (não um servidor HTTP).\n\n## Endpoint\n\n`GET {{baseUrl}}/sse`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}` (também aceito como query `?token=`).\n\n## Parâmetros\n\nNão há parâmetros de filtro neste endpoint: o stream entrega os eventos da instância autenticada. Comentários SSE de keep-alive (`: ping`) são enviados periodicamente.\n\n## Exemplo de Requisição\n\n```bash\ncurl -N '{{baseUrl}}/sse' \\\n  --header 'token: {{token}}' \\\n  --header 'Accept: text/event-stream'\n```\n\n## Resposta de Sucesso\n\nConexão persistente (`Content-Type: text/event-stream`). Exemplo de frames:\n\n```text\n: connected\n\nevent: messages\ndata: {\"event\":\"messages\",\"instance_id\":\"uuid-instancia\",\"data\":{},\"timestamp\":1710000000}\n\n: ping\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token ausente ou inválido.\n- Conexão fecha logo após abrir: proxy/load balancer sem suporte a streaming (desative buffering; a API envia `X-Accel-Buffering: no`).\n- Timeout em proxies: aumente idle timeout ou mantenha o `-N` (sem buffer) no curl.\n\n## Observações\n\n- Use `curl -N` para não bufferizar a saída.\n- O hub filtra por `instance_id` da instância autenticada.\n- Não há filtros `events` / `excludeMessages` neste endpoint (esses campos existem nos webhooks).",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/chat/block": {
      "post": {
        "summary": "Bloquear ou desbloquear contato",
        "tags": [
          "Bloqueios"
        ],
        "operationId": "bloqueios_post_chat_block",
        "description": "# Bloquear ou desbloquear contato\n\nAltera a blocklist do WhatsApp para um contato. Contato bloqueado não envia nem recebe mensagens com a instância.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/block`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `number` | string | Condicional | Telefone do contato. Informe `number` ou `chatid`. |\n| `chatid` | string | Condicional | JID do contato (`5511...@s.whatsapp.net`). |\n| `action` | string | Condicional | `block` ou `unblock`. Se omitido e sem `block`, o padrão é `block`. |\n| `block` | boolean | Condicional | Atalho: `true` → block, `false` → unblock (sobrescreve `action`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/chat/block' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"number\": \"5511999999999\",\n  \"block\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"blocklist\": {\n    \"DHash\": \"abcdef\",\n    \"JIDs\": [\n      \"5511999999999@s.whatsapp.net\",\n      \"5511888888888@s.whatsapp.net\"\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: número/JID inválido ou instância desconectada.\n- `401 Unauthorized`: token inválido.\n\n## Observações\n\n- A resposta devolve a blocklist atualizada (`DHash` + `JIDs`), não apenas uma mensagem.\n- Bloquear não apaga o histórico de conversa.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "5511999999999",
                "block": true
              }
            }
          }
        }
      }
    },
    "/chat/blocklist": {
      "get": {
        "summary": "Listar contatos bloqueados",
        "tags": [
          "Bloqueios"
        ],
        "operationId": "bloqueios_get_chat_blocklist",
        "description": "# Listar contatos bloqueados\n\nRetorna a blocklist atual da conta WhatsApp conectada. Use para auditoria ou painéis de moderação.\n\n## Endpoint\n\n`GET {{baseUrl}}/chat/blocklist`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\nNenhum.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/chat/blocklist' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"blocklist\": {\n    \"DHash\": \"abcdef\",\n    \"JIDs\": [\n      \"5511999999999@s.whatsapp.net\",\n      \"5511888888888@s.whatsapp.net\"\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token ausente ou inválido.\n- `500 Internal Server Error`: instância desconectada ou falha ao consultar a blocklist.\n\n## Observações\n\n- A lista reflete o estado no WhatsApp (API e app oficial).\n- Para alterar a lista, use `POST /chat/block`.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/chat/labels": {
      "post": {
        "summary": "Definir etiquetas de um chat",
        "tags": [
          "Etiquetas"
        ],
        "operationId": "etiquetas_post_chat_labels",
        "description": "# Definir etiquetas de um chat\n\nDefine o conjunto completo de etiquetas (`labels`) de um chat. A API compara com as atuais, adiciona as novas e remove as que saíram da lista.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/labels`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `number` | string | Condicional | Telefone do chat. Informe `number`, `chatid` ou `id`. |\n| `chatid` | string | Condicional | JID do chat. |\n| `id` | string | Condicional | ID interno do chat. |\n| `labels` | array[string] | Sim | IDs das etiquetas desejadas (substitui o conjunto atual). Array vazio remove todas. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/chat/labels' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"number\": \"5511999999999\",\n  \"labels\": [\"10\", \"20\", \"30\"]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: `number or chatid is required` (nenhum identificador enviado).\n- `500 Internal Server Error`: label inválida, chat inexistente ou instância desconectada.\n- `401 Unauthorized`: token inválido.\n\n## Observações\n\n- Obtenha os IDs em `GET /labels`.\n- Não existem campos `labelids`, `add_labelid` ou `remove_labelid` nesta API — use sempre `labels`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "5511999999999",
                "labels": [
                  "10",
                  "20",
                  "30"
                ]
              }
            }
          }
        }
      }
    },
    "/label/edit": {
      "post": {
        "summary": "Criar, editar ou remover etiqueta",
        "tags": [
          "Etiquetas"
        ],
        "operationId": "etiquetas_post_label_edit",
        "description": "# Criar, editar ou remover etiqueta\n\nCria ou atualiza uma etiqueta no banco e sincroniza com o WhatsApp via App State. Para remover no WhatsApp, envie o `labelid` com `name` vazio.\n\n## Endpoint\n\n`POST {{baseUrl}}/label/edit`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `labelid` | string | Sim | ID da etiqueta no WhatsApp. |\n| `name` | string | Condicional | Nome da etiqueta. Vazio = remover no WhatsApp. |\n| `color` | integer | Não | Índice de cor do WhatsApp. |\n| `colorHex` | string | Não | Hex opcional; se vazio, a API deriva de `color` + plataforma. |\n| `id` | string | Não | ID interno; se omitido, a API reutiliza o existente ou gera um novo. |\n| `owner` | string | Não | Dono; se vazio, usa o owner da instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/label/edit' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"labelid\": \"10\",\n  \"name\": \"Cliente VIP\",\n  \"color\": 2\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"label\": {\n    \"id\": \"lbl_abc123\",\n    \"client_name\": \"gozap\",\n    \"created\": \"2026-07-17T12:00:00Z\",\n    \"updated\": \"2026-07-17T12:00:00Z\",\n    \"name\": \"Cliente VIP\",\n    \"color\": 2,\n    \"colorHex\": \"#25D366\",\n    \"labelid\": \"10\",\n    \"owner\": \"5511999999999\"\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: `labelid is required` ou JSON inválido.\n- `500 Internal Server Error`: falha ao salvar ou sincronizar com o WhatsApp.\n- `401 Unauthorized`: token inválido.\n\n## Observações\n\n- Não há campo `delete` booleano: remoção = `name` vazio.\n- Depois de criar/editar, confira a lista em `GET /labels`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "labelid": "10",
                "name": "Cliente VIP",
                "color": 2
              }
            }
          }
        }
      }
    },
    "/labels": {
      "get": {
        "summary": "Listar etiquetas",
        "tags": [
          "Etiquetas"
        ],
        "operationId": "etiquetas_get_labels",
        "description": "# Listar etiquetas\n\nRetorna todas as etiquetas cadastradas no banco da instância. Use para obter os IDs antes de `POST /chat/labels` ou `POST /label/edit`.\n\n## Endpoint\n\n`GET {{baseUrl}}/labels`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\nNenhum.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/labels' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"labels\": [\n    {\n      \"id\": \"lbl_abc123\",\n      \"name\": \"Cliente\",\n      \"color\": 1,\n      \"colorHex\": \"#00A884\",\n      \"labelid\": \"10\",\n      \"owner\": \"5511999999999\"\n    },\n    {\n      \"id\": \"lbl_def456\",\n      \"name\": \"VIP\",\n      \"color\": 2,\n      \"colorHex\": \"#25D366\",\n      \"labelid\": \"20\",\n      \"owner\": \"5511999999999\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token ausente ou inválido.\n- `500 Internal Server Error`: falha ao ler o banco de etiquetas.\n\n## Observações\n\n- Use o campo `labelid` (não só `id`) ao associar etiquetas a chats.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/labels/refresh": {
      "post": {
        "summary": "Atualizar etiquetas do WhatsApp",
        "tags": [
          "Etiquetas"
        ],
        "operationId": "etiquetas_post_labels_refresh",
        "description": "# Atualizar etiquetas do WhatsApp\n\nForça a releitura do App State de etiquetas no WhatsApp e devolve a lista atualizada do banco. Use quando criou/editou labels no app e elas ainda não aparecem na API.\n\n## Endpoint\n\n`POST {{baseUrl}}/labels/refresh`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\nNenhum campo é lido pelo handler. Pode enviar body vazio `{}` ou omitir o corpo.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/labels/refresh' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"labels\": [\n    {\n      \"id\": \"lbl_abc123\",\n      \"name\": \"Cliente\",\n      \"color\": 1,\n      \"colorHex\": \"#00A884\",\n      \"labelid\": \"10\",\n      \"owner\": \"5511999999999\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token inválido.\n- `500 Internal Server Error`: label service indisponível, instância desconectada ou falha no FetchAppState.\n\n## Observações\n\n- Não existe parâmetro `force` nesta rota.\n- A resposta já inclui as labels após o refresh (não é só “started”).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {}
            }
          }
        }
      }
    },
    "/chat/delete": {
      "post": {
        "summary": "Excluir chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_delete",
        "description": "# Excluir chat\n\nRemove o chat no WhatsApp (quando possível) e apaga o registro correspondente no banco da instância. Identifique o chat por `chatid`/`number` ou pelo `id` interno.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/delete`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não* | JID do chat |\n| number | string | Não* | Número/JID alternativo |\n| id | string | Não* | ID interno do registro de chat |\n\n* Informe `id` **ou** `chatid`/`number`. Se houver destinatário (`chatid`/`number`), a API também tenta `DeleteChat` no WhatsApp antes de apagar no DB.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/delete\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — falha ao excluir no banco\n\n## Observações\n\n- Campos como `deleteChatDB` / `deleteMessagesDB` **não existem** neste handler — use apenas os campos da tabela acima.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/chat/archive": {
      "post": {
        "summary": "Arquivar ou desarquivar chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_archive",
        "description": "# Arquivar ou desarquivar chat\n\nArquiva (ou desarquiva) um chat no WhatsApp e atualiza `wa_archived` no banco.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/archive`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| jid | string | Sim* | Alternativa a `chatid` |\n| id | string | Não | ID interno (para update no DB) |\n| archived | boolean | Não | `true` arquiva (padrão se omitido), `false` desarquiva |\n| archive | boolean | Não | Alias de `archived` |\n\n* Informe `chatid`, `number` ou `jid`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/archive\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"archived\": true\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `number or chatid is required`\n- `401` — token ausente ou inválido\n- `500` — sessão offline / falha no WhatsApp",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "archived": true
              }
            }
          }
        }
      }
    },
    "/chat/ephemeral": {
      "post": {
        "summary": "Configurar mensagens temporárias do chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_ephemeral",
        "description": "# Configurar mensagens temporárias do chat\n\nDefine o timer de mensagens que desaparecem em um chat (privado ou grupo — o mesmo handler de `/group/ephemeral`).\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/ephemeral`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| jid | string | Sim* | Alternativa a `chatid` |\n| seconds | integer | Não** | Duração em segundos (`0` desliga) |\n| timer | integer | Não** | Alias de `seconds` |\n| duration | string|number | Não** | Atalho: `\"off\"`/`\"0\"`, `\"1d\"`, `\"7d\"`, `\"90d\"` ou número |\n\n* Informe `chatid`, `number` ou `jid`.\n** Use um de `seconds`, `timer` ou `duration`. Valores: 86400 (1d), 604800 (7d), 7776000 (90d).\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/ephemeral\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"duration\": \"7d\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `number or chatid is required`\n- `400` — `unsupported duration \"...\"`\n- `401` — token ausente ou inválido\n- `500` — sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "duration": "7d"
              }
            }
          }
        }
      }
    },
    "/chat/read": {
      "post": {
        "summary": "Marcar chat como lido ou não lido",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_read",
        "description": "# Marcar chat como lido ou não lido\n\nMarca o chat inteiro como lido (`read=true`, unread=0) ou não lido (`read=false`, unread=1) via app state e atualiza o banco.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/read`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| jid | string | Sim* | Alternativa a `chatid` |\n| read | boolean | Não | `true` lido (padrão), `false` não lido |\n\n* Informe `chatid`, `number` ou `jid`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/read\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"read\": true\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `number or chatid is required`\n- `401` — token ausente ou inválido\n- `500` — falha ao atualizar estado\n\n## Observações\n\n- Para marcar **mensagens específicas** como lidas (ticks), use `POST /message/markread`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "read": true
              }
            }
          }
        }
      }
    },
    "/chat/mute": {
      "post": {
        "summary": "Silenciar ou reativar notificações do chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_mute",
        "description": "# Silenciar ou reativar notificações do chat\n\nSilencia o chat por um período (ou permanentemente) e grava `wa_muteEndTime` no banco. Para dessilenciar, envie `muteEndTime: 0` (e não use `muted_until` futuro).\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/mute`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| jid | string | Sim* | Alternativa a `chatid` |\n| muteEndTime | integer | Não** | Atalho: `0` = unmute, `8` = 8h, `168` = 7 dias, `-1` = permanente |\n| muted_until | integer | Não** | Timestamp absoluto (unix s ou ms) até quando silenciar |\n\n* Informe `chatid`, `number` ou `jid`.\n** Se `muted_until` for enviado (>0 e no futuro), ele tem prioridade. Campo `mute` genérico **não** é lido pelo handler.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/mute\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"muteEndTime\": 8\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `number or chatid is required`\n- `401` — token ausente ou inválido\n- `500` — sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "muteEndTime": 8
              }
            }
          }
        }
      }
    },
    "/chat/pin": {
      "post": {
        "summary": "Fixar ou desafixar chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_pin",
        "description": "# Fixar ou desafixar chat\n\nFixa (ou remove o pin) de um chat na lista de conversas do WhatsApp e atualiza `wa_isPinned` no banco.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/pin`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Sim* | JID do chat |\n| number | string | Sim* | Alternativa a `chatid` |\n| jid | string | Sim* | Alternativa a `chatid` |\n| id | string | Não | ID interno do chat no DB |\n| pinned | boolean | Não | `true` fixa (padrão se omitido), `false` desafixa |\n| pin | boolean | Não | Alias de `pinned` |\n\n* Informe `chatid`, `number` ou `jid`.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/pin\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"pinned\": true\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `400` — `number or chatid is required`\n- `401` — token ausente ou inválido\n- `500` — sessão offline",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "pinned": true
              }
            }
          }
        }
      }
    },
    "/chat/find": {
      "post": {
        "summary": "Listar chats recentes",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_find",
        "description": "# Listar chats recentes\n\nRetorna chats ordenados pela última mensagem. O handler **não** aplica filtros de CRM (`lead_status`, `wa_label`, etc.) — apenas o parâmetro de query `limit`.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/find?limit=50`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Parâmetros\n\n| Parâmetro | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| limit | query integer | Não | Quantidade máxima (padrão `100`; valores ≤0 ou >500 viram `100`) |\n\nCorpo JSON é ignorado pelo handler atual (pode ser omitido).\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/find?limit=50\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\"\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"chats\": [\n    {\n      \"id\": \"c1a2b3\",\n      \"wa_chatid\": \"5511999999999@s.whatsapp.net\",\n      \"phone\": \"5511999999999\",\n      \"wa_name\": \"Cliente\",\n      \"wa_unreadCount\": 0,\n      \"wa_archived\": false,\n      \"wa_isPinned\": false\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — falha ao listar chats\n\n## Observações\n\n- Se a tabela de chats estiver vazia, a API pode derivar chats a partir do histórico de mensagens.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "50"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {}
            }
          }
        }
      }
    },
    "/chat/notes": {
      "post": {
        "summary": "Consultar notas do chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_notes",
        "description": "# Consultar notas do chat\n\nRetorna o campo de notas internas (`wa_notes`) armazenado no registro do chat. Identifique o chat por `chatid`, `number` ou `id`.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/notes`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não* | JID do chat |\n| number | string | Não* | Número/JID |\n| id | string | Não* | ID interno do chat |\n\n* Informe ao menos um identificador. Corpo pode ser omitido se o bind opcional permitir, mas sem identificador a busca falha.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/notes\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"notes\": \"Cliente prefere contato no período da tarde\"\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — chat não encontrado / erro de banco",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/chat/notes/refresh": {
      "post": {
        "summary": "Recarregar notas do chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_notes_refresh",
        "description": "# Recarregar notas do chat\n\nAlias de `POST /chat/notes`: usa o **mesmo handler** e devolve as notas (`wa_notes`) já salvas no banco. Não há sync adicional distinto no código atual.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/notes/refresh`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não* | JID do chat |\n| number | string | Não* | Número/JID |\n| id | string | Não* | ID interno do chat |\n\n* Informe ao menos um identificador.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/notes/refresh\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"notes\": \"Cliente prefere contato no período da tarde\"\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `500` — chat não encontrado",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/chat/notes/edit": {
      "post": {
        "summary": "Editar notas do chat",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_notes_edit",
        "description": "# Editar notas do chat\n\nAtualiza o campo `wa_notes` do chat no banco da instância (notas internas da plataforma).\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/notes/edit`\n\n## Autenticação\n\nHeader obrigatório: `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| chatid | string | Não* | JID do chat |\n| number | string | Não* | Número/JID |\n| id | string | Não* | ID interno do chat |\n| notes | string | Sim | Novo texto das notas |\n\n* Informe `id` **ou** `chatid`/`number` para localizar o registro.\n\n## Exemplo de Requisição\n\n```bash\ncurl -X POST \"{{baseUrl}}/chat/notes/edit\" \\\n  -H \"token: {{token}}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"chatid\": \"5511999999999@s.whatsapp.net\",\n    \"notes\": \"Cliente prefere contato no período da tarde\"\n  }'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401` — token ausente ou inválido\n- `400` — JSON inválido\n- `500` — falha ao atualizar",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "chatid": "5511999999999@s.whatsapp.net",
                "notes": "Cliente prefere contato no período da tarde"
              }
            }
          }
        }
      }
    },
    "/chat/sync": {
      "post": {
        "summary": "Sincronizar chats e mensagens",
        "tags": [
          "Chats"
        ],
        "operationId": "chats_post_chat_sync",
        "description": "# Sincronizar chats e mensagens\n\nRetorna chats e mensagens atualizados desde um timestamp, útil para sincronização incremental de painéis.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/chat/sync\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"since\": \"2026-01-01T00:00:00Z\",\n  \"limit\": 50\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"serverTime\": \"2026-01-01T12:00:00Z\",\n  \"chats\": [],\n  \"messages\": [],\n  \"contacts\": []\n}\n```\n\n## Observações\n\n`since` deve estar em RFC3339. `limit` padrão é validado pelo servidor.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "since": "2026-01-01T00:00:00Z",
                "limit": 50
              }
            }
          }
        }
      }
    },
    "/contacts": {
      "get": {
        "summary": "Listar contatos",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_get_contacts",
        "description": "# Listar contatos\n\nRetorna até 1000 contatos conhecidos pela instância. Use para carregar a agenda rapidamente; para listas grandes com paginação, prefira `POST /contacts/list`.\n\n## Endpoint\n\n`GET {{baseUrl}}/contacts`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `contactScope` | string | Não | Escopo dos contatos. Padrão: `address_book`. Valores: `address_book` (com nome na agenda), `outside_address_book` (sem nome na agenda), `all` (todos). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/contacts?contactScope=address_book' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n[\n  {\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"contact_name\": \"João Silva\",\n    \"contact_FirstName\": \"João\"\n  }\n]\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: instância desconectada ou store de contatos indisponível.\n\n## Observações\n\n- A resposta é um array direto (não vem envelopada em `{ success, contacts }`).\n- Campos retornados: `jid`, `contact_name`, `contact_FirstName`.\n- Limite interno: 1000 contatos (offset 0).",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "contactScope",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "address_book"
          }
        ]
      }
    },
    "/contacts/list": {
      "post": {
        "summary": "Listar contatos com paginação",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_contacts_list",
        "description": "# Listar contatos com paginação\n\nLista contatos com controle de `limit` e `offset`. Use em CRMs, tabelas e bases grandes em que `GET /contacts` não basta.\n\n## Endpoint\n\n`POST {{baseUrl}}/contacts/list`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `limit` | integer | Não | Máximo de itens por página. Padrão: `100`. Máximo: `1000`. |\n| `offset` | integer | Não | Quantos itens pular. Padrão: `0`. |\n| `contactScope` | string | Não | Escopo: `address_book` (padrão se vazio/inválido), `outside_address_book` ou `all`. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/contacts/list' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"limit\": 100,\n  \"offset\": 0,\n  \"contactScope\": \"address_book\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"contacts\": [\n    {\n      \"jid\": \"5511999999999@s.whatsapp.net\",\n      \"contact_name\": \"João Silva\",\n      \"contact_FirstName\": \"João\"\n    }\n  ],\n  \"totalDeviceContacts\": 2450,\n  \"pagination\": {\n    \"totalRecords\": 2450,\n    \"limit\": 100,\n    \"offset\": 0\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token ausente ou inválido.\n- `500 Internal Server Error`: instância desconectada ou falha ao ler contatos.\n\n## Observações\n\n- Diferente de `GET /contacts`, esta rota devolve metadados de paginação.\n- Para a próxima página, some `offset += limit`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "limit": 100,
                "offset": 0,
                "contactScope": "address_book"
              }
            }
          }
        }
      }
    },
    "/contacts/sync": {
      "post": {
        "summary": "Mobile - Sincronizar agenda",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_contacts_sync",
        "description": "# Mobile - Sincronizar agenda\n\nEnvia uma lista de números/nomes para a agenda da conta no modo **mobile (dispositivo primário)**. Use após conectar a instância mobile, por exemplo antes de depender de status para contatos.\n\n## Endpoint\n\n`POST {{baseUrl}}/contacts/sync`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `contacts` | array | Sim | Lista de contatos a sincronizar (não pode ser vazia). |\n| `contacts[].phone` | string | Sim | Telefone com DDI (com ou sem `+`). |\n| `contacts[].name` | string | Não | Nome na agenda; se vazio, a API usa o próprio número. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/contacts/sync' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"contacts\": [\n    { \"phone\": \"5511999999999\", \"name\": \"Cliente A\" },\n    { \"phone\": \"5511888888888\", \"name\": \"Cliente B\" }\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"result\": {\n    \"uploaded\": 2,\n    \"items\": [\n      {\n        \"phone\": \"5511999999999\",\n        \"name\": \"Cliente A\",\n        \"jid\": \"5511999999999@s.whatsapp.net\",\n        \"lid\": \"123456789012345@lid\",\n        \"on_whatsapp\": true,\n        \"synced\": true\n      }\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: `contacts` ausente ou vazio.\n- `500 Internal Server Error` com mensagem `contacts sync upload is for mobile (primary) connection mode`: a instância não está em modo mobile.\n- `401 Unauthorized`: token inválido.\n- `500 Internal Server Error`: bridge mobile indisponível ou sessão desconectada.\n\n## Observações\n\n- **Somente `connection_mode: mobile`**. Em modo web/companion a rota falha.\n- Números fora do WhatsApp retornam `on_whatsapp: false`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "contacts": [
                  {
                    "phone": "5511999999999",
                    "name": "Cliente A"
                  },
                  {
                    "phone": "5511888888888",
                    "name": "Cliente B"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/contact/add": {
      "post": {
        "summary": "Adicionar contato à agenda",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_contact_add",
        "description": "# Adicionar contato à agenda\n\nSalva um número na agenda do WhatsApp da instância (via App State). Use quando um lead novo precisa aparecer como contato salvo.\n\n## Endpoint\n\n`POST {{baseUrl}}/contact/add`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `number` | string | Sim | Número com DDI ou JID (`5511...` / `5511...@s.whatsapp.net`). |\n| `name` | string | Sim | Nome do contato (não pode ser vazio). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/contact/add' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"number\": \"5511999999999\",\n  \"name\": \"João Silva\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Contato adicionado com sucesso\",\n  \"contact\": {\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"name\": \"João Silva\",\n    \"phone\": \"5511999999999\"\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: `name is required` ou número/JID inválido.\n- `401 Unauthorized`: token inválido.\n- `500 Internal Server Error`: instância desconectada.\n\n## Observações\n\n- Funciona em modo web e mobile.\n- O contato pode demorar alguns instantes para aparecer em `GET /contacts`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "5511999999999",
                "name": "João Silva"
              }
            }
          }
        }
      }
    },
    "/contact/remove": {
      "post": {
        "summary": "Remover contato da agenda",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_contact_remove",
        "description": "# Remover contato da agenda\n\nRemove o número da agenda sincronizada do WhatsApp. Não apaga conversas nem bloqueia o contato.\n\n## Endpoint\n\n`POST {{baseUrl}}/contact/remove`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `number` | string | Sim | Número com DDI ou JID do contato. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/contact/remove' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"number\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": \"Contato removido com sucesso\",\n  \"removed_contact\": {\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"phone\": \"5511999999999\"\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: número/JID inválido ou falha no App State.\n- `401 Unauthorized`: token inválido.\n\n## Observações\n\n- Remover da agenda ≠ bloquear (`POST /chat/block`).\n- Histórico de mensagens e chats permanecem.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/chat/details": {
      "post": {
        "summary": "Obter detalhes do chat",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_chat_details",
        "description": "# Obter detalhes do chat\n\nBusca o registro do chat no banco da instância e as 50 mensagens mais recentes. Use ao abrir a ficha de um contato ou grupo no CRM.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/details`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `number` | string | Condicional | Telefone do chat. Informe `number`, `chatid` ou `id`. |\n| `chatid` | string | Condicional | JID do chat (`5511...@s.whatsapp.net` ou `...@g.us`). |\n| `id` | string | Condicional | ID interno do registro de chat. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/chat/details' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"number\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"chat\": {\n    \"id\": \"abc123\",\n    \"wa_chatid\": \"5511999999999@s.whatsapp.net\",\n    \"phone\": \"5511999999999\",\n    \"name\": \"João Silva\",\n    \"wa_name\": \"João Silva\",\n    \"wa_contactName\": \"João\",\n    \"wa_archived\": false,\n    \"wa_isBlocked\": false,\n    \"wa_isPinned\": false,\n    \"wa_unreadCount\": 2,\n    \"wa_label\": [\"10\", \"20\"],\n    \"wa_notes\": \"Cliente VIP\",\n    \"lead_status\": \"cliente\"\n  },\n  \"messages\": []\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token inválido.\n- `500 Internal Server Error`: chat não encontrado pelos identificadores enviados.\n\n## Observações\n\n- O corpo é opcional na validação HTTP, mas sem `number`/`chatid`/`id` a busca falha.\n- Não existe campo `preview` nesta rota.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "number": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/chat/check": {
      "post": {
        "summary": "Verificar números no WhatsApp",
        "tags": [
          "Contatos"
        ],
        "operationId": "contatos_post_chat_check",
        "description": "# Verificar números no WhatsApp\n\nConsulta se telefones estão registrados no WhatsApp. Use antes de campanhas ou importações para filtrar números inválidos.\n\n## Endpoint\n\n`POST {{baseUrl}}/chat/check`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `numbers` | array[string] | Condicional | Lista de telefones. Informe `numbers` e/ou `number`. |\n| `number` | string | Condicional | Atalho para um único telefone (é acrescentado à lista). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/chat/check' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"numbers\": [\n    \"5511999999999\",\n    \"5511888888888\"\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"contacts\": [\n    {\n      \"Query\": \"5511999999999\",\n      \"JID\": \"5511999999999@s.whatsapp.net\",\n      \"IsIn\": true,\n      \"PhoneNumber\": \"5511999999999@s.whatsapp.net\",\n      \"VerifiedName\": null\n    },\n    {\n      \"Query\": \"5511888888888\",\n      \"JID\": \"5511888888888@s.whatsapp.net\",\n      \"IsIn\": false,\n      \"PhoneNumber\": \"5511888888888@s.whatsapp.net\",\n      \"VerifiedName\": null\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token inválido.\n- `500 Internal Server Error`: instância desconectada ou falha na consulta ao WhatsApp.\n\n## Observações\n\n- A chave da lista na resposta é `contacts` (não `results`).\n- `IsIn: true` significa que o número existe no WhatsApp.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "numbers": [
                  "5511999999999",
                  "5511888888888"
                ]
              }
            }
          }
        }
      }
    },
    "/quickreply/edit": {
      "post": {
        "summary": "Criar ou atualizar resposta rápida",
        "tags": [
          "Respostas Rápidas"
        ],
        "operationId": "respostas_rapidas_post_quickreply_edit",
        "description": "# Criar ou atualizar resposta rápida\n\nSalva (upsert) um template de resposta rápida no banco da instância. Sem `id`, a API gera um novo; com `id` existente, atualiza o registro.\n\n## Endpoint\n\n`POST {{baseUrl}}/quickreply/edit`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `shortCut` | string | Sim* | Atalho do template (*not null no modelo). |\n| `text` | string | Sim* | Texto da resposta (*not null no modelo). |\n| `type` | string | Não | Tipo do template (`text`, `image`, `document`, `video`, `audio`, etc.). |\n| `file` | string | Não | URL do arquivo/mídia, quando aplicável. |\n| `docName` | string | Não | Nome do documento. |\n| `id` | string | Não | ID do template; omita para criar. |\n| `onWhatsApp` | boolean | Não | Indica origem no WhatsApp; padrão `false`. |\n| `owner` | string | Não | Dono opcional do registro. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/quickreply/edit' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"shortCut\": \"saudacao\",\n  \"type\": \"text\",\n  \"text\": \"Olá! Como posso ajudar hoje?\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"quickreply\": {\n    \"id\": \"rb9da9c03637452\",\n    \"client_name\": \"gozap\",\n    \"created\": \"2026-07-17T12:00:00Z\",\n    \"updated\": \"2026-07-17T12:00:00Z\",\n    \"onWhatsApp\": false,\n    \"docName\": \"\",\n    \"file\": \"\",\n    \"shortCut\": \"saudacao\",\n    \"text\": \"Olá! Como posso ajudar hoje?\",\n    \"type\": \"text\",\n    \"owner\": \"\"\n  }\n}\n```\n\n## Erros comuns\n\n- `400 Bad Request`: JSON inválido.\n- `500 Internal Server Error`: falha ao salvar no banco.\n- `401 Unauthorized`: token inválido.\n\n## Observações\n\n- O handler atual faz apenas upsert; não há campo `delete` nesta rota.\n- Liste templates em `GET /quickreply/showall` para obter o `id` na edição.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "shortCut": "saudacao",
                "type": "text",
                "text": "Olá! Como posso ajudar hoje?"
              }
            }
          }
        }
      }
    },
    "/quickreply/showall": {
      "get": {
        "summary": "Listar respostas rápidas",
        "tags": [
          "Respostas Rápidas"
        ],
        "operationId": "respostas_rapidas_get_quickreply_showall",
        "description": "# Listar respostas rápidas\n\nRetorna todos os templates de resposta rápida da instância, ordenados do mais recente para o mais antigo.\n\n## Endpoint\n\n`GET {{baseUrl}}/quickreply/showall`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\nNenhum.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/quickreply/showall' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"quickreplies\": [\n    {\n      \"id\": \"rb9da9c03637452\",\n      \"onWhatsApp\": false,\n      \"docName\": \"\",\n      \"file\": \"\",\n      \"shortCut\": \"saudacao\",\n      \"text\": \"Olá! Como posso ajudar hoje?\",\n      \"type\": \"text\",\n      \"owner\": \"\"\n    },\n    {\n      \"id\": \"f2b18e84f9b34e1\",\n      \"onWhatsApp\": false,\n      \"docName\": \"catalogo.pdf\",\n      \"file\": \"https://empresa.com/catalogo.pdf\",\n      \"shortCut\": \"catalogo\",\n      \"text\": \"Segue nosso catálogo.\",\n      \"type\": \"document\",\n      \"owner\": \"\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: token ausente ou inválido.\n- `500 Internal Server Error`: falha ao ler o banco.\n\n## Observações\n\n- A chave da lista é `quickreplies` (minúsculo, plural).\n- Use o `id` retornado em `POST /quickreply/edit` para atualizar um template.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/call/make": {
      "post": {
        "summary": "Iniciar chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_make",
        "description": "# Iniciar chamada\n\nInicia uma chamada de voz ou vídeo para um número WhatsApp. Retorna um `call_id` para aceitar/encerrar/trocar WebRTC depois.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/make`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `phone` | string | Sim | Número do destinatário (com DDI, sem `+`). |\n| `video` | boolean | Não | `true` = vídeo; `false` (default) = voz. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/make' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"phone\": \"5511999999999\",\n  \"video\": false\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"call_id\": \"3EB0FAKECALL\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nExige conexão **companion** (não funciona em modo mobile). Só uma chamada ativa por instância.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "phone": "5511999999999",
                "video": false
              }
            }
          }
        }
      }
    },
    "/call/accept": {
      "post": {
        "summary": "Aceitar chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_accept",
        "description": "# Aceitar chamada\n\nAceita uma chamada recebida (ou em andamento no registry) pelo `call_id`.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/accept`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `call_id` | string | Sim | ID da chamada. |\n| `from` | string | Não | JID de origem (campo do modelo; o handler usa `call_id`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/accept' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"call_id\": \"{{callId}}\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"call_id\": \"3EB0FAKECALL\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nExige conexão **companion**. Use o `call_id` de um evento de offer ou de `POST /call/make`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "call_id": "{{callId}}"
              }
            }
          }
        }
      }
    },
    "/call/reject": {
      "post": {
        "summary": "Rejeitar chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_reject",
        "description": "# Rejeitar chamada\n\nRejeita uma chamada recebida. Em companion, usa o registry ou rejeita direto no WhatsApp com `from` + `call_id`. Em mobile, encaminha ao bridge mobile.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/reject`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `call_id` | string | Sim* | ID da chamada. |\n| `from` | string | Sim* | JID de quem ligou (necessário se a chamada não estiver no registry). |\n\n\\* Na prática envie os dois; o serviço precisa do `call_id` e, fora do registry, do `from`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/reject' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"from\": \"5511888888888@s.whatsapp.net\",\n  \"call_id\": \"{{callId}}\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nÚnica rota de chamada que também funciona em modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "from": "5511888888888@s.whatsapp.net",
                "call_id": "{{callId}}"
              }
            }
          }
        }
      }
    },
    "/call/end": {
      "post": {
        "summary": "Encerrar chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_end",
        "description": "# Encerrar chamada\n\nEncerra uma chamada ativa pelo `call_id` e remove do registry da instância.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/end`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `call_id` | string | Sim | ID da chamada ativa. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/end' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"call_id\": \"{{callId}}\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nExige conexão **companion**.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "call_id": "{{callId}}"
              }
            }
          }
        }
      }
    },
    "/call/video/upgrade": {
      "post": {
        "summary": "Ativar vídeo na chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_video_upgrade",
        "description": "# Ativar vídeo na chamada\n\nFaz upgrade de uma chamada de voz ativa para vídeo.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/video/upgrade`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `call_id` | string | Sim | ID da chamada ativa. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/video/upgrade' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"call_id\": \"{{callId}}\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"call_id\": \"3EB0FAKECALL\",\n  \"video\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nExige conexão **companion** e chamada ativa no registry.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "call_id": "{{callId}}"
              }
            }
          }
        }
      }
    },
    "/call/webrtc": {
      "post": {
        "summary": "Trocar SDP WebRTC",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_webrtc",
        "description": "# Trocar SDP WebRTC\n\nEnvia o SDP offer do navegador/cliente e recebe o SDP answer para estabelecer o áudio/vídeo via bridge WebRTC da API.\n\n## Endpoint\n\n`POST {{baseUrl}}/call/webrtc`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `call_id` | string | Sim | ID da chamada ativa. |\n| `sdp_offer` | string | Sim | SDP offer completo (WebRTC). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/call/webrtc' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"call_id\": \"{{callId}}\",\n  \"sdp_offer\": \"v=0\\r\\no=- 0 0 IN IP4 127.0.0.1\\r\\ns=-\\r\\nt=0 0\\r\\n...\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"sdp_answer\": \"v=0\\r\\no=- 0 0 IN IP4 127.0.0.1\\r\\n...\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: chamada não encontrada, já há chamada ativa, ou a instância está em modo mobile (a maioria das rotas de chamada exige companion).\n\n## Observações\n\nExige conexão **companion** e chamada ativa. Usado pelo widget/webcall após accept/make.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "call_id": "{{callId}}",
                "sdp_offer": "v=0\n..."
              }
            }
          }
        }
      }
    },
    "/call/status": {
      "get": {
        "summary": "Listar chamadas ativas",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_get_call_status",
        "description": "# Listar chamadas ativas\n\nLista as chamadas ativas no registry da instância (id, peer, direção, estado, mídia e se há bridge WebRTC).\n\n## Endpoint\n\n`GET {{baseUrl}}/call/status`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/call/status' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"calls\": [\n    {\n      \"call_id\": \"3EB0FAKECALL\",\n      \"peer\": \"5511888888888@s.whatsapp.net\",\n      \"direction\": \"outgoing\",\n      \"state\": \"ACTIVE\",\n      \"media_type\": \"audio\",\n      \"has_bridge\": true\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/call/link/create": {
      "post": {
        "summary": "Criar link de chamada",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_link_create",
        "description": "# Criar link de chamada\n\nGera um link reutilizável `call.whatsapp.com` (voz ou vídeo). Funciona em instâncias mobile e companion.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/call/link/create\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"media\": \"audio\",\n  \"waiting_room\": false,\n  \"event_start_time\": 0\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"link\": {\n    \"token\": \"AbCtoken\",\n    \"media\": \"audio\",\n    \"url\": \"https://call.whatsapp.com/voice/AbCtoken\"\n  }\n}\n```\n\n## Observações\n\n`media`: `audio` (padrão) ou `video`. `waiting_room` ativa sala de espera na criação. `event_start_time` (Unix segundos) é opcional para links agendados. Use o `token` retornado em `/call/link/waiting-room`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "media": "audio",
                "waiting_room": false,
                "event_start_time": 0
              }
            }
          }
        }
      }
    },
    "/call/link/waiting-room": {
      "post": {
        "summary": "Configurar sala de espera do link",
        "tags": [
          "Chamadas"
        ],
        "operationId": "chamadas_post_call_link_waiting_room",
        "description": "# Configurar sala de espera do link\n\nAtiva ou desativa a sala de espera de um link de chamada já criado. Funciona em mobile e companion.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/call/link/waiting-room\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"token\": \"{{callLinkToken}}\",\n  \"media\": \"audio\",\n  \"enabled\": true\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true\n}\n```\n\n## Observações\n\n`token` é o valor retornado por `/call/link/create` (não o token da instância). `media` deve bater com o tipo do link (`audio` ou `video`).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "token": "{{callLinkToken}}",
                "media": "audio",
                "enabled": true
              }
            }
          }
        }
      }
    },
    "/chatwoot/call/resolve": {
      "get": {
        "summary": "Resolver widget de chamada Chatwoot",
        "tags": [
          "Integração Chatwoot"
        ],
        "operationId": "integracao_chatwoot_get_chatwoot_call_resolve",
        "description": "# Resolver widget de chamada Chatwoot\n\nResolve token da instância e dados do contato para o widget de chamada do Chatwoot.\n\n## Endpoint\n\n``` http\nGET {{baseUrl}}/chatwoot/call/resolve\n```\n\n## Autenticação\n\n``` http\nNenhuma (rota pública).\n```\n\n## Query\n\n| Parâmetro | Obrigatório | Descrição |\n| --- | --- | --- |\n| account_id | Sim | ID da conta Chatwoot |\n| conversation_id | Sim | ID da conversa |\n| token | Não | Token da instância para restringir o escopo |\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"token\": \"...\",\n  \"phone\": \"5511999999999\",\n  \"instance_id\": \"...\"\n}\n```",
        "parameters": [
          {
            "name": "account_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "1"
          },
          {
            "name": "conversation_id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "1"
          }
        ]
      }
    },
    "/chatwoot/config": {
      "get": {
        "summary": "Obter configuração do Chatwoot",
        "tags": [
          "Integração Chatwoot"
        ],
        "operationId": "integracao_chatwoot_get_chatwoot_config",
        "description": "# Obter configuração do Chatwoot\n\nRetorna a configuração Chatwoot salva para a instância. Se nunca foi configurada, `config` vem `null`.\n\n## Endpoint\n\n`GET {{baseUrl}}/chatwoot/config`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/chatwoot/config' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"config\": {\n    \"instance_id\": \"rbad7d89b64b6dc\",\n    \"chatwoot_enabled\": true,\n    \"chatwoot_url\": \"https://chatwoot.exemplo.com\",\n    \"chatwoot_account_id\": 1,\n    \"chatwoot_inbox_id\": 1,\n    \"chatwoot_sync\": true,\n    \"chatwoot_sync_status\": \"idle\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "put": {
        "summary": "Atualizar configuração do Chatwoot",
        "tags": [
          "Integração Chatwoot"
        ],
        "operationId": "integracao_chatwoot_put_chatwoot_config",
        "description": "# Atualizar configuração do Chatwoot\n\nCria ou atualiza a integração Chatwoot da instância. A API valida a config, salva e devolve também `webhook_url` e `call_script_url` para configurar no Chatwoot.\n\n## Endpoint\n\n`PUT {{baseUrl}}/chatwoot/config`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `enabled` | boolean | Não | Liga/desliga a integração. |\n| `url` | string | Não* | URL base do Chatwoot. Vazio preserva o valor atual. |\n| `access_token` | string | Não* | Token de acesso da API Chatwoot. |\n| `account_id` | number | Não* | ID da conta Chatwoot. |\n| `inbox_id` | number | Não* | ID da inbox. |\n| `database_url` | string | Não | URL Postgres do Chatwoot (para sync). |\n| `sync` | boolean | Não | Ativa sincronização histórica. |\n| `ignore_groups` | boolean | Não | Ignora mensagens de grupos. |\n| `sign_messages` | boolean | Não | Assina mensagens com nome do agente (default `true` se omitido na criação). |\n| `create_new_conversation` | boolean | Não | Cria nova conversa em certos fluxos. |\n| `sync_contacts_to_whatsapp` | boolean | Não | Sync de contatos Chatwoot → WhatsApp (default `true`). |\n| `management_phone` | string | Não | Telefone de gestão. |\n\n\\* Campos de conexão: se vazios, preservam o valor já salvo.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request PUT '{{baseUrl}}/chatwoot/config' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"enabled\": true,\n  \"url\": \"https://chatwoot.exemplo.com\",\n  \"access_token\": \"xxxxxxxxxxxxxxxxx\",\n  \"account_id\": 1,\n  \"inbox_id\": 1,\n  \"database_url\": \"postgres://postgres:password@100.100.100.100:5432/chatwoot?sslmode=disable\",\n  \"sync\": true,\n  \"ignore_groups\": true,\n  \"sign_messages\": false,\n  \"create_new_conversation\": false,\n  \"sync_contacts_to_whatsapp\": true,\n  \"management_phone\": \"5511999999999\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"config\": {\n    \"chatwoot_enabled\": true,\n    \"chatwoot_url\": \"https://chatwoot.exemplo.com\"\n  },\n  \"webhook_url\": \"https://api.exemplo.com/chatwoot/webhook\",\n  \"call_script_url\": \"https://api.exemplo.com/static/chatwoot-call.js\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: config inválida (URL/token/conta).\n\n## Observações\n\nApós salvar, configure o webhook do Chatwoot com a `webhook_url` retornada (autenticada pelo token da instância).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "enabled": true,
                "url": "https://chatwoot.exemplo.com",
                "access_token": "xxxxxxxxxxxxxxxxx",
                "account_id": 1,
                "inbox_id": 1,
                "database_url": "postgres://postgres:password@100.100.100.100:5432/chatwoot?sslmode=disable",
                "sync": true,
                "ignore_groups": true,
                "sign_messages": false,
                "create_new_conversation": false,
                "sync_contacts_to_whatsapp": true,
                "management_phone": "5511999999999"
              }
            }
          }
        }
      }
    },
    "/chatwoot/sync/status": {
      "get": {
        "summary": "Status da sincronização Chatwoot",
        "tags": [
          "Integração Chatwoot"
        ],
        "operationId": "integracao_chatwoot_get_chatwoot_sync_status",
        "description": "# Status da sincronização Chatwoot\n\nMostra o estado do sync histórico (status, cursor, erro, última sync e contagem local de mensagens).\n\n## Endpoint\n\n`GET {{baseUrl}}/chatwoot/sync/status`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/chatwoot/sync/status' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"status\": {\n    \"sync_status\": \"idle\",\n    \"sync_cursor\": \"\",\n    \"sync_error\": \"\",\n    \"synced_at\": null,\n    \"messages_local\": 120\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n\n## Observações\n\nSe não houver config Chatwoot, retorna `sync_status: idle`.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/chatwoot/webhook": {
      "post": {
        "summary": "Webhook Chatwoot",
        "tags": [
          "Integração Chatwoot"
        ],
        "operationId": "integracao_chatwoot_post_chatwoot_webhook",
        "description": "# Webhook Chatwoot\n\nRecebe eventos do Chatwoot (mensagens criadas, atualizações etc.) e processa envio/sincronização com o WhatsApp.\n\n## Endpoint\n\n``` http\nPOST {{baseUrl}}/chatwoot/webhook\n```\n\n## Autenticação\n\n``` http\ntoken: {{token}}\n```\n\n## Corpo\n\n``` json\n{\n  \"event\": \"message_created\",\n  \"account\": { \"id\": 1 },\n  \"conversation\": { \"id\": 1 },\n  \"message\": {}\n}\n```\n\n## Resposta\n\n``` json\n{\n  \"success\": true,\n  \"result\": { \"handled\": true, \"action\": \"...\" }\n}\n```\n\n## Observações\n\nConfigure esta URL no Chatwoot apontando para a instância. O corpo segue o payload nativo do Chatwoot.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "event": "message_created",
                "id": 42,
                "content": "Olá pelo Chatwoot",
                "message_type": "outgoing",
                "private": false,
                "conversation": {
                  "id": 1,
                  "inbox_id": 1
                },
                "sender": {
                  "name": "Agente",
                  "type": "user"
                }
              }
            }
          }
        }
      }
    },
    "/business/get/profile": {
      "post": {
        "summary": "Obter perfil comercial",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_get_profile",
        "description": "# Obter perfil comercial\n\nRetorna o perfil Business (descrição, endereço, e-mail, sites, categorias e horário) de um JID. Se `jid` for omitido, usa a própria conta conectada.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/get/profile`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Não | JID do negócio. Vazio = perfil da própria instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/get/profile' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"{{remoteJid}}\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": {\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"description\": \"Loja de eletrônicos\",\n    \"address\": \"Rua das Flores, 123\",\n    \"email\": \"contato@gozap.dev\",\n    \"websites\": [\n      \"https://gozap.dev\"\n    ],\n    \"categories\": [\n      {\n        \"id\": \"2255\",\n        \"localized_display_name\": \"Electronics\"\n      }\n    ],\n    \"business_hours_timezone\": \"America/Sao_Paulo\",\n    \"business_hours\": [\n      {\n        \"day_of_week\": \"mon\",\n        \"mode\": \"open_24h\",\n        \"open_time\": \"\",\n        \"close_time\": \"\"\n      }\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n\n## Observações\n\nRequer conta Business conectada (companion ou mobile).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "{{remoteJid}}"
              }
            }
          }
        }
      }
    },
    "/business/get/categories": {
      "get": {
        "summary": "Obter categorias de negócios",
        "tags": [
          "Business"
        ],
        "operationId": "business_get_business_get_categories",
        "description": "# Obter categorias de negócios\n\nLista as categorias oficiais que o WhatsApp aceita no perfil Business. Use os `id` retornados em `business/update/profile` (`category_ids`).\n\n## Endpoint\n\n`GET {{baseUrl}}/business/get/categories`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/business/get/categories' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": [\n    {\n      \"id\": \"2255\",\n      \"localized_display_name\": \"Electronics\"\n    },\n    {\n      \"id\": \"1234\",\n      \"localized_display_name\": \"Restaurant\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n\n## Observações\n\nRequer conta Business conectada.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/business/update/profile": {
      "post": {
        "summary": "Atualizar perfil comercial",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_update_profile",
        "description": "# Atualizar perfil comercial\n\nAtualiza campos do perfil Business da conta conectada. Envie apenas os campos que deseja alterar; pelo menos um é obrigatório.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/update/profile`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `description` | string | Não* | Descrição do negócio. |\n| `address` | string | Não* | Endereço. |\n| `email` | string \\| null | Não* | E-mail. `null` omite; `\"\"` limpa. |\n| `website` | string | Não* | Um site (legado); é mesclado em `websites`. |\n| `websites` | string[] | Não* | Lista de sites. |\n| `category_ids` | string[] | Não* | IDs de `GET /business/get/categories`. |\n| `timezone` | string | Não* | Fuso (ex.: `America/Sao_Paulo`). Com `business_hours`. |\n| `business_hours` | object[] | Não* | Horários: `day_of_week`, `mode`, `open_time`, `close_time`. |\n| `latitude` | string | Não | Latitude (com `address`). |\n| `longitude` | string | Não | Longitude (com `address`). |\n\n\\* Pelo menos um campo deve ser enviado.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/update/profile' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"description\": \"Loja de eletrônicos e acessórios\",\n  \"address\": \"Rua das Flores, 123 - Centro\",\n  \"email\": \"contato@gozap.dev\",\n  \"websites\": [\n    \"https://gozap.dev\",\n    \"https://gozap.dev/faq\"\n  ],\n  \"category_ids\": [\n    \"2255\"\n  ],\n  \"timezone\": \"America/Sao_Paulo\",\n  \"business_hours\": [\n    {\n      \"day_of_week\": \"mon\",\n      \"mode\": \"open_24h\"\n    },\n    {\n      \"day_of_week\": \"tue\",\n      \"mode\": \"open_24h\"\n    },\n    {\n      \"day_of_week\": \"wed\",\n      \"mode\": \"open_24h\"\n    },\n    {\n      \"day_of_week\": \"thu\",\n      \"mode\": \"open_24h\"\n    },\n    {\n      \"day_of_week\": \"fri\",\n      \"mode\": \"open_24h\"\n    },\n    {\n      \"day_of_week\": \"sat\",\n      \"mode\": \"appointment_only\"\n    },\n    {\n      \"day_of_week\": \"sun\",\n      \"mode\": \"appointment_only\"\n    }\n  ],\n  \"latitude\": \"-23.5505\",\n  \"longitude\": \"-46.6333\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": {\n    \"description\": {\n      \"status\": \"updated\"\n    },\n    \"address\": {\n      \"status\": \"updated\"\n    }\n  },\n  \"updated\": 2,\n  \"failed\": 0\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400`/`500`: nenhum campo enviado (`at least one field is required`).\n\n## Observações\n\nRequer conta Business. A resposta lista por campo o que foi atualizado ou falhou.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "description": "Loja de eletrônicos e acessórios",
                "address": "Rua das Flores, 123 - Centro",
                "email": "contato@gozap.dev",
                "websites": [
                  "https://gozap.dev",
                  "https://gozap.dev/faq"
                ],
                "category_ids": [
                  "2255"
                ],
                "timezone": "America/Sao_Paulo",
                "business_hours": [
                  {
                    "day_of_week": "mon",
                    "mode": "open_24h"
                  },
                  {
                    "day_of_week": "tue",
                    "mode": "open_24h"
                  },
                  {
                    "day_of_week": "wed",
                    "mode": "open_24h"
                  },
                  {
                    "day_of_week": "thu",
                    "mode": "open_24h"
                  },
                  {
                    "day_of_week": "fri",
                    "mode": "open_24h"
                  },
                  {
                    "day_of_week": "sat",
                    "mode": "appointment_only"
                  },
                  {
                    "day_of_week": "sun",
                    "mode": "appointment_only"
                  }
                ],
                "latitude": "-23.5505",
                "longitude": "-46.6333"
              }
            }
          }
        }
      }
    },
    "/business/get/features": {
      "post": {
        "summary": "Mobile - Obter features Business",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_get_features",
        "description": "# Obter features Business (mobile)\n\nConsulta, via socket cobaltmobile, quais recursos Business estão habilitados (Meta Verified, GenAI, etc.). Use só com instância em modo mobile conectada.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/get/features`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `meta_verified` | boolean | Não | Incluir flag Meta Verified. |\n| `marketing_messages` | boolean | Não | Incluir Marketing Messages. |\n| `genai` | boolean | Não | Incluir GenAI. |\n| `genai_image` | boolean | Não | Incluir GenAI Image. |\n| `meta_one` | boolean | Não | Incluir Meta One. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/get/features' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"meta_verified\": false,\n  \"marketing_messages\": false,\n  \"genai\": true,\n  \"genai_image\": true,\n  \"meta_one\": false\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"features\": {\n    \"meta_verified\": false,\n    \"marketing_messages\": false,\n    \"genai\": true,\n    \"genai_image\": true,\n    \"meta_one\": false\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: bridge mobile indisponível, instância não conectada em modo mobile, ou falha no WhatsApp.\n\n## Observações\n\n**Mobile only.** Falha se o bridge mobile não estiver disponível.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "meta_verified": false,
                "marketing_messages": false,
                "genai": true,
                "genai_image": true,
                "meta_one": false
              }
            }
          }
        }
      }
    },
    "/business/get/mobile_config": {
      "post": {
        "summary": "Mobile - Obter configuração mobile da conta Business",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_get_mobile_config",
        "description": "# Obter configuração mobile da conta Business\n\nBusca um bloco `mobile_config` no WhatsApp (via cobaltmobile). O campo `name` identifica qual config consultar.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/get/mobile_config`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Sim | Nome da config (também aceito como query `?name=`). |\n| `v` | string | Não | Versão da config. |\n| `report_type` | string | Não | Tipo de relatório, quando aplicável. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/get/mobile_config' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"biz_report_reasons\",\n  \"v\": \"1\",\n  \"report_type\": \"business_user\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"config\": {\n    \"name\": \"biz_report_reasons\",\n    \"v\": \"1\",\n    \"report_type\": \"business_user\",\n    \"tag\": \"mobile_config\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: bridge mobile indisponível, instância não conectada em modo mobile, ou falha no WhatsApp.\n- `400 Bad Request`: `name` ausente.\n\n## Observações\n\n**Mobile only.** Rota `POST /business/get/mobile_config`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "biz_report_reasons",
                "v": "1",
                "report_type": "business_user"
              }
            }
          }
        }
      }
    },
    "/business/get/verified_name": {
      "post": {
        "summary": "Mobile - Obter verified name",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_get_verified_name",
        "description": "# Obter verified name (mobile)\n\nObtém o certificado de nome verificado (tamanho em bytes) de um JID via socket cobaltmobile.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/get/verified_name`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Não | JID alvo. Vazio = comportamento do bridge para a conta atual. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/get/verified_name' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"verified_name\": {\n    \"jid\": \"\",\n    \"bytes\": 256\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: bridge mobile indisponível, instância não conectada em modo mobile, ou falha no WhatsApp.\n\n## Observações\n\n**Mobile only.**",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": ""
              }
            }
          }
        }
      }
    },
    "/business/update/verified_name": {
      "post": {
        "summary": "Mobile - Atualizar verified name",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_update_verified_name",
        "description": "# Atualizar verified name (mobile)\n\nSolicita/atualiza o nome verificado da conta Business via cobaltmobile. O campo `name` é obrigatório.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/update/verified_name`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Sim | Novo nome verificado. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/update/verified_name' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"GoZap Ltda\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"name\": \"GoZap Ltda\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: bridge mobile indisponível, instância não conectada em modo mobile, ou falha no WhatsApp.\n- `400 Bad Request`: `name` vazio.\n\n## Observações\n\n**Mobile only.** Sujeito às regras e aprovações do WhatsApp/Meta.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "GoZap Ltda"
              }
            }
          }
        }
      }
    },
    "/business/catalog/list": {
      "post": {
        "summary": "Listar produtos do catálogo WhatsApp",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_list",
        "description": "# Listar produtos do catálogo WhatsApp\n\nLista produtos do catálogo WhatsApp de um JID Business (paginado). Diferente de `GET /business/catalog/products`, que lista produtos salvos localmente na API.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/list`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID do negócio dono do catálogo. |\n| `after` | string | Não | Cursor da próxima página. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/list' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": {\n    \"paging\": {\n      \"cursors\": {\n        \"after\": \"\"\n      }\n    },\n    \"data\": [\n      {\n        \"id\": \"prod-1\",\n        \"name\": \"Fone Bluetooth\",\n        \"price\": \"99000\"\n      }\n    ]\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `jid` ausente.\n\n## Observações\n\nConsulta o catálogo remoto no WhatsApp (até 10 itens por página).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/business/catalog/info": {
      "post": {
        "summary": "Obter produto do catálogo WhatsApp",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_info",
        "description": "# Obter produto do catálogo WhatsApp\n\nRetorna os detalhes de um produto específico no catálogo WhatsApp de um JID Business.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/info`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | JID do negócio. |\n| `id` | string | Sim | ID do produto no catálogo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/info' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"5511999999999@s.whatsapp.net\",\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": {\n    \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"name\": \"Fone Bluetooth\",\n    \"description\": \"Fone sem fio\",\n    \"price\": \"99000\",\n    \"currency\": \"BRL\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `jid` ou `id` ausente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "5511999999999@s.whatsapp.net",
                "id": "123e4567-e89b-12d3-a456-426614174000"
              }
            }
          }
        }
      }
    },
    "/business/catalog/delete": {
      "post": {
        "summary": "Excluir produto do catálogo WhatsApp",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_delete",
        "description": "# Excluir produto do catálogo WhatsApp\n\nRemove um produto do catálogo WhatsApp da conta conectada. Para apagar um produto local da API, use `DELETE /business/catalog/product/{{id}}`.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/delete`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string | Sim | ID do produto no catálogo WhatsApp. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/delete' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": \"Deleted product\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `id` ausente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "id": "123e4567-e89b-12d3-a456-426614174000"
              }
            }
          }
        }
      }
    },
    "/business/catalog/show": {
      "post": {
        "summary": "Exibir produto no catálogo",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_show",
        "description": "# Exibir produto no catálogo\n\nTorna um produto visível no catálogo WhatsApp da conta conectada (`hidden = false`).\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/show`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string | Sim | ID do produto. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/show' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": \"Product shown\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `id` ausente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "id": "123e4567-e89b-12d3-a456-426614174000"
              }
            }
          }
        }
      }
    },
    "/business/catalog/hide": {
      "post": {
        "summary": "Ocultar produto no catálogo",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_hide",
        "description": "# Ocultar produto no catálogo\n\nOculta um produto do catálogo WhatsApp da conta conectada (`hidden = true`), sem excluí-lo.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/hide`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string | Sim | ID do produto. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/hide' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"id\": \"123e4567-e89b-12d3-a456-426614174000\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"response\": \"Product hidden\"\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `id` ausente.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "id": "123e4567-e89b-12d3-a456-426614174000"
              }
            }
          }
        }
      }
    },
    "/business/catalog/product": {
      "post": {
        "summary": "Cadastrar produto local do catálogo",
        "tags": [
          "Business"
        ],
        "operationId": "business_post_business_catalog_product",
        "description": "# Cadastrar produto local do catálogo\n\nCria um produto no banco local da API (shop/catalog GoZap) para uso em envios (`POST /send/product`). Não cria o produto no catálogo remoto do WhatsApp.\n\n## Endpoint\n\n`POST {{baseUrl}}/business/catalog/product`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `product_id` | string | Sim | ID do produto. |\n| `title` | string | Sim | Título. |\n| `description` | string | Não | Descrição. |\n| `currency_code` | string | Não | Moeda (ex.: `BRL`). |\n| `price_amount_1000` | number | Não | Preço × 1000 (ex.: R$ 99,00 → `99000`). |\n| `retailer_id` | string | Não | SKU / ID do varejista. |\n| `url` | string | Não | URL do produto. |\n| `image_url` | string | Não | URL da imagem. |\n| `image_count` | number | Não | Quantidade de imagens. |\n| `business_owner_jid` | string | Não | JID do dono do negócio. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/business/catalog/product' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"product_id\": \"sku-fone-001\",\n  \"title\": \"Fone Bluetooth\",\n  \"description\": \"Fone sem fio com estojo\",\n  \"currency_code\": \"BRL\",\n  \"price_amount_1000\": 99000,\n  \"retailer_id\": \"SKU-FONE-001\",\n  \"url\": \"https://loja.exemplo.com/fone\",\n  \"image_url\": \"https://loja.exemplo.com/fone.jpg\",\n  \"image_count\": 1,\n  \"business_owner_jid\": \"5511999999999@s.whatsapp.net\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"product\": {\n    \"product_id\": \"sku-fone-001\",\n    \"title\": \"Fone Bluetooth\",\n    \"currency_code\": \"BRL\",\n    \"price_amount_1000\": 99000,\n    \"active\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n- `400 Bad Request`: `product_id` ou `title` ausente.\n\n## Observações\n\nArmazenamento local na API. Para catálogo WhatsApp use as rotas `business/catalog/list|info|delete|show|hide`.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "product_id": "sku-fone-001",
                "title": "Fone Bluetooth",
                "description": "Fone sem fio com estojo",
                "currency_code": "BRL",
                "price_amount_1000": 99000,
                "retailer_id": "SKU-FONE-001",
                "url": "https://loja.exemplo.com/fone",
                "image_url": "https://loja.exemplo.com/fone.jpg",
                "image_count": 1,
                "business_owner_jid": "5511999999999@s.whatsapp.net"
              }
            }
          }
        }
      }
    },
    "/business/catalog/products": {
      "get": {
        "summary": "Listar produtos locais do catálogo",
        "tags": [
          "Business"
        ],
        "operationId": "business_get_business_catalog_products",
        "description": "# Listar produtos locais do catálogo\n\nLista os produtos cadastrados localmente na API para a instância. Não consulta o catálogo remoto do WhatsApp.\n\n## Endpoint\n\n`GET {{baseUrl}}/business/catalog/products`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/business/catalog/products' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"products\": [\n    {\n      \"product_id\": \"sku-fone-001\",\n      \"title\": \"Fone Bluetooth\",\n      \"currency_code\": \"BRL\",\n      \"price_amount_1000\": 99000,\n      \"active\": true\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/business/catalog/product/{id}": {
      "delete": {
        "summary": "Remover produto local do catálogo",
        "tags": [
          "Business"
        ],
        "operationId": "business_delete_business_catalog_product_id",
        "description": "# Remover produto local do catálogo\n\nRemove um produto do banco local da API pelo `id` (path). Não remove do catálogo WhatsApp remoto.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/business/catalog/product/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | path | Sim | Identificador do produto local (`product_id` / id na URL). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/business/catalog/product/sku-fone-001' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: instância desconectada ou a operação falhou no WhatsApp.\n\n## Observações\n\nSubstitua `{{id}}` pelo `product_id` cadastrado.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/auto-reply/rule": {
      "post": {
        "summary": "Criar regra de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_post_auto_reply_rule",
        "description": "# Criar regra de auto-resposta\n\nCria uma regra que responde automaticamente a mensagens recebidas. Use para FAQ, horário de atendimento ou filtros por palavra-chave.\n\n## Endpoint\n\n`POST {{baseUrl}}/auto-reply/rule`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Não | Nome amigável da regra (ex.: \"Horário de Atendimento\"). |\n| `match_type` | string | Não* | Como casar a mensagem: `keywords`, `exact` ou `pattern`. |\n| `match_value` | string[] | Não* | Lista de palavras-chave (usado quando `match_type` = `keywords`). |\n| `pattern` | string | Não* | Texto exato (`exact`) ou regex (`pattern`). |\n| `response_type` | string | Não | Tipo da resposta: `text`, `media`, `location`, `contact` ou `interactive`. |\n| `response_payload` | object | Não | Conteúdo da resposta (ex.: `{ \"text\": \"...\" }` para texto). |\n| `scope` | string | Não | Escopo: `all` (padrão), `groups` ou `private`. |\n| `allowed_jids` | string[] | Não | Se preenchido, só responde a esses JIDs de remetente. |\n| `blocked_jids` | string[] | Não | JIDs de remetente que nunca disparam a regra. |\n| `priority` | number | Não | Prioridade (maior = avaliada primeiro na ordenação do serviço). |\n| `cooldown_ms` | number | Não | Intervalo mínimo (ms) entre disparos da regra para o mesmo remetente. |\n| `quoted` | boolean | Não | Se `true`, responde citando a mensagem original. |\n| `simulate_typing` | boolean | Não | Simula \"digitando...\" antes de enviar. |\n| `typing_duration_ms` | number | Não | Duração (ms) da simulação de digitação. |\n| `active` | boolean | Não | Se `true`, a regra fica ativa. Se omitido, chega como `false`. |\n\nNota: pelo menos o critério de match deve fazer sentido: `keywords` + `match_value`, ou `exact`/`pattern` + `pattern`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/auto-reply/rule' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"Horário de Atendimento\",\n  \"match_type\": \"keywords\",\n  \"match_value\": [\n    \"horario\",\n    \"atendimento\"\n  ],\n  \"pattern\": \"\",\n  \"response_type\": \"text\",\n  \"response_payload\": {\n    \"text\": \"Nosso horário de atendimento é de segunda a sexta, das 08h às 18h.\"\n  },\n  \"scope\": \"all\",\n  \"allowed_jids\": [],\n  \"blocked_jids\": [],\n  \"priority\": 10,\n  \"cooldown_ms\": 60000,\n  \"quoted\": true,\n  \"simulate_typing\": true,\n  \"typing_duration_ms\": 1500,\n  \"active\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"rule\": {\n    \"id\": \"01HXYZABCDEFGHJKLMNPQRSTUV\",\n    \"client_name\": \"develop\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"name\": \"Horário de Atendimento\",\n    \"match_type\": \"keywords\",\n    \"match_value\": [\"horario\", \"atendimento\"],\n    \"pattern\": \"\",\n    \"response_type\": \"text\",\n    \"response_payload\": {\n      \"text\": \"Nosso horário de atendimento é de segunda a sexta, das 08h às 18h.\"\n    },\n    \"scope\": \"all\",\n    \"allowed_jids\": [],\n    \"blocked_jids\": [],\n    \"priority\": 10,\n    \"cooldown_ms\": 60000,\n    \"quoted\": true,\n    \"simulate_typing\": true,\n    \"typing_duration_ms\": 1500,\n    \"active\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `500 Internal Server Error`: falha ao persistir a regra.\n\n## Observações\n\n- `match_type` aceitos: `keywords` (contém alguma palavra de `match_value`), `exact` (texto igual a `pattern`) e `pattern` (regex em `pattern`).\n- `response_type` aceitos: `text`, `media`, `location`, `contact`, `interactive`. Em `text`, o payload tipicamente usa `{ \"text\": \"...\" }`.\n- No texto da resposta você pode usar `{{sender}}`, `{{chat}}` e `{{pushName}}`.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Horário de Atendimento",
                "match_type": "keywords",
                "match_value": [
                  "horario",
                  "atendimento"
                ],
                "pattern": "",
                "response_type": "text",
                "response_payload": {
                  "text": "Nosso horário de atendimento é de segunda a sexta, das 08h às 18h."
                },
                "scope": "all",
                "allowed_jids": [],
                "blocked_jids": [],
                "priority": 10,
                "cooldown_ms": 60000,
                "quoted": true,
                "simulate_typing": true,
                "typing_duration_ms": 1500,
                "active": true
              }
            }
          }
        }
      }
    },
    "/auto-reply/rules": {
      "get": {
        "summary": "Listar regras de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_get_auto_reply_rules",
        "description": "# Listar regras de auto-resposta\n\nRetorna todas as regras de auto-resposta da instância autenticada. Use para auditar ou montar um painel de regras.\n\n## Endpoint\n\n`GET {{baseUrl}}/auto-reply/rules`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/auto-reply/rules' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"rules\": [\n    {\n      \"id\": \"01HXYZABCDEFGHJKLMNPQRSTUV\",\n      \"name\": \"Horário de Atendimento\",\n      \"match_type\": \"keywords\",\n      \"match_value\": [\"horario\", \"atendimento\"],\n      \"response_type\": \"text\",\n      \"scope\": \"all\",\n      \"priority\": 10,\n      \"active\": true\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao consultar o banco.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/auto-reply/rule/{id}": {
      "get": {
        "summary": "Obter regra de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_get_auto_reply_rule_id",
        "description": "# Obter regra de auto-resposta\n\nBusca uma regra específica pelo ID. Use antes de editar ou para inspecionar o `response_payload` completo.\n\n## Endpoint\n\n`GET {{baseUrl}}/auto-reply/rule/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string (path) | Sim | ID da regra retornado na criação/listagem. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/auto-reply/rule/{{id}}' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"rule\": {\n    \"id\": \"01HXYZABCDEFGHJKLMNPQRSTUV\",\n    \"client_name\": \"develop\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"name\": \"Horário de Atendimento\",\n    \"match_type\": \"keywords\",\n    \"match_value\": [\"horario\", \"atendimento\"],\n    \"pattern\": \"\",\n    \"response_type\": \"text\",\n    \"response_payload\": {\n      \"text\": \"Nosso horário de atendimento é de segunda a sexta, das 08h às 18h.\"\n    },\n    \"scope\": \"all\",\n    \"allowed_jids\": [],\n    \"blocked_jids\": [],\n    \"priority\": 10,\n    \"cooldown_ms\": 60000,\n    \"quoted\": true,\n    \"simulate_typing\": true,\n    \"typing_duration_ms\": 1500,\n    \"active\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `404 Not Found`: regra inexistente ou de outra instância (`rule not found`).\n- `500 Internal Server Error`: falha ao consultar o banco.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "put": {
        "summary": "Atualizar regra de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_put_auto_reply_rule_id",
        "description": "# Atualizar regra de auto-resposta\n\nSubstitui os campos da regra pelo corpo enviado. Use para corrigir o match, a resposta ou o escopo.\n\n## Endpoint\n\n`PUT {{baseUrl}}/auto-reply/rule/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `name` | string | Não | Nome amigável da regra (ex.: \"Horário de Atendimento\"). |\n| `match_type` | string | Não* | Como casar a mensagem: `keywords`, `exact` ou `pattern`. |\n| `match_value` | string[] | Não* | Lista de palavras-chave (usado quando `match_type` = `keywords`). |\n| `pattern` | string | Não* | Texto exato (`exact`) ou regex (`pattern`). |\n| `response_type` | string | Não | Tipo da resposta: `text`, `media`, `location`, `contact` ou `interactive`. |\n| `response_payload` | object | Não | Conteúdo da resposta (ex.: `{ \"text\": \"...\" }` para texto). |\n| `scope` | string | Não | Escopo: `all` (padrão), `groups` ou `private`. |\n| `allowed_jids` | string[] | Não | Se preenchido, só responde a esses JIDs de remetente. |\n| `blocked_jids` | string[] | Não | JIDs de remetente que nunca disparam a regra. |\n| `priority` | number | Não | Prioridade (maior = avaliada primeiro na ordenação do serviço). |\n| `cooldown_ms` | number | Não | Intervalo mínimo (ms) entre disparos da regra para o mesmo remetente. |\n| `quoted` | boolean | Não | Se `true`, responde citando a mensagem original. |\n| `simulate_typing` | boolean | Não | Simula \"digitando...\" antes de enviar. |\n| `typing_duration_ms` | number | Não | Duração (ms) da simulação de digitação. |\n| `active` | boolean | Não | Se `true`, a regra fica ativa. Se omitido, chega como `false`. |\n\n\nNota: pelo menos o critério de match deve fazer sentido: `keywords` + `match_value`, ou `exact`/`pattern` + `pattern`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request PUT '{{baseUrl}}/auto-reply/rule/{{id}}' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"name\": \"Horário de Atendimento\",\n  \"match_type\": \"keywords\",\n  \"match_value\": [\n    \"horario\",\n    \"atendimento\",\n    \"funcionamento\"\n  ],\n  \"pattern\": \"\",\n  \"response_type\": \"text\",\n  \"response_payload\": {\n    \"text\": \"Olá {{pushName}}! Nosso horário é de segunda a sexta, das 08h às 18h.\"\n  },\n  \"scope\": \"private\",\n  \"allowed_jids\": [],\n  \"blocked_jids\": [],\n  \"priority\": 20,\n  \"cooldown_ms\": 120000,\n  \"quoted\": true,\n  \"simulate_typing\": true,\n  \"typing_duration_ms\": 2000,\n  \"active\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"rule\": {\n    \"id\": \"01HXYZABCDEFGHJKLMNPQRSTUV\",\n    \"client_name\": \"develop\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"name\": \"Horário de Atendimento\",\n    \"match_type\": \"keywords\",\n    \"match_value\": [\"horario\", \"atendimento\"],\n    \"pattern\": \"\",\n    \"response_type\": \"text\",\n    \"response_payload\": {\n      \"text\": \"Nosso horário de atendimento é de segunda a sexta, das 08h às 18h.\"\n    },\n    \"scope\": \"all\",\n    \"allowed_jids\": [],\n    \"blocked_jids\": [],\n    \"priority\": 10,\n    \"cooldown_ms\": 60000,\n    \"quoted\": true,\n    \"simulate_typing\": true,\n    \"typing_duration_ms\": 1500,\n    \"active\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `404 Not Found`: regra inexistente (`rule not found`).\n- `500 Internal Server Error`: falha ao salvar a regra.\n\n## Observações\n\n- O handler sobrescreve **todos** os campos listados; envie o estado completo desejado.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "name": "Horário de Atendimento",
                "match_type": "keywords",
                "match_value": [
                  "horario",
                  "atendimento",
                  "funcionamento"
                ],
                "pattern": "",
                "response_type": "text",
                "response_payload": {
                  "text": "Olá {{pushName}}! Nosso horário é de segunda a sexta, das 08h às 18h."
                },
                "scope": "private",
                "allowed_jids": [],
                "blocked_jids": [],
                "priority": 20,
                "cooldown_ms": 120000,
                "quoted": true,
                "simulate_typing": true,
                "typing_duration_ms": 2000,
                "active": true
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Excluir regra de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_delete_auto_reply_rule_id",
        "description": "# Excluir regra de auto-resposta\n\nRemove permanentemente uma regra da instância. Use quando a automação não for mais necessária.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/auto-reply/rule/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string (path) | Sim | ID da regra a excluir. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/auto-reply/rule/{{id}}' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao excluir a regra.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/auto-reply/rule/{id}/toggle": {
      "post": {
        "summary": "Ativar/desativar regra",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_post_auto_reply_rule_id_toggle",
        "description": "# Ativar ou desativar regra\n\nLiga ou desliga uma regra sem apagar a configuração. Use para pausar uma automação temporariamente.\n\n## Endpoint\n\n`POST {{baseUrl}}/auto-reply/rule/{{id}}/toggle`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `active` | boolean | Sim* | `true` ativa a regra; `false` desativa. |\n\nNota: o campo é obrigatório no sentido de definir o estado desejado; o binding JSON exige um objeto válido.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/auto-reply/rule/{{id}}/toggle' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"active\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `500 Internal Server Error`: falha ao atualizar o estado da regra.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "active": true
              }
            }
          }
        }
      }
    },
    "/auto-reply/settings": {
      "get": {
        "summary": "Obter configurações de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_get_auto_reply_settings",
        "description": "# Obter configurações de auto-resposta\n\nRetorna as configurações globais de auto-resposta da instância (digitação, cooldown global e multi-match).\n\n## Endpoint\n\n`GET {{baseUrl}}/auto-reply/settings`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/auto-reply/settings' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"settings\": {\n    \"id\": \"01HSETTINGSIDEXAMPLE00001\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"simulate_typing\": true,\n    \"typing_duration_ms\": 1500,\n    \"global_cooldown_ms\": 2000,\n    \"multi_match\": false\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao carregar as configurações.\n\n## Observações\n\n- Se ainda não existirem settings, o serviço pode criar um padrão (typing ligado, cooldown 2000 ms, multi-match desligado).\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Atualizar configurações de auto-resposta",
        "tags": [
          "Auto-Reply"
        ],
        "operationId": "auto_reply_post_auto_reply_settings",
        "description": "# Atualizar configurações de auto-resposta\n\nDefine o comportamento global do motor de auto-resposta da instância. Use para ajustar digitação, cooldown e se várias regras podem disparar na mesma mensagem.\n\n## Endpoint\n\n`POST {{baseUrl}}/auto-reply/settings`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `simulate_typing` | boolean | Não | Liga/desliga a simulação de digitação no nível global. |\n| `typing_duration_ms` | number | Não | Duração padrão (ms) da simulação de digitação. |\n| `global_cooldown_ms` | number | Não | Cooldown padrão (ms) quando a regra não define `cooldown_ms`. |\n| `multi_match` | boolean | Não | Se `true`, várias regras podem responder à mesma mensagem; se `false`, para na primeira. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/auto-reply/settings' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"simulate_typing\": true,\n  \"typing_duration_ms\": 1500,\n  \"global_cooldown_ms\": 2000,\n  \"multi_match\": false\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"settings\": {\n    \"id\": \"01HSETTINGSIDEXAMPLE00001\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"simulate_typing\": true,\n    \"typing_duration_ms\": 1500,\n    \"global_cooldown_ms\": 2000,\n    \"multi_match\": false\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `500 Internal Server Error`: falha ao salvar as configurações.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "simulate_typing": true,
                "typing_duration_ms": 1500,
                "global_cooldown_ms": 2000,
                "multi_match": false
              }
            }
          }
        }
      }
    },
    "/scheduler/schedule": {
      "post": {
        "summary": "Agendar mensagem para horário específico",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_post_scheduler_schedule",
        "description": "# Agendar mensagem para horário específico\n\nAgenda o envio de uma mensagem em um instante absoluto (RFC3339). Use para lembretes e campanhas com data/hora fixa.\n\n## Endpoint\n\n`POST {{baseUrl}}/scheduler/schedule`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | Destinatário (ex.: `5511...@s.whatsapp.net` ou grupo `@g.us`). |\n| `content_type` | string | Sim | Tipo do conteúdo: `text`, `media`, `location`, `contact` ou `interactive`. |\n| `content` | object | Sim | Payload do conteúdo (ex.: `{ \"text\": \"...\" }` para texto). |\n| `scheduled_at` | string | Sim | Data/hora em RFC3339 (ex.: `2026-07-20T14:30:00Z`). |\n| `timezone` | string | Não | Fuso horário informativo (ex.: `America/Sao_Paulo`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/scheduler/schedule' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"5511999999999@s.whatsapp.net\",\n  \"content_type\": \"text\",\n  \"content\": {\n    \"text\": \"Lembrete: sua consulta é amanhã às 10h.\"\n  },\n  \"scheduled_at\": \"2026-07-20T14:30:00Z\",\n  \"timezone\": \"America/Sao_Paulo\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"01HSCHEDMSGIDEXAMPLE00001\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"content_type\": \"text\",\n    \"content\": {\"text\": \"Lembrete: sua consulta é amanhã às 10h.\"},\n    \"scheduled_at\": \"2026-07-20T14:30:00Z\",\n    \"timezone\": \"America/Sao_Paulo\",\n    \"status\": \"pending\",\n    \"error\": \"\",\n    \"message_id\": \"\",\n    \"sent_at\": null\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou `scheduled_at` fora do formato RFC3339.\n- `500 Internal Server Error`: fila cheia (`scheduled message queue is full`) ou falha ao agendar.\n\n## Observações\n\n- O horário é normalizado para UTC no armazenamento.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "5511999999999@s.whatsapp.net",
                "content_type": "text",
                "content": {
                  "text": "Lembrete: sua consulta é amanhã às 10h."
                },
                "scheduled_at": "2026-07-20T14:30:00Z",
                "timezone": "America/Sao_Paulo"
              }
            }
          }
        }
      }
    },
    "/scheduler/delay": {
      "post": {
        "summary": "Agendar mensagem com delay",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_post_scheduler_delay",
        "description": "# Agendar mensagem com delay\n\nAgenda uma mensagem para daqui a N milissegundos. Use quando o horário absoluto não importa, só o intervalo.\n\n## Endpoint\n\n`POST {{baseUrl}}/scheduler/delay`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string | Sim | Destinatário da mensagem. |\n| `content_type` | string | Sim | Tipo do conteúdo: `text`, `media`, `location`, `contact` ou `interactive`. |\n| `content` | object | Sim | Payload do conteúdo. |\n| `delay_ms` | number | Sim | Atraso em milissegundos a partir de agora. |\n| `timezone` | string | Não | Fuso horário informativo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/scheduler/delay' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"jid\": \"5511999999999@s.whatsapp.net\",\n  \"content_type\": \"text\",\n  \"content\": {\n    \"text\": \"Mensagem enviada após o delay.\"\n  },\n  \"delay_ms\": 60000,\n  \"timezone\": \"America/Sao_Paulo\"\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"01HSCHEDMSGIDEXAMPLE00002\",\n    \"jid\": \"5511999999999@s.whatsapp.net\",\n    \"content_type\": \"text\",\n    \"content\": {\"text\": \"Mensagem enviada após o delay.\"},\n    \"scheduled_at\": \"2026-07-17T07:00:00Z\",\n    \"timezone\": \"America/Sao_Paulo\",\n    \"status\": \"pending\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: JSON inválido ou campo obrigatório ausente.\n- `500 Internal Server Error`: fila cheia ou falha ao agendar.\n\n## Observações\n\n- Internamente calcula `now + delay_ms` e reutiliza o mesmo fluxo de `/scheduler/schedule`.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "jid": "5511999999999@s.whatsapp.net",
                "content_type": "text",
                "content": {
                  "text": "Mensagem enviada após o delay."
                },
                "delay_ms": 60000,
                "timezone": "America/Sao_Paulo"
              }
            }
          }
        }
      }
    },
    "/scheduler/pending": {
      "get": {
        "summary": "Listar mensagens pendentes",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_get_scheduler_pending",
        "description": "# Listar mensagens pendentes\n\nLista os agendamentos ainda não enviados da instância. Opcionalmente filtre por destinatário com `jid`.\n\n## Endpoint\n\n`GET {{baseUrl}}/scheduler/pending`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `jid` | string (query) | Não | Se informado, retorna só pendências desse destinatário. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/scheduler/pending' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"count\": 1,\n  \"messages\": [\n    {\n      \"id\": \"01HSCHEDMSGIDEXAMPLE00001\",\n      \"jid\": \"5511999999999@s.whatsapp.net\",\n      \"content_type\": \"text\",\n      \"scheduled_at\": \"2026-07-20T14:30:00Z\",\n      \"status\": \"pending\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao listar pendências.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/scheduler/{id}": {
      "delete": {
        "summary": "Cancelar mensagem agendada",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_delete_scheduler_id",
        "description": "# Cancelar mensagem agendada\n\nCancela um agendamento específico pelo ID. Use quando o lembrete não deve mais ser enviado.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/scheduler/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string (path) | Sim | ID do agendamento (campo `message.id` na resposta de schedule/delay). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/scheduler/{{id}}' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: agendamento não encontrado ou falha ao cancelar.\n\n## Observações\n\n- O status no banco passa a `cancelled` e o item sai da fila em memória.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/scheduler/cancel-all": {
      "delete": {
        "summary": "Cancelar todas as mensagens pendentes",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_delete_scheduler_cancel_all",
        "description": "# Cancelar todas as mensagens pendentes\n\nCancela todos os agendamentos pendentes da instância de uma vez. Use para limpar a fila.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/scheduler/cancel-all`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/scheduler/cancel-all' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"cancelled\": 3\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao cancelar a fila.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/scheduler/pause": {
      "post": {
        "summary": "Pausar scheduler",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_post_scheduler_pause",
        "description": "# Pausar scheduler\n\nPausa o processamento da fila de agendamentos da instância. As mensagens permanecem pendentes, mas não são enviadas até o resume.\n\n## Endpoint\n\n`POST {{baseUrl}}/scheduler/pause`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não exige corpo JSON. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/scheduler/pause' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao pausar o scheduler.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/scheduler/resume": {
      "post": {
        "summary": "Retomar scheduler",
        "tags": [
          "Scheduler"
        ],
        "operationId": "scheduler_post_scheduler_resume",
        "description": "# Retomar scheduler\n\nRetoma o processamento da fila após um pause. Os agendamentos cujo horário já passou são processados na sequência.\n\n## Endpoint\n\n`POST {{baseUrl}}/scheduler/resume`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não exige corpo JSON. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/scheduler/resume' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao retomar o scheduler.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/anti-delete/config": {
      "get": {
        "summary": "Obter configuração anti-delete",
        "tags": [
          "Anti-Delete"
        ],
        "operationId": "anti_delete_get_anti_delete_config",
        "description": "# Obter configuração anti-delete\n\nRetorna se a recuperação de mensagens apagadas está ativa e como o conteúdo original é tratado.\n\n## Endpoint\n\n`GET {{baseUrl}}/anti-delete/config`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/anti-delete/config' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"config\": {\n    \"id\": \"01HANTIDELETECFGEXAMPLE01\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"enabled\": false,\n    \"store_recovered\": true,\n    \"notify_webhook\": true,\n    \"include_original\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao carregar a configuração.\n\n## Observações\n\n- Se ainda não houver config salva, o serviço devolve um padrão com `enabled: false`.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Atualizar configuração anti-delete",
        "tags": [
          "Anti-Delete"
        ],
        "operationId": "anti_delete_post_anti_delete_config",
        "description": "# Atualizar configuração anti-delete\n\nAtiva ou ajusta a recuperação de mensagens apagadas (revoke). Use para ligar o recurso e controlar armazenamento/webhook.\n\n## Endpoint\n\n`POST {{baseUrl}}/anti-delete/config`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `enabled` | boolean | Não | Liga/desliga a detecção de mensagens apagadas. |\n| `store_recovered` | boolean | Não | Se `true`, grava a mensagem recuperada no banco. |\n| `notify_webhook` | boolean | Não | Se `true`, dispara eventos `message.revoked` / `message.revoked.recovered`. |\n| `include_original` | boolean | Não | Se `true`, inclui o conteúdo original no webhook quando recuperado. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/anti-delete/config' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"enabled\": true,\n  \"store_recovered\": true,\n  \"notify_webhook\": true,\n  \"include_original\": true\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"config\": {\n    \"id\": \"01HANTIDELETECFGEXAMPLE01\",\n    \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n    \"enabled\": true,\n    \"store_recovered\": true,\n    \"notify_webhook\": true,\n    \"include_original\": true\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `500 Internal Server Error`: falha ao salvar a configuração.\n\n## Observações\n\n- A recuperação depende do histórico já ter a mensagem original armazenada.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "enabled": true,
                "store_recovered": true,
                "notify_webhook": true,
                "include_original": true
              }
            }
          }
        }
      }
    },
    "/anti-delete/recovered": {
      "get": {
        "summary": "Listar mensagens recuperadas",
        "tags": [
          "Anti-Delete"
        ],
        "operationId": "anti_delete_get_anti_delete_recovered",
        "description": "# Listar mensagens recuperadas\n\nLista mensagens que foram apagadas e recuperadas pelo anti-delete. Use `limit` e `offset` para paginar.\n\n## Endpoint\n\n`GET {{baseUrl}}/anti-delete/recovered`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `limit` | number (query) | Não | Quantidade por página (padrão `100`, máximo `500`). |\n| `offset` | number (query) | Não | Deslocamento da paginação (padrão `0`). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/anti-delete/recovered?limit=100&offset=0' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"count\": 1,\n  \"messages\": [\n    {\n      \"id\": \"01HRECOVEREDMSGEXAMPLE0001\",\n      \"instance_id\": \"01HINSTANCEIDEXAMPLE00001\",\n      \"message_id\": \"3EB0ABCDEF1234567890\",\n      \"chat_id\": \"5511999999999@s.whatsapp.net\",\n      \"sender\": \"5511888888888@s.whatsapp.net\",\n      \"sender_name\": \"João\",\n      \"original_content\": {\"conversation\": \"texto apagado\"},\n      \"message_type\": \"text\",\n      \"deleted_at\": \"2026-07-17T06:00:00Z\",\n      \"recovered_at\": \"2026-07-17T06:00:00Z\"\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao listar mensagens recuperadas.\n\n## Observações\n\n- `count` é o total no banco; `messages` é a página atual.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "100"
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "0"
          }
        ]
      }
    },
    "/anti-delete/recovered/{id}": {
      "get": {
        "summary": "Obter mensagem recuperada",
        "tags": [
          "Anti-Delete"
        ],
        "operationId": "anti_delete_get_anti_delete_recovered_id",
        "description": "# Obter mensagem recuperada\n\nRetorna o detalhe de uma mensagem recuperada pelo ID interno do anti-delete.\n\n## Endpoint\n\n`GET {{baseUrl}}/anti-delete/recovered/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string (path) | Sim | ID do registro recuperado (não confundir com `message_id` do WhatsApp). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/anti-delete/recovered/{{id}}' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"message\": {\n    \"id\": \"01HRECOVEREDMSGEXAMPLE0001\",\n    \"message_id\": \"3EB0ABCDEF1234567890\",\n    \"chat_id\": \"5511999999999@s.whatsapp.net\",\n    \"sender\": \"5511888888888@s.whatsapp.net\",\n    \"sender_name\": \"João\",\n    \"original_content\": {\"conversation\": \"texto apagado\"},\n    \"message_type\": \"text\",\n    \"deleted_at\": \"2026-07-17T06:00:00Z\",\n    \"recovered_at\": \"2026-07-17T06:00:00Z\"\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `404 Not Found`: registro inexistente (`not found`).\n- `500 Internal Server Error`: falha ao consultar o registro.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "delete": {
        "summary": "Remover mensagem recuperada",
        "tags": [
          "Anti-Delete"
        ],
        "operationId": "anti_delete_delete_anti_delete_recovered_id",
        "description": "# Remover mensagem recuperada\n\nApaga permanentemente um registro recuperado do armazenamento anti-delete.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/anti-delete/recovered/{{id}}`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string (path) | Sim | ID do registro recuperado a remover. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/anti-delete/recovered/{{id}}' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: falha ao remover o registro.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/status/privacy": {
      "get": {
        "summary": "Obter configurações de privacidade do status",
        "tags": [
          "Status"
        ],
        "operationId": "status_get_status_privacy",
        "description": "# Obter privacidade do status\n\nConsulta a audiência padrão dos status/stories da conta conectada (contatos, allowlist ou denylist).\n\n## Endpoint\n\n`GET {{baseUrl}}/status/privacy`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/status/privacy' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"privacy\": [\n    {\n      \"Type\": \"contacts\",\n      \"List\": []\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `500 Internal Server Error`: cliente WhatsApp indisponível ou falha na consulta.\n\n## Observações\n\n- Usa o cliente WhatsApp da instância (`RequireWAClient`); **não** é mobile-only.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      },
      "post": {
        "summary": "Definir privacidade do status",
        "tags": [
          "Status"
        ],
        "operationId": "status_post_status_privacy",
        "description": "# Definir privacidade do status\n\nAtualiza quem pode ver seus status/stories por padrão. Use `contacts`, `whitelist` ou `blacklist`.\n\n## Endpoint\n\n`POST {{baseUrl}}/status/privacy`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `type` | string | Sim | `contacts`, `whitelist` (aliases: `allowlist`, `allow`) ou `blacklist` (aliases: `denylist`, `deny`, `except`). |\n| `jids` | string[] | Condicional | Lista de JIDs/números; obrigatória na prática para `whitelist`/`blacklist`. |\n| `list` | string[] | Não | Alias de `jids` (usado se `jids` estiver vazio). |\n\nNota: envie `jids` (ou `list`) quando `type` for `whitelist` ou `blacklist`.\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/status/privacy' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"type\": \"blacklist\",\n  \"jids\": [\n    \"5511999999999@s.whatsapp.net\",\n    \"5511888888888@s.whatsapp.net\"\n  ]\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"privacy\": [\n    {\n      \"Type\": \"blacklist\",\n      \"List\": [\n        \"5511999999999@s.whatsapp.net\",\n        \"5511888888888@s.whatsapp.net\"\n      ]\n    }\n  ]\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: `type` ausente ou inválido.\n- `500 Internal Server Error`: tipo inválido no serviço, JID inválido ou cliente indisponível.\n\n## Observações\n\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "type": "blacklist",
                "jids": [
                  "5511999999999@s.whatsapp.net",
                  "5511888888888@s.whatsapp.net"
                ]
              }
            }
          }
        }
      }
    },
    "/status/presets": {
      "get": {
        "summary": "Listar presets de backgrounds e fonts",
        "tags": [
          "Status"
        ],
        "operationId": "status_get_status_presets",
        "description": "# Listar presets de backgrounds e fonts\n\nRetorna os nomes amigáveis de cores de fundo e fontes disponíveis para status de texto (úteis em `/send/status`).\n\n## Endpoint\n\n`GET {{baseUrl}}/status/presets`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Parâmetros\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| — | — | — | Este endpoint não recebe parâmetros de rota, query ou corpo. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request GET '{{baseUrl}}/status/presets' \\\n  --header 'token: {{token}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true,\n  \"presets\": {\n    \"backgrounds\": {\n      \"solid_blue\": \"#FF2196F3\",\n      \"solid_green\": \"#FF4CAF50\",\n      \"solid_red\": \"#FFF44336\"\n    },\n    \"fonts\": {\n      \"none\": 0,\n      \"serif\": 1,\n      \"sans_serif\": 2,\n      \"norse\": 3,\n      \"bubble\": 4,\n      \"italic\": 5,\n      \"bold\": 6,\n      \"script\": 7,\n      \"dancing\": 7\n    }\n  }\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n\n## Observações\n\n- A resposta é estática (não chama o WhatsApp); autenticação ainda é necessária.\n- Esta rota **não** exige modo mobile.",
        "security": [
          {
            "token": []
          }
        ]
      }
    },
    "/status/text": {
      "post": {
        "summary": "Mobile - Publicar status de texto",
        "tags": [
          "Status"
        ],
        "operationId": "status_post_status_text",
        "description": "# Mobile - Publicar status de texto\n\nPublica um status de texto efêmero via socket mobile (MEX). Use somente em instâncias no modo mobile.\n\n## Endpoint\n\n`POST {{baseUrl}}/status/text`\n\n## Autenticação\n\nEnvie o token da instância no header `token: {{token}}`.\n\n## Corpo da requisição\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `emoji` | string | Não | Emoji associado ao status (ex.: `🟢`). |\n| `text` | string | Não | Texto do status. |\n| `duration_sec` | number | Não | Duração efêmera em segundos (ex.: `86400` = 24h). |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request POST '{{baseUrl}}/status/text' \\\n  --header 'token: {{token}}' \\\n  --header 'Content-Type: application/json' \\\n  --data-raw '{\n  \"emoji\": \"🟢\",\n  \"text\": \"Disponível para conversar\",\n  \"duration_sec\": 86400\n}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: o header `token` não foi enviado ou é inválido.\n- `400 Bad Request`: o JSON está malformado.\n- `500 Internal Server Error`: instância não é mobile (`text status mex requires mobile connection mode`), bridge mobile indisponível ou falha no socket.\n\n## Observações\n\n- **Mobile-only**: exige `IsMobileInstance`; em modo web/desktop a API responde com erro.\n- Diferente de `POST /send/status` (status/stories via whatsmeow).",
        "security": [
          {
            "token": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "emoji": "🟢",
                "text": "Disponível para conversar",
                "duration_sec": 86400
              }
            }
          }
        }
      }
    },
    "/instance/admin": {
      "delete": {
        "summary": "Deletar instancia",
        "tags": [
          "Admininstração"
        ],
        "operationId": "admininstracao_delete_instance_admin",
        "description": "# Deletar instância (admin)\n\nRemove permanentemente uma instância pelo `id` ou `token`. Use na administração quando a exclusão não puder depender do token da própria instância.\n\n## Endpoint\n\n`DELETE {{baseUrl}}/instance/admin`\n\n## Autenticação\n\nEnvie o token de administrador no header `admintoken: {{adminToken}}`.\n\n## Parâmetros\n\nInforme **um** destes (query string ou JSON no body):\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `id` | string | Condicional | ID da instância. |\n| `token` | string | Condicional | Token da instância. |\n\n## Exemplo de Requisição\n\n```bash\ncurl --request DELETE '{{baseUrl}}/instance/admin?id={{instanceID}}' \\\n  --header 'admintoken: {{adminToken}}'\n```\n\n## Resposta de Sucesso\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Erros comuns\n\n- `401 Unauthorized`: `admintoken` ausente ou inválido.\n- `400 Bad Request`: nem `id` nem `token` foram enviados.\n- `404 Not Found`: instância não encontrada.\n\n## Observações\n\n- A operação encerra a sessão e apaga dados associados da instância.\n- Preferência de resolução: query `token` → query `id` → body JSON `token`/`id`.",
        "security": [
          {
            "admintoken": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "{{instanceID}}"
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "token": {
        "type": "apiKey",
        "in": "header",
        "name": "token"
      },
      "admintoken": {
        "type": "apiKey",
        "in": "header",
        "name": "admintoken"
      }
    }
  }
}
