# AtendroZAP — documentação completa Origem: https://wpp.atendro.cloud/docs Exemplos ilustrativos; não contêm credenciais ou conversas reais. Fonte: https://wpp.atendro.cloud/docs.md # Documentação do AtendroZAP Integre instâncias do WhatsApp ao Atendro: gerencie a conexão, envie mensagens e receba eventos no seu próprio webhook. Esta é a central de documentação de todos os servidores. Use os guias para montar a integração e a referência da API para consultar cada operação, seus campos e suas respostas. ## Comece pela sua integração 1. [Cadastre o servidor e teste o acesso](https://wpp.atendro.cloud/docs/guias/primeiros-passos.md). Confirme a URL da API e o token administrativo. 2. [Crie e conecte uma instância](https://wpp.atendro.cloud/docs/guias/instancias.md). Guarde o ID, o token da instância e o vínculo com a empresa. 3. [Configure o webhook global](https://wpp.atendro.cloud/docs/guias/webhooks.md). Escolha os eventos e um destino para as instâncias desse servidor. 4. [Implemente o receptor no Atendro](https://wpp.atendro.cloud/docs/guias/receber-eventos.md). Valide a assinatura e processe os eventos com idempotência. ## Central, servidor e instância | Recurso | Endereço ou credencial | Responsabilidade | |---|---|---| | Central | `https://wpp.atendro.cloud` | Painel de administração e esta documentação pública | | API do servidor 1 | `https://1.atendro.cloud` | Operações REST do servidor selecionado | | Token do servidor | Header `admintoken` | Criar instâncias, consultar capacidades e administrar o webhook global | | Token da instância | Header `token` | Conectar a instância, enviar mensagens e consultar seus dados | A URL da central não substitui a URL da API. Cada servidor tem seu próprio endereço e sua própria credencial administrativa. ## Explore a API por recurso - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md): criação, pareamento, status, reinício e exclusão. - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md): texto, mídia, contato, localização e menus. - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md): encaminhamento, reação, edição e exclusão. - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md): histórico armazenado, contatos, números e foto de perfil. - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md): cadastro global, exceções, entrega e reprocessamento. - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md): consulta e operações administrativas de grupo. - [Referência completa](https://wpp.atendro.cloud/docs/api.md): todos os métodos e caminhos publicados. ## Recursos disponíveis Consulte `GET /v1/capabilities` no servidor antes de habilitar uma ação no Atendro. A API documentada está em fase `laboratory`: os testes de contrato e a disponibilidade HTTP não substituem a homologação da integração com números autorizados. **Chamadas de voz usam instâncias de tipo `calls`.** Habilite a interface quando o servidor anunciar `capabilities.calls=true` e a instância de ligação estiver conectada. A instância de mensagens mantém a resposta `501 calls_not_supported`. Consulte o [guia de chamadas de voz](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md). ## Documentação para ferramentas e IA - [OpenAPI 3.1](https://wpp.atendro.cloud/openapi.json): contrato estruturado de requisições e respostas. - [llms.txt](https://wpp.atendro.cloud/llms.txt): índice por assunto com links para cada guia, endpoint e modelo. - [llms-full.txt](https://wpp.atendro.cloud/llms-full.txt): conteúdo completo em um único documento de texto. - Cada página também tem uma versão **Markdown**, acessível pelo link no cabeçalho do conteúdo. --- Fonte: https://wpp.atendro.cloud/docs/guias/monitoramento-vps.md # API central de saúde das VPS O backend do painel de suporte consulta a **central**, que reúne os servidores já cadastrados no console. Não é necessário distribuir os tokens administrativos das VPS ao painel. Esta API é de leitura; não reinicia serviços nem altera instâncias, limites de chamadas ou webhooks. ## Endpoints e autenticação | Base | Endpoint | Credencial | |---|---|---| | Central, por exemplo `https://wpp.atendro.cloud` | `GET /api/v1/servers/status` | `Authorization: Bearer ` | | Central | `GET /api/v1/servers/{server}/status` | Mesmo token de monitoramento | | API de cada VPS | `GET /v1/system/status` | Header `admintoken`, usado internamente pela central | `server` é o nome cadastrado no console. O cadastro existente determina as VPS consultadas; esta API não aceita URLs arbitrárias. O token da central fica em `CONSOLE_MONITORING_TOKEN` ou, no Compose, `ATENDROZAP_CONSOLE_MONITORING_TOKEN`. Use um segredo aleatório de pelo menos 32 caracteres, distinto dos tokens das VPS. Ausente: HTTP 503 `monitoring_disabled`. Inválido: HTTP 401. Servidor não cadastrado: HTTP 404 `server_not_found`. O token é exclusivo destes GETs. Login do console, cookies, token de instância e query string não o substituem. Guarde-o no **backend** do suporte, nunca no bundle, localStorage ou parâmetros da URL. A API não habilita CORS público. Exemplo de consumo no backend Node, sem imprimir credenciais: ```js const response = await fetch( `${process.env.ATENDROZAP_CENTRAL_URL}/api/v1/servers/status`, { headers: { Authorization: `Bearer ${process.env.ATENDROZAP_MONITORING_TOKEN}` }, signal: AbortSignal.timeout(10_000), redirect: 'error', }, ); if (!response.ok) throw new Error(`monitoring_http_${response.status}`); const fleet = await response.json(); // Entregue fleet à rota autenticada do seu painel de suporte. ``` Contrato completo: [OpenAPI da central](https://wpp.atendro.cloud/monitoring-openapi.json). O endpoint de cada VPS está no [OpenAPI principal](https://wpp.atendro.cloud/openapi.json). ## Como ler a resposta `schemaVersion` começa em 1. `servers` inclui também servidores offline, sem suporte à nova versão ou com falhas parciais. A ordem é pelo nome cadastrado. | Campo | Significado | |---|---| | `generatedAt` | Momento da resposta da central, em UTC | | `cacheSeconds` | Reutilização interna por até 15 segundos | | `summary` | Contagem total, online, offline, indisponíveis e por saúde | | `servers[].server` | Nome da VPS no cadastro central | | `observedAt` | Momento da tentativa mais recente de consultar a VPS | | `lastSuccessAt` | Última resposta válida observada; `null` se ainda não houve | | `availability` | `online`, `offline`, `unauthorized`, `unsupported`, `invalid_configuration`, `invalid_response`, `stale`, `unavailable` ou `cancelled` | | `health` | `ok`, `warning`, `critical` ou `unknown` | | `latencyMilliseconds` | Tempo até os headers HTTP da VPS; `null` quando indisponível | | `dataStale` | A resposta de `data` é uma leitura anterior, não uma medição atual | | `data` | Snapshot tipado da VPS, ou `null` sem leitura válida | | `alerts[]` | Código estável e gravidade, sem erros brutos ou dados privados | HTTP 200 significa que a consulta central foi executada; **não significa que todas as VPS estão saudáveis**. Use `availability`, `health`, `dataStale` e os estados de cada seção. Um erro de autenticação da VPS não é ausência de carga. Falhas não propagam corpos, headers, endereços ou tokens do servidor remoto. As duas rotas compartilham cache. Há no máximo oito consultas simultâneas e cinco segundos por coleta, incluindo a espera por vaga. Muitas consultas de suporte ao mesmo servidor se unem em uma coleta. Novos cadastros aparecem na próxima consulta; alterações de URL/token invalidam o cache correspondente. Leituras anteriores ficam somente em memória e se perdem ao reiniciar a central. ## Métricas disponíveis em `data` | Seção | Medições e interpretação | |---|---| | `host.snapshot.cpu` | CPUs lógicas, uso, espera por I/O e steal, em porcentagem | | `host.snapshot.load` | Load de 1/5/15 minutos e load dividido por CPUs lógicas | | `host.snapshot.memory` | RAM total, disponível, usada e percentual; considera `MemAvailable` | | `host.snapshot.swap` | Total, livre, usada e percentual | | `host.snapshot.rootFilesystem` | Disco total, livre, disponível, reservado, ocupado; inodes livres e usados | | `host.snapshot.network` | Contadores e bytes/s de recepção/transmissão; inclui interfaces virtuais não loopback | | `host.snapshot.diskIO` | I/O e ocupação do dispositivo da raiz; evita somar disco e partição | | `host.snapshot.uptimeSeconds` | Tempo ligado da VPS | | `host.snapshot.operations.docker` | Por papel `api/db/backup/console/caddy`: containers, em execução, reiniciando, OOM, reinícios e healthcheck | | `host.snapshot.operations.storage` | Bytes lógicos, quantidade e idade de arquivos de WAL, backups, gravações e diagnóstico; WAL completo cru, gzip, incompleto e auxiliares separados | | `host.snapshot.operations.backupVerification` | Marcador da última execução de `pg_verifybackup`; estado e idade da verificação | | `database` | Disponibilidade, tamanho do banco e pool de conexões da API | | `database.archiver` | Estado do arquivamento, quantidade pendente, tamanho de `pg_wal`, sucessos/falhas e timestamps | | `workload.instances` | Contagens por tipo/estado, leases desta VPS, estados conectados sem lease, vagas de chamadas configuradas e limite de sessões do worker | | `workload.calls` | Chamadas persistidas abertas, ativas/tocando/conectando/vídeo, excluindo leases expirados ou transferidos do total `live` | | `workload.webhooks` | Fila pendente, idade do evento mais antigo, retentativas, eventos mortos e destinos falhando/pausados | | `process` | Uptime, goroutines e memória do runtime Go da API; não é a RAM da VPS | `host.status` pode ser `ok/degraded/stale/unavailable`. O snapshot traz a hora original de coleta e sua validade. Métricas sem base de comparação, inclusive CPU/rede no primeiro ciclo e após reset, são `null`. Coleta parcial não converte ausência em zero. Tamanhos dos diretórios são bytes lógicos; disco disponível vem do filesystem. Tráfego agregado inclui interfaces Docker: não serve como fatura de tráfego externo. Falta de healthcheck aparece como tal. Instâncias e webhooks usam `scope: database`. Chamadas usam `scope: worker` e `source: database_snapshot`; não são uma prova de mídia RTP nem de qualidade da chamada. Se duas VPS compartilham banco, **não some as contagens de escopo database**. `callSlotsConfigured` é configuração, não capacidade homologada. A central não estima quantas chamadas uma VPS aguenta a partir desses números. Um backup verificado não prova cópia fora da VPS nem uma cadeia PITR completa. Sem o marcador de verificação, a situação é desconhecida, mesmo que existam arquivos de backup no diretório. O histórico de falhas do archiver é cumulativo; `blocked` exige falha mais recente que o sucesso e segmentos pendentes. ## Alertas e painel O painel pode começar com cartões de VPS, barras de CPU/RAM/disco, estado dos serviços, arquivamento do WAL, idade do backup, instâncias e chamadas ativas. Atualize a cada 30 segundos. Preserve indicação de leitura antiga e exiba `—` para `null`, em vez de zero. Um erro global da central deve marcar o painel como desatualizado, sem limpar todos os servidores existentes. Limiares iniciais da central: | Medida | Aviso | Crítico | |---|---:|---:| | Disco e inodes ocupados | 85% | 95% | | RAM ocupada | 85% | 95% | | CPU ocupada | 85% | 98% | | CPU steal | 10% | 25% | | Verificação de backup antiga | — | Mais de 36 horas | Banco indisponível, WAL bloqueado e serviço parado/reiniciando/unhealthy/OOM geram alerta crítico. Dados incompletos, WAL parcial e fila de webhook com mais de cinco minutos geram aviso. Os limiares avaliam snapshots; para notificações, o suporte deve exigir persistência em várias amostras e deduplicar alertas. Esta implementação não envia mensagens nem instala um sistema de notificações. Para gráficos históricos, armazene as amostras no backend do suporte usando `server` e a hora original `sampledAt`; não duplique amostras vindas do cache. A API fornece estado atual e última leitura válida, não séries temporais. ## Instalação 1. Preparar a revisão pelo fluxo `deploy/ship.sh HOST REV`. O build exporta `host-health` e `wal-archive` estáticos para `/opt/atendrozap/releases/REV/ops`. Ative a revisão com `sh deploy/host-health/install-ops.sh REV` no host; o preparo do build por si só não troca os executáveis em uso. 2. Instalar os arquivos de `deploy/host-health` e executar `install.sh` no host. O serviço systemd coleta a cada 15 segundos e escreve arquivo privado 0600, dono UID/GID 65532, em `/opt/atendrozap/health/status.json`. 3. O Compose monta esse diretório somente para leitura na API. Configure `ATENDROZAP_SYSTEM_STATUS_HOST_FILE=/host-health/status.json` e, opcionalmente, `ATENDROZAP_SYSTEM_STATUS_HOST_MAX_AGE=3m` (15s a 15m). O prazo efetivo é o menor entre esse teto e `validForSeconds` do snapshot; com coleta a cada 15 segundos, o coletor declara validade de 45 segundos. 4. Configure o token de monitoramento privado na central. Publique API e console na janela autorizada; recriar a API afeta brevemente as sessões de mensagens e chamadas. Recriar PostgreSQL para usar o novo `archive_command` é um passo distinto e deve ser coordenado. 5. Confira cada VPS pelo novo endpoint e as ausências parciais antes de considerar o painel operacional. VPS antigas aparecem como `unsupported`. O coletor roda no **host Linux**, acessa `/proc` e consulta apenas campos permitidos do Docker. O socket Docker não é montado na API. Reinicie somente o coletor após mudar volumes/papéis para atualizar os diretórios descobertos. macOS e execução do coletor dentro de container são explicitamente indisponíveis. --- Fonte: https://wpp.atendro.cloud/docs/guias/primeiros-passos.md # Primeiros passos Prepare o cadastro do provedor AtendroZAP, teste o acesso ao servidor e crie a primeira instância da integração. ## 1. Cadastre o servidor No backend do Atendro, guarde a URL base e o token administrativo do servidor. O exemplo abaixo usa o servidor 1. Em outra instalação, substitua a URL pelo endereço correspondente. ```sh export ATENDROZAP_URL="https://1.atendro.cloud" # Defina ATENDROZAP_ADMIN_TOKEN no ambiente privado do seu backend. ``` Guarde a URL sem `/v1`, `/instance`, query ou barra final. O token é o valor configurado em `ATENDROZAP_ADMIN_TOKEN` nesse servidor. Ele é diferente da senha do console e do segredo do webhook. O provedor precisa ser implementado no Atendro antes de ativar o cadastro. Vincule cada instância ao servidor e à empresa corretos. Veja [servidores e autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md). ## 2. Teste saúde e autenticação ```sh curl --request GET "$ATENDROZAP_URL/health/ready" curl --request GET "$ATENDROZAP_URL/v1/capabilities" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` O primeiro endpoint deve responder `200` com `status: ready`. O segundo verifica o token e informa as capacidades. `401` indica credencial ou header incorreto. O teste de cadastro não precisa conectar uma instância nem enviar mensagens. ## 3. Configure o receptor de eventos No [console](https://wpp.atendro.cloud), abra **Servidores → servidor → Configurações de webhook**. Informe a URL HTTPS do novo receptor no Atendro, o segredo de assinatura e os eventos necessários. Você também pode usar [POST /v1/webhook](https://wpp.atendro.cloud/docs/api/configure-global-webhook.md) com `admintoken`. As novas instâncias herdam o destino global. O [guia de webhooks](https://wpp.atendro.cloud/docs/guias/webhooks.md) explica as exceções e a desativação por instância. ## 4. Crie a instância ```sh curl --request POST "$ATENDROZAP_URL/instance/init" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: cadastro-instancia-exemplo-001" \ --data '{"name":"atendimento-teste","systemName":"Atendro","companyId":"empresa-teste"}' ``` A resposta é `200` e contém `instance.id` e `instance.token`. Guarde ambos no backend antes de continuar. A criação não conecta o WhatsApp. A listagem posterior não recupera o token. Use uma chave de idempotência nova para cada criação de negócio; mantenha a mesma chave e os mesmos bytes do corpo ao repetir uma tentativa. Consulte [erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## 5. Faça o pareamento autorizado Depois de guardar o token da instância em `ATENDROZAP_INSTANCE_TOKEN`, o fluxo de pareamento usa: ```sh curl --request POST "$ATENDROZAP_URL/instance/connect" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{}' ``` Execute esse passo somente com o responsável e o telefone autorizados. Mostre o QR apenas na interface privada. Acompanhe [GET /instance/status](https://wpp.atendro.cloud/docs/api/get-instance-status.md) até a sessão estar conectada e autenticada. ## Próximo passo Implemente o recebimento de eventos antes de habilitar automações. Depois, consulte [enviar texto](https://wpp.atendro.cloud/docs/api/send-text.md), [enviar mídia](https://wpp.atendro.cloud/docs/api/send-media.md) e [consultar conversas](https://wpp.atendro.cloud/docs/api/find-chats.md). --- Fonte: https://wpp.atendro.cloud/docs/guias/autenticacao.md # Servidores e autenticação O painel central gerencia vários servidores. As requisições REST são enviadas à URL do servidor selecionado, usando a credencial exigida pelo endpoint. ## URLs de cadastro | Campo | Valor | |---|---| | Console e documentação | `https://wpp.atendro.cloud` | | API do servidor 1 | `https://1.atendro.cloud` | | API local padrão | `http://127.0.0.1:8091` | | Token do servidor | `ATENDROZAP_ADMIN_TOKEN` desse servidor, cadastrado no backend privado | No Atendro, selecione o provedor `atendrozap` quando a integração estiver implementada. A URL deve apontar para a API, sem acrescentar `/v1` ou `/instance`. Para outro servidor, cadastre a URL e o token daquele servidor. ## Token administrativo Envie o header `admintoken` para criar e listar instâncias, consultar capacidades, administrar instâncias por ID e configurar o webhook global. ```sh curl "$ATENDROZAP_URL/v1/capabilities" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` O token é definido no servidor AtendroZAP. Não use a senha do console, o segredo de assinatura do webhook ou uma credencial do provedor anterior. Para copiar o token de um servidor já cadastrado, entre no console e abra **Servidores**. Abaixo da URL, clique no valor mascarado ou no ícone de **Token administrativo**. O painel busca a credencial somente nesse clique e a copia para a área de transferência, mantendo a tela mascarada. Essa ação exige uma sessão autenticada; não reemite o token nem altera instâncias. Use o valor no cadastro privado do backend da aplicação que consumirá a API. ## Token da instância Envie o header `token` nas operações da instância. Esse segredo é retornado em `POST /instance/init` e na reemissão administrativa de token. ```sh curl "$ATENDROZAP_URL/instance/status" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` Guarde o token associado ao ID da instância, ao servidor e à empresa. `GET /instance/all` não recupera o segredo. O token administrativo não substitui o token da instância nessas rotas. ## Headers aceitos Envie exatamente um header da credencial exigida. Headers ausentes, inválidos ou duplicados devolvem `401 unauthorized`. `Authorization: Bearer`, query string e `instancekey` não substituem `admintoken` e `token`. A única exceção para query é `GET /call/{id}/audio`, que aceita `?token=` na abertura do WebSocket. O console faz proxy usando o header no backend, sem entregar o token ao navegador. O botão de testar cadastro deve consultar somente readiness e capacidades. Não conecte, reinicie, exclua ou reemita tokens como teste de autenticação. ## Reemissão de token Use [POST /v1/instances/{id}/token](https://wpp.atendro.cloud/docs/api/admin-reissue-token.md) com `admintoken` quando for necessário substituir o segredo. `graceSeconds` aceita de 0 a 3600 segundos de convivência com o anterior; zero o revoga imediatamente. A aplicação deve salvar o novo token no backend antes de substituir a credencial usada pelas próximas requisições. ## Segredos de webhook e mídia O segredo de assinatura do webhook é separado dos tokens REST. Ele valida `X-AtendroZAP-Signature` no receptor, como descrito em [receber eventos](https://wpp.atendro.cloud/docs/guias/receber-eventos.md). Links de mídia carregam um token temporário na própria URL. Consuma o `fileURL` completo e respeite `expiresAt`; não remonte o link nem inclua sua URL em logs. ## Cadastro no Atendro Adapte as restrições de domínio e o tipo de provedor no consumidor antes da ativação. Trocar a URL de um cadastro do provedor anterior não implementa o contrato AtendroZAP. O navegador do atendente deve chamar o backend do Atendro. Tokens administrativos, tokens de instância e segredos de webhook ficam nesse backend. Esta documentação pública não recebe credenciais. --- Fonte: https://wpp.atendro.cloud/docs/guias/instancias.md # Ciclo de vida da instância Uma instância representa a sessão de WhatsApp de uma empresa em um servidor. Criação, conexão, reinício e exclusão têm efeitos diferentes. ## Fluxo de integração | Etapa | Operação | Resultado esperado | |---|---|---| | Criar | [POST /instance/init](https://wpp.atendro.cloud/docs/api/create-instance.md) | ID e token; estado `disconnected` | | Preparar eventos | [POST /webhook](https://wpp.atendro.cloud/docs/api/configure-webhook.md) | URL, segredo e eventos próprios da instância | | Conectar | [POST /instance/connect](https://wpp.atendro.cloud/docs/api/connect-instance.md) | Início de conexão, QR ou código de pareamento | | Acompanhar | [GET /instance/status](https://wpp.atendro.cloud/docs/api/get-instance-status.md) | Estado, `connected`, `loggedIn` e resumo de webhook | | Reiniciar sessão | [POST /instance/restart](https://wpp.atendro.cloud/docs/api/restart-instance.md) | Retoma a sessão com credenciais guardadas | | Desvincular | [POST /instance/disconnect](https://wpp.atendro.cloud/docs/api/disconnect-instance.md) | Remove a credencial local e tenta desvincular remotamente | | Excluir | [DELETE /instance](https://wpp.atendro.cloud/docs/api/delete-instance.md) | Remove a instância e seus dados associados | ## Criação e vínculo O cadastro usa `admintoken`. `name` é obrigatório; `systemName` e `companyId` ajudam a identificar a integração. Guarde o vínculo servidor → empresa → ID de instância no backend do Atendro. `kind` é fixado na criação: `whatsapp` (padrão) para mensagens e `calls` para voz. A instância de ligação tem pareamento próprio e pode usar um número dedicado ou outro dispositivo vinculado do mesmo número. Em `kind: calls`, `callsMaxConcurrent` escolhe de 1 a 8 ligações simultâneas. Pode ser alterado depois no painel ou por `POST /instance/call-settings`; ligações em andamento são preservadas. Mais de uma simultânea ainda depende de homologação em chamadas reais. O campo `companyId` não concede autorização automaticamente. A aplicação deve validar o vínculo em cada ação e em cada evento recebido. ## Estados da sessão | Estado | Significado | |---|---| | `disconnected` | Não há sessão autenticada disponível para as operações | | `connecting` | Pareamento ou conexão em andamento | | `connected` | Sessão conectada; considere também `connected` e `loggedIn` na resposta | O QR é temporário. Mostre-o apenas ao usuário autorizado e consulte o status para obter uma versão vigente. Não registre QR, código de pareamento ou chaves de sessão. ## Webhook de conexão O evento `connection` informa mudanças de estado. Configure a inscrição antes de iniciar o pareamento, porque uma URL nova começa a receber eventos após seu cadastro. `qrcode` é aceito por compatibilidade, mas não é entregue. Obtenha o QR pelo fluxo privado de connect/status. Veja [payloads dos eventos](https://wpp.atendro.cloud/docs/guias/eventos.md). ## Reinício e desconexão `restart` preserva a credencial de sessão. `disconnect` limpa a credencial local mesmo quando `unlinked` é `false`; nesse caso, a confirmação remota da desvinculação não ocorreu. O reinício administrativo do worker em [POST /admin/restart](https://wpp.atendro.cloud/docs/api/admin-restart-worker.md) devolve `202` e agenda o trabalho em background. Ele não retorna uma contagem de sessões já reiniciadas. ## Sessões distribuídas Cada sessão tem um worker dono e um lease. `409 session_owned_elsewhere` indica que a sessão está sob responsabilidade de outro worker; não crie outra instância para contornar o erro. Uma instância conectada permite apenas os recursos anunciados por `GET /v1/capabilities`. Conexão não implica suporte a chamadas de voz. --- Fonte: https://wpp.atendro.cloud/docs/guias/webhooks.md # Configurar webhooks Cada instância pode ter sua própria URL de webhook, segredo de assinatura e seleção de eventos. Configurar uma instância não altera as demais. Isso vale tanto para instâncias de mensagens (`whatsapp`) quanto de ligação (`calls`). ## Cadastro pelo console No [console central](https://wpp.atendro.cloud), abra **Servidores → servidor → instância → Webhook**, ou use **Configurar** na coluna Webhook da listagem. Informe a URL HTTPS do receptor, o segredo de assinatura e os eventos desejados. Clique em **Salvar webhook desta instância**. A configuração fica persistida após reinícios. Para ligações, selecione `call`, `call_settings` e `connection`; para mensagens, selecione `messages`, `messages_update`, `messages_edit` e `connection`, conforme a integração. ## Cadastro pela API Use [POST /webhook](https://wpp.atendro.cloud/docs/api/configure-webhook.md) na URL da API do servidor, com o header `token` da instância. A alternativa administrativa é [POST /v1/instances/{id}/webhook](https://wpp.atendro.cloud/docs/api/admin-configure-webhook.md), com o header `admintoken` e o ID da instância desejada. Exemplo para ligações: ```json { "action": "update", "url": "https://seu-atendro.example/webhooks/atendrozap", "secret": "", "events": ["connection", "call", "call_settings"], "enabled": true } ``` Substitua os marcadores no backend privado. A URL precisa ser HTTPS pública, sem credenciais embutidas ou redirecionamento. O segredo aceita até 256 caracteres ASCII sem espaços e não é devolvido nas consultas. Consulte `GET /webhook` com o mesmo token, ou `GET /v1/instances/{id}/webhook` com `admintoken`, para conferir a configuração. `inheritedGlobal: false` confirma um cadastro próprio. O segredo não é devolvido. ## Padrão global opcional O destino global continua disponível por `GET/POST /v1/webhook` com `admintoken`. Instâncias sem configuração própria podem herdá-lo; um cadastro feito na instância substitui essa herança. Configurações próprias são preservadas quando o global muda. Para desativar a entrega de uma instância, use `action: delete`. | Ação | Endpoint ou opção | Efeito | |---|---|---| | Usar o global | `POST /webhook`, `action: inherit` | A instância acompanha o destino do servidor | | Criar exceção | `POST /webhook`, `action: update` | URL e eventos próprios para essa instância | | Desativar na instância | `POST /webhook`, `action: delete` | Impede que futuras alterações globais reativem a entrega | | Pausar o global | `POST /v1/webhook`, `enabled: false` | Pausa somente as instâncias que herdam | | Remover o global | `POST /v1/webhook`, `action: delete` | Remove inscrições herdadas e preserva exceções | Cadastros anteriores à migração de herança permanecem como configurações próprias. Escolha **Usar webhook global** em cada instância que deve passar a herdar. ## Eventos entregues | Evento | Uso no Atendro | |---|---| | `connection` | Atualizar o estado da instância | | `messages` | Receber mensagens novas e ações projetadas nesse formato | | `messages_update` | Atualizar entrega, leitura e exclusão | | `messages_edit` | Atualizar o conteúdo de uma mensagem existente | | `groups` | Atualizar informações e participantes de grupos | | `call` | Acompanhar estados das ligações em instâncias `calls` | | `call_settings` | Sincronizar o limite por instância `calls` e sua versão após cada alteração aceita | | `limits` | Informar limites da sessão | | `undecryptable` | Tratar mensagem que não pôde ser decifrada | `qrcode`, `chats` e `history` não são entregues. Nomes de compatibilidade aceitos aparecem em `ignoredEvents`; nomes desconhecidos retornam `400 invalid_event`. `addUrlEvents` e `addUrlTypesMessages` devem ser `false`. Instâncias `calls` não persistem nem publicam eventos de mensagens, recibos, edições, grupos ou `undecryptable`; mantêm chamadas, configuração e ciclo de vida (`connection` e `limits`). O filtro vale também para eventos de mensagens antigos ainda na fila. A inscrição em `call` não inclui `call_settings`: adicione esse nome preservando a URL, o segredo, os filtros e os demais eventos da inscrição existente. Em uma configuração herdada, preserve a herança; alterar o webhook global exige autorização administrativa. O recurso é anunciado por `capabilities.calls_settings_webhook`. A integração deve fazer a leitura inicial por `GET /instance/status` e acompanhar versões, conforme o [guia de chamadas](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md). Essas adições ainda dependem de publicação no servidor utilizado. ## Mudança de URL e backlog A mesma URL preserva cursor e saúde de entrega. Um segredo omitido preserva o anterior quando a URL é a mesma. Ao mudar de URL, informe o segredo do novo destino; a inscrição começa após os eventos já existentes. Registrar um webhook não reenvia automaticamente o histórico. Eventos anteriores ao registro não são entregues por essa inscrição. ## Acompanhar a entrega [GET /webhook](https://wpp.atendro.cloud/docs/api/get-webhook.md) informa `inheritedGlobal` e `deliveryStatus`, incluindo pendentes, dead-letters e a última falha. [GET /webhook/errors](https://wpp.atendro.cloud/docs/api/get-webhook-errors.md) consulta as falhas recentes sem devolver payloads. O receptor deve validar a assinatura, deduplicar eventos e responder 2xx somente após uma gravação durável. Continue em [implementar o receptor](https://wpp.atendro.cloud/docs/guias/receber-eventos.md) e [payloads e política de entrega](https://wpp.atendro.cloud/docs/guias/eventos.md). --- Fonte: https://wpp.atendro.cloud/docs/guias/receber-eventos.md # Receptor AtendroZAP no Atendro Contrato para criar um **novo receptor específico do AtendroZAP**. O endpoint do provedor anterior não é reutilizado. A implementação e a URL definitiva no Atendro serão feitas separadamente; nenhum destino real está predefinido aqui. ## Cadastro global por servidor No console [wpp.atendro.cloud](https://wpp.atendro.cloud): **Servidores → servidor → Configurações de webhook**. Informe URL HTTPS pública, segredo de assinatura e eventos. Salve com entrega habilitada quando o receptor estiver pronto. Credenciais reais ficam no backend privado. Via API, `GET /v1/webhook` consulta e `POST /v1/webhook` salva na URL do servidor selecionado, ambos com header `admintoken`. A documentação fica na central; o webhook global continua sendo uma configuração de cada servidor. O corpo de cadastro é: ```json { "url": "https://seu-atendro.example/webhooks/atendrozap", "secret": "", "events": ["connection", "messages", "messages_update", "messages_edit", "groups", "limits", "undecryptable"], "enabled": true, "excludeMessages": [] } ``` O segredo deve ter até 256 caracteres ASCII sem espaços. Para gerar um novo, `openssl rand -hex 32` produz 32 bytes aleatórios; guarde o resultado somente no servidor e no receptor. É diferente do `admintoken` e dos tokens de instância. Com `ATENDROZAP_ENVELOPE_KEY`, fica cifrado no banco; as consultas só devolvem `hasSecret` e `secretSealed`, nunca o valor. | Ação | Resultado | |---|---| | Salvar o global | Aplica às instâncias atuais sem exceção e às novas, em transação | | Salvar `enabled:false` | Pausa as instâncias que herdam; a mesma URL mantém o cursor | | Salvar a mesma URL sem `secret` | Preserva o segredo anterior | | Trocar URL | Começa após os eventos já existentes; informe o segredo do novo destino | | `POST /v1/webhook` com `{"action":"delete"}` | Remove o global e as inscrições herdadas; preserva as próprias | | `POST /webhook` com token de instância | Cria uma configuração própria, independente do global | | `POST /webhook` com `{"action":"delete"}` | Desativa essa instância inclusive em futuras mudanças globais | | `POST /webhook` com `{"action":"inherit"}` | Remove a exceção e passa a seguir o global, inclusive se cadastrado depois | A administração por ID usa `GET/POST /v1/instances/{id}/webhook` e `GET /v1/instances/{id}/webhook/errors`, com `admintoken`, sem reemitir o token. `GET /webhook` informa `inheritedGlobal` quando há inscrição. Uma instância sem destino pode optar por `inherit` antes de existir um global. Se não existir global, a ação remove o destino próprio e aguarda o futuro cadastro. Inscrições existentes antes desta versão são preservadas como configurações próprias. Para incluí-las no global, selecione **Usar webhook global** em cada uma. `ATENDROZAP_WEBHOOK_URL` e `ATENDROZAP_WEBHOOK_SECRET` inicializam o cadastro global uma única vez. A configuração salva no banco, inclusive sua remoção, prevalece sobre essas variáveis nos próximos reinícios. ## Identificar servidor, instância e empresa No Atendro, cadastre o servidor com URL base e token administrativo. Associe cada `instanceId` retornado por `/instance/init` ao servidor e à empresa autorizada. Use um segredo diferente por servidor e identifique o servidor pela rota/configuração do receptor, por exemplo `/webhooks/atendrozap/{serverId}`. Esse `serverId` é uma referência de cadastro do Atendro, não uma credencial. Não resolva permissões por `instanceName`, `owner`, nome de empresa ou número. Depois da assinatura, confira se o `instanceId` pertence àquele servidor e a uma empresa ativa. O envelope não contém um `serverId` autenticado nem `companyId`. Não compartilhe um segredo global entre empresas sem esse vínculo no receptor. ## Verificação do POST O servidor envia JSON com timeout de 10 segundos, sem seguir redirecionamentos. | Header | Conteúdo | |---|---| | `X-AtendroZAP-Event-Id` | UUID do evento; igual a `eventId` | | `X-AtendroZAP-Instance-Id` | UUID da instância; igual a `instanceId` | | `X-AtendroZAP-Event-Type` | Tipo projetado; igual a `EventType` | | `X-AtendroZAP-Event-Seq` | Sequência numérica; igual a `seq` | | `X-AtendroZAP-Attempt` | Tentativa; informativo, não faz parte da assinatura | | `X-AtendroZAP-Timestamp` | Unix em segundos, gerado a cada tentativa | | `X-AtendroZAP-Signature` | `sha256=` seguido de HMAC SHA-256 em hexadecimal | Assinatura: `HMAC-SHA256(segredo, bytes(timestamp + ".") + bytes(corpo_bruto))`. Verifique **antes** de chamar um parser que altere o corpo. Rejeite timestamps mais de 5 minutos no passado ou no futuro. A comparação deve usar uma primitiva criptográfica, como `crypto.subtle.verify`. Rejeite eventos sem assinatura. [verify-webhook.mjs](https://wpp.atendro.cloud/docs/examples/verify-webhook.mjs) implementa essa verificação, limita o corpo a 2 MiB e confere a correspondência dos headers com os campos assinados. É um módulo JavaScript sem dependências, importável também em uma Edge Function com Web Crypto. Os testes estão em `scripts/verify_webhook_test.mjs`. O módulo **não** grava eventos, resolve empresas ou retorna sucesso HTTP. O receptor do Atendro deve completar esse fluxo: 1. Resolver o servidor cadastrado a partir da rota e carregar seu segredo. 2. Chamar `verifyAtendroZAP(request, secret)` com o corpo ainda intacto. 3. Verificar o vínculo servidor → instância → empresa. 4. Gravar o envelope em uma inbox durável com restrição única em `(server_id, instance_id, event_id)`. Uma duplicata já gravada pode receber 2xx. 5. Responder 204/200 apenas depois do commit. Em falha temporária do banco, responder 503 para que o AtendroZAP tente novamente. 6. Processar a inbox com retry interno; marcar o processamento concluído na mesma transação das alterações do Atendro ou usando operações idempotentes. Se a plataforma exigir JWT por padrão na entrada, ajuste **somente essa função** para aceitar os headers HMAC deste contrato. O AtendroZAP não envia Bearer/JWT, apikey da plataforma nem headers customizados. A assinatura e o vínculo de instância são a autenticação e autorização do novo receptor. ## Eventos a tratar O envelope comum contém `eventId`, `seq`, `EventType`, `instanceId` e `instanceName`. `instance` pode ser string ou objeto conforme o evento; `owner` pode estar ausente. Use `instanceId` como identificador estável. | Tipo | Tratamento no Atendro | |---|---| | `connection` | Ler `state/status/connection` e atualizar conexão. `instance` é objeto. QR não é enviado: consultar status autenticado | | `messages` | Upsert de mensagem pelo ID externo; distinguir texto, mídia, contato, localização e `ReactionMessage` | | `messages_update` | Processar **todos** os `event.MessageIDs`; aplicar `Sent`, `Delivered`, `Read`, `Played` ou `Deleted`. `chat` pode ser string | | `messages_edit` | Atualizar o conteúdo do ID original; não criar nova mensagem | | `groups` | Ler `data` com `action`, `groupJid`, assunto e alterações de participantes | | `call` | Ler `data` com `callId`, `direction`, `status`, `endReason` e `endedBy`; emitido por instâncias `calls` | | `call_settings` | Aplicar `data.callsMaxConcurrent` e `data.incomingCallMode` por `data.callsConfigVersion` à instância `calls`, sem criar um registro de chamada | | `limits` | Ler `data` e apresentar a restrição da sessão | | `undecryptable` | Registrar estado de mensagem indecifrável sem inventar seu conteúdo | O formato detalhado e os exemplos estão em [EVENTS.md](https://wpp.atendro.cloud/docs/guias/eventos.md). Reações chegam como `messages` com `messageType: ReactionMessage`. Mensagens enviadas pela API e edições próprias têm projeções filtradas; o Atendro deve registrar a resposta do envio/edição e reconciliar por ID. Não dependa de um eco do webhook. Para a resposta automática de chamadas, processe somente a decisão confirmada `data.autoReplyRequested=true`, com `direction=inbound`, `status=ended`, `endReason=rejected`, `endedBy=local`, `rejectionSource=policy` e `incomingCallMode=reject_reply`. Registre a solicitação de forma durável junto do recebimento do evento, deduplique por instância/chamada e use a configuração imutável correspondente a `callsConfigVersion`. A identidade do chamador deve ficar restrita à empresa; um LID não deve ser convertido em número por remoção do sufixo. Envie pelo canal de mensagens explicitamente vinculado, com proteção contra repetição e resultado de entrega independente da recusa. `history`, `chats`, `qrcode`, `presence`, `contacts`, `labels`, `chat_labels`, `blocks`, `sender`, `newsletter_messages` são aceitos por compatibilidade, mas aparecem em `ignoredEvents`. Histórico é consultado por `/chat/find` e `/message/find`. Estados de ligações são entregues por `call` nas instâncias de tipo `calls`. ## Duplicação, ordem e recuperação Instâncias `calls` entregam chamadas, configuração e ciclo de vida; eventos de mensagens, recibos, edições, grupos e `undecryptable` são filtrados, inclusive no backlog. Inscreva explicitamente `call_settings` além de `call` e `connection`. A atualização do limite não altera o cadastro do webhook. Para sincronizar, faça `GET /instance/status` inicialmente e compare `instance.callsConfigVersion` com a versão persistida no Atendro. `connection` pode acrescentar o limite e a versão em `instance`; `call_settings` usa `data`. Aplique ambos pela versão, nunca por horário de chegada; campos opcionais ausentes não apagam a configuração conhecida. Leia o [prompt de implementação](https://wpp.atendro.cloud/docs/guias/atendro-ligacoes-simultaneas.md). As adições são anunciadas por `capabilities.calls_settings_webhook` e ainda dependem de publicação no servidor utilizado. A entrega é pelo menos uma vez. `seq` é crescente por instância, com lacunas possíveis; não é um contador exclusivo daquela instância. Eventos filtrados e recibos condensados não geram POST. Estados de entrega de mensagens não devem regredir quando ocorrer replay. Uma inbox deve processar todos os itens de um recibo em lote antes de marcar o evento concluído. 2xx confirma a entrega. `400/410/413/422` encerram imediatamente as tentativas; `401/403` encerram após 3. Rede, timeout e demais códigos usam retry com backoff, até 20 tentativas ou 48 horas. Após 10 falhas transitórias consecutivas há uma pausa de 5 minutos. A requisição já em trânsito pode concluir após uma mudança de configuração; a próxima entrega usa o cadastro atualizado. Consulte `GET /webhook` e `/webhook/errors`, ou as versões administrativas por ID. Com o token da instância, liste `GET /v1/events?status=dead` e use `POST /v1/events/{id}/replay` depois de corrigir o receptor. Se sua inbox já aceitou o evento, retente o processamento interno dela: reenviar o mesmo ID não deve duplicar a alteração. Trocar o destino não transfere eventos anteriores. ## Homologação do novo receptor Validar assinatura válida/inválida, janela de timestamp, instância de outro servidor/empresa, duplicatas concorrentes, falha de persistência, recibos com múltiplos IDs, mudança de conexão, reação, edição, mídia e recuperação após indisponibilidade. Não registrar payloads, números, conteúdo de conversas ou segredos em logs. Esta revisão testa o contrato e a entrega local com dados sintéticos; a homologação no Atendro real depende da implementação desse receptor. ## Registrar atendimento de ligação Assine `call` no webhook da instância de voz ou no webhook global herdado. O parceiro registra atendimento ao receber `EventType=call` com `data.event=answered`, `data.answered=true` e `data.answeredAt`. Nesse instante `data.status=connecting`; `active` indica mídia iniciada depois. Faça upsert por `(instanceId, data.callId)` e deduplique por `eventId`; o reenvio preserva esse ID. Os estados posteriores mantêm `answeredAt`. Subeventos `recording_ready`/`recording_failed` apenas atualizam a gravação. O download exige header `token` e deve ser intermediado pelo backend do Atendro. [Contrato completo de chamadas](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md). Com gravação de vídeo habilitada no provedor, `video_recording_ready` e `video_recording_failed` chegam no mesmo `EventType=call`, com `callId` e `videoRecording: {status, contentType: "video/mp4", durationMs, bytes, failureReason}`. Guarde esse objeto separadamente do `recording` do WAV. Não interprete esses subeventos como encerramento ou alteração de vagas: eles não substituem `ended`, `endReason` ou `endedBy`, e podem ser processados antes ou depois do evento terminal da chamada. Deduplicate pelo `eventId` e use o `seq` do envelope para atualizações da gravação. Reconciliar por `GET /call/{id}` ou histórico; `processing` é estado consultável, sem webhook de progresso obrigatório. O download `GET /call/{id}/recording/video` exige proxy autenticado do backend, header `token` e repasse de `Range`, mantendo as credenciais fora do player. O [guia de gravação de vídeo](https://wpp.atendro.cloud/docs/guias/captura-video.md) inclui o prompt de implementação para o atendro-ai e o tratamento de retenção e falhas. --- Fonte: https://wpp.atendro.cloud/docs/guias/eventos.md # Eventos e webhooks O serviço persiste eventos no PostgreSQL (`events`) antes de qualquer entrega e os entrega ao webhook da instância em ordem de `seq`, pelo menos uma vez. O formato persistido (`/v1/events`) é o próprio do serviço; o corpo entregue ao webhook é a **projeção legada**, no envelope que o parser do consumidor (`uazapi-webhook`) lê. A projeção é uma função pura de `internal/webhook`, coberta por fixtures fixadas na revisão do parser (`projector_test.go`). ## Registro `POST /webhook` (token da instância): ```json {"enabled": true, "url": "https://seu-atendro.example/webhooks/atendrozap", "events": ["connection", "messages", "messages_update", "groups", "qrcode"], "excludeMessages": ["wasSentByApi"], "addUrlEvents": false, "addUrlTypesMessages": false, "action": "add", "secret": "opcional"} ``` - Um webhook por instância; `action: update` é o mesmo upsert, `delete` desativa inclusive em mudanças globais; `inherit` volta ao destino global. Reregistrar a mesma URL mantém o cursor, a saúde e o `secret` (que nunca aparece nas respostas). Uma URL nova começa **depois** dos eventos já existentes: o consumidor nunca recebe o backlog de outra vida. - `url`: https para host público, sem credenciais, sem redirects. Hosts em `ATENDROZAP_WEBHOOK_HOST_ALLOWLIST` (o receptor do laboratório) podem ser privados e http. IPs privados por DNS são recusados na conexão. - `events`: os nomes entregues são `connection`, `messages`, `messages_update`, `messages_edit`, `groups`, `limits`, `undecryptable`, `call`, `call_settings`; `history`, `chats`, `qrcode`, `presence`, `contacts`, `labels`, `chat_labels`, `blocks`, `sender` e `newsletter_messages` são aceitos e devolvidos em `ignoredEvents`. Nomes desconhecidos → `400 invalid_event`. - `addUrlEvents`/`addUrlTypesMessages: true` → `400 unsupported_option` (o nome do evento vai no corpo e em `X-AtendroZAP-Event-Type`). - `excludeMessages`: `wasSentByApi`, `wasNotSentByApi`, `fromMeYes`, `fromMeNo`, `isGroupYes`, `isGroupNo` — filtram só `messages`. Envios pela API nunca geram `messages` de qualquer forma. - O cadastro global persistido usa `GET/POST /v1/webhook` com `admintoken`. O console oferece **Servidor → Configurações de webhook**. Instâncias sem exceção herdam o destino; as futuras o recebem na transação de criação. `ATENDROZAP_WEBHOOK_URL` e `ATENDROZAP_WEBHOOK_SECRET` apenas inicializam a configuração uma vez; alterações salvas prevalecem nos reinícios. O [contrato do novo receptor](https://wpp.atendro.cloud/docs/guias/receber-eventos.md) detalha essas regras. `GET /webhook` devolve o registro (`registered`, `inheritedGlobal`, `url`, `events`, `excludeMessages`, `enabled`, `hasSecret`, `deliveryStatus{pending, dead, oldestPendingSeconds, paused, pausedUntil, consecutiveFailures, lastStatus, lastError, lastDeliveredAt}`) e `webhooks: [o mesmo]`. `GET /webhook/errors` lista as últimas 20 falhas deste worker, sem payload. `GET /instance/status` traz o resumo em `webhooks`. ## Entrega - `POST` JSON, timeout 10 s, sem redirects, `User-Agent: AtendroZAP/…`. - Headers: `X-AtendroZAP-Event-Id`, `X-AtendroZAP-Event-Type`, `X-AtendroZAP-Event-Seq`, `X-AtendroZAP-Instance-Id`, `X-AtendroZAP-Attempt`, `X-AtendroZAP-Timestamp` e, com `secret`, `X-AtendroZAP-Signature: sha256=`. O novo receptor do Atendro deve verificar assinatura e vínculo servidor/instância antes de aceitar o evento; o parser legado não satisfaz esse contrato. - Um entregador por instância por vez, em qualquer worker: a linha de `webhooks` é reclamada com `FOR UPDATE SKIP LOCKED` e um lease de 30 s renovado a cada evento; cada claim trabalha no máximo 20 s e devolve o webhook, para que um receptor lento ocupe uma vaga e nunca o worker. Desabilitar ou trocar a URL para de entregar no evento seguinte. Ordem por `seq`; um evento que precisa de retry bloqueia os seguintes da instância (o parser tolera recibo antes da mensagem só por heurística). Recibos da mesma mensagem enfileirados juntos são condensados no estado mais alto (o consumidor descarta atualizações do mesmo id em < 5 s). - Política por resposta: 2xx entregue; `400`, `410`, `413`, `422` dead-letter imediato; `401`/`403` dead após 3 tentativas; o resto (rede, timeout, 3xx, 404, 429, 5xx) retenta com backoff exponencial de 5 s, teto 10 min, jitter, `Retry-After` honrado; dead após 20 tentativas ou 48 h. - Circuit breaker: 10 falhas consecutivas (dead-letters não contam) pausam o webhook por 5 min sem perder eventos. Sucesso zera o contador. - Falha transitória do próprio serviço ao montar o envelope (banco indisponível) retenta como uma falha de rede; só um defeito permanente (mensagem inexistente, payload ilegível) vira dead-letter. - `GET /v1/events?status=pending|delivered|dead` (pendentes do mais antigo para o mais novo: o primeiro é o que bloqueia); `POST /v1/events/{id}/replay` põe um evento (dead ou entregue) de volta na fila com orçamento novo de tentativas; eventos de antes do registro atual respondem `409 event_before_registration`. - Retenção: entregues 7 d, dead 30 d, pendentes que nenhum webhook pode entregar (sem registro, ou anteriores a ele) 30 d; poda horária. Instância apagada perde o webhook e tem o backlog marcado dead. - Eventos de antes do registro não são entregues (`start_seq`). - Receptores devem tratar a entrega como pelo menos uma vez: desduplicar por `X-AtendroZAP-Event-Id` e recusar `X-AtendroZAP-Timestamp` fora de uma janela (5 min) quando verificarem a assinatura. ## Catálogo (formato persistido → projeção legada) | Tipo persistido | Payload | Projeção | |---|---|---| | `messages` | `{message: }` | `EventType: messages`, `chat{wa_chatid, wa_isGroup, owner, name}`, `message` no formato legado (`legacy.Message`): `id` = `owner:messageid`, `messageid`, `chatid` (forma telefone quando o chat é LID), `sender`, `sender_pn`, `participant` (grupo), `pushName`, `fromMe`, `messageType` PascalCase, `type` (`text`/`media`/…), `mediaType`, `timestamp` (s), `messageTimestamp` (ms), `text`, `caption`, `fileName`, `mimetype`, `fileURL` (só mídia retida), `content{key{id, fromMe, remoteJid, participant}, text/caption, contextInfo{stanzaId, participant}, selectedButtonId, selectedDisplayText, degreesLatitude…}`, `edited: ""`, `reaction: ""`. Envios pela API nunca são projetados | | `messages_update` recibo | `{ids, status, chatid, timestamp}` | `EventType: messages_update`, `state` na raiz (`Sent`, `Delivered`, `Read`, `Played`), `event{Type, MessageIDs (bare), Chat (string), IsFromMe, Timestamp}`, `chat` string, `owner` dígitos. `failed` não tem projeção | | `messages_update` revogação | `{type: revoke, targetId, …}` | `state: Deleted`, `type: DeletedMessage`, `event{Type: Deleted, MessageIDs: [alvo]}` | | `messages_update` "apagar para mim" | `{type: delete_for_me, targetId, chatid, fromMe, known}` (a mensagem ganha `deletedForMeAt`) | **Não projetado**: a mensagem sumiu só da visão da conta; anunciar `Deleted` apagaria no consumidor uma mensagem que a outra parte ainda tem. Visível em `/v1/events` e em `GET /message/status/{id}` | | `messages_update` reação | `{type: reaction, targetId, text, sender, fromMe, …}` | **forma `messages`** com `messageType: ReactionMessage`, `type: reaction`, `content.key.ID` = alvo, `text` = emoji (vazio remove), `fromMe` = quem reagiu, `reaction: ""`, `message.owner`. A forma `messages_update` do parser consulta uma coluna inexistente e não funciona | | `messages_edit` | `{targetId, text, id, fromMe, …}` | `messages_edit` (`originalMessageId`, `messageId` = original, `newText`, `text`, `editMessageId`) quando assinado; senão in-band em `messages` com `message.edited` = id original e `text` novo. Edições feitas pela API não são anunciadas | | `connection` (não emitido quando o motivo é `lease lost`: outro worker é o dono e anuncia o próprio estado) | `{state, previous, reason, disconnectCode, jid, owner, pushName, worker, timestamp}` | `state`/`status`/`connection` (`connected`, `connecting`, `disconnected`), `phoneNumber` (dígitos, só quando conhecido), `lastDisconnectReason` (textos que casam os regex do consumidor), `instance{status, owner, profileName, lastDisconnect, lastDisconnectReason}`, `reasonCode`, `needsHumanQr` | | `groups` | `{action: joined\|update, groupJid, name?, topic?, sender, join[], leave[], promote[], demote[], deleted, timestamp}` | Entregue como `{EventType: groups, event: groups, data}` quando inscrito. O assunto do grupo também sai em `chat.name` e `message.groupName` das mensagens | | `limits`, `undecryptable` | próprio | Só para quem assina o nome; `{EventType, event, data}` | | `call` (só instâncias `kind: calls`) | `{callId, direction (outbound/inbound), status (ringing/connecting/active/ended), number, jid, seq, timestamp, event, answered, startedAt, answeredAt?, mediaStartedAt?, endedAt?, endReason?, endedBy? (local/remote), durationSeconds?, video, videoState?}` | Só para quem assina `call`; `{EventType: call, event: call, data: }`. `number` é a identidade registrada no WhatsApp (celular BR pode vir sem o nono dígito). `video` diz se a chamada é/foi de vídeo; `videoState` `{active, sending, receiving, requested, pending, orientation}` só enquanto viva; `data.event: video` marca mudanças de vídeo sem mudança de `status` | | `call_settings` (só instâncias `kind: calls`) | `{kind: calls, callsMaxConcurrent, incomingCallMode, callsConfigVersion, updatedAt}` | Só para quem assina `call_settings`; `{EventType: call_settings, event: call_settings, data: }`. Snapshot gravado atomicamente com cada POST de configuração aceito, mesmo sem mudança de valor ou com a instância desconectada | Com `capabilities.calls_incoming_policy=true`, chamadas recebidas também carregam `incomingCallMode` e `callsConfigVersion`, congelados quando a oferta chega. Recusas confirmadas incluem `rejectionSource: policy|busy|manual`. `autoReplyRequested=true` exige recusa bem-sucedida pela política `reject_reply`; é uma solicitação ao consumidor, não confirmação de envio de texto. Recusas por ocupação também geram histórico/evento. O consumidor deve deduplicar a solicitação pela identidade composta servidor/instância/chamada e manter o resultado de envio separado do encerramento da ligação. Não responder a `ring_timeout`, atendimento em outro dispositivo ou recusa manual só por observar `ended`. Eventos internos e `qrcode` nunca são entregues; o QR nunca entra em `events`. Em instâncias `calls`, a projeção bloqueia eventos de mensagens, recibos, edições, grupos e `undecryptable`, inclusive os que já estavam na fila antes do filtro. A sessão também deixa de persistir novos eventos dessas categorias e histórico de mensagens. `connection` e `limits` continuam disponíveis além de `call` e `call_settings`, conforme a inscrição. ## Sincronização do limite de chamadas As adições desta seção aguardam publicação e são anunciadas por `capabilities.calls_settings_webhook=true`. O envelope e sua assinatura não mudam. Exemplo sintético parcial: ```json { "EventType": "call_settings", "event": "call_settings", "eventId": "00000000-0000-4000-8000-000000000002", "instanceId": "00000000-0000-4000-8000-000000000001", "seq": 42, "data": { "kind": "calls", "callsMaxConcurrent": 2, "incomingCallMode": "allow", "callsConfigVersion": 3, "updatedAt": "2026-09-19T15:00:00.123456789Z" } } ``` `callsMaxConcurrent` é inteiro de 1 a 8. `callsConfigVersion` é inteiro de 64 bits, crescente por instância; não é a sequência do envelope. `updatedAt` é UTC em RFC3339Nano. Cada POST aceito em `/instance/call-settings` ou `/v1/instances/{id}/call-settings` incrementa a versão e grava o evento na mesma transação. Falha de persistência não deixa configuração sem evento. Retries do webhook preservam o mesmo `eventId` e a mesma versão; repetir o POST cria outra versão, mesmo enviando o mesmo limite. Objetos HTTP `instance` de tipo `calls` expõem `callsMaxConcurrent`, `incomingCallMode` e `callsConfigVersion`, inclusive versão `0`; a data HTTP mantém o nome `updated`. O evento `connection` acrescenta esses campos no objeto `instance`, junto de `kind: calls`, quando consegue ler o estado persistido. Limite, modo e versão são opcionais em `connection`; sua ausência não representa zero e não autoriza substituir uma configuração conhecida. Após assinar `call_settings`, consulte `GET /instance/status`: o cadastro do webhook não gera snapshot inicial nem reenvia o backlog. Aplique snapshots de HTTP, `connection` e `call_settings` por versão para resolver disputas com respostas em trânsito. Ignore versões menores e trate a mesma versão de forma idempotente. Não use `updatedAt` ou horário de chegada para decidir qual vence. Na redução do limite, chamadas vivas continuam; novas admissões ficam bloqueadas até haver vaga. Veja o [prompt de integração](https://wpp.atendro.cloud/docs/guias/atendro-ligacoes-simultaneas.md). ## Limites conhecidos deste serviço - Mensagens de grupo saem com `chat.name`/`message.groupName` quando o assunto é conhecido (sincronizado no `connected`, mantido por notificações e history sync); um grupo que a conta ainda não viu descrito sai sem nome, nunca com o push name de um participante. - Mensagens importadas do histórico do telefone (`from_history`) nunca geram `messages`: são lidas por `/message/find` (padrão) e `/chat/find`. - Chats LID sem forma telefônica conhecida saem com `@lid` em `chatid`; nenhum telefone é fabricado. ## Limites conhecidos do consumidor - Recibos para o mesmo id em < 5 s são descartados pelo consumidor (debounce); `Delivered` seguido de `Read` em < 5 s perde o `Read`. - Um envio estacionado como ambíguo (504) só é resgatado pela heurística de 90 s do consumidor quando o `Delivered` chega com `event.Chat` cujos dígitos coincidem com `contacts.phone`; números brasileiros guardados pelo WhatsApp sem o nono dígito não coincidem. - A edição in-band não é idempotente no consumidor (`edit_count` cresce a cada reentrega). - O guard de transferência do consumidor responde `503 Retry-After: 5` quando indisponível; a entrega retenta. ## Atendimento e gravação de ligações Para instâncias `calls`, `data.event=answered` confirma o aceite com `status=connecting`, `answered=true` e `answeredAt`, antes de começar a mídia. `event=active` acrescenta `mediaStartedAt`. O encerramento mantém os dados do atendimento e informa `durationSeconds`. `ringing` não é aceite. `data.event=video` é um subevento de `call` para mudanças do vídeo sem mudança de `status`: pedido do contato (`videoState.requested`), aceite, câmera ligada ou desligada de cada lado. Todo evento de chamada traz `video` (booleano, permanente após negociado) e, enquanto a chamada vive, `videoState`. Exige `capabilities.calls_video`. `recording_ready` e `recording_failed` são subeventos de `call`, com `callId` e objeto `recording`; atualizam apenas a gravação. A API fornece `GET /call/history` e `GET /call/{id}/recording` para consulta persistente e download privado. Deduplicar pelo `eventId` do envelope e ordenar pelo `seq` do envelope. Contrato e exemplo em [Chamadas de voz](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md). `video_recording_ready` e `video_recording_failed` também são subeventos de `call`, entregues a quem assina `call`. Trazem `callId`, `timestamp` e `videoRecording: {status, contentType: "video/mp4", durationMs, bytes, failureReason}`. Atualizam somente a gravação de vídeo, independentemente de `recording` do WAV. Não são `ended`, não alteram `endReason`/`endedBy`, não liberam vagas de ligações e não exigem `data.status` da chamada. A entrega pode ser processada antes ou depois do encerramento. O resultado e seu evento são gravados atomicamente, preservando o primeiro resultado terminal e o mesmo ID nas tentativas de entrega. Enquanto o MP4 está na fila ou sendo composto, a consulta informa `videoRecording.status=processing`; não existe webhook de progresso obrigatório. O MP4 pronto usa `GET /call/{id}/recording/video`, privado e com suporte a `Range`. Na consulta a duração usa `durationSeconds`; nos subeventos usa `durationMs`. Consulte o [guia de gravação de vídeo](https://wpp.atendro.cloud/docs/guias/captura-video.md). --- Fonte: https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md # Erros e idempotência Leia o status HTTP e o campo `error` juntos. Uma falha de transporte não significa necessariamente que uma mensagem deixou de ser enviada. ## Decida pelo resultado | HTTP / erro | Como tratar | |---|---| | `400` | Corrigir JSON, parâmetros, opções ou allowlist antes de repetir | | `401 unauthorized` | Conferir o tipo de header e o token do servidor ou da instância | | `403` em grupos | Conferir participação e permissões da conta | | `404` | Recurso inexistente; não presumir desconexão | | `405` | Corrigir o método; consultar o header `Allow` | | `409 whatsapp_disconnected` | Aguardar o fluxo autorizado de reconexão | | `409 session_owned_elsewhere` | Sessão pertence a outro worker; não duplicar a instância | | `409 media_reupload_pending` | Aguardar o reenvio da mídia e tentar o download depois | | `409 idempotency_in_progress` | Aguardar e repetir a mesma requisição com a mesma chave | | `422 idempotency_mismatch` | A chave foi reutilizada com método, caminho ou corpo diferentes | | `422 send_failed` / `number_not_on_whatsapp` | Falha definitiva desse envio; inspecionar o erro | | `429` | Respeitar `Retry-After` | | `500 whatsapp_reachout_timelock` | Bloqueio 463 do WhatsApp; observar `error_key` e `details.reachout_timelock.until` | | `501 calls_not_supported` | Verificar módulo habilitado e uso de instância `calls`; uma instância de mensagens mantém esse erro | | `502 storage_unavailable` | Aguardar recuperação do banco; respeitar `Retry-After` | | `503` em readiness | Banco não pronto | | `504 send_ambiguous` / `action_ambiguous` | Reconciliar pelo ID e pelos eventos antes de reenviar | ## Resultado ambíguo Um `504` pode ocorrer depois de o WhatsApp aceitar a operação. Guarde o identificador devolvido e consulte o status ou os eventos. Repetir com uma chave nova pode duplicar o efeito. Os aliases `messageid`, `messageId` e `id` dos envios se referem ao ID da mensagem do WhatsApp. Na edição, `editId` identifica a ação de edição e o ID original permanece separado. ## Rotas com idempotência | Operações | Retenção | |---|---| | `POST /instance/init` | 15 minutos | | `/send/*`, ações em mensagens e mutações de grupo indicadas no contrato | 24 horas | A página de cada endpoint informa se ele oferece `Idempotency-Key`. Não há garantia geral para qualquer POST. ```http Idempotency-Key: operacao-exemplo-001 ``` Crie uma chave por operação de negócio. Em uma repetição, mantenha a mesma chave, o método, o caminho e **os mesmos bytes do corpo**. Alterar espaços ou a ordem das chaves no JSON altera o hash. ## Replay de requisição `Idempotency-Replayed: true` indica uma resposta guardada. Respostas transitórias `409`, `429` e `5xx`, exceto `504`, liberam a chave. Resultados concluídos e ambíguos `504` permanecem guardados durante a retenção. Repetir um `504` e receber a mesma resposta não autoriza criar outra chave para o mesmo envio. ## Limites e correlação Use `X-Request-Id` para correlacionar falhas sem registrar tokens ou conversas. O corpo geral aceita 64 KiB; `/send/media` aceita 48 MiB de JSON e `/group/updateImage` 12 MiB. Bytes UTF-8 e caracteres não são a mesma medida. O orçamento do handler de envio é de 44 segundos. Configure o timeout do cliente de forma compatível e implemente a reconciliação de resultados ambíguos. ## Reentrega de eventos Idempotência de requisição e deduplicação de webhook são responsabilidades distintas. Para eventos, deduplique por servidor, instância e `X-AtendroZAP-Event-Id`. [POST /v1/events/{id}/replay](https://wpp.atendro.cloud/docs/api/replay-event.md) pode repetir um efeito já processado. --- Fonte: https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md # Chamadas de voz e vídeo Ligações usam uma instância de tipo `calls`, com pareamento próprio e áudio nos dois sentidos pelo navegador. O módulo precisa estar habilitado no servidor. Vídeo é opcional por cima do áudio, habilitado à parte e ainda experimental (veja [Chamadas de vídeo](#chamadas-de-vídeo)). ## Capacidade anunciada Consulte [GET /v1/capabilities](https://wpp.atendro.cloud/docs/api/get-capabilities.md) com `admintoken`. Exigir `capabilities.calls=true` e `instance_kinds` contendo `calls`. Este recorte ilustra um servidor habilitado: ```json { "capabilities": {"calls": true, "calls_per_instance_limit": true, "calls_video": false}, "instance_kinds": ["whatsapp", "calls"], "calls_max_concurrent": 1, "calls_max_concurrent_range": {"min": 1, "max": 8} } ``` Com `ATENDROZAP_CALLS_ENABLED=false`, criar ou operar a instância de ligação é recusado. O limite padrão é uma chamada por instância. Conectar uma instância de mensagens não habilita voz nela. `calls_video` anuncia o vídeo (`ATENDROZAP_CALLS_VIDEO_ENABLED=true`); sem ele, `video: true` e as rotas de vídeo respondem `501 calls_video_not_supported`. ## Limite de ligações por instância Escolha **Ligações simultâneas** ao criar uma instância de ligação ou abra **Instância → Visão geral → Ligações simultâneas → Salvar limite**. Aceita de 1 a 8, incluindo ligações ainda tocando. O único modo homologado em chamadas reais continua sendo 1 por vez. Pela API, informe `callsMaxConcurrent` em `POST /instance/init` com `kind: calls`. Para alterar depois, use [POST /instance/call-settings](https://wpp.atendro.cloud/docs/api/configure-instance-calls.md) com o header `token`, ou [POST /v1/instances/{id}/call-settings](https://wpp.atendro.cloud/docs/api/admin-configure-instance-calls.md) com `admintoken`: ```json {"callsMaxConcurrent": 2} ``` O limite é persistido e aparece no objeto `instance` do status e da listagem, junto de `callsConfigVersion` (inteiro crescente; inclusive `0` antes de uma edição). Voz e vídeo compartilham o mesmo limite; cada chamada `ringing`, `connecting` ou `active`, recebida ou realizada, ocupa uma vaga. Pode ser salvo com a instância desconectada. Alterar não reconecta a sessão: ligações em andamento são preservadas, mesmo que ultrapassem um limite reduzido; novas ligações aguardam haver vaga e recebem `409 line_busy` enquanto não houver. O worker local aplica imediatamente. Se a sessão estiver em outro worker, ele aplica na próxima renovação de lease e antes de cada nova ligação de saída. `calls_max_concurrent` em capacidades é o padrão do servidor, não o limite individual. Instâncias antigas sem escolha própria continuam usando esse padrão até a primeira edição; novas instâncias persistem o padrão da criação. Configure os eventos `call`, `call_settings` e `connection` na aba **Webhook** da própria instância. A inscrição também pode ser feita por API, conforme o [guia de webhooks](https://wpp.atendro.cloud/docs/guias/webhooks.md). Cada `POST /instance/call-settings` ou variante administrativa bem-sucedido incrementa `callsConfigVersion` e grava um evento `call_settings` na mesma transação, mesmo quando o valor enviado é igual ao anterior ou a instância está desconectada. O evento é entregue somente com inscrição explícita em `call_settings`; mudar o limite não altera a inscrição do webhook. O novo evento mantém o envelope assinado existente, com `data: {kind: "calls", callsMaxConcurrent, callsConfigVersion, updatedAt}`. `updatedAt` usa UTC em RFC3339Nano; nos objetos HTTP o campo de data existente continua se chamando `updated`. `capabilities.calls_settings_webhook=true` anuncia esse contrato. Eventos `connection` de uma instância `calls` também acrescentam `instance.kind` e, quando o banco pode ser consultado, `instance.callsMaxConcurrent` e `instance.callsConfigVersion`. Esses dois últimos campos são opcionais: a ausência não redefine o limite. Assinar o webhook não envia um snapshot inicial; consulte `GET /instance/status` ao integrar ou retomar a instância e compare a versão antes de aplicar respostas HTTP ou eventos, evitando regressões. Uma instância `calls` gera eventos de chamada (`call`), configuração (`call_settings`) e ciclo de vida (`connection`, `limits`, conforme inscrição). Ela não persiste nem publica mensagens, recibos, edições, eventos de grupos, histórico de mensagens ou `undecryptable` recebidos nessa sessão. Uma instância `whatsapp` separada continua responsável pelas conversas. O [prompt de integração com o Atendro](https://wpp.atendro.cloud/docs/guias/atendro-ligacoes-simultaneas.md) detalha sincronização, vagas, reservas e testes. As adições de configuração e o filtro de mensagens descritos aqui aguardam publicação; não presumir que uma API em produção já os anuncia. ## Primeiro teste pelo painel 1. Abra o servidor no [console](https://wpp.atendro.cloud) e clique em **Nova instância**. 2. Selecione **Tipo → Ligação**, informe um nome e crie. O painel guarda o token no backend. 3. Solicite a conexão e escaneie o QR pelo WhatsApp do número autorizado. Aguarde **connected**. Pode ser outro dispositivo vinculado do mesmo número usado para mensagens ou um número dedicado. 4. Nas **Conversas** da instância de mensagens, abra a conversa autorizada e clique em **Ligar**. O painel escolhe uma instância de ligação conectada do mesmo servidor cujo token conhece. Também é possível usar **Discar** na página da instância de ligação. 5. Permita o microfone, atenda no telefone de destino e confira áudio nos dois sentidos. O widget segue a tela de ligação do WhatsApp: o contato no palco, os controles redondos embaixo. **Mudo** controla o microfone; **Câmera** liga o vídeo (quando habilitado); **Gravando** mostra a gravação automática e, ao encerrar, vira **Gravação**, que abre o player do áudio ali mesmo; **Desligar** encerra a chamada. Mantenha a página aberta durante a conversa. Se o tipo **Ligação** não aparecer, confira a capacidade do servidor. Se o painel não conhecer o token de uma instância criada fora dele, reemita-o pela interface antes do uso. Erros de linha ocupada ou sessão desconectada são mostrados no widget. ## Ruído e eco O painel solicita cancelamento de eco, supressão de ruído e ajuste de ganho ao navegador. Quando o dispositivo oferece o modo de cancelamento de todo o áudio reproduzido, ele é preferido para incluir a voz que sai pelo painel. O widget avisa quando não consegue confirmar o cancelamento de eco. **Reduzir ruído do microfone** vem marcado: acrescenta um filtro de graves e atenua suavemente o fundo entre as falas. Desmarque durante uma chamada para comparar, especialmente se sua voz for muito baixa. Essa opção controla o filtro adicional; o cancelamento de eco do navegador continua solicitado. O tratamento ocorre no computador do atendente antes do envio e não altera o som recebido. Quando a gravação automática está habilitada no servidor, ela captura a voz já tratada do atendente e a voz recebida do contato. O filtro não elimina todas as vozes, teclas ou sons fortes enquanto você fala. Use fone se persistir eco; no teste com dois aparelhos próximos, afaste o telefone do microfone do computador e evite volume alto no viva-voz. A qualidade depende também do navegador, microfone e ambiente. ## Rotas e estados | Operação | Resultado | |---|---| | [POST /call/make](https://wpp.atendro.cloud/docs/api/make-call.md) | Corpo `{number, video?}`; `201` com `callId`; aceita `Idempotency-Key` | | [POST /call/answer](https://wpp.atendro.cloud/docs/api/answer-call.md) | Corpo `{callId}`; atende uma chamada recebida | | [POST /call/reject](https://wpp.atendro.cloud/docs/api/reject-call.md) | Corpo `{callId}`; recusa uma chamada recebida | | [POST /call/hangup](https://wpp.atendro.cloud/docs/api/hangup-call.md) | Corpo `{callId}`; encerra a chamada | | [POST /call/video](https://wpp.atendro.cloud/docs/api/call-video.md) | Corpo `{callId, action}` com `start`, `accept` ou `stop`; liga, aceita ou desliga o vídeo | | [GET /call/active](https://wpp.atendro.cloud/docs/api/list-active-calls.md) | Lista as chamadas vivas da instância | | [GET /call/{id}](https://wpp.atendro.cloud/docs/api/get-call.md) | Estado da chamada viva ou do histórico persistente | | [GET /call/history](https://wpp.atendro.cloud/docs/api/list-call-history.md) | Histórico paginado, com filtros e situação da gravação | | [GET /call/{id}/recording](https://wpp.atendro.cloud/docs/api/download-call-recording.md) | Reprodução/download autenticado do WAV, com suporte a Range | | [GET /call/{id}/audio](https://wpp.atendro.cloud/docs/api/stream-call-audio.md) | Upgrade WebSocket; PCM s16le mono a 16 kHz | | [GET /call/{id}/video](https://wpp.atendro.cloud/docs/api/stream-call-video.md) | Upgrade WebSocket; H.264 Annex-B com cabeçalho de 8 bytes e avisos JSON | Todas usam o token da instância `calls`. Estados: `ringing`, `connecting`, `active`, `ended`; o encerramento inclui `endReason` e `endedBy`. Uma instância `whatsapp` mantém `501 calls_not_supported` em `/call/make`; outras rotas de ligação recusam o tipo incorreto com `409 wrong_instance_kind`. O áudio passa pelo console, que autentica a sessão do navegador e adiciona o token no pedido à API. Apenas as pontes de áudio e vídeo aceitam `?token=` como alternativa ao header. Prefira o proxy para manter a credencial no backend e não registrar tokens em URLs. A perda do socket de áudio ou vídeo abre uma janela de 30 segundos para reconexão com o mesmo callId. Reabrir o socket do mesmo tipo cancela seu prazo; se ele não retornar, a chamada termina com hangup/local. A negociação de vídeo é preservada durante a janela e a nova ponte pede um keyframe. Para desligar voluntariamente, use POST /call/hangup; para desligar só a câmera, use POST /call/video com action: stop. ## Chamadas de vídeo Recurso experimental. O motor de chamadas transporta o vídeo (H.264 pelo relay do WhatsApp) e a sinalização de upgrade foi validada pelo projeto upstream contra uma segunda implementação, mas o caminho de mídia de vídeo ainda não foi homologado com o número de laboratório. Por isso o vídeo fica atrás de `ATENDROZAP_CALLS_VIDEO_ENABLED` e é anunciado em `capabilities.calls_video`. Três formas de haver vídeo numa chamada: 1. **Chamada de vídeo desde o toque**: `POST /call/make` com `{"number": "...", "video": true}`. A oferta anuncia vídeo e `videoState.sending` já vem verdadeiro. 2. **Upgrade no meio da chamada**: `POST /call/video` com `{"callId": "...", "action": "start"}` numa chamada atendida. Fica `videoState.pending` até o contato aceitar no telefone; aceite abre o envio (`sending`), recusa devolve ao áudio. Numa chamada que já negociou vídeo, `start` apenas religa a câmera. 3. **Pedido do contato**: o telefone pede vídeo e chega `data.event: "video"` com `videoState.requested`. Responda com `action: "accept"`; ignorar deixa o WhatsApp retirar o pedido. Uma chamada recebida como vídeo já nasce com os dois fluxos anunciados. `action: "stop"` desliga a câmera deste lado (ou retira o pedido pendente) sem mexer no áudio nem no vídeo do contato. `videoState.receiving` diz se o contato está com a câmera ligada e `orientation` (0–3, quartos de volta) como girar os quadros dele. Os quadros trafegam por `GET /call/{id}/video`, um WebSocket separado do áudio. Cada mensagem binária é um cabeçalho de 8 bytes (versão 1; flags com bit 0 = keyframe; orientação; reservado; duração do quadro em microssegundos, big-endian) seguido de uma unidade de acesso H.264 em Annex-B. A API não codifica nem decodifica pixels: quem envia produz H.264 (WebCodecs no navegador, ffmpeg, codec de hardware) e quem recebe decodifica. Abra o socket junto com a chamada, antes de haver vídeo, para não perder o keyframe que abre o fluxo do contato; quadros enviados com o fluxo fechado são descartados, e enquanto o motor espera um keyframe os quadros intermediários também. Mensagens de texto da API são avisos JSON: `{"event":"keyframe"}` pede um IDR no próximo quadro e `{"event":"video","video":{...}}` acompanha cada mudança de `videoState` (o primeiro aviso é o estado atual). Códigos de fechamento: 4000 chamada encerrada, 4001 cabeçalho inválido, 4002 falha de escrita, 4003 substituído por outro socket. No painel, com a capacidade anunciada e um navegador com WebCodecs (Chrome, Edge, Safari 16.4+, Firefox 130+), o discador da instância de ligação ganha **Chamada de vídeo**, as conversas ganham **Vídeo**, e **Câmera** no widget faz o upgrade. O vídeo do contato ocupa o palco do widget e a própria câmera aparece como miniatura, como na tela de chamada do WhatsApp. Resolução enviada: até 640×480 a 15 quadros por segundo, cerca de 0,6 Mbit/s por sentido — o servidor só repassa os bytes, sem transcodificar. O histórico marca `video: true` nas chamadas que tiveram vídeo. Com `capabilities.calls_video_recording=true`, a captura opcional também gera um MP4 com as duas câmeras lado a lado após o encerramento. O WAV continua independente; `videoRecording` informa o processamento e o download. Veja [Gravação de videochamadas](https://wpp.atendro.cloud/docs/guias/captura-video.md) para habilitação, limites e integração no Atendro. A gravação de vídeo permanece desligada por padrão e ainda exige homologação em celulares reais. ## Registrar o atendimento no sistema parceiro Inscreva `call` no webhook global ou próprio para receber `data` com `callId`, direção, estado e motivo de encerramento. A entrega segue a política de assinatura, retry e deduplicação dos demais eventos. O sinal de atendimento é **`EventType: "call"` e `data.event: "answered"`**. Nesse momento `data.answered` é `true`, `data.answeredAt` traz o horário do aceite e `data.status` é `connecting`. O estado `active` chega depois, quando o motor recebe áudio; não espere por ele para registrar que atendeu. Isso vale para o aceite remoto de uma chamada realizada e para o atendimento local de uma chamada recebida. `ringing` e `preaccept` não são atendimento. ```json { "EventType": "call", "event": "call", "eventId": "ID_DO_EVENTO", "instanceId": "ID_DA_INSTANCIA", "seq": 2, "data": { "callId": "ID_DA_CHAMADA", "event": "answered", "direction": "outbound", "status": "connecting", "answered": true, "startedAt": "2026-09-18T15:00:00Z", "answeredAt": "2026-09-18T15:00:05Z" } } ``` O exemplo é um recorte: o envelope completo inclui as identidades previstas no contrato. No consumidor, valide a assinatura sobre o corpo original, identifique a instância por `instanceId` e faça upsert por `(instanceId, data.callId)`. Deduplicate por `eventId`; retries preservam esse identificador. Use `seq` do envelope para ordenar, pois `data.seq` pertence à sessão de ligações. Responda 2xx após guardar o evento. Todo evento traz `video` (booleano) e, enquanto a chamada vive, `videoState`. `data.event: "video"` marca mudanças só de vídeo (pedido do contato, aceite, câmera ligada/desligada), sem alterar `status`. `data.event: "active"` acrescenta `mediaStartedAt`, mantendo `answeredAt`. `data.event: "ended"` acrescenta `endedAt`, `endReason`, `endedBy` e `durationSeconds`. Os eventos posteriores também preservam `answered=true` e `answeredAt`, permitindo reconciliar o atendimento se o consumidor perdeu uma notificação. Chamadas não atendidas terminam com `answered=false`. `endReason: "hangup"` com `endedBy: "remote"` também representa um nó WhatsApp `terminate` remoto sem motivo explícito (ausente, vazio ou só espaços). Indica solicitação remota de encerramento; isoladamente não comprova que alguém apertou o botão de desligar. Motivos explícitos são preservados; um callback genérico sem motivo continua `unknown`. O primeiro motivo fica no evento e no histórico, sem reclassificar chamadas antigas. `data.event: "recording_ready"` informa `callId` e `recording` com `status`, `bytes` e `durationMs` depois de o arquivo ficar pronto. `recording_failed` informa falha, sem inventar um áudio disponível. Esses dois eventos atualizam a gravação, não o estado da chamada; não dependem de um campo `status` da chamada e podem chegar antes do evento de encerramento. `data.event: "video_recording_ready"` e `"video_recording_failed"` informam `callId` e o objeto separado `videoRecording`, com `contentType: "video/mp4"`, `status`, `bytes`, `durationMs` e `failureReason`. São atualizações da gravação de vídeo: não são `ended`, não mudam vagas de simultaneidade e não substituem `recording` do WAV. Consulte o [guia de gravação de vídeo](https://wpp.atendro.cloud/docs/guias/captura-video.md). ## Histórico e gravação automática No painel, abra a instância de ligação e a aba **Histórico de chamadas**. É possível filtrar realizadas/recebidas e atendidas/sem atendimento, consultar duração, ouvir e baixar. O histórico permanece após reiniciar a API e após a expiração do áudio; não depende da retenção de `/v1/events`. Na API, `GET /call/history?limit=25&answered=true` lista a primeira página. Envie o `nextCursor` recebido como `before` para buscar chamadas mais antigas. Filtros opcionais: `direction`, `status`, `from` (inclusivo) e `to` (exclusivo), com datas RFC3339. Máximo de 100 itens por página. Na VPS 1 a configuração solicitada é gravar **todas as chamadas atendidas** e reter o áudio por **30 dias**. `capabilities.call_history` e `capabilities.call_recording` anunciam os recursos; a retenção está em `calls_recording_retention_days`. A captura começa no aceite, sem gravar toques, e acompanha substituições da ponte de áudio. O WAV tem PCM 16-bit, 16 kHz, dois canais: atendente à esquerda e contato à direita. O som processado ocupa aproximadamente 3,84 MB por minuto de chamada. Cada item tem `recording.status`: `not_recorded`, `recording` (captura ou finalização), `ready`, `failed` ou `expired`. Quando pronto, `downloadPath` aponta para `GET /call/{id}/recording`. **Use o header `token` no backend**: essa rota não aceita credencial na query. Faça proxy autenticado para o player do Atendro, repassando `Range` para permitir avançar no áudio. O console já faz isso sem expor o token ao navegador. Depois do prazo, o download responde `410 recording_expired`; a limpeza dos arquivos roda de hora em hora, preservando o histórico. Um worker reiniciado durante uma chamada marca o registro como encerrado por `worker_restarted` e a gravação incompleta como falha. Disco indisponível ou fila de gravação esgotada também gera falha explícita, sem bloquear a chamada. Os eventos antigos ainda existentes são importados para o histórico pela migração. Não há áudio recuperável de chamadas anteriores à ativação. ## Comportamento ao receber uma ligação Servidores com `capabilities.calls_incoming_policy=true` aceitam `incomingCallMode` em `POST /instance/call-settings` (ou na variante administrativa por ID). A atualização é parcial: alterar apenas o modo preserva o limite, e alterar apenas o limite preserva o modo. | Modo | Resultado | |---|---| | `allow` | A chamada fica disponível para um atendente aceitar. É o padrão das instâncias existentes. | | `reject` | O servidor recusa a chamada recebida, mesmo com o navegador fechado. | | `reject_reply` | O servidor recusa e publica a solicitação de resposta automática para o consumidor. | O modo e `callsConfigVersion` são congelados na chegada da chamada. A mudança vale para chamadas novas, sem interromper atendimentos em andamento. Cada atualização aceita publica o snapshot completo em `call_settings`. Para impedir que duas edições concorrentes sobrescrevam uma à outra, envie `expectedCallsConfigVersion`; divergência retorna `409 settings_version_conflict`. ```json { "incomingCallMode": "reject_reply", "expectedCallsConfigVersion": 3 } ``` A instância `calls` não envia mensagens. No Atendro-AI, configure explicitamente o texto e uma conexão de mensagens da mesma empresa e do mesmo número. A recusa e o envio são operações independentes: o histórico precisa mostrar resposta pendente, enviada ou falha, sem afirmar que recusar comprovou o envio. Os snapshots/eventos de chamada recebida incluem `incomingCallMode` e `callsConfigVersion`. Uma recusa confirmada inclui `rejectionSource` (`policy`, `busy` ou `manual`). `autoReplyRequested=true` aparece apenas após recusa bem-sucedida por política `reject_reply`; não envie texto a partir de qualquer evento `ended/rejected`. Chamadas rejeitadas por ocupação também geram histórico/eventos, sem ocupar uma vaga adicional. O consumidor deve deduplicar por servidor, instância e chamada, usar a configuração da versão recebida e limitar a frequência de resposta por contato. Eventos repetidos, atrasados e reprocessados não autorizam uma segunda mensagem. Falta de identidade resolvida ou de conexão válida gera falha explícita. Uma chamada não atendida expira localmente: isso não equivale a recusa nem autoriza responder. A recusa explícita pode afetar o toque em outros aparelhos vinculados à conta. ## Limites de validação A bancada validou uma chamada curta de saída com áudio nos dois sentidos, e o responsável confirmou a chamada real pelo painel da VPS em 18/09/2026. Após o ajuste de áudio, repetiu a chamada e confirmou melhora tanto do ruído quanto do eco. Essa confirmação é qualitativa, no ambiente testado. Latência boca-ouvido medida, chamada longa, recebimento e o defeito upstream #25 (recusa por aparelho Web/Desktop do destino) continuam pendentes de homologação. Veja [validação e limites](https://wpp.atendro.cloud/docs/guias/validacao.md). --- Fonte: https://wpp.atendro.cloud/docs/guias/captura-video.md # Gravação de videochamadas O AtendroZAP pode capturar os dois sentidos de uma videochamada e gerar um MP4 após seu encerramento. É uma opção do servidor, desligada por padrão, anunciada em `capabilities.calls_video_recording`. A gravação WAV existente continua disponível com seu contrato e ciclo de vida próprios. O MP4 mostra atendente à esquerda e contato à direita, em 1280×360 a 25 fps, com vídeo H.264 e áudio AAC estéreo: voz do atendente à esquerda e do contato à direita. Proporções são preservadas com margens pretas. Câmera desligada deixa o espaço correspondente preto. O console exibe player e download na aba **Histórico de chamadas**, depois do processamento. ## Habilitar no servidor Esta configuração destina-se à homologação. A ativação em produção depende da validação com chamadas reais, orientação e consumo de recursos descrita ao final deste guia. São necessários os módulos de chamadas, vídeo e gravação de áudio: ```sh ATENDROZAP_CALLS_ENABLED=true ATENDROZAP_CALLS_VIDEO_ENABLED=true ATENDROZAP_CALLS_RECORDING_ENABLED=true ATENDROZAP_CALLS_RECORDING_DIR=/call-recordings ATENDROZAP_CALLS_RECORDING_RETENTION_DAYS=30 ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED=true ATENDROZAP_CALLS_VIDEO_RECORDING_RETENTION_DAYS=7 ``` A ativação é global por worker: as videochamadas das instâncias `calls` existentes e das cadastradas depois passam a ser capturadas automaticamente. Não há habilitação individual por instância. Chamadas anteriores à ativação não ganham gravação retroativa. Também são necessários os executáveis `ffmpeg` e `ffprobe`. A imagem padrão `api` permanece sem eles. O target opcional `api-video` inclui FFmpeg 8.1.2 e libx264; essa composição tem licença GPL-2.0-or-later e revisão própria. Não basta ligar a variável numa imagem que não contém os executáveis. Consulte a revisão de licença do repositório antes de distribuir a imagem. Depois de finalizar o commit, o fluxo do repositório pode preparar as imagens no host autorizado: ```sh deploy/ship.sh HOST REV api-video ``` `HOST` é o alias SSH autorizado e `REV` é a revisão Git revisada. Esse comando envia o código versionado e constrói as imagens da API e do console; não reinicia os containers. A construção consome recursos do host e deve ser feita na janela de preparação acordada. Ativação da imagem e da flag ocorre em etapa posterior, após homologação e autorização operacional. O serviço valida a combinação de módulos e resolve os executáveis no startup. Habilitar a opção exige publicar a imagem adequada e reiniciar a API em uma janela operacional. Esta documentação não informa que a opção já esteja ativa em produção. | Variável | Padrão | Valores aceitos | |---|---|---| | `ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED` | `false` | Booleano; requer vídeo e gravação de áudio | | `ATENDROZAP_CALLS_VIDEO_RECORDING_RETENTION_DAYS` | `7` | 1–3650 dias desde o encerramento; independente da retenção de áudio | | `ATENDROZAP_CALLS_VIDEO_RECORDING_INVERT_REMOTE_ORIENTATION` | `false` | `true` troca 90°/270° somente no cliente remoto do MP4, compatível com o ajuste `invert=true` do Atendro | | `ATENDROZAP_CALLS_VIDEO_RECORDING_FFMPEG` | `ffmpeg` | Executável ou caminho local | | `ATENDROZAP_CALLS_VIDEO_RECORDING_FFPROBE` | `ffprobe` | Executável ou caminho local | | `ATENDROZAP_CALLS_VIDEO_RECORDING_MAX_CONCURRENT` | `1` | 1–8 renders ativos por worker | | `ATENDROZAP_CALLS_VIDEO_RECORDING_MAX_PENDING` | `8` | 1–128 renders esperando por worker | | `ATENDROZAP_CALLS_VIDEO_RECORDING_MAX_BYTES` | `1073741824` (1 GiB) | 1 MiB–16 GiB; limite da captura H.264 e, separadamente, do MP4 | | `ATENDROZAP_CALLS_VIDEO_RECORDING_QUEUE_BYTES` | `16777216` (16 MiB) | 1–256 MiB de quadros aguardando escrita por chamada | | `ATENDROZAP_CALLS_VIDEO_RECORDING_RENDER_TIMEOUT` | `30m` | 1 segundo–6 horas; inclui espera por áudio e por vaga de render | Os limites de render não alteram `callsMaxConcurrent`: uma chamada encerrada pode continuar gerando seu MP4 enquanto outra chamada usa a vaga de ligação. Há também limite de entradas na fila de captura. Fila ou disco indisponível produzem falha explícita na gravação; o gravador não bloqueia a mídia. Limites de fila não substituem limites de CPU e memória do processo. ## Captura, sincronização e retomada Durante a chamada, o motor observa H.264 já codificado, timestamps RTP, orientação e mudanças de câmera. A captura usa uma fila separada e realiza escrita fora dos goroutines de mídia. O relógio de cada fluxo é alinhado à linha do tempo da chamada, preservando intervalos sem câmera; não se concatena H.264 bruto supondo uma taxa fixa de quadros. O observador pertence à chamada e permanece durante a substituição do socket do navegador. Uma retomada da ponte não inicia uma segunda gravação nem zera a linha do tempo. O material pode começar apenas no primeiro keyframe decodificável. A composição exige SPS/PPS e frames válidos; captura sem keyframe pode terminar como falha. O MP4 só é anunciado como `ready` após inspeção das trilhas e decodificação integral sem erros. Uma saída truncada ou corrompida não é publicada como gravação pronta. Nesta versão, timestamps de apresentação que exigem reordenação de quadros H.264 geram `unsupported_video_reordering`; não são descartados silenciosamente nem recebem tempos inventados. A rotação padrão usa o contrato CVO atual: quartos de volta no sentido horário. O Atendro pode aplicar uma correção adicional ao desenhar a câmera do cliente; seu controller atualmente inicia com `invert=true` quando não há preferência salva. Para usar a mesma convenção na gravação, habilitar `ATENDROZAP_CALLS_VIDEO_RECORDING_INVERT_REMOTE_ORIENTATION=true` no worker. A composição passa a usar `(4-orientação)&3` apenas no vídeo remoto: troca 90°/270° e preserva 0°/180°. O lado local, metadados da API, captura e ponte ao vivo mantêm seus contratos. O ajuste ocorre durante o processamento offline e não acrescenta uma etapa ao caminho de mídia da chamada. Essa opção não acompanha cliques manuais de rotação ou preferências locais do navegador. Ela deve corresponder à convenção de exibição da integração. Os testes sintéticos cobrem as quatro orientações, mudanças durante a chamada e quadros sem metadado novo; Android/iPhone reais e sincronização em chamadas prolongadas ainda precisam de homologação. Os segmentos originais são removidos depois do processamento; MP4 já gerados não são corrigidos automaticamente, pois a orientação de cada trecho não fica registrada no arquivo composto. ## Estado e download `GET /call/{id}` e `GET /call/history` podem incluir `videoRecording`: ```json { "callId": "CHAMADA_DE_TESTE", "videoRecording": { "status": "ready", "contentType": "video/mp4", "bytes": 1048576, "durationSeconds": 120, "downloadPath": "/call/CHAMADA_DE_TESTE/recording/video", "expiresAt": "2026-10-19T15:02:00Z" } } ``` O exemplo é um recorte sintético. O objeto `recording` continua representando somente o WAV. `video: true` indica vídeo negociado na chamada; sozinho não garante que um MP4 tenha sido gravado. `videoRecording` ausente significa que não existe registro de captura de vídeo para aquela chamada, incluindo chamadas anteriores à ativação ou sem quadros capturados. | `videoRecording.status` | Significado para a interface | |---|---| | `recording` | Capturando ou finalizando o material da chamada | | `processing` | Compondo o MP4 ou esperando vaga de processamento | | `ready` | Player e download disponíveis | | `failed` | Vídeo indisponível; `failureReason` informa uma categoria técnica | | `expired` | Retenção encerrada; preservar o histórico | Não é obrigatório observar todos os estados intermediários. Uma falha pode ocorrer durante captura ou processamento. O primeiro resultado terminal é preservado; a expiração por retenção continua sendo aplicada a um arquivo pronto. [GET /call/{id}/recording/video](https://wpp.atendro.cloud/docs/api/download-call-video-recording.md) usa exclusivamente o header `token`. Não aceita token na query. O backend do Atendro deve autenticar seu usuário, verificar a empresa e a instância e fazer proxy do arquivo, preservando `Range` e `If-Range` e as respostas `206`/`416`. O navegador não recebe a credencial da instância. O arquivo usa `Content-Type: video/mp4` e `Cache-Control: private, no-store`. O endpoint devolve `404 recording_not_available` enquanto não estiver pronto, `410 recording_expired` após a retenção e `503` se o arquivo estiver indisponível ou pertencer a outro worker. O histórico continua consultável sem sessão WhatsApp conectada. O download precisa chegar ao worker dono do arquivo; não existe transferência automática de gravações entre workers. ## Eventos e integração no Atendro Assine `call`, valide a assinatura do envelope existente e identifique a chamada por `(serverId, instanceId, data.callId)`. Os novos subeventos são `video_recording_ready` e `video_recording_failed`: ```json { "EventType": "call", "event": "call", "eventId": "ID_DO_EVENTO", "instanceId": "ID_DA_INSTANCIA", "seq": 42, "data": { "callId": "CHAMADA_DE_TESTE", "event": "video_recording_ready", "videoRecording": { "status": "ready", "contentType": "video/mp4", "durationMs": 120000, "bytes": 1048576, "failureReason": "" }, "timestamp": 1789830120 } } ``` Esse também é um recorte sintético. Falhas usam o mesmo formato, com `event: video_recording_failed`, `status: failed` e uma categoria em `failureReason`. O evento não traz URL pública nem credencial. O webhook usa `durationMs`; o histórico usa `durationSeconds`. Esses eventos atualizam **apenas a gravação de vídeo**. Não são `ended`, não mudam o motivo de encerramento, não alteram vagas de simultaneidade e não substituem `recording` do áudio. Não exigem `data.status` da chamada. Podem ser processados antes ou depois de `ended`; preserve cada domínio separado. Deduplicar por `eventId` e usar `seq` do envelope, não `data.seq`. ### Prompt para implementar no atendro-ai ```text Implemente a gravação de videochamadas do provedor AtendroZAP no atendro-ai. Leia o contrato em /docs/guias/captura-video no servidor de documentação. 1. Preserve todo o fluxo atual de chamadas e gravação WAV. Consulte a capability opcional calls_video_recording para apresentar suporte à captura; gravações antigas prontas continuam acessíveis se a flag mudar. 2. Persista videoRecording separadamente de recording, por servidor, instância e callId. Aceite recording, processing, ready, failed e expired. Ausência do objeto não pode apagar dados conhecidos nem sugerir MP4 pronto. 3. No receptor assinado EventType=call, trate data.event video_recording_ready/video_recording_failed como atualização independente. Deduplicate por eventId. Esses eventos não são ended e nunca liberam vaga, encerram atendimento ou sobrescrevem endReason/endedBy. Podem chegar antes do ended; faça upsert sem inventar estado terminal da chamada. 4. Reconcilie com GET /call/{id} ou GET /call/history ao abrir o histórico e após reconexão/perda de eventos. Use consultas com intervalo limitado enquanto processing; não espere gerar o vídeo na requisição de hangup. 5. Quando ready, exiba player de vídeo e botão de download, mantendo o áudio. Mostre Preparando vídeo durante processing, falha e expiração sem player quebrado. Webhook usa durationMs; consultas usam durationSeconds. 6. Crie proxy no backend para GET /call/{id}/recording/video no servidor correto. Valide sessão, empresa, instância e acesso à chamada; envie token só no header do backend. Replique Range/If-Range, Content-Type, Content-Range, Accept-Ranges e status 206/416; use cache privado desabilitado. Não exponha tokens no HTML, URLs, logs ou resposta ao navegador. Restrinja downloadPath à API cadastrada; não aceite URLs arbitrárias recebidas no webhook. 7. Trate 404 enquanto indisponível, 410 expirado e 503 indisponibilidade do worker sem recriar a chamada. Falha do vídeo não invalida o WAV. 8. Teste ready/failed repetidos, chegada antes/depois de ended, processing, expiração, histórico sem vídeo, isolamento entre empresas, proxy Range e preservação da contagem de ligações simultâneas. Não ligar ou migrar números reais durante esses testes. ``` ## Retenção, falhas e limites de validação WAV e MP4 usam o mesmo UUID interno, diretório privado e arquivos 0600. Os prazos são independentes e contados do encerramento: vídeo expira em **7 dias** por padrão (`ATENDROZAP_CALLS_VIDEO_RECORDING_RETENTION_DAYS`), áudio em **30 dias** (`ATENDROZAP_CALLS_RECORDING_RETENTION_DAYS`). `GET /v1/capabilities` anuncia os dois valores separadamente em `calls_video_recording_retention_days` e `calls_recording_retention_days`. A configuração vale para as novas gravações; o histórico é preservado. A limpeza horária remove os arquivos vencidos e a API recusa o download assim que o prazo termina, mesmo antes da remoção física. Durante a composição coexistem WAV, segmentos temporários e MP4: 1 GiB por captura ou saída não significa limite total de 1 GiB no disco. Exemplos de falha: `video_queue_full`, `video_render_queue_full`, `video_too_large`, `video_keyframe_unavailable`, `video_audio_unavailable`, `video_render_timeout`, `video_render_failed` ou `unsupported_video_reordering`. Há limites adicionais para arquivos H.264: até 64 segmentos, 1.024 NALs por unidade de acesso, SPS/PPS até 65.535 bytes, vídeo 8-bit 4:2:0 com até 16 referências e pixels codificados até 1920×1088 (inclui o padding de 1080p e aceita retrato). Um orçamento agregado dos buffers de decodificação limita fontes simultâneas do render; excessos geram `video_segment_limit`, `video_decoder_limit` ou `invalid_video_frame`. Esses limites protegem recursos, sem prometer uma capacidade de chamadas simultâneas. Perfis aceitos: Baseline, Main, Extended e High (66/77/88/100). Cada SPS é validado, mesmo quando há vários na mesma unidade de acesso; SPS/PPS diferentes nessa unidade e extensões MVC/SVC não suportadas são recusados. Repetições idênticas são permitidas. O processo não registra saída bruta do FFmpeg, frames, áudio ou identidades no log normal. Após reiniciar o worker, registros `recording` ou `processing` viram `failed` com `worker_restarted`, com evento de falha e limpeza dos temporários. Não há retomada automática do render. Uma falha ou expiração do vídeo não apaga o áudio nem muda o motivo de término da ligação. Quando o prazo de encerramento do arquivo (`Archive.Wait`) se esgota, os processos de render e trabalhos esperando são cancelados; não continuam como processos soltos após o encerramento do serviço. A validação com celulares reais, chamadas prolongadas, orientação e capacidade de render simultâneo na VPS continua pendente. A opção permanece desligada por padrão; ativá-la não comprova esses critérios. As evidências da implementação e seus limites estão no relatório [Gravação de videochamadas — 19/09/2026](https://wpp.atendro.cloud/docs/guias/validacao-captura-video.md). --- Fonte: https://wpp.atendro.cloud/docs/guias/validacao-captura-video.md # Gravação de videochamadas — implementação e evidências de 19/09/2026 Esta mudança acrescenta captura opcional de vídeo e geração de MP4 após a chamada. O WAV e o contrato existente de chamadas permanecem independentes. Os ensaios iniciais usaram somente material sintético. A ativação autorizada na VPS 1 está registrada ao final deste documento. Android/iPhone, chamadas prolongadas e capacidade de produção continuam pendentes de homologação. ## Comportamento implementado Com `ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED=true`, vídeo e gravação de áudio habilitados e FFmpeg/ffprobe disponíveis, a chamada captura as unidades H.264 recebidas e as efetivamente enviadas ao relay. A imagem Docker padrão `api` e a configuração padrão continuam com a gravação de vídeo desligada. O observador pertence à chamada, preservando a captura durante ausência, substituição e liberação do attachment do navegador. Frames incompletos ou escritas parciais no relay não viram frames enviados na gravação. Timestamps RTP, orientação e eventos de câmera acompanham o H.264 em uma fila limitada, sem escrita em disco nos goroutines de mídia. Depois do encerramento, o arquivo final é composto em MP4 H.264 1280×360 a 25 fps, com atendente à esquerda, contato à direita e áudio AAC estéreo derivado do WAV. Câmera desligada deixa a área correspondente preta. O WAV continua disponível separadamente. A saída só pode ser anunciada como `ready` após inspeção e decode integral; a composição tem orçamento de fila, disco, decodificação e tempo. Reordenação de apresentação H.264 não suportada gera falha explícita. `call_video_recordings` mantém o estado independente: `recording`, `processing`, `ready`, `failed` ou `expired`. O primeiro resultado terminal e seu webhook são persistidos juntos. O WAV necessário a uma captura ou composição pendente é preservado fisicamente até esse trabalho terminar; a expiração continua impedindo seu download quando o prazo já venceu. Reinício marca captura/composição pendente como `failed/worker_restarted`, sem retomada automática do trabalho. O histórico e `GET /call/{id}` acrescentam `videoRecording` somente quando existe captura. O endpoint `GET /call/{id}/recording/video` exige header `token`, mantém isolamento de instância/worker, aceita `Range` e usa cache privado desabilitado. O console faz proxy por sessão autenticada e apresenta player, download e estados de processamento, falha e expiração. Os subeventos `video_recording_ready`/`video_recording_failed` usam o envelope existente `EventType=call`. Atualizam apenas o vídeo: não são `ended`, não mudam motivo de encerramento, não liberam vaga e não substituem o objeto `recording` do áudio. Guia e prompt de integração: [Gravação de videochamadas](https://wpp.atendro.cloud/docs/guias/captura-video.md). ## Evidências RED/GREEN Os exemplos abaixo usam dados sintéticos e um PostgreSQL descartável. Nenhum dado privado ou endereço de banco de produção foi utilizado. “RED” descreve execução que falhou antes do respectivo ajuste; “GREEN” é o resultado executado depois. Testes de recursos inteiramente novos também são listados como cobertura, sem inventar uma execução anterior. | Camada e teste | Falha observada antes do ajuste | Resultado após o ajuste | |---|---|---| | HTTP — `TestVideoRecordingRouteRequiresHeaderCredential` | Rota de MP4 devolvia 404, quando o teste exigia 401 para credencial apenas na query | Passou: autenticação exclusivamente pelo header | | Serviço — `TestVideoRecordingSurvivesAbsentReplacedAndReleasedBridges` | Nenhum dos quatro frames esperados era observado (`0`, esperado `4`) | Passou: captura mantém o mesmo ciclo durante ausência, substituição e liberação da ponte | | Motor — `TestVideoRecordingOnlyObservesCompletelySentAccessUnits` | Nenhuma das duas access units esperadas era observada (`0`, esperado `2`) | Passou: só captura unidades aceitas e completamente enviadas | | Motor — `TestVideoRecordingReceivesAuthenticatedFramesWithoutBrowser` | Timeout de um segundo aguardando captura sem navegador | Passou: recebe H.264 após autenticação e remontagem SRTP mesmo sem sink do navegador | | Motor — `TestVideoRecordingExcludesPartiallyWrittenFrames` | Em escrita curta, continuava até quatro escritas, quando deveria parar na segunda | Passou: interrompe envio e não captura unidade incompleta | | Retenção — `TestRecordingCleanupPinsWAVUntilItsVideoJobEnds` | Quatro subcasos `recording/processing → ready/failed` removiam WAV ainda necessário | Passaram: mantém o WAV pendente e libera limpeza após resultado final do vídeo | | Gravador — `TestNewSourceAfterCameraOffDoesNotReuseOldParameterSets` | Nova câmera reutilizava SPS/PPS de outro SSRC | Passou: nova fonte precisa de seus próprios parâmetros antes de decodificar | | Validação MP4 — `TestVideoValidationRejectsTruncatedMP4WithIntactMetadata` | Arquivo truncado com metadados intactos era aceito como válido | Passou: decode integral recusa a saída corrompida | | H.264 adversarial — `TestEveryParameterSetIsValidatedBeforeCapture` | Nove subcasos aceitavam SPS fora dos limites escondido antes de outro SPS, conjuntos distintos na mesma AU ou extensões de NAL não suportadas | Passaram: valida todos os SPS e rejeita conjuntos ambíguos e extensões não suportadas; repetição idêntica continua permitida | Os testes de observação foram escritos após adicionar as interfaces e executados antes de ligá-las ao serviço/motor; portanto, suas falhas acima foram comportamentais, não apenas erros de compilação. Os dois testes do gravador foram reproduzidos em RED por `go test -overlay`, removendo somente as respectivas correções sem alterar o workspace. Sem o overlay, os mesmos testes passaram. A evidência mostra o efeito desses ajustes específicos, sem afirmar que toda a gravação existia no commit anterior. ## Cobertura executada por camada - **Motor e serviço:** recepção SRTP fragmentada, SPS/PPS, wrap do timestamp `0xfffffff0`, orientação CVO `3`, câmera desligada, filtro até keyframe, callback removido, registro tardio após encerramento e engine sem suporte. `go test -race ./internal/calls` passou. No módulo do fork, `go test -race .` e `go vet .` passaram. Os novos testes `TestVideoRecording` foram repetidos vinte vezes com detector de races. - **Persistência:** `TestVideoRecordingLifecycleAndFirstTerminalEvent`, `TestVideoRecordingCleanupRecoveryAndRetentionAreIndependent` e `TestVideoRecordingResultAndOutboxRollbackTogether` passaram. Exercitam atraso de eventos, rollback de resultado/outbox, preservação do WAV, isolamento de worker, expiração e ausência de republicação após poda do evento. `go test -race ./internal/storage` passou no banco descartável, incluindo a proteção do WAV durante processamento e `TestRecordingCleanupReleasesVideoPinsWhenRecoveringStoppedWorker`. - **Captura e composição:** `ATENDROZAP_TEST_VIDEO_TOOLS_REQUIRED=1 go test -race ./internal/callrecording` passou usando FFmpeg/ffprobe reais e conteúdo sintético. As verificações incluem pixels nas rotações 0/90/180/270°, preto com câmera desligada, início remoto atrasado, mudança de resolução no mesmo SSRC, áudio AAC com energia nos dois canais e PTS `0`, `0.2`, `1.5` segundos preservados com wrap RTP. `TestWaitDeadlineCancelsAndReapsRunningTranscoder` verifica cancelamento e espera de um processo filho real, sem shell. A revisão adversarial final acrescentou nove subcasos RED/GREEN e foi seguida de nova execução completa do pacote com `-race`, ferramentas obrigatórias e `vet`, todas aprovadas. - **HTTP:** testes focados de histórico, WAV, MP4, autenticação, Range, estados indisponíveis e limites de instância/worker passaram com `-race`. `TestOpenAPI` passou depois de acrescentar a operação à enumeração manual do teste de roteamento. Essa enumeração faltante foi corrigida; a rota já respondia nos testes HTTP específicos. - **Console:** `TestConsoleCallHistoryAndRecording` passou com `-race`. Verifica player, download, processamento, proxy Range, exigência de sessão e ausência de tokens no HTML e nos headers de resposta ao navegador. - **Documentação:** `python3 scripts/sync_api_docs.py`, a verificação `--check` e os três testes de `test_build_docs.py` passaram; o catálogo agora contém 69 operações. ## Verificação global e imagem opcional Verificações globais concluídas nesta implementação: - `go test -race ./...` passou com PostgreSQL descartável e `ATENDROZAP_TEST_VIDEO_TOOLS_REQUIRED=1`, incluindo os testes reais de FFmpeg/ffprobe com material sintético. A execução global foi repetida e passou após a última revisão adversarial de todos os SPS/PPS. - `go vet ./...` e `go build ./cmd/atendrozap` passaram, também repetidos depois dessa revisão final. - Testes com detector de races de `github.com/purpshell/meowcaller/...` e o `vet` do fork passaram. - Revisão automatizada do inventário: quatro testes Python e verificação de 60 dependências passaram. Os dezoito testes Node também passaram. - `python3 scripts/check_video_tools.py` passou: revisões e checksums das fontes nativas, avisos de licença e configuração revisada do FFmpeg foram conferidos. Essa verificação não substitui a execução da imagem pronta. A primeira execução global expôs uma espera incompleta no teste de sessão `TestServerErrorReceiptFailsSentMessage`: o status persistido já podia ser `failed` antes de o evento assíncrono aparecer no outbox, causando `unexpected events: []` na fixture em memória. O teste passou a aguardar as duas condições, sem mudar o código de produção. A execução focada repetida cem vezes passou, seguida de nova execução global verde. A imagem padrão `api` foi construída com sucesso e `scripts/test_engine_offline.sh` passou. O target `video-test`, derivado de `api-video` e usando exatamente seus executáveis de FFmpeg 8.1.2/libx264 fixados, também foi construído e executado com sucesso: ```sh docker build --target video-test -t atendrozap-video-test:local . docker run --rm --network none --read-only \ --tmpfs /tmp:rw,nosuid,nodev,size=512m,mode=1777 \ --cpus 2 --memory 1g atendrozap-video-test:local ``` Passaram vinte testes principais, além dos subcasos, incluindo composição MP4, decode integral, pixels, orientação, mudança de fonte e energia dos dois canais de áudio. A execução foi local em `linux/arm64`, com rede desligada e sistema de arquivos somente leitura, exceto `/tmp` limitado a 512 MiB. Os limites de duas CPUs e 1 GiB de memória descrevem o ensaio; não medem a capacidade de chamadas de produção. Na primeira execução desse container, a extração de áudio no helper de teste solicitava o muxer bruto `s16le`, ausente do runtime mínimo. A composição MP4/AAC e a validação do arquivo já funcionavam. O helper passou a extrair WAV e ler seu chunk PCM, preservando as verificações de amostras e energia dos dois canais. Nenhum codec de produção precisou ser acrescentado. Após esse ajuste exclusivamente de teste, o container passou e `go test -race ./...` com banco descartável/ferramentas obrigatórias, `go vet ./...` e `go build ./cmd/atendrozap` foram repetidos e passaram. O ensaio de CI em `linux/amd64` ocorrerá após o push; não é declarado verde neste relatório. Revisão e inventário das ferramentas nativas estão em `docs/LICENSE_REVIEW.md` e `third_party/video-tools/manifest.json`. ## Limites e validação física pendente Padrões: um render ativo e oito esperando por worker, fila de captura de 16 MiB por chamada, limite de 1 GiB para captura e, separadamente, para MP4, timeout de 30 minutos incluindo espera. Segmentos temporários, WAV e MP4 coexistem: esses limites não representam uma cota total de disco. O guia documenta limites de segmentos, geometria, referências e NALs. A composição usa CPU adicional e a fila reside no processo da API. Ainda não há dado para prometer quantidade de chamadas ou renders simultâneos numa VPS específica. A retenção deve considerar mídia, temporários e espaço livre; o banco guarda metadados, não os arquivos. A rotação segue a interpretação CVO atual. Os testes sintéticos verificam a aplicação do valor, não comprovam que Android/iPhone emitam a orientação esperada. Permanecem pendentes: gravação de voz/vídeo prolongada com Android/iPhone, comparação visual e A/V nos dois sentidos, câmera desligada/religada, troca de aba, Wi-Fi interrompido por dez segundos e medição de CPU/memória/disco sob carga representativa. A estabilidade anterior de uma chamada real não constitui homologação desta gravação. Preparar uma imagem pelo fluxo do repositório não conclui essas etapas e não implica ativação da opção. A publicação autorizada abaixo não substitui a homologação física pendente. ## Ativação autorizada na VPS 1 — 19/09/2026 Às 22:34:50 BRT (`2026-09-20T01:34:50Z`), API e console passaram da revisão `0df3b65` para `4f7e63f`, com a API construída pelo target `api-video`. FFmpeg e ffprobe 8.1.2 foram conferidos dentro do container em execução. Configuração global do worker: ```sh ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED=true ATENDROZAP_CALLS_VIDEO_RECORDING_RETENTION_DAYS=7 ATENDROZAP_CALLS_RECORDING_RETENTION_DAYS=30 ATENDROZAP_CALLS_VIDEO_RECORDING_MAX_CONCURRENT=1 ``` Aplica-se às próximas videochamadas das instâncias `calls` existentes e futuras. O MP4 expira sete dias depois do encerramento, sem reduzir o prazo do WAV ou excluir o histórico. A API bloqueia o download na expiração; a limpeza horária remove os arquivos vencidos. Não há geração retroativa. Antes do reinício foi confirmada a ausência de chamadas em andamento. Banco e configuração anteriores ficaram em backup privado na própria VPS: `/opt/atendrozap/pre-deploy/video-recording-4f7e63f-20260920T013431Z/`. Somente API e console foram recriados. A migração 18 foi aplicada no startup. Vinte e dois testes principais do gravador, mais subcasos, passaram usando os codecs exatos da imagem publicada em `linux/amd64`, rede desativada, filesystem somente leitura, `/tmp` de 512 MiB, uma CPU e 1 GiB de memória. O binário de testes foi compilado com Go 1.26.4 para essa arquitetura. O material foi sintético; nenhum número foi pareado e nenhuma chamada real foi iniciada para a validação. Após a ativação: readiness 200; `capabilities.calls_video_recording=true`; retenções anunciadas 7/30; OpenAPI público com o prazo independente de vídeo. As duas instâncias de chamadas e a instância de mensagens anteriormente conectadas voltaram a conectadas; a outra instância permaneceu desconectada. O Atendro já usa `videoRecording.expiresAt` para mostrar a disponibilidade. O canal SSH original de build ficou sem retornar, apesar de a etapa remota ter terminado: as três imagens, binários ops, revisão e remoção do bundle foram conferidos por outra conexão, seguidos do teste isolado acima. O `ship.sh` agora usa keepalive a cada 15 segundos para que builds longos e silenciosos mantenham a conexão e falhas de transporte sejam detectadas. ## Correção publicada: referências H.264 do navegador — 20/09/2026 Publicação autorizada da revisão `10346148924f058edeb5ea445621ea0ce6d704ed` (`1034614`) na VPS 1, às `2026-09-20T02:47Z`. API e console substituíram `4f7e63f`; a API foi construída com o target `api-video`, mantendo FFmpeg/ffprobe 8.1.2. O limite de referências do SPS passou de quatro para 16, preservando os limites de geometria e orçamento do decoder. O encoder nativo do Chrome produzia SPS válidos com seis/sete referências, recusados antes do MP4. Detalhes e regressões em `docs/DECISIONS.md` e `internal/callrecording/testdata/browser-h264/README.md`. Os 23 testes principais do pacote de gravação, mais subcasos, passaram na imagem Linux/amd64 preparada na VPS, com rede desativada, filesystem somente leitura, `/tmp` de 512 MiB, uma CPU e 1 GiB de memória. As fixtures do navegador produziram MP4 nos dois lados e passaram pela decodificação estrita do FFmpeg. Nenhuma chamada real foi iniciada. Antes da ativação havia zero chamadas abertas, zero capturas de áudio e zero gravações de vídeo em captura/processamento. Backup privado do banco, configuração e informações de retorno: `/opt/atendrozap/pre-deploy/h264-references-1034614-20260920T024713Z/`. Banco, proxy e serviço de backups não foram reiniciados. Após a publicação, o status operacional confirmou a revisão completa, readiness 200 e banco disponível. As duas sessões de chamadas e a sessão de mensagens anteriores voltaram a conectadas; a quarta instância continuou desconectada. Capabilities manteve captura de vídeo habilitada, vídeo por sete dias e áudio por 30 dias. A documentação pública passou a anunciar o limite 16. O status agregado `degraded` já existia antes da publicação; as pendências de webhooks não foram alteradas por esta correção. A correção aplica-se às próximas capturas. Registros de vídeo já terminados com falha não são reprocessados, pois seus temporários foram removidos. A origem exata da falha histórica continua sem comprovação pelo log genérico; a incompatibilidade com o SPS do navegador foi reproduzida e corrigida. ## Compatibilidade de orientação do cliente publicada — 20/09/2026 Às `2026-09-20T15:20:59Z` (12:20:59 BRT), a revisão `92437cd` substituiu `1034614` na API e no console da VPS 1. A imagem usa o target `api-video`. Foi habilitada `ATENDROZAP_CALLS_VIDEO_RECORDING_INVERT_REMOTE_ORIENTATION=true` para alinhar os novos MP4 ao padrão `invert=true` do controller do Atendro. A opção troca 90°/270° apenas no lado remoto durante a composição offline; o contrato RTP/API e a orientação do atendente permanecem independentes. O relato visual mostrava o cliente de cabeça para baixo. A diferença entre as duas fórmulas foi reproduzida com um retrato sintético de topo vermelho e base azul; a regressão confere as quatro posições no MP4, alterações de orientação/resolução na mesma chamada e quadros sem novo metadado. Ela também confere que o lado local mantém a própria rotação. O print não registra os valores CVO originais, e preferências manuais do navegador continuam fora do contrato de gravação. Os 24 testes principais do pacote, além dos subcasos, passaram com os codecs da imagem Linux/amd64 pronta, uma CPU, 1 GiB, rede desativada e filesystem somente leitura fora do `/tmp` sintético. A validação local completa passou com `go test -race ./...`, PostgreSQL 17 descartável, FFmpeg/ffprobe obrigatórios, `go vet ./...` e `go build ./cmd/atendrozap`. Nenhuma chamada real foi iniciada pelo agente. Havia zero chamadas, capturas de áudio ou vídeos em processamento antes do reinício. Backup privado do banco e da configuração: `/opt/atendrozap/pre-deploy/video-orientation-92437cd-20260920T152040Z/`. Após a atualização: readiness 200, flag de compatibilidade confirmada no container, gravação habilitada e retenções 7/30. As duas sessões de chamadas e a sessão de mensagens voltaram a conectadas; as duas outras instâncias continuaram desconectadas. Nenhum erro JSON de startup foi observado. Os dois vídeos já disponíveis não foram regravados. Os temporários e a linha do tempo de orientação original são descartados após compor o MP4, portanto não se aplica uma rotação fixa em lote que possa inverter trechos corretos. A confirmação visual no aparelho real depende de nova chamada. --- Fonte: https://wpp.atendro.cloud/docs/guias/atendro-ligacoes-simultaneas.md # Prompt para o Atendro: gestão de ligações simultâneas Este texto pode ser enviado ao agente que trabalha no repositório `atendro-ai`. O contrato abaixo foi preparado no AtendroZAP, mas ainda não foi publicado na VPS 1. A implementação no consumidor pode avançar com fixtures; o teste real depende de `capabilities.calls_settings_webhook=true` no servidor escolhido. Nenhuma mudança de instâncias, webhooks de produção ou limite em produção é autorizada por este documento. ## Texto para implementar no atendro-ai Implemente a sincronização do limite de ligações simultâneas por instância AtendroZAP e a gestão das vagas no backend e na interface do Atendro. Inspecione primeiro os módulos atuais de provedor, conexões, webhooks, chamadas, ponte de mídia e permissões. Reutilize os mecanismos de inbox, assinatura e reconexão já existentes; preserve os demais provedores e os contratos em uso. O usuário precisa conseguir configurar uma instância para duas ligações, ver o limite atualizado quando ele mudar no painel do AtendroZAP e distribuir as duas vagas entre atendentes. Voz e vídeo compartilham o limite. Isso é uma configuração de admissão do provedor: mais de uma ligação simultânea no mesmo número ainda não foi homologada em aparelhos reais. Não apresente o número configurado como capacidade física comprovada ou como duas linhas WhatsApp independentes. ### Contrato do provedor Use a URL do servidor vinculado à conexão, nunca uma VPS fixa no código. Credenciais ficam no backend. As rotas de instância recebem header `token`; rotas administrativas usam `admintoken`, acessível somente a administradores autorizados. Não exponha esses segredos em bundle, navegador, URL, log ou erro. - `GET /v1/capabilities` anuncia `capabilities.calls`, `capabilities.calls_per_instance_limit` e `capabilities.calls_settings_webhook`; `calls_max_concurrent_range` contém `{min: 1, max: 8}`. `calls_max_concurrent` é o padrão do servidor, não o limite salvo da instância. Para vídeo, exija também `capabilities.calls_video`. - `GET /instance/status` retorna `instance.kind`, `instance.callsMaxConcurrent` e `instance.callsConfigVersion` para `kind: calls`. A versão é um inteiro de 64 bits, inclusive `0`; não confunda zero com ausência. O campo de data HTTP existente é `instance.updated`, não `updatedAt`. - `POST /instance/call-settings`, com header `token`, recebe `{"callsMaxConcurrent": 2}`. A variante administrativa é `POST /v1/instances/{id}/call-settings`. A resposta contém o objeto `instance` com limite e versão canônicos. Cada POST aceito incrementa a versão, mesmo repetindo o mesmo valor. Não existe comparação condicional de versão nesta rota: escritas concorrentes vencem pela última versão salva. - O limite de 1 a 8 conta chamadas recebidas e realizadas, de voz ou vídeo, em `ringing`, `connecting` e `active`, além das discagens que o serviço já reservou. Uma chamada de vídeo ocupa uma vaga, mesmo usando dois sockets. - Reduzir o limite preserva chamadas vivas. Se houver duas e o limite cair para um, nenhuma é encerrada; novas chamadas só entram quando o total ficar abaixo de um. Sem vaga, uma discagem recebe `409 line_busy`. A API não cria uma fila de discagem automática; não repita chamadas em loop ao liberar vaga. - A alteração pode ser salva desconectada. O worker local aplica sem reconectar; outro worker aplica na próxima renovação de lease e antes de cada nova discagem de saída. Uma confirmação de configuração não comprova que uma ligação de teste foi realizada. - `GET /call/active` retorna `{calls: [...]}` para a instância. A lista não mostra reservas de discagem que ainda não receberam `callId`. `GET /call/{id}` e `GET /call/history` permitem reconciliar chamadas e fins. ### Inscrição e processamento dos webhooks No receptor HMAC existente, acrescente `call_settings` à lista de eventos reconhecidos. Uma instância `calls` deve assinar `call`, `call_settings` e `connection`; `limits` é opcional conforme a integração. Ela não publica mensagens, recibos, edições, grupos ou `undecryptable`. `call_settings` não é um subevento `call` e não contém `callId`: nunca crie uma chamada a partir dele. Ao preparar a inscrição, consulte `GET /webhook` e mescle os nomes necessários com os eventos já salvos. Preserve URL, segredo, filtros, estado habilitado e demais opções. Para a mesma URL, omitir `secret` preserva o segredo existente; não envie segredo vazio ou inventado. O GET não devolve o segredo. Se o cadastro for herdado do global, preserve a herança: alteração global exige permissão administrativa e avaliação das demais instâncias. Não transforme silenciosamente um webhook herdado em exceção própria nem substitua configurações de clientes. Se a inscrição estiver desabilitada ou ausente, siga o fluxo autorizado de provisionamento do produto, sem ativá-la como efeito colateral de mudar o limite. O AtendroZAP grava a configuração e o evento atomicamente. Inscrição ausente não impede salvar o limite, mas não há entrega sem assinar `call_settings`. Registrar o webhook não produz snapshot inicial. Depois de preparar a inscrição, leia o status para obter o estado atual e resolver a corrida com eventos recebidos durante essa leitura. Exemplo sintético parcial do novo evento, no envelope assinado atual: ```json { "EventType": "call_settings", "event": "call_settings", "eventId": "00000000-0000-4000-8000-000000000002", "instanceId": "00000000-0000-4000-8000-000000000001", "seq": 42, "data": { "kind": "calls", "callsMaxConcurrent": 2, "callsConfigVersion": 3, "updatedAt": "2026-09-19T15:00:00.123456789Z" } } ``` `updatedAt` é UTC em RFC3339Nano. O evento `connection` mantém seu formato e acrescenta `instance.kind: calls`; quando a leitura do banco é possível, também traz `instance.callsMaxConcurrent` e `instance.callsConfigVersion`. Esses campos opcionais em `connection` não ficam em `data`. Se ausentes, preserve o limite conhecido e reconcilie pelo status. Valide a assinatura HMAC-SHA256 sobre `timestamp + "." + corpo bruto`, a janela de timestamp e o vínculo servidor/instância/empresa antes de aceitar. Deduplique por identidade do servidor, `instanceId` e `eventId`; confirme 2xx somente após persistência durável. Retries preservam o `eventId`. Use `seq` do envelope para ordenar eventos; a versão de configuração é um contador separado. Persista limite e versão juntos. Aplique snapshots de resposta POST, GET, `call_settings` e `connection` pela mesma regra transacional: versão maior substitui, menor é ignorada, igual é idempotente. Uma mesma versão com valor divergente exige reconciliação, sem escolher pelo horário. Campos ausentes em versões antigas da API não equivalem a zero. Não use `updatedAt`, horário de chegada ou ordem das promessas HTTP para sobrescrever uma versão maior. Use representação que preserve inteiros de 64 bits nos componentes que precisarem deles; não faça comparação textual lexicográfica de versões. Após um POST, aplique a resposta canônica e reconcilie com GET. Se houver timeout ou perda de resposta, leia o status antes de repetir a alteração. Notifique as sessões do Atendro vinculadas à conexão após o commit, usando o canal de atualização que o produto já possui. Uma mudança feita fora do Atendro deve aparecer sem exigir novo pareamento ou recarregar a página. ### Gestão de vagas e operação pelos atendentes Mantenha a identidade da chamada como `(servidor, instanceId, callId)`; no escopo de um servidor, `(instanceId, callId)`. Um mesmo `callId` pode existir em duas instâncias quando ambas as pontas estão pareadas. Conte recebidas e realizadas, incluindo as que estão tocando. `answered` confirma atendimento em `connecting`; não espere `active` para reservar a vaga. Eventos `video` atualizam a mesma chamada e não consomem vaga adicional. Eventos repetidos ou fora de ordem não podem incrementar o contador de novo. `ended` libera uma vez e conserva o primeiro motivo/origem de encerramento; eventos antigos não reabrem a chamada. `recording_ready` e `recording_failed` só atualizam a gravação: não ocupam nem liberam uma vaga por conta própria. Evite um contador isolado de incrementos/decrementos; derive a ocupação de registros idempotentes de chamadas e reservas válidas. Antes de discar, faça reserva atômica da vaga no backend compartilhado do Atendro. Duas abas, atendentes ou réplicas podem discar ao mesmo tempo; desabilitar o botão no navegador não impede essa disputa. Conte reservas pendentes ainda sem `callId`, atribua identidade à tentativa e reutilize sua `Idempotency-Key` ao repetir a mesma discagem. Ao receber `callId`, converta a reserva em chamada sem contar duas vezes. Correlacione também quando o webhook chegar antes da resposta HTTP. Em falha definitiva ou `line_busy`, libere a reserva e reconcilie. Em resultado ambíguo, preserve-a de forma conservadora até resolver pelo mecanismo de idempotência e consulta do provedor; o GET de chamadas ativas não mostra reservas internas ainda sem ID. Não libere uma reserva apenas porque o navegador fechou ou uma resposta demorou. O provedor continua sendo a autoridade final de admissão: ligações recebidas podem ocupar uma vaga entre a checagem local e a discagem. Trate `409 line_busy` como condição operacional, atualize a ocupação e informe o atendente. Quando sem vaga, mostre o limite e as chamadas que a ocupam. Se o Atendro implementar espera, ela deve ser explícita e cancelável; não iniciar uma ligação futura sem a intenção do atendente ainda válida. Mostre, por conexão, limite configurado, chamadas vivas e tentativas pendentes. Disponibilidade é no mínimo zero; ao reduzir abaixo da ocupação, mostre a situação excedente sem desligar ninguém. A permissão de alterar o limite deve ser validada no backend, respeitar empresa e conexão e aceitar somente inteiros de 1 a 8. Estado desconectado bloqueia discagem, mas permite configurar o limite. Cada chamada precisa de proprietário/atendente e ponte de mídia próprios, identificados por instância e `callId`. Não use um único socket ou estado global por número/conexão. Dois atendentes não devem tomar a mesma chamada por acidente; o AtendroZAP aceita substituir um attachment, o que não é um bloqueio de propriedade de atendimento. Preserve as regras existentes de transferência. Microfone, reprodução e câmera devem ser associados à chamada atendida e ao usuário correto, sem misturar áudio entre chamadas. Mantenha a janela existente de reconexão da ponte: o AtendroZAP tolera 30 s sem socket de áudio/vídeo e o Atendro retém a sessão por 25 s. Desligamento voluntário usa `/call/hangup`; câmera desligada usa `/call/video` com `action: stop` e não libera a vaga. Uma queda de socket não é, sozinha, prova de `ended`. Ao abrir/reconectar a tela, ao reconectar o receptor e após erros de admissão, reconcilie configuração e chamadas com `GET /instance/status` e `GET /call/active`. Consulte o estado/histórico das chamadas locais que desapareceram da lista para obter o encerramento real. Proteja essa leitura contra eventos mais novos recebidos em paralelo; preserve as reservas ainda em resolução. Faça reconciliação periódica moderada como recuperação de eventos perdidos, sem depender de polling rápido para a operação normal. ### Testes e entrega Cubra com testes significativos, usando mocks/fixtures e banco descartável: 1. Limite alterado no AtendroZAP de 1 para 2 chega via webhook e atualiza persistência, interface e admissão sem reconectar a instância. 2. Configuração via Atendro usa credencial no backend, valida permissões, aceita 1 a 8 e rejeita valores inválidos; falha remota não aparenta sucesso. 3. Snapshot inicial, versão zero, HTTP antigo após webhook novo, eventos duplicados/fora de ordem, assinatura inválida e instância de outra empresa. 4. Duas reservas concorrentes com limite 1 admitem apenas uma; com limite 2 admitem duas e recusam a terceira, inclusive entre réplicas do backend. 5. Webhook chega antes da resposta de discagem; timeout ambíguo não duplica chamada nem libera a vaga prematuramente; `409 line_busy` reconcilia. 6. Chamada recebida disputa vaga com saída; vídeo e gravação não contam duas vezes; duas instâncias com o mesmo `callId` continuam separadas. 7. Redução de 2 para 1 com duas chamadas vivas preserva ambas e bloqueia novas. 8. Reload, queda do receptor, reconexão dos sockets e atualização concorrente preservam propriedade, contagem e primeiro encerramento. 9. Inscrição mescla eventos sem perder URL, segredo, filtros ou herança; instância de mensagens e demais provedores conservam o comportamento atual. Entregue mudanças, migrações necessárias, testes executados e instruções de ativação. Não publique nem altere instâncias, limites, webhooks ou credenciais de produção apenas para executar testes. Separe o resultado dos testes locais da homologação pendente de duas chamadas WhatsApp reais no mesmo número. Referências: [Chamadas](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz.md), [Eventos](https://wpp.atendro.cloud/docs/guias/eventos.md), [Receptor HMAC](https://wpp.atendro.cloud/docs/guias/receber-eventos.md) e [OpenAPI](https://wpp.atendro.cloud/openapi.json). --- Fonte: https://wpp.atendro.cloud/docs/guias/compatibilidade.md # Compatibilidade Uazapi — contrato alvo e estado de implementação Auditado no código de `atendro-ai` em 15/09/2026 e revisto em 16/09/2026 para o ciclo de vida. A nomenclatura de prioridade define a ordem de desenvolvimento; contas que usam uma função só podem migrar quando ela estiver homologada. ## Implementado (ciclo de vida, mensagens, mídia, ações, menus e webhooks; homologado com número de laboratório em 16–17/09/2026) | Rota | Resposta entregue | |---|---| | `POST /instance/init` | `{response, connected:false, loggedIn:false, instance:{id, token, name, systemName, status, ...}}`; o `token` só aparece aqui | | `GET /instance/all` | Array de instâncias com `id, name, systemName, status, owner, profileName, lastDisconnectReason, worker`; sem `token` e sem `qrcode` | | `POST /instance/connect` | `{connected, loggedIn, jid, instance:{status, qrcode (data URI PNG), paircode, owner, profileName, lastDisconnectReason}}`. Espera até 5 s por QR ou login antes de responder; o consumidor pode continuar em `GET /instance/status` | | `GET /instance/status` | Mesma forma do connect, sem efeitos colaterais; `status` em `connected|connecting|disconnected` | | `POST /instance/disconnect` | Logout: `{response, unlinked, instance}`; a credencial é apagada mesmo sem confirmação remota | | `POST /instance/restart` | Reabre preservando credencial: `{response, connected, loggedIn, jid, instance}` | | `DELETE /instance` | `{response:"Instance deleted"}`; síncrono, sem estado `deleting` | | `POST /send/text` | `{number, text, replyid?, delay?, linkPreview?}` → `{success:true, messageid, id, timestamp}` com o ID real do WhatsApp. `number` aceita dígitos ou chat (`@s.whatsapp.net`, `@g.us`, `@lid`). `replyid` cita a mensagem guardada (`422 reply_not_found`); `delay` em ms (string ou número, teto 15 s). Erros: sem sessão logada `409 whatsapp_disconnected` ("WhatsApp disconnected … not connected", reconhecido pelo classificador); número sem conta `422` ("not on WhatsApp"); recusa do servidor `422 send_failed` com `provider_code`; bloqueio de prospecção (código 463) `500` com `error_key: WHATSAPP_REACHOUT_TIMELOCK`, `provider_code: 463` e `details.reachout_timelock.until` — a forma que o consumidor procura para a mensagem amigável; fila ocupada `429 too_many_requests`; falha transitória antes do envio (nada enviado) `429 retry_later`; frame enviado sem ack ou socket perdido após o envio `504 send_ambiguous` com `messageid`. 504 e o 500 do 463 são os únicos 5xx; 4xx são falhas definitivas ou retentáveis (429) | | `POST /instance/init` e `POST /send/text` com `Idempotency-Key` | Mesma chave e corpo → mesma resposta com `Idempotency-Replayed: true` (24 h para envios; 15 min para `init`, cuja resposta contém o token); corpo diferente → `422 idempotency_mismatch`; em andamento → `409 idempotency_in_progress`; tentativa abandonada há mais de 2 min é retomada. Respostas transitórias (409, 429, 5xx exceto 504) não são guardadas: a chave fica livre para a repetição | | `GET/POST/DELETE /v1/instances/{id}[/connect|disconnect|restart]` | Rotas administrativas por id (`admintoken`), para o painel agir sem o token da instância que `GET /instance/all` não devolve | | `GET /message/status/{id}` | `{id, status, failure, fromMe, timestamp, deliveredAt, readAt, playedAt}`; `404 message_not_found` | | `POST /send/media` | `{number, type, file, text?, docName?, replyid?, delay?}` → `{success, messageid, id, timestamp, mimetype, ptt}`. `file`: data URI (o que o consumidor envia até 5 MiB), base64 ou URL de host da allowlist — **o consumidor cai para URL acima de 5 MiB, então `ATENDROZAP_MEDIA_URL_ALLOWLIST` precisa conter o host do storage do Atendro** (https, sem redirects, sem redes privadas, até 32 MiB). O mime declarado é conciliado com os bytes (o consumidor embrulha base64 cru como `image/jpeg`); `docName` é reduzido ao nome-base. `ptt` só vira nota de voz com `audio/ogg`; outros áudios saem como arquivo, com `note`. Erros de política de URL `400`; arquivo grande `413`; fetch transitório `429 url_fetch_failed`; upload falho antes do envio `429 retry_later`; tipo × mime incompatíveis `422 invalid_media` | | `POST /send/contact`, `POST /send/location` | `{number, fullName, phoneNumber, organization?, replyid?, delay?}` e `{number, latitude, longitude, name?, address?, replyid?, delay?}` → `{success, messageid, id, timestamp}` | | `POST /message/download` | `{id}` (aceita `owner:id`) → `{fileURL, url, mimetype, mimeType, fileName, size, expiresAt, messageid}`; `mimetype` sem parâmetros (`audio/ogg`, não `audio/ogg; codecs=opus`), inferido dos bytes quando ausente. O link é um GET público assinado válido pela retenção (48 h), com `Content-Length`; só tipos passivos (imagem, áudio, vídeo, PDF) são servidos `inline`; markup/script viram `application/octet-stream` em `attachment`, com CSP `sandbox`. Mídia expirada no servidor → `409 media_reupload_pending` (não 404/503, que o consumidor trata como irrecuperável) com pedido de reenvio ao celular (um a cada 5 min); celular sem o arquivo → `404 media_unavailable` (definitivo); acima de 64 MiB → `413 media_too_large`; mensagem desconhecida `404`; sem mídia `422 not_media`; falha `502 media_failed`. Até 4 downloads simultâneos por worker | | `POST /message/markread` | `{id: [..] ou "id"}` (até 1000) → `{success, marked, count}`; um recibo por (chat, remetente); ids desconhecidos ou próprios são ignorados | | `POST /chat/read` | `{number, read:true}` → `{success, marked}`: recibo para as recebidas ainda não lidas do chat (até 100) | | `POST /chat/check` | `{numbers:[..]}` ou `{number}` → array `[{query, exists, numberExists, jid, data:{exists, jid}}]` (todas as formas que o consumidor lê) | | `POST /chat/details` | `{number}` → `{jid, exists, name, pushName, displayName, verifiedName, isBusiness, profilePicUrl, profilePictureUrl, imagePreview, pictureId, imageState}`; foto com cache de 24 h e revalidação por id; número sem conta `404` | | `POST /send/menu` | `{number, type: button\|list\|poll, text, choices[], footerText?, listButton?, selectableCount?, replyid?, delay?, renderMode?}` → `{success, messageid, messageId, id, timestamp, type, renderMode, rendered}`. `choices` na gramática legada: `"[Seção]"` abre seção (listas), `"label\|id\|descrição"`, `"label\nid"` ou `"label"` (id = label), `"label\|url:"`/`"label\|https://…"` e `"label\|copy:"` (só em botões); `call:` responde `400`. Limites da plataforma: 3 botões (4 a 10 botões só de resposta — como o menu de avaliação do consumidor — saem como lista, `rendered: list`), 10 linhas, 2–12 opções de enquete; labels cortados no limite do que é renderizado (20 botão, 24 linha, 100 enquete; inteiros no modo texto); ids de resposta até 256 bytes, URLs até 2048; `carousel` responde `400`. `renderMode`: `auto` (padrão: tenta a forma nativa — `InteractiveMessage` com native flow, aceita pelo servidor e renderizada no aparelho de laboratório em 17/09/2026; os protos legados `ButtonsMessage`/`ListMessage` são recusados com 405 — uma recusa é lembrada por 6 h na sessão e o menu cai para enquete, ou para texto quando há opção `url:`/`copy:`), `native` (só a forma nativa; a recusa vira `422 send_failed` com `provider_code: 405`), `poll` (as opções viram enquete de escolha única e o voto volta com o `id` original; labels duplicados são recusados) ou `text` (lista numerada em texto; a resposta chega como texto e o consumidor casa por label). `rendered` diz o que saiu (`button`, `list`, `poll`, `text`). `selectableCount` só vale para `type: poll` (padrão 1). As opções ficam guardadas na mensagem (`choices`) em todos os modos | | `POST /message/react` | `{number?, text, id}` → `{success, messageid, messageId, id, timestamp, reaction:{id, emoji, status: sent\|removed}}`; `text` vazio remove; `number` é ignorado (o chat é o da mensagem guardada — o consumidor deriva `number` do contato, errado em grupos); `id` aceita `owner:id`. Reação própria fica em `reactions` da mensagem. Mensagem desconhecida `404`; apagada `422 message_revoked`; emoji inválido `400` | | `POST /message/delete` | `{id}` → `{success, id, messageid, status: "Deleted", timestamp (RFC 3339), recorded}`; repetido → `200` com `alreadyDeleted`. Só mensagens próprias (`422 cannot_delete` para as recebidas: apagar a de um participante exige ser admin do grupo, que o motor ainda não verifica). Apaga corpo, conteúdo bruto, opções, reações e mídia retida; gera evento `messages_update`. `recorded:false` quando o WhatsApp aceitou mas o store não gravou | | `POST`/`PUT /message/edit` | `{id\|messageId, text}` (o consumidor vivo manda `POST {id, text}`; o hook V2 `PUT {number, messageId, text}`) → `{success, id: owner:id, messageid, messageId, editId, content, messageType, messageTimestamp (ms), timestamp, status, owner, editCount, recorded}`. Só mensagens próprias de texto ou legenda (imagem, vídeo, documento com conteúdo guardado) até 20 min (`422 edit_window_expired`, `not_own_message`, `not_editable`, `message_revoked`). O texto editado vai sem a prévia de link antiga | | `POST /message/forward` | `{number, id\|messageId, delay?}` → resposta de envio. Rota própria (a UAZAPI não tem forward por id; o consumidor reenvia). Texto, contato e localização (inclusive localização ao vivo, como pino) são copiados do conteúdo guardado; mídia é baixada (store ou WhatsApp) e reenviada — `409 media_reupload_pending`, `404 media_unavailable`, `413`, falha transitória `429 retry_later`; visualização única, contato/localização sem conteúdo guardado e outros tipos `422 not_forwardable`; apagada `422 message_revoked`. Nada é gravado antes de o original ser aceito. A cópia carrega a marca "Encaminhada" e `forwardedFrom` | | `forward: true` em `/send/text`, `/send/media`, `/send/contact`, `/send/location` | Marca a mensagem como encaminhada (como na spec legada) | | `POST /message/find` | `{chatid?, id?, limit? (padrão 100, máx. 200), offset?}` → `{messages[], returnedMessages, limit, offset, nextOffset?, hasMore}`, mais recentes primeiro. Cada item no formato legado `Message`: `id` (`owner:messageid`), `messageid`, `chatid`, `sender`, `sender_pn`, `senderName`/`pushName`, `isGroup`, `fromMe`, `wasSentByApi`, `messageType` (`Conversation`, `ExtendedTextMessage`, `ImageMessage`, …, `ButtonsResponseMessage`), `type`, `messageTimestamp` (ms), `timestamp` (s), `status` (`Pending\|Sent\|Delivered\|Read\|Played\|Failed\|Received\|Deleted`), `text` (o label escolhido, em respostas interativas), `quoted`, `edited`, `content{key, text\|caption, selectedButtonId…}`, `buttonOrListid`, `reactions`, `choices`, `fileURL`/`mediaUrl` (só quando a mídia está retida; consulta só de metadados). Só mensagens desde o pareamento (histórico é etapa 5b) | | `GET /message/status/{id}` | Inclui `revokedAt`, `editedAt`, `editCount` e `reactions` | | `POST /webhook`, `GET /webhook`, `GET /webhook/errors` | Registro com o corpo exato que o consumidor envia (`enabled, url, events, excludeMessages, addUrlEvents:false, addUrlTypesMessages:false, action:add`); `ignoredEvents` para nomes aceitos e não emitidos; `deliveryStatus`. Entrega assinada, em ordem por instância, com retry, dead-letter, replay e circuit breaker — ver [EVENTS.md](https://wpp.atendro.cloud/docs/guias/eventos.md) | | `GET /v1/messages`, `GET /v1/events?status=`, `POST /v1/events/{id}/replay` | Rotas próprias de inspeção e replay (não fazem parte do contrato legado) | Falhas de banco respondem `502 storage_unavailable` com `Retry-After` (não 503, que a fila de mídia do consumidor trata como irrecuperável na primeira tentativa). Diferenças deliberadas em relação ao provedor legado: tokens não são listados (o painel usa as rotas por id); `companyId` opcional no `init` filtra `GET /instance/all?companyId=`; um registro `connected` sem lease viva é reportado como `disconnected` (`worker lost`); `disconnect` sempre limpa a credencial (o legado mantinha `owner` preso e exigia recriar a instância); `409 session_owned_elsewhere` sinaliza sessão em outro worker; `502 whatsapp_unreachable` sinaliza falha de conexão ao iniciar o pareamento; `408` não é usado. `lastDisconnectReason` usa `QR Code timeout`, `logged out: `, `connection replaced by another session`, `connection closed`, `disconnected by API (user requested)`, `worker shutdown`, `worker lost`, `restart` e `lease lost`, com o `disconnectCode` correspondente; os textos casam com os regex que o consumidor usa para classificar quedas (`logged.?out`, `connection.?replaced`, `disconnected by API`). ## Superfície restante | Prioridade | Método e caminho | Contrato esperado | |---|---|---| | P1 | `POST /message/presence` | Presença coerente com sessão (só uso interno via `delay` hoje) | | P2/gate | importação de sessão pela extensão | Sem suporte previsto | | feito (5d) | `POST /call/make` e demais rotas `/call/*` | Em instância `kind: calls`: chamada real com áudio pela ponte WebSocket ([guia de ligações](https://wpp.atendro.cloud/docs/guias/chamadas-de-voz)); em instância `whatsapp`, `501 calls_not_supported` como antes | Grupos, chats e histórico (etapa 5b) estão implementados no contrato que o consumidor usa, com as diferenças deliberadas abaixo: - `GET /group/list?noparticipants=true` → `{groups: Group[]}` com os campos PascalCase (`JID`, `Name`, `Topic`, `OwnerJID`, `ParticipantCount`, `Participants[].JID/PhoneNumber/LID/IsAdmin/IsSuperAdmin/DisplayName/Error`, `invite_link`); a lista vem do que o serviço sincronizou (no `connected`, por notificações e por history sync); `force=true` ressincroniza. - `POST /group/info {groupjid, getInviteLink, force}` → `Group`; sem `force` serve o cache por 10 min; `getInviteLink` só devolve o link se a conta é admin (senão fica vazio, sem erro). `getRequestsParticipants` é ignorado. - `POST /group/create {name, participants[]}` → `Group` direto (o consumidor lê `result.group || result`), com `Participants[].Error` para quem o servidor recusou; nome de 1–100 caracteres (o WhatsApp atual aceita 100; o `maxLength: 25` da spec é antigo). - `POST /group/updateParticipants` → `{groupUpdated: [{JID, Error}], needs_refresh}`; `approve`/`reject` respondem `400 invalid_action`. - `POST /group/updateName` e `/group/updateImage` respondem `200` com `needs_refresh`; a imagem (data URI, base64 ou URL da allowlist; JPEG, PNG ou GIF) é convertida para JPEG de até 640×640 aqui, então o consumidor pode mandar o que o usuário subiu; `"remove"` apaga. Erros: `400` (entrada), `403 not_admin`, `404 group_not_found`, `415 invalid_image`, `429` (limite do WhatsApp). - `POST /chat/find` ({} ou `{limit, offset, wa_isGroup}`) → `{chats: Chat[], hasMore, pagination}` com `wa_chatid` (forma telefone para conversas diretas), `name` (assunto do grupo / push name), `wa_name`, `wa_contactName` (só grupos: assunto), `wa_isGroup`, `wa_unreadCount`, `wa_lastMsgTimestamp` (s) e `wa_lastMessageTime` (s, o que o webhook `chats` do consumidor lê). Sem filtros de lead/etiqueta. - `/message/find` inclui o histórico importado do telefone por padrão (`includeHistory: false` exclui); o histórico chega pelo history sync do pareamento e nunca gera eventos. - `POST /admin/restart` (`admintoken`) reinicia as sessões **deste worker** (soft, `202 {message, worker}`); o processo não sai. A resposta agenda a operação em background e não inclui contagem de sessões reiniciadas. - `POST /call/make` em instância `whatsapp` responde `501 calls_not_supported`; a chamada real é da instância `calls` (etapa 5d). - Eventos `groups` são persistidos e entregues quando inscritos no webhook global ou próprio. `chats` continua sem emissão de webhook. `GET/POST /instance/proxy` está implementado no contrato que o consumidor usa (`{mode: custom, proxy_url}` antes do `connect`; `{mode: internal}` para soltar; resposta com `proxy.effective_mode` e `fallback.active`), com duas diferenças deliberadas: não há pool gerenciado (`internal` = conexão direta, `effective_mode` só `custom`/`none`, `fallback` nunca ativo) e um proxy que não alcança o WhatsApp é recusado com `400 proxy_unreachable` em vez de gravado com `validation_error`. `POST /v1/instances/{id}/token` (reemissão de token com prazo de convivência) não tem equivalente legado. `profilePicUrl` vem de `/chat/details`; `GET /instance/status` ainda não o inclui. Headers de instância usam `token`; o sender também envia `instancekey`. Compatibilidade não concede autorização com base no nome da instância. Associar token à empresa e à sessão corretas. O admin token não pode ser exposto ao cliente. O OpenAPI legado diverge do runtime em alguns pontos: há `/instance/create` no spec, mas o Atendro chama `/instance/init`. Não implementar só a especificação. `/sender/simple`, `/sender/advanced` e `/instance/updateDelaySettings` não foram encontrados como dependência runtime e não fazem parte de P0. ## Eventos e mensagens Entregues desde a 4a; o catálogo e a projeção estão em [EVENTS.md](https://wpp.atendro.cloud/docs/guias/eventos.md). Envelope observado: `{EventType,instanceName,token,chat,message}`; `token` é omitido (só o digest existe) e a autorização é a assinatura, que o consumidor ainda não verifica. Contratos alvo: - `messages`: entrada e mensagens do celular; `messageid/key.id`, `chatid`, `fromMe`, `participant`, sender, conteúdo e citação. Não fabricar telefone de LID. - `connection` e `qrcode`: estado/identidade/QR, motivo de desconexão distinguível. - `messages_update`: ACK por `MessageIDs/messageIds/ids` e `Sent/Delivered/Read/Played`, além de formatos de reação, edição e exclusão usados pelo parser. Desde a 3c, reações, revogações e edições recebidas atualizam a mensagem alvo (`reactions`, `revokedAt`, `editedAt`/`editCount`/corpo) e geram eventos internos `messages_update` (`type: reaction|revoke`, com `known:false` quando o alvo nunca foi guardado) e `messages_edit`; votos de enquete e respostas de botão/lista viram mensagens `button_reply` com `targetId` = menu e `choices` = seleção. A projeção para o envelope legado é da etapa 4a. - `history`: opt-in e separado do recebimento novo; sem disparo de IA/automação. O mesmo ID precisa casar entre REST, eco, ACK, reply, reação e exclusão. Tratar variantes `owner:id` sem perder identidade. Suprimir somente ecos de envios API; preservar mensagens manuais do celular. Recibos podem chegar repetidos ou antes da resposta REST e não podem regredir `read` para `sent`. A API legada deve devolver ID de mensagem, não sucesso com ID de fila. Se ocorrer timeout após entrega ao motor, manter resultado ambíguo e reconciliar; não reenviar automaticamente. O Atendro já possui fila/pacing: coordenar contratos entre sistemas. ## Evidências no consumidor - [Ciclo de vida](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/uazapi-instance-manager/index.ts) - [Envio](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/uazapi-send-message/index.ts) - [Parser de webhook](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/uazapi-webhook/index.ts) - [Ações](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/uazapi-message-actions/index.ts) - [Mídia](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/process-media-queue/index.ts) - [Grupos](https://github.com/atendro-ai/atendro-ai/blob/main/supabase/functions/uazapi-group-manager/index.ts) Fixar a revisão do consumidor quando escrever fixtures/testes de contrato. Fixtures devem ser sintéticas ou anonimizadas. Matching deve validar semântica de campos, IDs e efeitos, sem exigir ordem byte-a-byte irrelevante de propriedades JSON. ## Gates de integração O produto ainda restringe domínios a `uazapi.com` em guard de URL, migration e media-proxy. Serão necessárias allowlists explícitas, assinatura de webhook, elegibilidade de piloto e revisão do cutover antes da integração. `is_active=false` não devolve sessões ao backend anterior e `max_instances=0` significa ilimitado. Não cadastrar este bootstrap como servidor ativo no produto. O cutover precisa bloquear eventos tardios do backend antigo, invalidar cache de vínculo e reconciliar ACKs de envios anteriores. O parser atual também resolve instância por nome; trocar token/URL sozinho não isola os eventos. --- Fonte: https://wpp.atendro.cloud/docs/guias/validacao.md # Validação do contrato de integração — 18/09/2026 Escopo: [guia do Atendro](https://wpp.atendro.cloud/docs/ATENDRO_INTEGRATION.md), [OpenAPI](https://wpp.atendro.cloud/openapi.json), [catálogo](https://wpp.atendro.cloud/docs/API_ENDPOINTS.md) e [llms.txt](https://wpp.atendro.cloud/llms.txt). Revisão funcional do serviço: esta alteração adiciona cadastro global persistido, herança por instância, rotas públicas de documentação e gerenciamento no console. A migração 0013 preserva inscrições anteriores como exceções explícitas. ## Documentação central — 18/09/2026 A referência pública é servida pelo console em `https://wpp.atendro.cloud/docs`. As URLs da API continuam específicas de cada servidor. Os antigos caminhos de documentação redirecionam com 308 para a central, descartando parâmetros de consulta. A organização contém 10 guias, 56 operações em 12 categorias e 71 modelos. São 152 páginas com versões HTML e Markdown, além do OpenAPI, `llms.txt`, `llms-full.txt` e arquivos públicos de apoio. Os exemplos são sintéticos. | Verificação desta revisão | Resultado | |---|---| | Cobertura da referência | Cada operação e modelo do OpenAPI possui página; cada operação está nos dois arquivos para IA | | Exemplos contra JSON Schema 2020-12 | 181 requisições/respostas ilustrativas válidas; verificação executada no ambiente Python temporário | | Publicação pelo console | GET/HEAD sem login, sem acesso a store, credenciais ou worker; POST recusado | | Privacidade dos redirects | Destino fixo em `wpp.atendro.cloud`; host e query do solicitante não são propagados | | Autenticação existente | Console privado preservado; rotas operacionais continuam na API com os headers originais | | Conteúdo sem JavaScript | Títulos, campos, exemplos e respostas renderizados pelo servidor; Markdown integral disponível | | Navegação no navegador | Busca com acentos, páginas de endpoint, abas cURL/JavaScript e status HTTP, cópia de código | | Responsividade | Revisão visual de desktop e quadros locais com 390 px e 1024 px de largura | | Renderer e links para IA | Testes de escape HTML, preservação do código e resolução de todos os links Markdown passaram | | `go test -race ./...`, `go vet ./...`, builds da API e console | Passaram; integração em PostgreSQL descartável | | Dependências e receptor | 47 módulos revisados; 5 testes do validador HMAC passaram | O CI compara o catálogo gerado, os índices para IA e o conteúdo completo com o OpenAPI e os guias. A conferência dos exemplos valida o formato; não comprova execução de cada exemplo contra WhatsApp real. ## Resultados da integração — 17/09/2026 | Verificação | Resultado | O que demonstra | |---|---|---| | Readiness remota (revisão anterior `b626aa3`) | `200 ready` em 17/09 | Evidência anterior, não valida a instalação desta alteração | | `python3 scripts/sync_api_docs.py --check` | Passou; 56 operações / 50 caminhos | Referências locais, parâmetros de caminho, headers e catálogo sincronizados | | `openapi-spec-validator 0.7.2` sobre `docs/openapi.json` | `OK` | Documento válido segundo a especificação OpenAPI 3.1 | | `TestOpenAPICoversRouter` | Passou | Rotas fixas e catálogo de rotas por prefixo correspondem ao OpenAPI; testes referenciados existem | | `TestOpenAPIAuthenticationMatchesRouter` | Passou nas 56 operações | Headers administrativos/de instância, rejeição de credenciais ausentes/incorretas/duplicadas, Bearer/query/instancekey; despacho autenticado com fixtures | | `go test -race ./...` | Passou em todos os pacotes | Suíte HTTP/sessão/engine/storage/webhooks e testes de persistência com banco descartável | | `go vet ./...` | Passou | Análise estática Go | | `go build ./cmd/atendrozap` e build do console | Passou | Binários compilados | | `docker build --target api` | Passou | Empacotamento com documentação embutida e compilação dos alvos API/console | | `python3 scripts/check_dependencies.py` | Passou; 47 módulos revisados | Inventário de dependências Go preservado | | Herança global e concorrência | Passou com PostgreSQL descartável | Instâncias atuais/futuras, exceções, opt-out, troca de URL, remoção persistida e rotação de chave | | `TestGlobalWebhookSignedHTTPDelivery` | Passou | Cadastro via HTTP, criação com herança, projeção e entrega HTTP assinada de connection/groups, ordem e baixa na outbox | | `node --test scripts/verify_webhook_test.mjs` | 5 testes passaram | Corpo bruto, assinatura, timestamp, metadados, limites e falhas do exemplo do receptor | | Console de webhook | Testes e navegador passaram | Autenticação, CSRF, gravação global/por instância, ausência do segredo nas páginas e bloqueio de redirects com credenciais | | Documentação no navegador | Passou | Busca entre 56 operações, expansão de schemas, autenticação indicada; tela desktop e largura de 390 px sem overflow horizontal | | `git diff --check` | Passou | Sem problemas de whitespace no diff | O PostgreSQL foi criado exclusivamente para esta validação, em contêiner temporário com armazenamento descartável, e informado por `ATENDROZAP_TEST_DATABASE_URL`. Não foi usado o banco de laboratório ou o banco do Atendro. O validador OpenAPI foi instalado em ambiente Python temporário; nenhuma dependência de execução foi adicionada ao projeto. O teste de autenticação não substitui os testes funcionais de cada operação: eles estão relacionados no catálogo e foram executados pela suíte completa. As sessões HTTP são falsas, por desenho. A validação formal do OpenAPI verifica o documento, não compara automaticamente cada campo de todos os payloads de resposta ao JSON Schema. Exemplos e contratos foram revisados no código. ## Publicação inicial autorizada — 17/09/2026 A revisão funcional `74a63a9` foi publicada na API e no console após autorização do responsável. A configuração de logs do proxy recebeu filtros para dados sensíveis. Um backup do banco e as imagens anteriores foram preservados antes da atualização. | Verificação no servidor publicado | Resultado | |---|---| | `https://1.atendro.cloud/health/ready` | `200 ready` após reiniciar API e console | | Documentação pública | As 16 rotas permitidas responderam 200, com conteúdo correspondente aos arquivos da revisão | | OpenAPI publicado | 56 operações / 50 caminhos | | `https://wpp.atendro.cloud/login` | 200, formulário de acesso disponível | | `GET /v1/capabilities` com `admintoken`, via HTTPS público | 200; `global_webhook=true`, eventos `groups` disponíveis, `calls=false` | | `GET /v1/webhook` com `admintoken` | 200; `scope=server`, `registered=false`: aguardando a URL do novo receptor no Atendro | | `GET /v1/webhook` sem credenciais | 401 | | Migrações do banco | As 13 migrações aplicadas, incluindo 0013 | | Logs do proxy | Marcadores sintéticos confirmaram a ausência de headers e URI no acesso público; um contêiner isolado confirmou a mesma proteção nos logs de acesso e de erro para respostas 502 | Os tokens permaneceram no servidor durante as consultas autenticadas; não foram exibidos nem incluídos na documentação. A publicação preservou banco, volumes e configurações existentes. O webhook global não foi ativado: seu cadastro pelo console depende da URL e do segredo do receptor que será criado no Atendro. ## Constatações da publicação inicial para o consumidor (17/09/2026) - **Ligações:** `POST /call/make` retorna `501 calls_not_supported` com token válido; `capabilities.calls=false` naquela publicação. A etapa 5d posterior habilita voz por instâncias `calls`, conforme o guia de ligações. - **Instâncias:** token do servidor usa `admintoken`; token da instância usa `token`. Criação responde 200. Listagem não recupera o segredo. - **Restart administrativo:** responde `202 {message, worker}`; agenda o trabalho em background e não devolve a quantidade de sessões reiniciadas. - **Grupos no webhook:** o cadastro REST agora permite `groups`; a entrega assinada foi verificada com evento sintético e receptor HTTP local. - **Idempotência:** cobre init, todos os envios, ações e mutações de grupo, conforme o catálogo; não cobre qualquer POST indiscriminadamente. ## Limites e pendências As consultas remotas acima validam publicação, autenticação administrativa e leitura da configuração global. Não substituem a homologação das operações que alteram instâncias ou interagem com o WhatsApp, nem a entrega ao futuro receptor do Atendro. O teste de entrega assinada usou somente eventos sintéticos e um receptor local. Não houve novo pareamento, envio de mensagem, chamada, alteração de grupos, cadastro/ativação de servidor no Atendro, migração de tráfego ou chamadas à rota de conexão durante esta publicação. Os testes locais e as consultas remotas não encerram os [gates de piloto](https://wpp.atendro.cloud/docs/PILOT_GATES.md). A documentação foi centralizada no console: `/docs`, `/openapi.json` e `/llms.txt` são públicos em `https://wpp.atendro.cloud`. Os caminhos antigos em `https://1.atendro.cloud` redirecionam para a central; a URL das operações da API permanece específica de cada servidor. O próximo teste de cadastro no consumidor deve verificar readiness e capabilities com o token informado no backend privado. As demais operações reais dependem de ambiente de homologação, números/grupo de teste autorizados e dos cenários descritos no guia e nos gates. ## Reproduzir as verificações Com `ATENDROZAP_TEST_DATABASE_URL` já configurada para **um banco descartável**: ```sh python3 scripts/sync_api_docs.py --check python3 scripts/check_dependencies.py python3 -m unittest discover -s scripts -p 'test_build_docs.py' node --test scripts/verify_webhook_test.mjs go test -race ./... go vet ./... go build ./cmd/atendrozap git diff --check ``` Opcionalmente, em um ambiente que tenha `openapi-spec-validator==0.7.2`: ```sh python -m openapi_spec_validator docs/openapi.json ``` O CI executa a sincronização da documentação, o exemplo de verificação HMAC, os testes Go, vet e build. A validação formal externa acima foi executada nesta revisão e não é uma dependência do CI. Sem `ATENDROZAP_TEST_DATABASE_URL`, os testes de PostgreSQL são pulados; esse resultado não equivale à execução com banco descartável. --- Fonte: https://wpp.atendro.cloud/docs/api/health-live.md # Verificar processo HTTP `GET /health/live` Sem autenticação; não atesta banco nem WhatsApp. ## Autenticação Endpoint público, sem token. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Verificar processo HTTP | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"alive"`, `"ready"`, `"not_ready"` | | `reason` | `string` | opcional | Valores: `"database_unreachable"` | Exemplo ilustrativo, com valores sintéticos: ```json { "status": "alive" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/health/live" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/health/live"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Diagnóstico](https://wpp.atendro.cloud/docs/api/diagnostico.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/health-ready.md # Verificar banco acessível `GET /health/ready` 200 não significa instância conectada nem integração homologada. ## Autenticação Endpoint público, sem token. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Verificar banco acessível | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"alive"`, `"ready"`, `"not_ready"` | | `reason` | `string` | opcional | Valores: `"database_unreachable"` | Exemplo ilustrativo, com valores sintéticos: ```json { "status": "ready" } ``` ## Resposta 503 Banco inacessível: status=not_ready, reason=database_unreachable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"alive"`, `"ready"`, `"not_ready"` | | `reason` | `string` | opcional | Valores: `"database_unreachable"` | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/health/ready" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/health/ready"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Diagnóstico](https://wpp.atendro.cloud/docs/api/diagnostico.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-capabilities.md # Consultar capacidades `GET /v1/capabilities` Fonte para habilitar funcionalidades. Para voz, exigir capabilities.calls=true e instance_kinds contendo calls. status=laboratory. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar capacidades | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `service` | `string` | obrigatório | Valores: `"AtendroZAP"` | | `status` | `string` | obrigatório | Valores: `"laboratory"` | | `worker` | `string` | opcional | — | | `engine` | `object` | opcional | — | | `capabilities` | `object` | obrigatório | — | | `capabilities.calls` | `boolean` | opcional | Habilitado neste worker por ATENDROZAP_CALLS_ENABLED; exige instância calls. | | `capabilities.ptt_transcoding` | `boolean` | opcional | Valores: `false` | | `capabilities.call_history` | `boolean` | opcional | — | | `capabilities.call_recording` | `boolean` | opcional | Gravação automática das chamadas atendidas habilitada neste worker. | | `capabilities.calls_per_instance_limit` | `boolean` | opcional | Permite configurar callsMaxConcurrent por instância, sem reiniciar a sessão. | | `capabilities.calls_video` | `boolean` | opcional | Chamadas de vídeo, upgrade no meio da ligação e ponte GET /call/{id}/video habilitados neste worker por ATENDROZAP_CALLS_VIDEO_ENABLED (exige calls). Recurso experimental até a homologação em laboratório. | | `capabilities.calls_settings_webhook` | `boolean` | opcional | Anuncia call_settings com limite/versionamento em outbox atômica e callsConfigVersion em objetos instance. Exige inscrição explícita em call_settings; connection pode trazer o snapshot opcional em instance. | | `capabilities.calls_video_recording` | `boolean` | opcional | Captura de vídeo e geração de MP4 lado a lado habilitadas neste worker por ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED. Opt-in: requer calls_video, call_recording, FFmpeg e ffprobe. Não implica homologação em celulares reais. | | `capabilities.calls_incoming_policy` | `boolean` | opcional | Permite configurar incomingCallMode, comparar expectedCallsConfigVersion e receber decisões de recusa automática com metadados por chamada. Não garante envio de mensagem pelo consumidor nem homologação de áudio recebido. | | `interactive` | `object` | opcional | — | | `webhookEvents` | `object` | opcional | — | | `webhookEvents.delivered` | `array` | opcional | — | | `webhookEvents.ignored` | `array` | opcional | — | | `instance_kinds` | `array` | opcional | — | | `calls_max_concurrent` | `integer` | opcional | Padrão do servidor usado na criação e em instâncias antigas sem limite próprio. Consulte instance.callsMaxConcurrent para o limite efetivo. Mínimo: `0` | | `calls_recording_retention_days` | `integer` | opcional | Retenção das gravações de áudio em dias; 0 desativa exclusão automática do áudio. Vídeo possui prazo independente. Histórico preservado. Mínimo: `0` | | `calls_video_recording_retention_days` | `integer` | opcional | Retenção das gravações MP4 em dias, contados do encerramento da chamada. Padrão 7, independente do áudio. Histórico preservado. Mínimo: `1`. Máximo: `3650` | | `calls_max_concurrent_range` | `object` | opcional | — | | `calls_max_concurrent_range.min` | `integer` | obrigatório | Valor fixo: `1` | | `calls_max_concurrent_range.max` | `integer` | obrigatório | Valor fixo: `8` | Exemplo ilustrativo, com valores sintéticos: ```json { "service": "AtendroZAP", "status": "laboratory", "worker": "worker-1", "engine": { "configured": true, "store": "postgresql" }, "instance_kinds": [ "whatsapp", "calls" ], "calls_max_concurrent": 1, "capabilities": { "instance_lifecycle": true, "message_send_text": true, "webhooks": true, "global_webhook": true, "calls": true, "calls_settings_webhook": true, "calls_video_recording": false, "ptt_transcoding": false }, "webhookEvents": { "delivered": [ "connection", "messages", "messages_update", "messages_edit", "groups", "limits", "undecryptable", "call", "call_settings" ], "ignored": [ "qrcode", "history", "chats" ] } } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/capabilities" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/capabilities"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Diagnóstico](https://wpp.atendro.cloud/docs/api/diagnostico.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/create-instance.md # Criar instância e emitir token `POST /instance/init` Não pareia nem conecta. Guardar instance.id e instance.token no backend; listar não recupera o token. kind=whatsapp por padrão; kind=calls cria um dispositivo vinculado próprio para voz. callsMaxConcurrent define o limite próprio de 1 a 8 para calls; omitido, usa o padrão do servidor. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 15 minutos. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `name` | `string` | obrigatório | Obrigatório, até 128 bytes UTF-8, sem controle ou espaços nas extremidades. Comprimento mínimo: `1`. Comprimento máximo: `128` | | `systemName` | `string` | opcional | Até 128 bytes; recomendado Atendro. Comprimento máximo: `128` | | `companyId` | `string` | opcional | Até 128 bytes; vínculo com tenant no consumidor. Filtro de lista, não autorização. Comprimento máximo: `128` | | `kind` | `string` | opcional | Imutável após criar. calls exige o módulo habilitado e pareamento próprio. Valores: `"whatsapp"`, `"calls"`. Padrão: `"whatsapp"` | | `callsMaxConcurrent` | `integer` | opcional | Limite de ligações simultâneas desta instância calls, incluindo as que estão tocando. Acima de 1 ainda depende de homologação em chamadas reais. Opcional na criação; omitido, persiste o padrão ATENDROZAP_CALLS_MAX_CONCURRENT do servidor. Recusado em kind=whatsapp. Mínimo: `1`. Máximo: `8` | | `incomingCallMode` | `string` | opcional | Opcional apenas em kind=calls. Omitido, preserva o comportamento allow. Padrão: `"allow"` | ## Resposta 200 Criar instância e emitir token | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `connected` | `boolean` | obrigatório | Valores: `false` | | `loggedIn` | `boolean` | obrigatório | Valores: `false` | | `instance` | `object` | obrigatório | Modelo: [IssuedInstance](https://wpp.atendro.cloud/docs/modelos/issued-instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected", "token": "0000000000000000000000000000000000000000000000000000000000000000" }, "loggedIn": false, "response": "Instance created" } ``` ## Resposta 400 invalid_name, invalid_kind, invalid_calls_max_concurrent ou invalid_json. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported ao solicitar kind=calls com o módulo desligado. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/init" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "name": "atendimento-teste", "systemName": "Atendro", "companyId": "empresa-teste" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/init"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "name": "atendimento-teste", "systemName": "Atendro", "companyId": "empresa-teste" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-instances.md # Listar instâncias do servidor `GET /instance/all` Array direto. Nunca inclui token; qrcode é vazio. companyId é filtro administrativo, não isolamento de autenticação. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de consulta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `companyId` | `string` | opcional | — | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Listar instâncias do servidor | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `[].id` | `string` | obrigatório | Formato: `uuid` | | `[].name` | `string` | obrigatório | — | | `[].systemName` | `string` | opcional | — | | `[].companyId` | `string` | opcional | — | | `[].status` | `string` | obrigatório | Valores: `"disconnected"`, `"connecting"`, `"connected"` | | `[].owner` | `string` | obrigatório | — | | `[].profileName` | `string` | obrigatório | — | | `[].qrcode` | `string` | obrigatório | PNG em data URI quando há QR vigente; vazio no restante e nas listagens. | | `[].paircode` | `string` | opcional | — | | `[].lastDisconnect` | `string` | opcional | RFC 3339. Formato: `date-time` | | `[].lastDisconnectReason` | `string` | opcional | — | | `[].disconnectCode` | `string` | opcional | — | | `[].worker` | `string` | opcional | — | | `[].limitEnforcement` | `string` | opcional | — | | `[].limitUntil` | `string` | opcional | RFC 3339. Formato: `date-time` | | `[].created` | `string` | opcional | RFC 3339. Formato: `date-time` | | `[].updated` | `string` | opcional | RFC 3339. Formato: `date-time` | | `[].kind` | `string` | obrigatório | Valores: `"whatsapp"`, `"calls"` | | `[].callsMaxConcurrent` | `integer` | opcional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `[].callsConfigVersion` | `integer` | opcional | Versão crescente da configuração de chamadas; presente inclusive 0 em objetos instance de kind=calls. Comparar esta versão entre respostas HTTP e snapshots de webhook para evitar regressões. O campo não pertence às instâncias whatsapp. Mínimo: `0`. Formato: `int64` | | `[].incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | Exemplo ilustrativo, com valores sintéticos: ```json [] ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/instance/all" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/all"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/connect-instance.md # Conectar ou iniciar pareamento `POST /instance/connect` Abre conexão real; exige autorização para laboratório. Aguarda até 5 s por QR/login; acompanhar /instance/status. Sem phone: QR; com phone: paircode. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo opcional. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `phone` | `string` | opcional | Opcional. Sem phone usa QR; com phone extrai 8–15 dígitos incluindo DDI e pede código de pareamento. | ## Resposta 200 Conectar ou iniciar pareamento | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/connect" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{}' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/connect"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({}), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-instance-status.md # Consultar sessão e webhook `GET /instance/status` Sem iniciar conexão. Usar connected e loggedIn; QR/código podem estar presentes durante pareamento. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar sessão e webhook | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/instance/status" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/status"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/disconnect-instance.md # Desvincular e limpar credencial `POST /instance/disconnect` Logout, distinto de restart. unlinked informa confirmação remota. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Desvincular e limpar credencial | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `unlinked` | `boolean` | obrigatório | Indica confirmação remota. Credencial local é limpa mesmo se false. | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "response": "Operação concluída", "unlinked": false } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/disconnect" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/disconnect"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/restart-instance.md # Reiniciar preservando credencial `POST /instance/restart` Reabre sessão; não usar como rotina de validação de cadastro. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Reiniciar preservando credencial | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | | `response` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false, "response": "Operação concluída" } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/restart" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/restart"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/delete-instance.md # Excluir instância `DELETE /instance` Logout em melhor esforço e exclusão definitiva; somente após autorização do responsável. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Excluir instância | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "response": "Operação concluída" } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request DELETE "$ATENDROZAP_URL/instance" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "DELETE", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Instâncias](https://wpp.atendro.cloud/docs/api/instancias.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-get-instance.md # Consultar instância por ID `GET /v1/instances/{id}` Ação administrativa com admintoken, sem precisar do token da instância. Mesmos efeitos da rota de instância. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar instância por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/instances/${ID}" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-delete-instance.md # Excluir instância por ID `DELETE /v1/instances/{id}` Ação administrativa com admintoken, sem precisar do token da instância. Mesmos efeitos da rota de instância. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Excluir instância por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "response": "Operação concluída" } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request DELETE "$ATENDROZAP_URL/v1/instances/${ID}" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "DELETE", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-connect-instance.md # Conectar instância por ID `POST /v1/instances/{id}/connect` Ação administrativa com admintoken, sem precisar do token da instância. Mesmos efeitos da rota de instância. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo opcional. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `phone` | `string` | opcional | Opcional. Sem phone usa QR; com phone extrai 8–15 dígitos incluindo DDI e pede código de pareamento. | ## Resposta 200 Conectar instância por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/connect" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --data '{}' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/connect"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({}), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-disconnect-instance.md # Desvincular instância por ID `POST /v1/instances/{id}/disconnect` Ação administrativa com admintoken, sem precisar do token da instância. Mesmos efeitos da rota de instância. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Desvincular instância por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `unlinked` | `boolean` | obrigatório | Indica confirmação remota. Credencial local é limpa mesmo se false. | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "response": "Operação concluída", "unlinked": false } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/disconnect" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/disconnect"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-restart-instance.md # Reiniciar instância por ID `POST /v1/instances/{id}/restart` Ação administrativa com admintoken, sem precisar do token da instância. Mesmos efeitos da rota de instância. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Reiniciar instância por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | | `response` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "connected": false, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected" }, "jid": "", "loggedIn": false, "response": "Operação concluída" } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/restart" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/restart"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-reissue-token.md # Reemitir token da instância `POST /v1/instances/{id}/token` O novo segredo aparece nesta resposta. graceSeconds=0 revoga o anterior imediatamente; máximo 3600. Não possui idempotência. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo opcional. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `graceSeconds` | `integer` | opcional | Prazo de convivência do token anterior; zero revoga imediatamente. Padrão: `0`. Mínimo: `0`. Máximo: `3600` | ## Resposta 200 Reemitir token da instância | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `graceSeconds` | `integer` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [IssuedInstance](https://wpp.atendro.cloud/docs/modelos/issued-instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "graceSeconds": 0, "instance": { "id": "00000000-0000-4000-8000-000000000001", "kind": "whatsapp", "name": "instancia-de-teste", "owner": "", "profileName": "", "qrcode": "", "status": "disconnected", "token": "0000000000000000000000000000000000000000000000000000000000000000" }, "response": "Operação concluída" } ``` ## Resposta 400 Corpo ou telefone inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 session_owned_elsewhere ou outro conflito de sessão. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 worker_full; Retry-After=5. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 whatsapp_unreachable ou storage_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/token" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "graceSeconds": 300 }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/token"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "graceSeconds": 300 }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-restart-worker.md # Reiniciar sessões deste worker `POST /admin/restart` Soft restart das sessões do worker que atende a requisição. Não reinicia processo nem todos os workers do cluster. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 202 Reiniciar sessões deste worker | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `message` | `string` | obrigatório | — | | `worker` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "message": "Operação agendada", "worker": "worker-1" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/admin/restart" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/admin/restart"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Administração](https://wpp.atendro.cloud/docs/api/administracao.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/send-text.md # Enviar texto `POST /send/text` Retorna ID real do WhatsApp, não ID de fila. linkPreview é ignorado. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `text` | `string` | obrigatório | UTF-8, não vazio/branco, até 65536 bytes. Comprimento mínimo: `1`. Comprimento máximo: `65536` | | `linkPreview` | `any` | opcional | Aceito e ignorado; o serviço não gera prévia de link. | ## Resposta 200 Enviar texto | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/send/text" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123", "text": "Mensagem de teste da integração." }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/send/text"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123", "text": "Mensagem de teste da integração." }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/send-media.md # Enviar mídia `POST /send/media` URL depende da allowlist de mídia. PTT requer OGG/Opus; sem transcodificação outros formatos saem como áudio comum. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `type` | `string` | obrigatório | Valores: `"image"`, `"video"`, `"audio"`, `"ptt"`, `"document"`, `"sticker"` | | `file` | `string` | obrigatório | Data URI, base64 ou URL permitida por ATENDROZAP_MEDIA_URL_ALLOWLIST. Até 32 MiB decodificados; JSON até 48 MiB. Comprimento mínimo: `1` | | `text` | `string` | opcional | Legenda em UTF-8, até 65536 bytes. Comprimento máximo: `65536` | | `docName` | `string` | opcional | Nome-base do documento. | ## Resposta 200 Enviar mídia | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `mimetype` | `string` | obrigatório | — | | `ptt` | `boolean` | obrigatório | — | | `note` | `string` | opcional | Explica envio como áudio comum quando PTT não é possível. | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "mimetype": "valor-de-exemplo", "ptt": false, "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/send/media" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123", "type": "image", "file": "https://arquivos.example/imagem.png", "text": "Imagem de teste." }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/send/media"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123", "type": "image", "file": "https://arquivos.example/imagem.png", "text": "Imagem de teste." }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/send-contact.md # Enviar contato `POST /send/contact` Contato vCard; number é o destinatário e phoneNumber é o telefone do contato. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `fullName` | `string` | obrigatório | Nome do contato sintético/autorizado, 1–128 bytes após trim. Comprimento mínimo: `1`. Comprimento máximo: `128` | | `phoneNumber` | `string` | obrigatório | Telefone do contato: 8–15 dígitos com DDI após retirar formatação. | | `organization` | `string` | opcional | Até 128 bytes. Comprimento máximo: `128` | ## Resposta 200 Enviar contato | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/send/contact" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123", "fullName": "Contato de teste", "phoneNumber": "12025550124", "organization": "Empresa de teste" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/send/contact"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123", "fullName": "Contato de teste", "phoneNumber": "12025550124", "organization": "Empresa de teste" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/send-location.md # Enviar localização `POST /send/location` Coordenadas obrigatórias; suporta citação e marca de encaminhada. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `latitude` | `number` | obrigatório | Mínimo: `-90`. Máximo: `90` | | `longitude` | `number` | obrigatório | Mínimo: `-180`. Máximo: `180` | | `name` | `string` | opcional | Até 256 bytes. Comprimento máximo: `256` | | `address` | `string` | opcional | Até 512 bytes. Comprimento máximo: `512` | ## Resposta 200 Enviar localização | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/send/location" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123", "latitude": -15.7939, "longitude": -47.8828, "name": "Local de teste" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/send/location"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123", "latitude": -15.7939, "longitude": -47.8828, "name": "Local de teste" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/send-menu.md # Enviar botões, lista ou enquete `POST /send/menu` renderMode=auto tenta nativo e pode cair para enquete/texto. rendered informa o formato entregue. 3 botões; 4–10 respostas podem virar lista; até 10 linhas; enquetes 2–12 opções. call: e carousel recusados. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `type` | `string` | obrigatório | Valores: `"button"`, `"buttons"`, `"list"`, `"poll"` | | `text` | `string` | obrigatório | Até 4096 bytes. Comprimento mínimo: `1`. Comprimento máximo: `4096` | | `choices` | `array` | obrigatório | Mínimo de itens: `1` | | `footerText` | `string` | opcional | — | | `listButton` | `string` | opcional | — | | `selectableCount` | `integer / string` | opcional | Só em type=poll; padrão 1. | | `renderMode` | `string` | opcional | Valores: `"auto"`, `"native"`, `"poll"`, `"text"`. Padrão: `"auto"` | ## Resposta 200 Enviar botões, lista ou enquete | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `type` | `string` | obrigatório | — | | `renderMode` | `string` | obrigatório | Valores: `"auto"`, `"native"`, `"poll"`, `"text"` | | `rendered` | `string` | obrigatório | Valores: `"button"`, `"list"`, `"poll"`, `"text"` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "renderMode": "auto", "rendered": "button", "success": true, "timestamp": 1789603200, "type": "valor-de-exemplo" } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/send/menu" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123", "type": "poll", "text": "Qual assunto deseja tratar?", "choices": [ "Atendimento", "Financeiro" ], "selectableCount": 1, "renderMode": "auto" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/send/menu"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123", "type": "poll", "text": "Qual assunto deseja tratar?", "choices": [ "Atendimento", "Financeiro" ], "selectableCount": 1, "renderMode": "auto" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Enviar mensagens](https://wpp.atendro.cloud/docs/api/envio.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/forward-message.md # Encaminhar mensagem guardada `POST /message/forward` Rota própria do AtendroZAP. Faz novo envio; mídias são baixadas e reenviadas, com marca de encaminhada. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Resposta 200 Encaminhar mensagem guardada | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found ou media_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/forward" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "id": "MENSAGEM_DE_TESTE", "number": "12025550123" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/forward"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE", "number": "12025550123" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/react-message.md # Reagir ou remover reação `POST /message/react` Chat vem do ID guardado; number é ignorado. text vazio remove a reação. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | | `text` | `string` | opcional | Um emoji; vazio/ausente remove a reação. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Resposta 200 Reagir ou remover reação | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `reaction` | `object` | obrigatório | — | | `reaction.id` | `string` | obrigatório | — | | `reaction.emoji` | `string` | obrigatório | — | | `reaction.status` | `string` | obrigatório | Valores: `"sent"`, `"removed"` | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "messageId": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "reaction": { "emoji": "valor-de-exemplo", "id": "MENSAGEM_DE_TESTE", "status": "sent" }, "success": true, "timestamp": 1789603200 } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found ou media_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/react" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "id": "MENSAGEM_DE_TESTE", "text": "👍" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/react"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE", "text": "👍" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/delete-message.md # Apagar mensagem própria para todos `POST /message/delete` Mensagem recebida retorna cannot_delete. recorded=false indica WhatsApp aceitou mas o banco não gravou. Repetida pode retornar alreadyDeleted. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Resposta 200 Apagar mensagem própria para todos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `id` | `string` | obrigatório | — | | `messageid` | `string` | opcional | — | | `messageId` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"Deleted"` | | `timestamp` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `recorded` | `boolean` | obrigatório | — | | `alreadyDeleted` | `boolean` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "id": "MENSAGEM_DE_TESTE", "recorded": true, "status": "Deleted", "success": true, "timestamp": "2026-09-17T00:00:00Z" } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found ou media_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/delete" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "id": "MENSAGEM_DE_TESTE" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/delete"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/edit-message.md # Editar texto ou legenda própria `POST /message/edit` Janela de 20 min. id/messageid do resultado identificam o original; editId identifica a ação. recorded=false exige reconciliação. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | | `text` | `string` | obrigatório | Texto/legenda UTF-8, não vazio, até 65536 bytes. Comprimento mínimo: `1`. Comprimento máximo: `65536` | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Resposta 200 Editar texto ou legenda própria | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `id` | `string` | obrigatório | owner:id do original. | | `messageid` | `string` | obrigatório | ID do original. | | `messageId` | `string` | opcional | — | | `editId` | `string` | obrigatório | ID da ação de edição. | | `content` | `string` | opcional | — | | `messageType` | `string` | opcional | — | | `messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `status` | `string` | opcional | — | | `owner` | `string` | opcional | — | | `editCount` | `integer` | opcional | — | | `recorded` | `boolean` | obrigatório | false: WhatsApp aceitou mas a persistência local falhou. | Exemplo ilustrativo, com valores sintéticos: ```json { "editId": "MENSAGEM_DE_TESTE", "id": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "recorded": true, "success": true } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found ou media_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/edit" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "id": "MENSAGEM_DE_TESTE", "text": "Texto atualizado no exemplo." }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/edit"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE", "text": "Texto atualizado no exemplo." }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/edit-message-put.md # Editar mensagem (alias PUT) `PUT /message/edit` Mesmo contrato de POST /message/edit. Trocar POST por PUT com a mesma Idempotency-Key muda o hash da requisição. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | | `text` | `string` | obrigatório | Texto/legenda UTF-8, não vazio, até 65536 bytes. Comprimento mínimo: `1`. Comprimento máximo: `65536` | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Resposta 200 Editar mensagem (alias PUT) | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `id` | `string` | obrigatório | owner:id do original. | | `messageid` | `string` | obrigatório | ID do original. | | `messageId` | `string` | opcional | — | | `editId` | `string` | obrigatório | ID da ação de edição. | | `content` | `string` | opcional | — | | `messageType` | `string` | opcional | — | | `messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `status` | `string` | opcional | — | | `owner` | `string` | opcional | — | | `editCount` | `integer` | opcional | — | | `recorded` | `boolean` | obrigatório | false: WhatsApp aceitou mas a persistência local falhou. | Exemplo ilustrativo, com valores sintéticos: ```json { "editId": "MENSAGEM_DE_TESTE", "id": "MENSAGEM_DE_TESTE", "messageid": "MENSAGEM_DE_TESTE", "recorded": true, "success": true } ``` ## Resposta 400 Entrada inválida. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 body_too_large ou mídia acima do limite. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 too_many_requests ou retry_later: nada enviado, respeitar Retry-After. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 500 whatsapp_reachout_timelock / WHATSAPP_REACHOUT_TIMELOCK, provider_code=463. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 504 send_ambiguous ou action_ambiguous com ID. Reconciliar antes de repetir. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request PUT "$ATENDROZAP_URL/message/edit" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "id": "MENSAGEM_DE_TESTE", "text": "Texto atualizado no exemplo." }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/edit"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "PUT", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE", "text": "Texto atualizado no exemplo." }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Ações em mensagens](https://wpp.atendro.cloud/docs/api/acoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/find-messages.md # Buscar mensagens no formato legado `POST /message/find` Ordem mais recente primeiro. includeHistory=true por padrão; histórico nunca dispara automações novas. id ausente no store retorna messages=[]. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo opcional. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | opcional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `chatid` | `string` | opcional | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `limit` | `integer / string` | opcional | 0/ausente usa 100; máximo 200. Padrão: `100` | | `offset` | `integer / string` | opcional | Deslocamento da página. | | `includeHistory` | `boolean / string / integer / null` | opcional | Padrão: `true` | ## Resposta 200 Buscar mensagens no formato legado | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `messages` | `array` | obrigatório | — | | `messages[].id` | `string` | obrigatório | owner:messageid. | | `messages[].messageid` | `string` | obrigatório | — | | `messages[].chatid` | `string` | obrigatório | — | | `messages[].sender` | `string` | opcional | — | | `messages[].sender_pn` | `string` | opcional | — | | `messages[].senderName` | `string` | opcional | — | | `messages[].pushName` | `string` | opcional | — | | `messages[].isGroup` | `boolean` | opcional | — | | `messages[].fromMe` | `boolean` | obrigatório | — | | `messages[].wasSentByApi` | `boolean` | opcional | — | | `messages[].messageType` | `string` | opcional | Tipo legado PascalCase. | | `messages[].type` | `string` | opcional | — | | `messages[].messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `messages[].timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `messages[].status` | `string` | opcional | Pending, Sent, Delivered, Read, Played, Failed, Received ou Deleted. | | `messages[].text` | `string` | opcional | — | | `messages[].content` | `object` | opcional | — | | `messages[].buttonOrListid` | `string` | opcional | — | | `messages[].reactions` | `array` | opcional | — | | `messages[].choices` | `any` | opcional | Opções armazenadas de menus/enquetes; estrutura depende do tipo e pode ser null. | | `messages[].fileURL` | `string` | opcional | — | | `messages[].mediaUrl` | `string` | opcional | — | | `returnedMessages` | `integer` | obrigatório | — | | `limit` | `integer` | obrigatório | — | | `offset` | `integer` | obrigatório | — | | `hasMore` | `boolean` | obrigatório | — | | `nextOffset` | `integer` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "hasMore": false, "limit": 0, "messages": [], "offset": 0, "returnedMessages": 0 } ``` ## Resposta 400 invalid_limit ou invalid_chatid. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/find" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "chatid": "12025550123", "limit": 20, "offset": 0 }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/find"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "chatid": "12025550123", "limit": 20, "offset": 0 }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-message-status.md # Consultar resultado da mensagem `GET /message/status/{id}` Estados internos em minúsculas; usar para reconciliar resultado ambíguo. Preferir ID bruto messageid devolvido no envio. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar resultado da mensagem | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | — | | `status` | `string` | obrigatório | Estado interno, em minúsculas: sending, unknown, failed, sent, delivered, read, played ou received. | | `failure` | `string` | obrigatório | — | | `fromMe` | `boolean` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `deliveredAt` | `integer / null` | opcional | — | | `readAt` | `integer / null` | opcional | — | | `playedAt` | `integer / null` | opcional | — | | `revokedAt` | `integer / null` | opcional | — | | `deletedForMeAt` | `integer / null` | opcional | — | | `editedAt` | `integer / null` | opcional | — | | `editCount` | `integer` | opcional | — | | `reactions` | `array / null` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "failure": "valor-de-exemplo", "fromMe": false, "id": "MENSAGEM_DE_TESTE", "status": "valor-de-exemplo", "timestamp": 1789603200 } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/message/status/${ID}" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/status/{id}"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-stored-messages.md # Listar mensagens no formato interno `GET /v1/messages` Até 200, sem offset. Para paginação e formato legado use /message/find. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de consulta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `limit` | `integer` | opcional | Padrão: `50`. Mínimo: `1`. Máximo: `200` | | `chatid` | `string` | opcional | — | | `excludeHistory` | `boolean` | opcional | Padrão: `false` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Listar mensagens no formato interno | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `messages` | `array` | obrigatório | — | | `messages[].id` | `string` | opcional | — | | `messages[].chatid` | `string` | opcional | — | | `messages[].fromMe` | `boolean` | opcional | — | | `messages[].status` | `string` | opcional | — | | `messages[].timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `hasMore` | `boolean` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "hasMore": false, "messages": [] } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/messages" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/messages"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/download-message-media.md # Obter link assinado de mídia `POST /message/download` Pode buscar mídia no WhatsApp e pedir reenvio ao celular; não é uma consulta sem efeitos. Link vence com retenção de 48 h, use expiresAt. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | ## Resposta 200 Obter link assinado de mídia | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `fileURL` | `string` | obrigatório | — | | `url` | `string` | obrigatório | — | | `mimetype` | `string` | obrigatório | — | | `mimeType` | `string` | obrigatório | — | | `fileName` | `string` | obrigatório | — | | `size` | `integer` | obrigatório | — | | `expiresAt` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `messageid` | `string` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "expiresAt": "2026-09-17T00:00:00Z", "fileName": "valor-de-exemplo", "fileURL": "valor-de-exemplo", "messageid": "MENSAGEM_DE_TESTE", "mimeType": "valor-de-exemplo", "mimetype": "valor-de-exemplo", "size": 0, "url": "valor-de-exemplo" } ``` ## Resposta 400 invalid_id. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 message_not_found ou media_unavailable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 media_reupload_pending; aguardar reenvio ao celular. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 media_too_large; limite 64 MiB. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 not_media. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/download" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "id": "MENSAGEM_DE_TESTE" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/download"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "id": "MENSAGEM_DE_TESTE" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Mídia](https://wpp.atendro.cloud/docs/api/midia.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-signed-media.md # Ler bytes pelo link assinado `GET /v1/media/{token}` Sem header token: a credencial é o token na URL assinada devolvida pela API. Não registrar/compartilhar o link. Expirado ou inválido retorna 404. Não aceita upload. ## Autenticação URL assinada: utilize o `fileURL` completo recebido no download, dentro de sua validade. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `token` | `string` | obrigatório | Token assinado do fileURL; usar a URL inteira devolvida pelo download. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Bytes da mídia; Content-Length presente. Tipos passivos inline; conteúdo ativo vira attachment/application/octet-stream com CSP sandbox. Conteúdo: `application/octet-stream`, `image/*`, `audio/*`, `video/*`, `application/pdf`. ## Resposta 404 Link inválido, expirado ou mídia não encontrada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/media/${TOKEN}" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/media/{token}"; path = path.replace("{token}", encodeURIComponent(process.env.TOKEN)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.arrayBuffer(); ``` ## Relacionados - [Mídia](https://wpp.atendro.cloud/docs/api/midia.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/mark-messages-read.md # Enviar recibos de leitura por ID `POST /message/markread` Até 1000 IDs; mensagens próprias e desconhecidas são ignoradas. Afeta leitura no WhatsApp. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string / array` | obrigatório | — | ## Resposta 200 Enviar recibos de leitura por ID | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `marked` | `array` | obrigatório | — | | `count` | `integer` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "count": 0, "marked": [], "success": true } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/message/markread" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "id": [ "MENSAGEM_DE_TESTE" ] }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/message/markread"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "id": [ "MENSAGEM_DE_TESTE" ] }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Leitura](https://wpp.atendro.cloud/docs/api/leitura.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/mark-chat-read.md # Marcar recebidas do chat como lidas `POST /chat/read` Envia recibo para até 100 mensagens ainda não lidas. read=false retorna marked=0 e note; não há suporte a marcar como não lido. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `read` | `boolean` | opcional | Ausente equivale a true; false não marca como não lido e retorna marked=0 com note. Padrão: `true` | ## Resposta 200 Marcar recebidas do chat como lidas | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `marked` | `integer` | obrigatório | — | | `note` | `string` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "marked": 0, "success": true } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/chat/read" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "number": "12025550123", "read": true }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/chat/read"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "number": "12025550123", "read": true }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Leitura](https://wpp.atendro.cloud/docs/api/leitura.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/check-numbers.md # Verificar números no WhatsApp `POST /chat/check` 1–50 telefones; number é alias singular de numbers. Exige sessão conectada. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | condicional | Um telefone com DDI. | | `numbers` | `string / array` | condicional | — | Pelo menos uma destas combinações deve ser válida: - `number` - `numbers` ## Resposta 200 Verificar números no WhatsApp | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `[].query` | `string` | obrigatório | — | | `[].exists` | `boolean` | obrigatório | — | | `[].numberExists` | `boolean` | obrigatório | — | | `[].jid` | `string` | obrigatório | — | | `[].data` | `object` | obrigatório | — | | `[].data.exists` | `boolean` | opcional | — | | `[].data.jid` | `string` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json [] ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/chat/check" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "numbers": [ "12025550123" ] }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/chat/check"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "numbers": [ "12025550123" ] }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-chat-details.md # Obter identidade e foto `POST /chat/details` Foto em cache por 24 h; campos vazios dependem de privacidade do WhatsApp. Não devolver dados de terceiros em logs. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | ## Resposta 200 Obter identidade e foto | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `jid` | `string` | obrigatório | — | | `exists` | `boolean` | obrigatório | — | | `name` | `string` | opcional | — | | `pushName` | `string` | opcional | — | | `displayName` | `string` | opcional | — | | `verifiedName` | `string` | opcional | — | | `isBusiness` | `boolean` | opcional | — | | `profilePicUrl` | `string` | obrigatório | — | | `profilePictureUrl` | `string` | opcional | — | | `imagePreview` | `string` | opcional | — | | `pictureId` | `string` | opcional | — | | `imageState` | `string` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "exists": false, "jid": "", "profilePicUrl": "" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 number_not_on_whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/chat/details" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "number": "12025550123" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/chat/details"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "number": "12025550123" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/find-chats.md # Listar conversas conhecidas `POST /chat/find` Não consulta histórico remoto sob demanda. wa_lastMsgTimestamp e wa_lastMessageTime estão em segundos. Sem filtros de lead/etiqueta. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo opcional. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `limit` | `integer / string` | opcional | 0/ausente retorna até 5000. Padrão: `5000` | | `offset` | `integer / string` | opcional | Deslocamento da página. | | `wa_isGroup` | `boolean / string / integer / null` | opcional | — | | `includeLeft` | `boolean / string / integer / null` | opcional | — | ## Resposta 200 Listar conversas conhecidas | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `chats` | `array` | obrigatório | — | | `chats[].id` | `string` | obrigatório | — | | `chats[].wa_chatid` | `string` | obrigatório | — | | `chats[].name` | `string` | opcional | — | | `chats[].wa_name` | `string` | opcional | — | | `chats[].wa_contactName` | `string` | opcional | — | | `chats[].wa_isGroup` | `boolean` | obrigatório | — | | `chats[].wa_unreadCount` | `integer` | opcional | — | | `chats[].wa_archived` | `boolean` | opcional | — | | `chats[].wa_lastMsgTimestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `chats[].wa_lastMessageTime` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `chats[].owner` | `string` | opcional | — | | `chats[].phone` | `string` | opcional | Vazio para grupo ou LID sem telefone conhecido. | | `chats[].pictureId` | `string` | opcional | — | | `chats[].wa_isGroup_announce` | `boolean` | opcional | — | | `chats[].participantCount` | `integer` | opcional | — | | `chats[].topic` | `string` | opcional | — | | `hasMore` | `boolean` | obrigatório | — | | `pagination` | `object` | obrigatório | — | | `pagination.limit` | `integer` | obrigatório | — | | `pagination.offset` | `integer` | obrigatório | — | | `pagination.returned` | `integer` | obrigatório | — | | `nextOffset` | `integer` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "chats": [], "hasMore": false, "pagination": { "limit": 0, "offset": 0, "returned": 0 } } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/chat/find" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "limit": 20, "offset": 0 }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/chat/find"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "limit": 20, "offset": 0 }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Conversas e consultas](https://wpp.atendro.cloud/docs/api/consultas.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-groups.md # Listar grupos sincronizados `GET /group/list` Contrato implementado; homologação real de grupos pendente. force=true consulta WhatsApp; noparticipants=true omite Participants. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de consulta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `force` | `boolean` | opcional | Padrão: `false` | | `noparticipants` | `boolean` | opcional | Padrão: `false` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Listar grupos sincronizados | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groups` | `array` | obrigatório | — | | `groups[].JID` | `string` | obrigatório | — | | `groups[].Name` | `string` | obrigatório | — | | `groups[].Topic` | `string` | opcional | — | | `groups[].OwnerJID` | `string` | opcional | — | | `groups[].OwnerPN` | `string` | opcional | — | | `groups[].IsLocked` | `boolean` | opcional | — | | `groups[].IsAnnounce` | `boolean` | opcional | — | | `groups[].AddressingMode` | `string` | opcional | — | | `groups[].ParticipantCount` | `integer` | obrigatório | — | | `groups[].Participants` | `array` | opcional | — | | `groups[].Participants[].JID` | `string` | obrigatório | — | | `groups[].Participants[].PhoneNumber` | `string` | opcional | — | | `groups[].Participants[].LID` | `string` | opcional | — | | `groups[].Participants[].IsAdmin` | `boolean` | obrigatório | — | | `groups[].Participants[].IsSuperAdmin` | `boolean` | obrigatório | — | | `groups[].Participants[].DisplayName` | `string` | obrigatório | — | | `groups[].Participants[].Error` | `integer` | obrigatório | Código por participante; 0 indica ausência de erro registrado. | | `groups[].invite_link` | `string` | obrigatório | Vazio se não solicitado ou sem permissão de admin. | | `groups[].PictureID` | `string` | opcional | — | | `groups[].lastMessageAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `groups[].syncedAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `groups[].left` | `boolean` | opcional | — | | `groups[].GroupCreated` | `string` | opcional | RFC 3339. Formato: `date-time` | Exemplo ilustrativo, com valores sintéticos: ```json { "groups": [] } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Sessão desconectada/ocupada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/group/list" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/list"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-group-info.md # Consultar grupo `POST /group/info` Cache de 10 min; force=true atualiza. getInviteLink só retorna link para administrador. getRequestsParticipants ignorado. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `force` | `boolean / string / integer / null` | opcional | — | | `getInviteLink` | `boolean / string / integer / null` | opcional | — | | `getRequestsParticipants` | `any` | opcional | Aceito e ignorado. | ## Resposta 200 Consultar grupo | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `JID` | `string` | obrigatório | — | | `Name` | `string` | obrigatório | — | | `Topic` | `string` | opcional | — | | `OwnerJID` | `string` | opcional | — | | `OwnerPN` | `string` | opcional | — | | `IsLocked` | `boolean` | opcional | — | | `IsAnnounce` | `boolean` | opcional | — | | `AddressingMode` | `string` | opcional | — | | `ParticipantCount` | `integer` | obrigatório | — | | `Participants` | `array` | opcional | — | | `Participants[].JID` | `string` | obrigatório | — | | `Participants[].PhoneNumber` | `string` | opcional | — | | `Participants[].LID` | `string` | opcional | — | | `Participants[].IsAdmin` | `boolean` | obrigatório | — | | `Participants[].IsSuperAdmin` | `boolean` | obrigatório | — | | `Participants[].DisplayName` | `string` | obrigatório | — | | `Participants[].Error` | `integer` | obrigatório | Código por participante; 0 indica ausência de erro registrado. | | `invite_link` | `string` | obrigatório | Vazio se não solicitado ou sem permissão de admin. | | `PictureID` | `string` | opcional | — | | `lastMessageAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `syncedAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `left` | `boolean` | opcional | — | | `GroupCreated` | `string` | opcional | RFC 3339. Formato: `date-time` | Exemplo ilustrativo, com valores sintéticos: ```json { "JID": "", "Name": "valor-de-exemplo", "ParticipantCount": 0, "invite_link": "" } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Sessão desconectada/ocupada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/group/info" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "groupjid": "120363000000000001@g.us", "force": false }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/info"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "groupjid": "120363000000000001@g.us", "force": false }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/create-group.md # Criar grupo `POST /group/create` Nome até 100 caracteres e até 50 participantes na criação. Conferir Error por participante. Exige autorização para grupo de teste. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `name` | `string` | obrigatório | Comprimento mínimo: `1`. Comprimento máximo: `100` | | `participants` | `array` | obrigatório | Mínimo de itens: `1`. Máximo de itens: `50` | ## Resposta 200 Criar grupo | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `JID` | `string` | obrigatório | — | | `Name` | `string` | obrigatório | — | | `Topic` | `string` | opcional | — | | `OwnerJID` | `string` | opcional | — | | `OwnerPN` | `string` | opcional | — | | `IsLocked` | `boolean` | opcional | — | | `IsAnnounce` | `boolean` | opcional | — | | `AddressingMode` | `string` | opcional | — | | `ParticipantCount` | `integer` | obrigatório | — | | `Participants` | `array` | opcional | — | | `Participants[].JID` | `string` | obrigatório | — | | `Participants[].PhoneNumber` | `string` | opcional | — | | `Participants[].LID` | `string` | opcional | — | | `Participants[].IsAdmin` | `boolean` | obrigatório | — | | `Participants[].IsSuperAdmin` | `boolean` | obrigatório | — | | `Participants[].DisplayName` | `string` | obrigatório | — | | `Participants[].Error` | `integer` | obrigatório | Código por participante; 0 indica ausência de erro registrado. | | `invite_link` | `string` | obrigatório | Vazio se não solicitado ou sem permissão de admin. | | `PictureID` | `string` | opcional | — | | `lastMessageAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `syncedAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `left` | `boolean` | opcional | — | | `GroupCreated` | `string` | opcional | RFC 3339. Formato: `date-time` | Exemplo ilustrativo, com valores sintéticos: ```json { "JID": "", "Name": "valor-de-exemplo", "ParticipantCount": 0, "invite_link": "" } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/group/create" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "name": "Grupo de teste", "participants": [ "12025550123" ] }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/create"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "name": "Grupo de teste", "participants": [ "12025550123" ] }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/update-group-participants.md # Alterar participantes `POST /group/updateParticipants` add/remove/promote/demote. approve/reject retornam 400 invalid_action. Conferir Error por participante e atualizar o grupo. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `action` | `string` | obrigatório | Valores: `"add"`, `"remove"`, `"promote"`, `"demote"` | | `participants` | `array` | obrigatório | Mínimo de itens: `1` | ## Resposta 200 Alterar participantes | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupUpdated` | `array` | obrigatório | — | | `groupUpdated[].JID` | `string` | obrigatório | — | | `groupUpdated[].Error` | `integer` | obrigatório | — | | `needs_refresh` | `boolean` | obrigatório | Valores: `true` | Exemplo ilustrativo, com valores sintéticos: ```json { "groupUpdated": [], "needs_refresh": true } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/group/updateParticipants" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "groupjid": "120363000000000001@g.us", "action": "add", "participants": [ "12025550123" ] }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/updateParticipants"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "groupjid": "120363000000000001@g.us", "action": "add", "participants": [ "12025550123" ] }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/update-group-name.md # Alterar nome do grupo `POST /group/updateName` Nome até 100 caracteres. Efeito real em grupo; homologação de laboratório pendente. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `name` | `string` | obrigatório | Comprimento mínimo: `1`. Comprimento máximo: `100` | ## Resposta 200 Alterar nome do grupo | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `needs_refresh` | `boolean` | obrigatório | Valores: `true` | | `pictureId` | `string` | opcional | Presente na atualização de imagem. | Exemplo ilustrativo, com valores sintéticos: ```json { "needs_refresh": true, "response": "Operação concluída" } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/group/updateName" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "groupjid": "120363000000000001@g.us", "name": "Grupo de teste atualizado" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/updateName"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "groupjid": "120363000000000001@g.us", "name": "Grupo de teste atualizado" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/update-group-image.md # Alterar imagem do grupo `POST /group/updateImage` JPEG/PNG/GIF até 8 MiB; corpo JSON até 12 MiB; convertido em JPEG até 640×640. remove/delete removem a foto. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `image` | `string` | obrigatório | Data URI/base64/URL permitida (JPEG, PNG, GIF; até 8 MiB), ou remove/delete. Convertida para JPEG até 640×640. Comprimento mínimo: `1` | ## Resposta 200 Alterar imagem do grupo | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `needs_refresh` | `boolean` | obrigatório | Valores: `true` | | `pictureId` | `string` | opcional | Presente na atualização de imagem. | Exemplo ilustrativo, com valores sintéticos: ```json { "needs_refresh": true, "response": "Operação concluída" } ``` ## Resposta 400 Grupo, participantes, nome ou imagem inválidos. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 not_in_group ou not_admin. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 group_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 Conflito de sessão ou idempotency_in_progress; respeitar o código error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 413 image_too_large ou body_too_large. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 415 invalid_image. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 Falha semântica da operação ou idempotency_mismatch. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 429 rate_limited, Retry-After=30. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/group/updateImage" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "groupjid": "120363000000000001@g.us", "image": "https://arquivos.example/grupo.png" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/group/updateImage"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "groupjid": "120363000000000001@g.us", "image": "https://arquivos.example/grupo.png" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Grupos](https://wpp.atendro.cloud/docs/api/grupos.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-instance-proxy.md # Consultar proxy da instância `GET /instance/proxy` Credenciais da URL são redigidas; não há pool gerenciado nem fallback automático. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar proxy da instância | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `mode` | `string` | obrigatório | Valores: `"custom"`, `"none"` | | `effective_mode` | `string` | obrigatório | Valores: `"custom"`, `"none"` | | `effective_detail` | `string` | opcional | Valores: `"direct"`, `"instance"`, `"sealed"` | | `fallback` | `object` | obrigatório | — | | `fallback.active` | `boolean` | opcional | Valores: `false` | | `fallback.reason` | `string` | opcional | — | | `fallback.since` | `integer` | opcional | — | | `proxy_url` | `string` | obrigatório | Credenciais redigidas. | | `proxy_fallback` | `string` | opcional | Valores: `"never"` | | `managed` | `boolean` | opcional | Valores: `false` | | `last_test_at` | `integer` | opcional | Unix em milissegundos. | | `last_test_error` | `string` | opcional | — | | `validation_error` | `boolean` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "effective_mode": "custom", "fallback": { "active": false, "reason": "valor-de-exemplo", "since": 0 }, "mode": "custom", "proxy_url": "valor-de-exemplo" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/instance/proxy" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/proxy"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Proxy da instância](https://wpp.atendro.cloud/docs/api/proxy.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/set-instance-proxy.md # Configurar proxy ou conexão direta `POST /instance/proxy` custom sonda conectividade antes de gravar. internal significa conexão direta; none exige confirm_no_proxy=true. Mudança pode reiniciar sessão; não usar para testar cadastro. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `mode` | `string` | obrigatório | Valores: `"custom"`, `"none"`, `"internal"` | | `proxy_url` | `string` | condicional | Obrigatória em custom; http/https/socks5/socks5h; sondada antes da gravação. Somente na requisição; não é devolvido | | `confirm_no_proxy` | `boolean` | condicional | Obrigatório true em mode=none. | Quando `mode` = `"custom"`, informe `proxy_url`. Quando `mode` = `"none"`, informe `confirm_no_proxy`. ## Resposta 200 Configurar proxy ou conexão direta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `details` | `string` | obrigatório | — | | `proxy` | `object` | obrigatório | Modelo: [Proxy](https://wpp.atendro.cloud/docs/modelos/proxy.md). | | `restart_requested` | `boolean` | obrigatório | — | Exemplo ilustrativo, com valores sintéticos: ```json { "details": "valor-de-exemplo", "proxy": { "effective_mode": "custom", "fallback": { "active": false, "reason": "valor-de-exemplo", "since": 0 }, "mode": "custom", "proxy_url": "valor-de-exemplo" }, "restart_requested": false } ``` ## Resposta 400 proxy_unreachable, invalid_proxy_url, invalid_mode ou confirm_no_proxy_required. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 proxy_required ou secret_unreadable. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/proxy" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "mode": "internal" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/proxy"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "mode": "internal" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Proxy da instância](https://wpp.atendro.cloud/docs/api/proxy.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/configure-webhook.md # Configurar, desativar ou herdar webhook `POST /webhook` Um destino efetivo por instância. Cadastro cria exceção ao global. URL nova começa após o backlog; mesma URL preserva cursor e segredo omitido. action=delete desativa inclusive em mudanças globais; action=inherit volta ao global. groups e call são entregues; qrcode continua ignorado. call é emitido pelas instâncias calls. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `action` | `string` | condicional | Valores: `"add"`, `"update"`, `"delete"`, `"inherit"`. Padrão: `"add"` | | `enabled` | `boolean` | opcional | Padrão: `true` | | `url` | `string` | condicional | HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist. Comprimento máximo: `2048` | | `events` | `string / array` | condicional | Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados. | | `excludeMessages` | `string / array` | opcional | wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo. | | `addUrlEvents` | `boolean / string / integer / null` | opcional | Deve ser false. | | `addUrlTypesMessages` | `boolean / string / integer / null` | opcional | Deve ser false. | | `secret` | `string` | opcional | Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido. Comprimento máximo: `256`. Somente na requisição; não é devolvido | Pelo menos uma destas combinações deve ser válida: - `action`; `action`: Valores: `"delete"`, `"inherit"` - `url`, `events` ## Resposta 200 Cadastrar, atualizar ou remover webhook ### Variante 1 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | ### Variante 2 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `deleted` | `boolean` | obrigatório | Valores: `true` | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "inheritedGlobal": true } ``` ## Resposta 400 invalid_url/event/events/exclude/secret, invalid_action ou unsupported_option. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 503 webhooks_disabled. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/webhook" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "action": "inherit" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/webhook"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "action": "inherit" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-webhook.md # Consultar webhook e entrega `GET /webhook` Sem cadastro: registered=false, webhooks=[]. Com cadastro inclui webhooks=[registro] e deliveryStatus. Nunca revela o secret. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar webhook e entrega | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "inheritedGlobal": true } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/webhook" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/webhook"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-webhook-errors.md # Consultar falhas recentes de entrega `GET /webhook/errors` Falhas deste worker, sem payload; também inclui estado persistido quando houver webhook. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar falhas recentes de entrega | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `errors` | `array` | obrigatório | — | | `worker` | `string` | obrigatório | — | | `lastStatus` | `integer` | opcional | — | | `lastError` | `string` | opcional | — | | `consecutiveFailures` | `integer` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "errors": [], "worker": "worker-1" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/webhook/errors" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/webhook/errors"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-events.md # Inspecionar eventos internos e fila `GET /v1/events` Formato persistido difere do envelope legado entregue. Consultar EVENTS.md. Não expor payloads em logs. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de consulta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `limit` | `integer` | opcional | Padrão: `50`. Mínimo: `1`. Máximo: `200` | | `status` | `string` | opcional | Valores: `"pending"`, `"delivered"`, `"dead"` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Inspecionar eventos internos e fila | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `events` | `array` | obrigatório | — | | `events[].id` | `string` | obrigatório | Formato: `uuid` | | `events[].seq` | `integer` | obrigatório | — | | `events[].type` | `string` | obrigatório | — | | `events[].payload` | `object` | obrigatório | Evento interno; o envelope HTTP entregue ao consumidor é uma projeção. Ver EVENTS.md. | | `events[].createdAt` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `events[].attempts` | `integer` | obrigatório | — | | `events[].status` | `string` | obrigatório | Valores: `"pending"`, `"delivered"`, `"dead"` | | `events[].deliveredAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].deadAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].lastAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].lastStatus` | `integer` | opcional | — | | `events[].lastError` | `string` | opcional | — | | `events[].nextAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `status` | `string` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "events": [] } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/events" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/events"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/replay-event.md # Reenfileirar evento `POST /v1/events/{id}/replay` Reinicia orçamento de tentativas; pode repetir automações no consumidor. Deduplicar pelo ID do evento. Exige avaliação antes do replay real. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Reenfileirar evento | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `event` | `object` | obrigatório | Modelo: [Event](https://wpp.atendro.cloud/docs/modelos/event.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "event": { "attempts": 0, "createdAt": "2026-09-17T00:00:00Z", "id": "00000000-0000-4000-8000-000000000001", "payload": {}, "seq": 0, "status": "pending", "type": "valor-de-exemplo" }, "success": true } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 event_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 event_before_registration; anterior ao webhook atual ou sem webhook. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/events/${ID}/replay" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/events/{id}/replay"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/make-call.md # Iniciar ligação por instância calls `POST /call/make` Exige kind=calls conectado e módulo ligado. Retorna 201 ao iniciar; acompanhar o estado. video: true inicia uma chamada de vídeo (exige capabilities.calls_video). Em instância whatsapp mantém 501 calls_not_supported. Não equivale à chamada sem áudio do provedor legado. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. **Idempotência:** suporta `Idempotency-Key`, com retenção de 24 horas. Preserve a mesma chave, método, caminho e bytes do corpo ao repetir. [Entenda a idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md). ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Idempotency-Key` | `string` | opcional | ASCII visível sem espaços, 1–128. Repetir método, caminho e os mesmos bytes do JSON. 409 em andamento; 422 se mudar a requisição. 504 é guardado e não deve causar reenvio automático. Comprimento mínimo: `1`. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Telefone com DDI (formatação removida pela API) ou JID de conversa direta. Resolve as duas formas do nono dígito brasileiro. Comprimento mínimo: `1` | | `video` | `boolean` | opcional | Inicia uma chamada de vídeo: a oferta anuncia vídeo e o envio da câmera abre quando a mídia começa. Exige capabilities.calls_video=true; caso contrário 501 calls_video_not_supported. Padrão: `false` | ## Resposta 201 Chamada iniciada; acompanhar pelo callId. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_number ou invalid_json. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 number_not_on_whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 line_busy, not_connected, owned_elsewhere ou idempotency_in_progress. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 422 idempotency_mismatch: chave repetida com corpo diferente. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. calls_video_not_supported: video=true sem o recurso no worker. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta 502 call_failed. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 503 retry_later antes de iniciar a chamada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/call/make" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: $IDEMPOTENCY_KEY" \ --data '{ "number": "12025550123" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/make"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json", "Idempotency-Key": process.env.IDEMPOTENCY_KEY }, body: JSON.stringify({ "number": "12025550123" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/configure-global-webhook.md # Salvar ou remover webhook global `POST /v1/webhook` Configuração persistida por servidor. Instâncias sem exceção herdam automaticamente. Atualização transacional preserva configurações próprias. action=delete limpa o global; a configuração salva prevalece sobre bootstrap por ambiente. Segredo nunca é devolvido. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `action` | `string` | condicional | Valores: `"add"`, `"update"`, `"delete"`. Padrão: `"add"` | | `enabled` | `boolean` | opcional | Padrão: `true` | | `url` | `string` | condicional | HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist. Comprimento máximo: `2048` | | `events` | `string / array` | condicional | Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados. | | `excludeMessages` | `string / array` | opcional | wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo. | | `addUrlEvents` | `boolean / string / integer / null` | opcional | Deve ser false. | | `addUrlTypesMessages` | `boolean / string / integer / null` | opcional | Deve ser false. | | `secret` | `string` | opcional | Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido. Comprimento máximo: `256`. Somente na requisição; não é devolvido | Pelo menos uma destas combinações deve ser válida: - `action`; `action`: Valor fixo: `"delete"` - `url`, `events` ## Resposta 200 Salvar ou remover webhook global | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `ignoredEvents` | `array` | opcional | — | | `scope` | `string` | obrigatório | Valor fixo: `"server"` | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "scope": "server", "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "secretSealed": true, "excludeMessages": [], "ignoredEvents": [] } ``` ## Resposta 400 invalid_url/event/events/exclude/secret, invalid_action ou unsupported_option. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 503 webhooks_disabled. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/webhook" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "action": "update", "url": "https://seu-atendro.example/webhooks/atendrozap", "secret": "", "events": [ "connection", "messages", "messages_update", "messages_edit", "groups" ], "enabled": true }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/webhook"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "action": "update", "url": "https://seu-atendro.example/webhooks/atendrozap", "secret": "", "events": [ "connection", "messages", "messages_update", "messages_edit", "groups" ], "enabled": true }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-global-webhook.md # Consultar webhook global `GET /v1/webhook` Configuração persistida por servidor. Instâncias sem exceção herdam automaticamente. Atualização transacional preserva configurações próprias. action=delete limpa o global; a configuração salva prevalece sobre bootstrap por ambiente. Segredo nunca é devolvido. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar webhook global | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `ignoredEvents` | `array` | opcional | — | | `scope` | `string` | obrigatório | Valor fixo: `"server"` | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "scope": "server", "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "secretSealed": true, "excludeMessages": [], "ignoredEvents": [] } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/webhook" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/webhook"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-configure-webhook.md # Configurar, desativar ou herdar webhook por ID `POST /v1/instances/{id}/webhook` Um destino efetivo por instância. Cadastro cria exceção ao global. URL nova começa após o backlog; mesma URL preserva cursor e segredo omitido. action=delete desativa inclusive em mudanças globais; action=inherit volta ao global. groups e call são entregues; qrcode continua ignorado. call é emitido pelas instâncias calls. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `action` | `string` | condicional | Valores: `"add"`, `"update"`, `"delete"`, `"inherit"`. Padrão: `"add"` | | `enabled` | `boolean` | opcional | Padrão: `true` | | `url` | `string` | condicional | HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist. Comprimento máximo: `2048` | | `events` | `string / array` | condicional | Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados. | | `excludeMessages` | `string / array` | opcional | wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo. | | `addUrlEvents` | `boolean / string / integer / null` | opcional | Deve ser false. | | `addUrlTypesMessages` | `boolean / string / integer / null` | opcional | Deve ser false. | | `secret` | `string` | opcional | Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido. Comprimento máximo: `256`. Somente na requisição; não é devolvido | Pelo menos uma destas combinações deve ser válida: - `action`; `action`: Valores: `"delete"`, `"inherit"` - `url`, `events` ## Resposta 200 Cadastrar, atualizar ou remover webhook ### Variante 1 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | ### Variante 2 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `deleted` | `boolean` | obrigatório | Valores: `true` | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "inheritedGlobal": true } ``` ## Resposta 400 invalid_url/event/events/exclude/secret, invalid_action ou unsupported_option. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta 503 webhooks_disabled. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/webhook" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "action": "inherit" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/webhook"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "action": "inherit" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-get-webhook.md # Consultar webhook e entrega por ID `GET /v1/instances/{id}/webhook` Sem cadastro: registered=false, webhooks=[]. Com cadastro inclui webhooks=[registro] e deliveryStatus. Nunca revela o secret. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar webhook e entrega | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | Exemplo ilustrativo, com valores sintéticos: ```json { "registered": true, "url": "https://seu-atendro.example/webhooks/atendrozap", "events": [ "connection", "messages" ], "enabled": true, "hasSecret": true, "inheritedGlobal": true } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/instances/${ID}/webhook" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/webhook"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-get-webhook-errors.md # Consultar falhas recentes de entrega por ID `GET /v1/instances/{id}/webhook/errors` Falhas deste worker, sem payload; também inclui estado persistido quando houver webhook. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Consultar falhas recentes de entrega | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `errors` | `array` | obrigatório | — | | `worker` | `string` | obrigatório | — | | `lastStatus` | `integer` | opcional | — | | `lastError` | `string` | opcional | — | | `consecutiveFailures` | `integer` | opcional | — | Exemplo ilustrativo, com valores sintéticos: ```json { "errors": [], "worker": "worker-1" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/instances/${ID}/webhook/errors" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/webhook/errors"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Webhooks e eventos](https://wpp.atendro.cloud/docs/api/webhooks.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/answer-call.md # Atender ligação recebida `POST /call/answer` Token da instância calls que possui a chamada. Corpo com callId; a operação renova o lease antes do efeito externo. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | ## Resposta 200 Estado da chamada após a ação. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "inbound", "number": "12025550123", "status": "connecting", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_json ou invalid_call_id. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta 503 retry_later. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/call/answer" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callId": "CHAMADA_DE_TESTE" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/answer"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callId": "CHAMADA_DE_TESTE" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/reject-call.md # Recusar ligação recebida `POST /call/reject` Token da instância calls que possui a chamada. Corpo com callId; a operação renova o lease antes do efeito externo. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | ## Resposta 200 Estado da chamada após a ação. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "inbound", "number": "12025550123", "status": "ended", "startedAt": "2026-09-18T00:00:00Z", "endedAt": "2026-09-18T00:00:10Z", "endedBy": "local", "endReason": "rejected" } ``` ## Resposta 400 invalid_json ou invalid_call_id. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta 503 retry_later. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/call/reject" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callId": "CHAMADA_DE_TESTE" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/reject"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callId": "CHAMADA_DE_TESTE" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/hangup-call.md # Encerrar ligação `POST /call/hangup` Token da instância calls que possui a chamada. Corpo com callId; a operação renova o lease antes do efeito externo. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | ## Resposta 200 Estado da chamada após a ação. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ended", "startedAt": "2026-09-18T00:00:00Z", "endedAt": "2026-09-18T00:00:10Z", "endedBy": "local", "endReason": "hangup" } ``` ## Resposta 400 invalid_json ou invalid_call_id. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta 503 retry_later. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/call/hangup" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callId": "CHAMADA_DE_TESTE" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/hangup"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callId": "CHAMADA_DE_TESTE" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-active-calls.md # Listar ligações ativas `GET /call/active` Lista as chamadas vivas da instância calls neste worker. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Chamadas vivas. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `calls` | `array` | obrigatório | — | | `calls[].callId` | `string` | obrigatório | — | | `calls[].direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `calls[].number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `calls[].jid` | `string` | opcional | — | | `calls[].status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `calls[].startedAt` | `string` | obrigatório | Formato: `date-time` | | `calls[].answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `calls[].endedAt` | `string` | opcional | Formato: `date-time` | | `calls[].endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `calls[].endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `calls[].answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `calls[].mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `calls[].durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `calls[].recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `calls[].video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `calls[].videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `calls[].videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `calls[].incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `calls[].callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `calls[].rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `calls[].autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "calls": [ { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ] } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/active" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/active"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-call.md # Consultar estado de ligação `GET /call/{id}` Consulta a chamada viva ou seu histórico persistente, com recording (WAV) e videoRecording opcional (MP4) independentes. Continua disponível após desconexão/reinício e após expirar os arquivos. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | callId retornado pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Estado da chamada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/${ID}" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/{id}"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/stream-call-audio.md # Abrir ponte WebSocket de áudio `GET /call/{id}/audio` Upgrade WebSocket. PCM s16le mono 16 kHz binário nos dois sentidos; origem validada por ATENDROZAP_CALLS_AUDIO_ORIGINS. Aceita token no header ou na query somente nesta rota. O console faz proxy com o header e guarda o token fora do navegador. Perder o socket mantém a chamada por 30 segundos aguardando reconexão com o mesmo callId; um novo socket de áudio cancela o prazo e substitui o primeiro. Sem retorno, encerra com hangup/local. Para desligar voluntariamente, use POST /call/hangup. Códigos 4000 encerrada, 4001 PCM ímpar, 4002 falha de escrita, 4003 substituído. ## Autenticação Header aceito: `token`. Use o token da instância. Alternativa exclusiva desta ponte: `?token=`. O proxy do console usa o header no backend; prefira esse fluxo para manter a credencial fora do navegador. Não registrar a query. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | callId retornado pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 101 WebSocket estabelecido; mensagens binárias PCM. ## Resposta 400 Upgrade WebSocket inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 Origem de navegador não autorizada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; /call/make também recusa instância whatsapp. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### Go (backend) ```go // github.com/coder/websocket; credencial somente no backend. endpoint, err := url.Parse(os.Getenv("ATENDROZAP_URL")) if err != nil { return err } endpoint.Path = "/call/" + os.Getenv("CALL_ID") + "/audio" endpoint.Scheme = "wss" conn, _, err := websocket.Dial(ctx, endpoint.String(), &websocket.DialOptions{ HTTPHeader: http.Header{"token": {os.Getenv("ATENDROZAP_INSTANCE_TOKEN")}}, }) if err != nil { return err } defer conn.CloseNow() // Enviar e receber mensagens binárias PCM s16le, mono, 16 kHz. // No navegador, usar a ponte autenticada do console para manter o token privado. ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/list-call-history.md # Consultar histórico de chamadas `GET /call/history` Histórico persistente da instância, do mais novo ao mais antigo. Independente da conexão e da retenção de eventos/áudio. Paginação por before/nextCursor; não aceita token na query. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de consulta | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `limit` | `integer` | opcional | Itens por página. Padrão: `50`. Mínimo: `1`. Máximo: `100` | | `before` | `string` | opcional | Cursor nextCursor da página anterior. | | `direction` | `string` | opcional | Direção da chamada. Valores: `"inbound"`, `"outbound"` | | `answered` | `boolean` | opcional | Filtra pela ocorrência do atendimento. | | `status` | `string` | opcional | Estado atual/final. Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `from` | `string` | opcional | Início do intervalo, inclusivo. Formato: `date-time` | | `to` | `string` | opcional | Fim do intervalo, exclusivo. Formato: `date-time` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Página do histórico. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `calls` | `array` | obrigatório | — | | `calls[].callId` | `string` | obrigatório | — | | `calls[].direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `calls[].number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `calls[].jid` | `string` | opcional | — | | `calls[].status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `calls[].startedAt` | `string` | obrigatório | Formato: `date-time` | | `calls[].answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `calls[].endedAt` | `string` | opcional | Formato: `date-time` | | `calls[].endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `calls[].endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `calls[].answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `calls[].mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `calls[].durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `calls[].recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `calls[].video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `calls[].videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `calls[].videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `calls[].incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `calls[].callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `calls[].rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `calls[].autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | | `hasMore` | `boolean` | obrigatório | — | | `nextCursor` | `string` | obrigatório | Usar como before na próxima página; vazio quando não há mais resultados. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_filter. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/history" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/history"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/download-call-recording.md # Ouvir ou baixar gravação `GET /call/{id}/recording` WAV PCM 16-bit 16 kHz estéreo: atendente à esquerda, contato à direita. Header token obrigatório; query token recusada. Suporta Range. Cache privado desabilitado. Somente no worker onde o arquivo está armazenado; use proxy autenticado no sistema consumidor. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | callId retornado pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Range` | `string` | opcional | Intervalo HTTP de bytes para reprodução/seek. | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Gravação pronta. Conteúdo: `audio/wav`. ## Resposta 206 Intervalo de bytes da gravação. Conteúdo: `audio/wav`. ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found ou recording_not_available. ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state; conferir error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 410 recording_expired: áudio fora do prazo de retenção. ## Resposta 416 Intervalo de bytes inválido. ## Resposta 503 recording_unavailable_on_worker ou recording_file_unavailable. ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/${ID}/recording" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/{id}/recording"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/configure-instance-calls.md # Configurar limite e comportamento das chamadas recebidas da instância `POST /instance/call-settings` Persiste parcialmente callsMaxConcurrent e/ou incomingCallMode, mesmo desconectada, sem iniciar chamadas ou reiniciar a sessão. Campos omitidos permanecem. expectedCallsConfigVersion opcional exige a versão atual e retorna 409 settings_version_conflict em divergência. Cada POST aceito incrementa callsConfigVersion e grava atomicamente call_settings com limite e modo, mesmo repetindo valores. Alterações de modo valem para novas chamadas. O worker local aplica imediatamente; outro worker aplica na renovação do lease. Rejeições automáticas geram histórico e evento, inclusive quando ocupado, sem consumir uma vaga de atendimento. reject_reply somente solicita resposta ao consumidor: a instância calls não envia texto. A integração deve configurar uma conexão de mensagens, deduplicação e fila persistente. Reduzir o limite preserva chamadas vivas. Mais de uma simultânea e atendimento recebido ainda dependem de homologação real. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callsMaxConcurrent` | `integer` | condicional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `incomingCallMode` | `string` | condicional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `expectedCallsConfigVersion` | `integer` | opcional | Comparação condicional opcional. Se diferente da versão salva, retorna 409 settings_version_conflict sem alterar a instância. Enviar junto a pelo menos um campo de configuração. Mínimo: `0`. Formato: `int64` | Pelo menos uma destas combinações deve ser válida: - `callsMaxConcurrent` - `incomingCallMode` ## Resposta 200 Limite e snapshot persistidos na mesma transação; instance.callsMaxConcurrent e instance.callsConfigVersion são os valores canônicos. Compare a versão com respostas e eventos em trânsito. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_calls_max_concurrent (obrigatório, inteiro de 1 a 8), invalid_json ou invalid_body. ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 409 wrong_instance_kind: configuração exclusiva de instâncias calls. ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/instance/call-settings" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callsMaxConcurrent": 2 }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/instance/call-settings"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callsMaxConcurrent": 2 }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/admin-configure-instance-calls.md # Configurar limite e comportamento das chamadas recebidas da instância `POST /v1/instances/{id}/call-settings` Persiste parcialmente callsMaxConcurrent e/ou incomingCallMode, mesmo desconectada, sem iniciar chamadas ou reiniciar a sessão. Campos omitidos permanecem. expectedCallsConfigVersion opcional exige a versão atual e retorna 409 settings_version_conflict em divergência. Cada POST aceito incrementa callsConfigVersion e grava atomicamente call_settings com limite e modo, mesmo repetindo valores. Alterações de modo valem para novas chamadas. O worker local aplica imediatamente; outro worker aplica na renovação do lease. Rejeições automáticas geram histórico e evento, inclusive quando ocupado, sem consumir uma vaga de atendimento. reject_reply somente solicita resposta ao consumidor: a instância calls não envia texto. A integração deve configurar uma conexão de mensagens, deduplicação e fila persistente. Reduzir o limite preserva chamadas vivas. Mais de uma simultânea e atendimento recebido ainda dependem de homologação real. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Identificador devolvido pela API. Comprimento mínimo: `1`. Formato: `uuid` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callsMaxConcurrent` | `integer` | condicional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `incomingCallMode` | `string` | condicional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `expectedCallsConfigVersion` | `integer` | opcional | Comparação condicional opcional. Se diferente da versão salva, retorna 409 settings_version_conflict sem alterar a instância. Enviar junto a pelo menos um campo de configuração. Mínimo: `0`. Formato: `int64` | Pelo menos uma destas combinações deve ser válida: - `callsMaxConcurrent` - `incomingCallMode` ## Resposta 200 Limite e snapshot persistidos na mesma transação; instance.callsMaxConcurrent e instance.callsConfigVersion são os valores canônicos. Compare a versão com respostas e eventos em trânsito. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_calls_max_concurrent (obrigatório, inteiro de 1 a 8), invalid_json ou invalid_body. ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 instance_not_found. ## Resposta 409 wrong_instance_kind: configuração exclusiva de instâncias calls. ## Resposta 502 storage_unavailable (Retry-After=5). Algumas rotas também retornam 502 por falha da conexão/mídia; consultar error. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "storage_unavailable" } ``` ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/v1/instances/${ID}/call-settings" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callsMaxConcurrent": 2 }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/instances/{id}/call-settings"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callsMaxConcurrent": 2 }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/call-video.md # Ligar, aceitar ou desligar o vídeo de uma ligação `POST /call/video` Ação de vídeo numa chamada atendida da instância calls. Exige capabilities.calls_video=true. start em chamada de áudio pede vídeo ao contato e fica pending até a resposta; em chamada que já negociou vídeo reabre a câmera. accept responde ao pedido do contato (videoState.requested). stop desliga a câmera deste lado sem encerrar a chamada nem o vídeo do contato. Os quadros trafegam por GET /call/{id}/video. Recurso experimental: o caminho de mídia de vídeo do motor ainda não foi homologado em laboratório. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Formato: `application/json`. Corpo obrigatório. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | | `action` | `string` | obrigatório | start liga a câmera deste lado: em chamada só de áudio vira pedido ao contato (pending até a resposta); em chamada que já negociou vídeo apenas reabre o fluxo. accept aceita o pedido do contato (videoState.requested). stop desliga a câmera deste lado ou retira o pedido pendente; o vídeo do contato e o áudio continuam. Valores: `"start"`, `"accept"`, `"stop"` | ## Resposta 200 Estado da chamada após a ação, com videoState. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | Exemplo ilustrativo, com valores sintéticos: ```json { "callId": "CHAMADA_DE_TESTE", "direction": "outbound", "number": "12025550123", "status": "ringing", "startedAt": "2026-09-18T00:00:00Z" } ``` ## Resposta 400 invalid_call_id, invalid_video_action ou invalid_json. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou invalid_call_state (chamada não atendida, já encerrada, ou accept sem pedido do contato). | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; calls_video_not_supported: vídeo desligado no worker (ATENDROZAP_CALLS_VIDEO_ENABLED) ou motor sem vídeo. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta 502 call_failed: o motor recusou a transição. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request POST "$ATENDROZAP_URL/call/video" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "callId": "CHAMADA_DE_TESTE", "action": "start" }' ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/video"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "POST", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN, "Content-Type": "application/json" }, body: JSON.stringify({ "callId": "CHAMADA_DE_TESTE", "action": "start" }), }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/stream-call-video.md # Abrir ponte WebSocket de vídeo `GET /call/{id}/video` Upgrade WebSocket. Mensagens binárias nos dois sentidos: uma unidade de acesso H.264 (Annex-B) por mensagem, precedida por cabeçalho de 8 bytes — byte 0 versão (1); byte 1 flags (bit 0 = keyframe, informado na descida); byte 2 orientação da câmera do contato (0..3, descida); byte 3 reservado; bytes 4..7 duração do quadro em microssegundos, big-endian (na subida avança o relógio do fluxo; 0 = passo padrão de 1/30 s). A API não codifica nem decodifica pixels: o cliente usa WebCodecs, ffmpeg ou codec de hardware. Mensagens de texto da API são avisos JSON: {\"event\":\"keyframe\"} quando o contato precisa de um IDR no próximo quadro e {\"event\":\"video\",\"video\":{...}} a cada mudança de videoState (o primeiro aviso é o estado atual). Pode ser aberta antes de haver vídeo: assim a ponte não perde o keyframe que abre o fluxo do contato. Quadros enviados com o fluxo fechado são descartados. Perder o socket mantém a chamada e a negociação de vídeo por 30 segundos aguardando reconexão com o mesmo callId; um novo socket de vídeo cancela o prazo, substitui o primeiro (4003) e pede um keyframe. Sem retorno, encerra com hangup/local. Para desligar só a câmera, use POST /call/video com action: stop. Códigos 4000 encerrada, 4001 cabeçalho inválido, 4002 falha de escrita, 4003 substituído. Mesma autenticação e origens da ponte de áudio. Exige capabilities.calls_video=true. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | callId retornado pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 101 WebSocket estabelecido; mensagens binárias H.264 com cabeçalho e avisos JSON em texto. ## Resposta 400 Upgrade WebSocket inválido. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 403 Origem de navegador não autorizada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 404 call_not_found. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 409 wrong_instance_kind, not_connected, owned_elsewhere ou chamada já encerrada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 501 calls_not_supported: módulo desligado; calls_video_not_supported: vídeo desligado no worker (ATENDROZAP_CALLS_VIDEO_ENABLED) ou motor sem vídeo. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "calls_not_supported" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/${ID}/video" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/{id}/video"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/download-call-video-recording.md # Assistir ou baixar gravação de vídeo `GET /call/{id}/recording/video` MP4 H.264 1280×360 com atendente à esquerda e contato à direita, áudio AAC estéreo. Gerado após o encerramento quando a captura opcional está habilitada; preserva o WAV independente. Header token obrigatório; query token recusada. Suporta Range e cache privado desabilitado. Somente no worker que armazena o arquivo; faça proxy autenticado no backend consumidor. A rota não altera o estado da chamada nem ocupa uma vaga de ligação. ## Autenticação Header obrigatório: `token`. Use o token da instância. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Parâmetros de caminho | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | callId retornado pela API. Comprimento mínimo: `1` | ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | | `Range` | `string` | opcional | Intervalo HTTP de bytes para reprodução/seek. | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Gravação pronta. Conteúdo: `video/mp4`. ## Resposta 206 Intervalo de bytes da gravação. Conteúdo: `video/mp4`. ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta 404 call_not_found ou recording_not_available: inclui vídeo ausente, recording, processing ou failed. ## Resposta 409 wrong_instance_kind: download disponível apenas em instâncias calls; não exige sessão conectada. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Resposta 410 recording_expired: vídeo fora do prazo de retenção. ## Resposta 416 Intervalo de bytes inválido. ## Resposta 503 recording_unavailable_on_worker ou recording_file_unavailable. ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/call/${ID}/recording/video" \ --header "token: $ATENDROZAP_INSTANCE_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/call/{id}/recording/video"; path = path.replace("{id}", encodeURIComponent(process.env.ID)); const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "token": process.env.ATENDROZAP_INSTANCE_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Chamadas de voz e vídeo](https://wpp.atendro.cloud/docs/api/ligacoes.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/api/get-system-status.md # Consultar saúde operacional do worker `GET /v1/system/status` Leitura administrativa de métricas agregadas, sem instâncias individuais, números/JIDs, mensagens, URLs de webhook, tokens, caminhos ou comandos. HTTP 200 informa que o observador respondeu; consultar status/available de cada bloco. As consultas PostgreSQL têm orçamento de 3 s. Process contém métricas Go/API; host vem de arquivo local produzido pelo coletor no host e inclui idade/validade próprias. Arquivo ausente, inválido ou antigo permanece unavailable/stale. Não aceita destino, URL ou caminho pela requisição. Usar a API central com token de monitoramento para acesso de suporte sem fornecer admintoken de cada servidor. ## Autenticação Header obrigatório: `admintoken`. Use o token administrativo do servidor. Base URL: a API do servidor selecionado, como `https://1.atendro.cloud`. O domínio `wpp.atendro.cloud` hospeda a documentação e o console. ## Headers adicionais | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `X-Request-Id` | `string` | opcional | ASCII visível sem espaços, 1–128 caracteres. Inválido/ausente é substituído por UUID. Ecoado na resposta. Comprimento máximo: `128` | ## Corpo da requisição Não há corpo de requisição definido para esta operação. ## Resposta 200 Snapshot agregado; dependências indisponíveis ficam explícitas no corpo. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `database` | `object` | obrigatório | Modelo: [SystemStatusDatabase](https://wpp.atendro.cloud/docs/modelos/system-status-database.md). | | `host` | `object` | obrigatório | Modelo: [HostHealthResult](https://wpp.atendro.cloud/docs/modelos/host-health-result.md). | | `process` | `object` | obrigatório | Processo Go/API: heap e runtimeSys não são RAM usada da VPS; gomaxprocs não mede núcleos físicos nem CPU do host. Modelo: [SystemStatusProcess](https://wpp.atendro.cloud/docs/modelos/system-status-process.md). | | `sampledAt` | `string` | obrigatório | Instante UTC da amostragem do worker. O host tem sampledAt e idade próprios. Formato: `date-time` | | `schemaVersion` | `integer` | obrigatório | Valor fixo: `1`. Mínimo: `0` | | `status` | `string` | obrigatório | HTTP 200 significa que o observador respondeu. Verificar available/status em cada bloco; valores indisponíveis não representam consumo zero. Valores: `"ok"`, `"degraded"` | | `version` | `string` | opcional | — | | `workerId` | `string` | obrigatório | Padrão de formato: `^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$` | | `workload` | `object` | obrigatório | Modelo: [SystemStatusWorkload](https://wpp.atendro.cloud/docs/modelos/system-status-workload.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "database": { "archiver": { "archivedCount": 0, "available": false, "failedCount": 0, "status": "ok" }, "available": false }, "host": { "ageSeconds": 0, "errors": [], "snapshot": { "cpu": { "ioWaitPercent": 0, "logicalCPUs": 0, "stealPercent": 0, "usagePercent": 0 }, "diskIO": { "busyPercent": 0, "inFlight": 0, "readBytesPerSecond": 0, "readsPerSecond": 0, "scope": "root_device", "writeBytesPerSecond": 0, "writesPerSecond": 0 }, "errors": [], "intervalSeconds": 0, "load": { "fifteen": 0, "fifteenPerCPU": 0, "five": 0, "fivePerCPU": 0, "one": 0, "onePerCPU": 0 }, "memory": { "availableBytes": 0, "totalBytes": 0, "usedBytes": 0, "usedPercent": 0 }, "network": { "interfaces": 0, "receivedBytes": 0, "receivedBytesPerSecond": 0, "scope": "all_non_loopback", "transmittedBytes": 0, "transmittedBytesPerSecond": 0 }, "rootFilesystem": { "availableBytes": 0, "availablePercent": 0, "freeBytes": 0, "inodesFree": 0, "inodesTotal": 0, "inodesUsedPercent": 0, "reservedBytes": 0, "totalBytes": 0, "usedBytes": 0, "usedPercent": 0 }, "sampledAt": "2026-09-17T00:00:00Z", "schemaVersion": 1, "source": "host", "swap": { "freeBytes": 0, "totalBytes": 0, "usedBytes": 0, "usedPercent": 0 }, "uptimeSeconds": 0, "validForSeconds": 1 }, "status": "ok" }, "process": { "goVersion": "valor-de-exemplo", "gomaxprocs": 0, "goroutines": 0, "heapAllocBytes": 0, "heapInuseBytes": 0, "runtimeSysBytes": 0, "startedAt": "2026-09-17T00:00:00Z", "uptimeSeconds": 0 }, "sampledAt": "2026-09-17T00:00:00Z", "schemaVersion": 1, "status": "ok", "workerId": "valor-de-exemplo", "workload": { "available": false } } ``` ## Resposta 401 unauthorized: header ausente, inválido ou duplicado. Bearer/query/instancekey não substituem admintoken/token. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | Exemplo ilustrativo, com valores sintéticos: ```json { "error": "unauthorized" } ``` ## Resposta default Falha; usar HTTP status e error. 404 rota inexistente; 405 método inválido com Allow. Ver catálogo no guia de integração. | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Exemplos de requisição Defina as variáveis no ambiente privado e substitua os dados sintéticos antes de usar. Os exemplos não executam operações nesta página. ### cURL ```sh curl --request GET "$ATENDROZAP_URL/v1/system/status" \ --header "admintoken: $ATENDROZAP_ADMIN_TOKEN" ``` ### JavaScript ```javascript const baseUrl = process.env.ATENDROZAP_URL; let path = "/v1/system/status"; const url = new URL(path, baseUrl); const response = await fetch(url, { method: "GET", headers: { "admintoken": process.env.ATENDROZAP_ADMIN_TOKEN }, }); if (!response.ok) { throw new Error(`AtendroZAP: HTTP ${response.status}`); } const result = await response.json(); ``` ## Relacionados - [Diagnóstico](https://wpp.atendro.cloud/docs/api/diagnostico.md) - [Autenticação](https://wpp.atendro.cloud/docs/guias/autenticacao.md) - [Erros e idempotência](https://wpp.atendro.cloud/docs/guias/erros-e-idempotencia.md) --- Fonte: https://wpp.atendro.cloud/docs/modelos/error.md # Error Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `error` | `string` | obrigatório | — | | `message` | `string` | opcional | — | | `messageid` | `string` | opcional | ID para reconciliação quando o resultado é ambíguo. | | `messageId` | `string` | opcional | — | | `id` | `string` | opcional | — | | `provider_code` | `integer` | opcional | — | | `error_key` | `string` | opcional | — | | `error_source` | `string` | opcional | — | | `details` | `object` | opcional | — | | `instance` | `object` | opcional | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "error": { "type": "string" }, "message": { "type": "string" }, "messageid": { "type": "string", "description": "ID para reconciliação quando o resultado é ambíguo." }, "messageId": { "type": "string" }, "id": { "type": "string" }, "provider_code": { "type": "integer" }, "error_key": { "type": "string" }, "error_source": { "type": "string" }, "details": { "type": "object" }, "instance": { "$ref": "#/components/schemas/Instance" } }, "required": [ "error" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/health.md # Health Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"alive"`, `"ready"`, `"not_ready"` | | `reason` | `string` | opcional | Valores: `"database_unreachable"` | ## Definição OpenAPI ```json { "type": "object", "properties": { "status": { "type": "string", "enum": [ "alive", "ready", "not_ready" ] }, "reason": { "type": "string", "enum": [ "database_unreachable" ] } }, "required": [ "status" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/capabilities.md # Capabilities Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `service` | `string` | obrigatório | Valores: `"AtendroZAP"` | | `status` | `string` | obrigatório | Valores: `"laboratory"` | | `worker` | `string` | opcional | — | | `engine` | `object` | opcional | — | | `capabilities` | `object` | obrigatório | — | | `capabilities.calls` | `boolean` | opcional | Habilitado neste worker por ATENDROZAP_CALLS_ENABLED; exige instância calls. | | `capabilities.ptt_transcoding` | `boolean` | opcional | Valores: `false` | | `capabilities.call_history` | `boolean` | opcional | — | | `capabilities.call_recording` | `boolean` | opcional | Gravação automática das chamadas atendidas habilitada neste worker. | | `capabilities.calls_per_instance_limit` | `boolean` | opcional | Permite configurar callsMaxConcurrent por instância, sem reiniciar a sessão. | | `capabilities.calls_video` | `boolean` | opcional | Chamadas de vídeo, upgrade no meio da ligação e ponte GET /call/{id}/video habilitados neste worker por ATENDROZAP_CALLS_VIDEO_ENABLED (exige calls). Recurso experimental até a homologação em laboratório. | | `capabilities.calls_settings_webhook` | `boolean` | opcional | Anuncia call_settings com limite/versionamento em outbox atômica e callsConfigVersion em objetos instance. Exige inscrição explícita em call_settings; connection pode trazer o snapshot opcional em instance. | | `capabilities.calls_video_recording` | `boolean` | opcional | Captura de vídeo e geração de MP4 lado a lado habilitadas neste worker por ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED. Opt-in: requer calls_video, call_recording, FFmpeg e ffprobe. Não implica homologação em celulares reais. | | `capabilities.calls_incoming_policy` | `boolean` | opcional | Permite configurar incomingCallMode, comparar expectedCallsConfigVersion e receber decisões de recusa automática com metadados por chamada. Não garante envio de mensagem pelo consumidor nem homologação de áudio recebido. | | `interactive` | `object` | opcional | — | | `webhookEvents` | `object` | opcional | — | | `webhookEvents.delivered` | `array` | opcional | — | | `webhookEvents.ignored` | `array` | opcional | — | | `instance_kinds` | `array` | opcional | — | | `calls_max_concurrent` | `integer` | opcional | Padrão do servidor usado na criação e em instâncias antigas sem limite próprio. Consulte instance.callsMaxConcurrent para o limite efetivo. Mínimo: `0` | | `calls_recording_retention_days` | `integer` | opcional | Retenção das gravações de áudio em dias; 0 desativa exclusão automática do áudio. Vídeo possui prazo independente. Histórico preservado. Mínimo: `0` | | `calls_video_recording_retention_days` | `integer` | opcional | Retenção das gravações MP4 em dias, contados do encerramento da chamada. Padrão 7, independente do áudio. Histórico preservado. Mínimo: `1`. Máximo: `3650` | | `calls_max_concurrent_range` | `object` | opcional | — | | `calls_max_concurrent_range.min` | `integer` | obrigatório | Valor fixo: `1` | | `calls_max_concurrent_range.max` | `integer` | obrigatório | Valor fixo: `8` | ## Definição OpenAPI ```json { "type": "object", "properties": { "service": { "type": "string", "enum": [ "AtendroZAP" ] }, "status": { "type": "string", "enum": [ "laboratory" ] }, "worker": { "type": "string" }, "engine": { "type": "object" }, "capabilities": { "type": "object", "properties": { "calls": { "type": "boolean", "description": "Habilitado neste worker por ATENDROZAP_CALLS_ENABLED; exige instância calls." }, "ptt_transcoding": { "type": "boolean", "enum": [ false ] }, "call_history": { "type": "boolean" }, "call_recording": { "type": "boolean", "description": "Gravação automática das chamadas atendidas habilitada neste worker." }, "calls_per_instance_limit": { "type": "boolean", "description": "Permite configurar callsMaxConcurrent por instância, sem reiniciar a sessão." }, "calls_video": { "type": "boolean", "description": "Chamadas de vídeo, upgrade no meio da ligação e ponte GET /call/{id}/video habilitados neste worker por ATENDROZAP_CALLS_VIDEO_ENABLED (exige calls). Recurso experimental até a homologação em laboratório." }, "calls_settings_webhook": { "type": "boolean", "description": "Anuncia call_settings com limite/versionamento em outbox atômica e callsConfigVersion em objetos instance. Exige inscrição explícita em call_settings; connection pode trazer o snapshot opcional em instance." }, "calls_video_recording": { "type": "boolean", "description": "Captura de vídeo e geração de MP4 lado a lado habilitadas neste worker por ATENDROZAP_CALLS_VIDEO_RECORDING_ENABLED. Opt-in: requer calls_video, call_recording, FFmpeg e ffprobe. Não implica homologação em celulares reais." }, "calls_incoming_policy": { "type": "boolean", "description": "Permite configurar incomingCallMode, comparar expectedCallsConfigVersion e receber decisões de recusa automática com metadados por chamada. Não garante envio de mensagem pelo consumidor nem homologação de áudio recebido." } }, "additionalProperties": { "type": "boolean" } }, "interactive": { "type": "object", "additionalProperties": { "type": "string" } }, "webhookEvents": { "type": "object", "properties": { "delivered": { "type": "array", "items": { "type": "string" } }, "ignored": { "type": "array", "items": { "type": "string" } } } }, "instance_kinds": { "type": "array", "items": { "type": "string", "enum": [ "whatsapp", "calls" ] } }, "calls_max_concurrent": { "type": "integer", "minimum": 0, "description": "Padrão do servidor usado na criação e em instâncias antigas sem limite próprio. Consulte instance.callsMaxConcurrent para o limite efetivo." }, "calls_recording_retention_days": { "type": "integer", "minimum": 0, "description": "Retenção das gravações de áudio em dias; 0 desativa exclusão automática do áudio. Vídeo possui prazo independente. Histórico preservado." }, "calls_video_recording_retention_days": { "type": "integer", "minimum": 1, "maximum": 3650, "description": "Retenção das gravações MP4 em dias, contados do encerramento da chamada. Padrão 7, independente do áudio. Histórico preservado." }, "calls_max_concurrent_range": { "type": "object", "properties": { "min": { "type": "integer", "const": 1 }, "max": { "type": "integer", "const": 8 } }, "required": [ "min", "max" ] } }, "required": [ "service", "status", "capabilities" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/instance.md # Instance Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Formato: `uuid` | | `name` | `string` | obrigatório | — | | `systemName` | `string` | opcional | — | | `companyId` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"disconnected"`, `"connecting"`, `"connected"` | | `owner` | `string` | obrigatório | — | | `profileName` | `string` | obrigatório | — | | `qrcode` | `string` | obrigatório | PNG em data URI quando há QR vigente; vazio no restante e nas listagens. | | `paircode` | `string` | opcional | — | | `lastDisconnect` | `string` | opcional | RFC 3339. Formato: `date-time` | | `lastDisconnectReason` | `string` | opcional | — | | `disconnectCode` | `string` | opcional | — | | `worker` | `string` | opcional | — | | `limitEnforcement` | `string` | opcional | — | | `limitUntil` | `string` | opcional | RFC 3339. Formato: `date-time` | | `created` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updated` | `string` | opcional | RFC 3339. Formato: `date-time` | | `kind` | `string` | obrigatório | Valores: `"whatsapp"`, `"calls"` | | `callsMaxConcurrent` | `integer` | opcional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `callsConfigVersion` | `integer` | opcional | Versão crescente da configuração de chamadas; presente inclusive 0 em objetos instance de kind=calls. Comparar esta versão entre respostas HTTP e snapshots de webhook para evitar regressões. O campo não pertence às instâncias whatsapp. Mínimo: `0`. Formato: `int64` | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string" }, "systemName": { "type": "string" }, "companyId": { "type": "string" }, "status": { "type": "string", "enum": [ "disconnected", "connecting", "connected" ] }, "owner": { "type": "string" }, "profileName": { "type": "string" }, "qrcode": { "type": "string", "description": "PNG em data URI quando há QR vigente; vazio no restante e nas listagens." }, "paircode": { "type": "string" }, "lastDisconnect": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "lastDisconnectReason": { "type": "string" }, "disconnectCode": { "type": "string" }, "worker": { "type": "string" }, "limitEnforcement": { "type": "string" }, "limitUntil": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "created": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "updated": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "kind": { "type": "string", "enum": [ "whatsapp", "calls" ] }, "callsMaxConcurrent": { "type": "integer", "minimum": 1, "maximum": 8, "description": "Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais." }, "callsConfigVersion": { "type": "integer", "format": "int64", "minimum": 0, "description": "Versão crescente da configuração de chamadas; presente inclusive 0 em objetos instance de kind=calls. Comparar esta versão entre respostas HTTP e snapshots de webhook para evitar regressões. O campo não pertence às instâncias whatsapp." }, "incomingCallMode": { "$ref": "#/components/schemas/IncomingCallMode" } }, "required": [ "id", "name", "status", "qrcode", "owner", "profileName", "kind" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/issued-instance.md # IssuedInstance Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Formato: `uuid` | | `name` | `string` | obrigatório | — | | `systemName` | `string` | opcional | — | | `companyId` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"disconnected"`, `"connecting"`, `"connected"` | | `owner` | `string` | obrigatório | — | | `profileName` | `string` | obrigatório | — | | `qrcode` | `string` | obrigatório | PNG em data URI quando há QR vigente; vazio no restante e nas listagens. | | `paircode` | `string` | opcional | — | | `lastDisconnect` | `string` | opcional | RFC 3339. Formato: `date-time` | | `lastDisconnectReason` | `string` | opcional | — | | `disconnectCode` | `string` | opcional | — | | `worker` | `string` | opcional | — | | `limitEnforcement` | `string` | opcional | — | | `limitUntil` | `string` | opcional | RFC 3339. Formato: `date-time` | | `created` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updated` | `string` | opcional | RFC 3339. Formato: `date-time` | | `kind` | `string` | obrigatório | Valores: `"whatsapp"`, `"calls"` | | `callsMaxConcurrent` | `integer` | opcional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `callsConfigVersion` | `integer` | opcional | Versão crescente da configuração de chamadas; presente inclusive 0 em objetos instance de kind=calls. Comparar esta versão entre respostas HTTP e snapshots de webhook para evitar regressões. O campo não pertence às instâncias whatsapp. Mínimo: `0`. Formato: `int64` | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `token` | `string` | obrigatório | Segredo de instância: guardar no backend. Só criação/reemissão; replay idempotente de init pode repetir por 15 min. Comprimento mínimo: `64`. Comprimento máximo: `64` | ## Definição OpenAPI ```json { "allOf": [ { "$ref": "#/components/schemas/Instance" }, { "type": "object", "properties": { "token": { "type": "string", "description": "Segredo de instância: guardar no backend. Só criação/reemissão; replay idempotente de init pode repetir por 15 min.", "minLength": 64, "maxLength": 64 } }, "required": [ "token" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/connection.md # Connection Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | ## Definição OpenAPI ```json { "type": "object", "properties": { "connected": { "type": "boolean", "description": "Socket conectado." }, "loggedIn": { "type": "boolean", "description": "Credencial de sessão autenticada; usar junto de connected." }, "jid": { "type": "string" }, "instance": { "$ref": "#/components/schemas/Instance" }, "webhooks": { "type": "object", "description": "Presente no status, inclui registered e a saúde de entrega quando registrada." } }, "required": [ "connected", "loggedIn", "jid", "instance" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/init-request.md # InitRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `name` | `string` | obrigatório | Obrigatório, até 128 bytes UTF-8, sem controle ou espaços nas extremidades. Comprimento mínimo: `1`. Comprimento máximo: `128` | | `systemName` | `string` | opcional | Até 128 bytes; recomendado Atendro. Comprimento máximo: `128` | | `companyId` | `string` | opcional | Até 128 bytes; vínculo com tenant no consumidor. Filtro de lista, não autorização. Comprimento máximo: `128` | | `kind` | `string` | opcional | Imutável após criar. calls exige o módulo habilitado e pareamento próprio. Valores: `"whatsapp"`, `"calls"`. Padrão: `"whatsapp"` | | `callsMaxConcurrent` | `integer` | opcional | Limite de ligações simultâneas desta instância calls, incluindo as que estão tocando. Acima de 1 ainda depende de homologação em chamadas reais. Opcional na criação; omitido, persiste o padrão ATENDROZAP_CALLS_MAX_CONCURRENT do servidor. Recusado em kind=whatsapp. Mínimo: `1`. Máximo: `8` | | `incomingCallMode` | `string` | opcional | Opcional apenas em kind=calls. Omitido, preserva o comportamento allow. Padrão: `"allow"` | ## Definição OpenAPI ```json { "type": "object", "properties": { "name": { "type": "string", "description": "Obrigatório, até 128 bytes UTF-8, sem controle ou espaços nas extremidades.", "minLength": 1, "maxLength": 128 }, "systemName": { "type": "string", "description": "Até 128 bytes; recomendado Atendro.", "maxLength": 128 }, "companyId": { "type": "string", "description": "Até 128 bytes; vínculo com tenant no consumidor. Filtro de lista, não autorização.", "maxLength": 128 }, "kind": { "type": "string", "enum": [ "whatsapp", "calls" ], "default": "whatsapp", "description": "Imutável após criar. calls exige o módulo habilitado e pareamento próprio." }, "callsMaxConcurrent": { "type": "integer", "minimum": 1, "maximum": 8, "description": "Limite de ligações simultâneas desta instância calls, incluindo as que estão tocando. Acima de 1 ainda depende de homologação em chamadas reais. Opcional na criação; omitido, persiste o padrão ATENDROZAP_CALLS_MAX_CONCURRENT do servidor. Recusado em kind=whatsapp." }, "incomingCallMode": { "allOf": [ { "$ref": "#/components/schemas/IncomingCallMode" } ], "default": "allow", "description": "Opcional apenas em kind=calls. Omitido, preserva o comportamento allow." } }, "required": [ "name" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/init-result.md # InitResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `connected` | `boolean` | obrigatório | Valores: `false` | | `loggedIn` | `boolean` | obrigatório | Valores: `false` | | `instance` | `object` | obrigatório | Modelo: [IssuedInstance](https://wpp.atendro.cloud/docs/modelos/issued-instance.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "response": { "type": "string" }, "connected": { "type": "boolean", "enum": [ false ] }, "loggedIn": { "type": "boolean", "enum": [ false ] }, "instance": { "$ref": "#/components/schemas/IssuedInstance" } }, "required": [ "response", "connected", "loggedIn", "instance" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/connect-request.md # ConnectRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `phone` | `string` | opcional | Opcional. Sem phone usa QR; com phone extrai 8–15 dígitos incluindo DDI e pede código de pareamento. | ## Definição OpenAPI ```json { "type": "object", "properties": { "phone": { "type": "string", "description": "Opcional. Sem phone usa QR; com phone extrai 8–15 dígitos incluindo DDI e pede código de pareamento." } } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/disconnect-result.md # DisconnectResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `unlinked` | `boolean` | obrigatório | Indica confirmação remota. Credencial local é limpa mesmo se false. | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "response": { "type": "string" }, "unlinked": { "type": "boolean", "description": "Indica confirmação remota. Credencial local é limpa mesmo se false." }, "instance": { "$ref": "#/components/schemas/Instance" } }, "required": [ "response", "unlinked", "instance" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/restart-result.md # RestartResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `boolean` | obrigatório | Socket conectado. | | `loggedIn` | `boolean` | obrigatório | Credencial de sessão autenticada; usar junto de connected. | | `jid` | `string` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | | `webhooks` | `object` | opcional | Presente no status, inclui registered e a saúde de entrega quando registrada. | | `response` | `string` | obrigatório | — | ## Definição OpenAPI ```json { "allOf": [ { "$ref": "#/components/schemas/Connection" }, { "type": "object", "properties": { "response": { "type": "string" } }, "required": [ "response" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/response-message.md # ResponseMessage Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "response": { "type": "string" } }, "required": [ "response" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/token-request.md # TokenRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `graceSeconds` | `integer` | opcional | Prazo de convivência do token anterior; zero revoga imediatamente. Padrão: `0`. Mínimo: `0`. Máximo: `3600` | ## Definição OpenAPI ```json { "type": "object", "properties": { "graceSeconds": { "type": "integer", "description": "Prazo de convivência do token anterior; zero revoga imediatamente.", "minimum": 0, "maximum": 3600, "default": 0 } } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/token-result.md # TokenResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `graceSeconds` | `integer` | obrigatório | — | | `instance` | `object` | obrigatório | Modelo: [IssuedInstance](https://wpp.atendro.cloud/docs/modelos/issued-instance.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "response": { "type": "string" }, "graceSeconds": { "type": "integer" }, "instance": { "$ref": "#/components/schemas/IssuedInstance" } }, "required": [ "response", "graceSeconds", "instance" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-text-request.md # SendTextRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `text` | `string` | obrigatório | UTF-8, não vazio/branco, até 65536 bytes. Comprimento mínimo: `1`. Comprimento máximo: `65536` | | `linkPreview` | `any` | opcional | Aceito e ignorado; o serviço não gera prévia de link. | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "replyid": { "type": "string", "description": "ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found." }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." }, "forward": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "text": { "type": "string", "description": "UTF-8, não vazio/branco, até 65536 bytes.", "minLength": 1, "maxLength": 65536 }, "linkPreview": { "description": "Aceito e ignorado; o serviço não gera prévia de link." } }, "required": [ "number", "text" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-media-request.md # SendMediaRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `type` | `string` | obrigatório | Valores: `"image"`, `"video"`, `"audio"`, `"ptt"`, `"document"`, `"sticker"` | | `file` | `string` | obrigatório | Data URI, base64 ou URL permitida por ATENDROZAP_MEDIA_URL_ALLOWLIST. Até 32 MiB decodificados; JSON até 48 MiB. Comprimento mínimo: `1` | | `text` | `string` | opcional | Legenda em UTF-8, até 65536 bytes. Comprimento máximo: `65536` | | `docName` | `string` | opcional | Nome-base do documento. | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "replyid": { "type": "string", "description": "ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found." }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." }, "forward": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "type": { "type": "string", "enum": [ "image", "video", "audio", "ptt", "document", "sticker" ] }, "file": { "type": "string", "description": "Data URI, base64 ou URL permitida por ATENDROZAP_MEDIA_URL_ALLOWLIST. Até 32 MiB decodificados; JSON até 48 MiB.", "minLength": 1 }, "text": { "type": "string", "description": "Legenda em UTF-8, até 65536 bytes.", "maxLength": 65536 }, "docName": { "type": "string", "description": "Nome-base do documento." } }, "required": [ "number", "type", "file" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-contact-request.md # SendContactRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `fullName` | `string` | obrigatório | Nome do contato sintético/autorizado, 1–128 bytes após trim. Comprimento mínimo: `1`. Comprimento máximo: `128` | | `phoneNumber` | `string` | obrigatório | Telefone do contato: 8–15 dígitos com DDI após retirar formatação. | | `organization` | `string` | opcional | Até 128 bytes. Comprimento máximo: `128` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "replyid": { "type": "string", "description": "ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found." }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." }, "forward": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "fullName": { "type": "string", "description": "Nome do contato sintético/autorizado, 1–128 bytes após trim.", "minLength": 1, "maxLength": 128 }, "phoneNumber": { "type": "string", "description": "Telefone do contato: 8–15 dígitos com DDI após retirar formatação." }, "organization": { "type": "string", "description": "Até 128 bytes.", "maxLength": 128 } }, "required": [ "number", "fullName", "phoneNumber" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-location-request.md # SendLocationRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `latitude` | `number` | obrigatório | Mínimo: `-90`. Máximo: `90` | | `longitude` | `number` | obrigatório | Mínimo: `-180`. Máximo: `180` | | `name` | `string` | opcional | Até 256 bytes. Comprimento máximo: `256` | | `address` | `string` | opcional | Até 512 bytes. Comprimento máximo: `512` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "replyid": { "type": "string", "description": "ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found." }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." }, "forward": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "latitude": { "type": "number", "minimum": -90, "maximum": 90 }, "longitude": { "type": "number", "minimum": -180, "maximum": 180 }, "name": { "type": "string", "description": "Até 256 bytes.", "maxLength": 256 }, "address": { "type": "string", "description": "Até 512 bytes.", "maxLength": 512 } }, "required": [ "number", "latitude", "longitude" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-menu-request.md # SendMenuRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `replyid` | `string` | opcional | ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found. | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | | `forward` | `boolean / string / integer / null` | opcional | — | | `type` | `string` | obrigatório | Valores: `"button"`, `"buttons"`, `"list"`, `"poll"` | | `text` | `string` | obrigatório | Até 4096 bytes. Comprimento mínimo: `1`. Comprimento máximo: `4096` | | `choices` | `array` | obrigatório | Mínimo de itens: `1` | | `footerText` | `string` | opcional | — | | `listButton` | `string` | opcional | — | | `selectableCount` | `integer / string` | opcional | Só em type=poll; padrão 1. | | `renderMode` | `string` | opcional | Valores: `"auto"`, `"native"`, `"poll"`, `"text"`. Padrão: `"auto"` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "replyid": { "type": "string", "description": "ID de mensagem guardada para citação; desconhecida retorna 422 reply_not_found." }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." }, "forward": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "type": { "type": "string", "enum": [ "button", "buttons", "list", "poll" ] }, "text": { "type": "string", "description": "Até 4096 bytes.", "minLength": 1, "maxLength": 4096 }, "choices": { "type": "array", "items": { "type": "string", "description": "label|id|descrição, label\nid ou label; [Seção] nas listas; url:/copy: em botões. call: não suportado." }, "minItems": 1 }, "footerText": { "type": "string" }, "listButton": { "type": "string" }, "selectableCount": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Só em type=poll; padrão 1." }, "renderMode": { "type": "string", "enum": [ "auto", "native", "poll", "text" ], "default": "auto" } }, "required": [ "number", "type", "text", "choices" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-result.md # SendResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean", "enum": [ true ] }, "messageid": { "type": "string" }, "messageId": { "type": "string" }, "id": { "type": "string" }, "timestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" } }, "required": [ "success", "messageid", "messageId", "id", "timestamp" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-media-result.md # SendMediaResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `mimetype` | `string` | obrigatório | — | | `ptt` | `boolean` | obrigatório | — | | `note` | `string` | opcional | Explica envio como áudio comum quando PTT não é possível. | ## Definição OpenAPI ```json { "allOf": [ { "$ref": "#/components/schemas/SendResult" }, { "type": "object", "properties": { "mimetype": { "type": "string" }, "ptt": { "type": "boolean" }, "note": { "type": "string", "description": "Explica envio como áudio comum quando PTT não é possível." } }, "required": [ "mimetype", "ptt" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/send-menu-result.md # SendMenuResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `type` | `string` | obrigatório | — | | `renderMode` | `string` | obrigatório | Valores: `"auto"`, `"native"`, `"poll"`, `"text"` | | `rendered` | `string` | obrigatório | Valores: `"button"`, `"list"`, `"poll"`, `"text"` | ## Definição OpenAPI ```json { "allOf": [ { "$ref": "#/components/schemas/SendResult" }, { "type": "object", "properties": { "type": { "type": "string" }, "renderMode": { "type": "string", "enum": [ "auto", "native", "poll", "text" ] }, "rendered": { "type": "string", "enum": [ "button", "list", "poll", "text" ] } }, "required": [ "type", "renderMode", "rendered" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/react-request.md # ReactRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | | `text` | `string` | opcional | Um emoji; vazio/ausente remove a reação. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "messageId": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "number": { "type": "string", "description": "Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada." }, "text": { "type": "string", "description": "Um emoji; vazio/ausente remove a reação." } }, "anyOf": [ { "required": [ "id" ] }, { "required": [ "messageId" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/delete-message-request.md # DeleteMessageRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "messageId": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "number": { "type": "string", "description": "Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada." } }, "anyOf": [ { "required": [ "id" ] }, { "required": [ "messageId" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/edit-request.md # EditRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | opcional | Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada. | | `text` | `string` | obrigatório | Texto/legenda UTF-8, não vazio, até 65536 bytes. Comprimento mínimo: `1`. Comprimento máximo: `65536` | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "messageId": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "number": { "type": "string", "description": "Ignorado para reação, edição e exclusão; o chat vem da mensagem guardada." }, "text": { "type": "string", "description": "Texto/legenda UTF-8, não vazio, até 65536 bytes.", "minLength": 1, "maxLength": 65536 } }, "required": [ "text" ], "anyOf": [ { "required": [ "id" ] }, { "required": [ "messageId" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/forward-request.md # ForwardRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `messageId` | `string` | condicional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `delay` | `integer / string` | opcional | Espera de digitação em milissegundos; o manager limita a 15000 ms. | Pelo menos uma destas combinações deve ser válida: - `id` - `messageId` ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "messageId": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "delay": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Espera de digitação em milissegundos; o manager limita a 15000 ms." } }, "required": [ "number" ], "anyOf": [ { "required": [ "id" ] }, { "required": [ "messageId" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/react-result.md # ReactResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `messageid` | `string` | obrigatório | — | | `messageId` | `string` | obrigatório | — | | `id` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `reaction` | `object` | obrigatório | — | | `reaction.id` | `string` | obrigatório | — | | `reaction.emoji` | `string` | obrigatório | — | | `reaction.status` | `string` | obrigatório | Valores: `"sent"`, `"removed"` | ## Definição OpenAPI ```json { "allOf": [ { "$ref": "#/components/schemas/SendResult" }, { "type": "object", "properties": { "reaction": { "type": "object", "properties": { "id": { "type": "string" }, "emoji": { "type": "string" }, "status": { "type": "string", "enum": [ "sent", "removed" ] } }, "required": [ "id", "emoji", "status" ] } }, "required": [ "reaction" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/delete-message-result.md # DeleteMessageResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `id` | `string` | obrigatório | — | | `messageid` | `string` | opcional | — | | `messageId` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"Deleted"` | | `timestamp` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `recorded` | `boolean` | obrigatório | — | | `alreadyDeleted` | `boolean` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean", "enum": [ true ] }, "id": { "type": "string" }, "messageid": { "type": "string" }, "messageId": { "type": "string" }, "status": { "type": "string", "enum": [ "Deleted" ] }, "timestamp": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "recorded": { "type": "boolean" }, "alreadyDeleted": { "type": "boolean" } }, "required": [ "success", "id", "status", "timestamp", "recorded" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/edit-result.md # EditResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `id` | `string` | obrigatório | owner:id do original. | | `messageid` | `string` | obrigatório | ID do original. | | `messageId` | `string` | opcional | — | | `editId` | `string` | obrigatório | ID da ação de edição. | | `content` | `string` | opcional | — | | `messageType` | `string` | opcional | — | | `messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `status` | `string` | opcional | — | | `owner` | `string` | opcional | — | | `editCount` | `integer` | opcional | — | | `recorded` | `boolean` | obrigatório | false: WhatsApp aceitou mas a persistência local falhou. | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean", "enum": [ true ] }, "id": { "type": "string", "description": "owner:id do original." }, "messageid": { "type": "string", "description": "ID do original." }, "messageId": { "type": "string" }, "editId": { "type": "string", "description": "ID da ação de edição." }, "content": { "type": "string" }, "messageType": { "type": "string" }, "messageTimestamp": { "type": "integer", "description": "Unix em milissegundos.", "format": "int64" }, "timestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "status": { "type": "string" }, "owner": { "type": "string" }, "editCount": { "type": "integer" }, "recorded": { "type": "boolean", "description": "false: WhatsApp aceitou mas a persistência local falhou." } }, "required": [ "success", "id", "messageid", "editId", "recorded" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/find-messages-request.md # FindMessagesRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | opcional | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | | `chatid` | `string` | opcional | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `limit` | `integer / string` | opcional | 0/ausente usa 100; máximo 200. Padrão: `100` | | `offset` | `integer / string` | opcional | Deslocamento da página. | | `includeHistory` | `boolean / string / integer / null` | opcional | Padrão: `true` | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "chatid": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "limit": { "oneOf": [ { "type": "integer", "minimum": 0, "maximum": 200 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "0/ausente usa 100; máximo 200.", "default": 100 }, "offset": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Deslocamento da página." }, "includeHistory": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ], "default": true } } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/legacy-message.md # LegacyMessage Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | owner:messageid. | | `messageid` | `string` | obrigatório | — | | `chatid` | `string` | obrigatório | — | | `sender` | `string` | opcional | — | | `sender_pn` | `string` | opcional | — | | `senderName` | `string` | opcional | — | | `pushName` | `string` | opcional | — | | `isGroup` | `boolean` | opcional | — | | `fromMe` | `boolean` | obrigatório | — | | `wasSentByApi` | `boolean` | opcional | — | | `messageType` | `string` | opcional | Tipo legado PascalCase. | | `type` | `string` | opcional | — | | `messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `status` | `string` | opcional | Pending, Sent, Delivered, Read, Played, Failed, Received ou Deleted. | | `text` | `string` | opcional | — | | `content` | `object` | opcional | — | | `buttonOrListid` | `string` | opcional | — | | `reactions` | `array` | opcional | — | | `choices` | `any` | opcional | Opções armazenadas de menus/enquetes; estrutura depende do tipo e pode ser null. | | `fileURL` | `string` | opcional | — | | `mediaUrl` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "owner:messageid." }, "messageid": { "type": "string" }, "chatid": { "type": "string" }, "sender": { "type": "string" }, "sender_pn": { "type": "string" }, "senderName": { "type": "string" }, "pushName": { "type": "string" }, "isGroup": { "type": "boolean" }, "fromMe": { "type": "boolean" }, "wasSentByApi": { "type": "boolean" }, "messageType": { "type": "string", "description": "Tipo legado PascalCase." }, "type": { "type": "string" }, "messageTimestamp": { "type": "integer", "description": "Unix em milissegundos.", "format": "int64" }, "timestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "status": { "type": "string", "description": "Pending, Sent, Delivered, Read, Played, Failed, Received ou Deleted." }, "text": { "type": "string" }, "content": { "type": "object" }, "buttonOrListid": { "type": "string" }, "reactions": { "type": "array", "items": { "type": "object" } }, "choices": { "description": "Opções armazenadas de menus/enquetes; estrutura depende do tipo e pode ser null." }, "fileURL": { "type": "string" }, "mediaUrl": { "type": "string" } }, "required": [ "id", "messageid", "chatid", "fromMe" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/find-messages-result.md # FindMessagesResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `messages` | `array` | obrigatório | — | | `messages[].id` | `string` | obrigatório | owner:messageid. | | `messages[].messageid` | `string` | obrigatório | — | | `messages[].chatid` | `string` | obrigatório | — | | `messages[].sender` | `string` | opcional | — | | `messages[].sender_pn` | `string` | opcional | — | | `messages[].senderName` | `string` | opcional | — | | `messages[].pushName` | `string` | opcional | — | | `messages[].isGroup` | `boolean` | opcional | — | | `messages[].fromMe` | `boolean` | obrigatório | — | | `messages[].wasSentByApi` | `boolean` | opcional | — | | `messages[].messageType` | `string` | opcional | Tipo legado PascalCase. | | `messages[].type` | `string` | opcional | — | | `messages[].messageTimestamp` | `integer` | opcional | Unix em milissegundos. Formato: `int64` | | `messages[].timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `messages[].status` | `string` | opcional | Pending, Sent, Delivered, Read, Played, Failed, Received ou Deleted. | | `messages[].text` | `string` | opcional | — | | `messages[].content` | `object` | opcional | — | | `messages[].buttonOrListid` | `string` | opcional | — | | `messages[].reactions` | `array` | opcional | — | | `messages[].choices` | `any` | opcional | Opções armazenadas de menus/enquetes; estrutura depende do tipo e pode ser null. | | `messages[].fileURL` | `string` | opcional | — | | `messages[].mediaUrl` | `string` | opcional | — | | `returnedMessages` | `integer` | obrigatório | — | | `limit` | `integer` | obrigatório | — | | `offset` | `integer` | obrigatório | — | | `hasMore` | `boolean` | obrigatório | — | | `nextOffset` | `integer` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "messages": { "type": "array", "items": { "$ref": "#/components/schemas/LegacyMessage" } }, "returnedMessages": { "type": "integer" }, "limit": { "type": "integer" }, "offset": { "type": "integer" }, "hasMore": { "type": "boolean" }, "nextOffset": { "type": "integer" } }, "required": [ "messages", "returnedMessages", "limit", "offset", "hasMore" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/message-status.md # MessageStatus Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | — | | `status` | `string` | obrigatório | Estado interno, em minúsculas: sending, unknown, failed, sent, delivered, read, played ou received. | | `failure` | `string` | obrigatório | — | | `fromMe` | `boolean` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `deliveredAt` | `integer / null` | opcional | — | | `readAt` | `integer / null` | opcional | — | | `playedAt` | `integer / null` | opcional | — | | `revokedAt` | `integer / null` | opcional | — | | `deletedForMeAt` | `integer / null` | opcional | — | | `editedAt` | `integer / null` | opcional | — | | `editCount` | `integer` | opcional | — | | `reactions` | `array / null` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string" }, "status": { "type": "string", "description": "Estado interno, em minúsculas: sending, unknown, failed, sent, delivered, read, played ou received." }, "failure": { "type": "string" }, "fromMe": { "type": "boolean" }, "timestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "deliveredAt": { "type": [ "integer", "null" ] }, "readAt": { "type": [ "integer", "null" ] }, "playedAt": { "type": [ "integer", "null" ] }, "revokedAt": { "type": [ "integer", "null" ] }, "deletedForMeAt": { "type": [ "integer", "null" ] }, "editedAt": { "type": [ "integer", "null" ] }, "editCount": { "type": "integer" }, "reactions": { "type": [ "array", "null" ], "items": { "type": "object" } } }, "required": [ "id", "status", "failure", "fromMe", "timestamp" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/stored-message.md # StoredMessage Projeção interna session.DescribeMessage; campos de conteúdo variam com o tipo. Para o formato legado use /message/find. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | opcional | — | | `chatid` | `string` | opcional | — | | `fromMe` | `boolean` | opcional | — | | `status` | `string` | opcional | — | | `timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string" }, "chatid": { "type": "string" }, "fromMe": { "type": "boolean" }, "status": { "type": "string" }, "timestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" } }, "description": "Projeção interna session.DescribeMessage; campos de conteúdo variam com o tipo. Para o formato legado use /message/find." } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/list-messages-result.md # ListMessagesResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `messages` | `array` | obrigatório | — | | `messages[].id` | `string` | opcional | — | | `messages[].chatid` | `string` | opcional | — | | `messages[].fromMe` | `boolean` | opcional | — | | `messages[].status` | `string` | opcional | — | | `messages[].timestamp` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `hasMore` | `boolean` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "messages": { "type": "array", "items": { "$ref": "#/components/schemas/StoredMessage" } }, "hasMore": { "type": "boolean" } }, "required": [ "messages", "hasMore" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/download-request.md # DownloadRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id. Comprimento mínimo: `1` | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 } }, "required": [ "id" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/download-result.md # DownloadResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `fileURL` | `string` | obrigatório | — | | `url` | `string` | obrigatório | — | | `mimetype` | `string` | obrigatório | — | | `mimeType` | `string` | obrigatório | — | | `fileName` | `string` | obrigatório | — | | `size` | `integer` | obrigatório | — | | `expiresAt` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `messageid` | `string` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "fileURL": { "type": "string" }, "url": { "type": "string" }, "mimetype": { "type": "string" }, "mimeType": { "type": "string" }, "fileName": { "type": "string" }, "size": { "type": "integer" }, "expiresAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "messageid": { "type": "string" } }, "required": [ "fileURL", "url", "mimetype", "mimeType", "fileName", "size", "expiresAt", "messageid" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/mark-read-request.md # MarkReadRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string / array` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "oneOf": [ { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, { "type": "array", "items": { "type": "string", "description": "ID da mensagem guardada nesta instância. Nos corpos aceita também owner:id.", "minLength": 1 }, "minItems": 1, "maxItems": 1000 } ] } }, "required": [ "id" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/mark-read-result.md # MarkReadResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `marked` | `array` | obrigatório | — | | `count` | `integer` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean" }, "marked": { "type": "array", "items": { "type": "string" } }, "count": { "type": "integer" } }, "required": [ "success", "marked", "count" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/chat-read-request.md # ChatReadRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | | `read` | `boolean` | opcional | Ausente equivale a true; false não marca como não lido e retorna marked=0 com note. Padrão: `true` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "read": { "type": "boolean", "description": "Ausente equivale a true; false não marca como não lido e retorna marked=0 com note.", "default": true } }, "required": [ "number" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/chat-read-result.md # ChatReadResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `marked` | `integer` | obrigatório | — | | `note` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean" }, "marked": { "type": "integer" }, "note": { "type": "string" } }, "required": [ "success", "marked" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/check-request.md # CheckRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | condicional | Um telefone com DDI. | | `numbers` | `string / array` | condicional | — | Pelo menos uma destas combinações deve ser válida: - `number` - `numbers` ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Um telefone com DDI." }, "numbers": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" }, "maxItems": 50 } ] } }, "anyOf": [ { "required": [ "number" ] }, { "required": [ "numbers" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/number-check.md # NumberCheck Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `query` | `string` | obrigatório | — | | `exists` | `boolean` | obrigatório | — | | `numberExists` | `boolean` | obrigatório | — | | `jid` | `string` | obrigatório | — | | `data` | `object` | obrigatório | — | | `data.exists` | `boolean` | opcional | — | | `data.jid` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "query": { "type": "string" }, "exists": { "type": "boolean" }, "numberExists": { "type": "boolean" }, "jid": { "type": "string" }, "data": { "type": "object", "properties": { "exists": { "type": "boolean" }, "jid": { "type": "string" } } } }, "required": [ "query", "exists", "numberExists", "jid", "data" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/details-request.md # DetailsRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID. Comprimento mínimo: `1` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 } }, "required": [ "number" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/chat-details.md # ChatDetails Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `jid` | `string` | obrigatório | — | | `exists` | `boolean` | obrigatório | — | | `name` | `string` | opcional | — | | `pushName` | `string` | opcional | — | | `displayName` | `string` | opcional | — | | `verifiedName` | `string` | opcional | — | | `isBusiness` | `boolean` | opcional | — | | `profilePicUrl` | `string` | obrigatório | — | | `profilePictureUrl` | `string` | opcional | — | | `imagePreview` | `string` | opcional | — | | `pictureId` | `string` | opcional | — | | `imageState` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "jid": { "type": "string" }, "exists": { "type": "boolean" }, "name": { "type": "string" }, "pushName": { "type": "string" }, "displayName": { "type": "string" }, "verifiedName": { "type": "string" }, "isBusiness": { "type": "boolean" }, "profilePicUrl": { "type": "string" }, "profilePictureUrl": { "type": "string" }, "imagePreview": { "type": "string" }, "pictureId": { "type": "string" }, "imageState": { "type": "string" } }, "required": [ "jid", "exists", "profilePicUrl" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/find-chats-request.md # FindChatsRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `limit` | `integer / string` | opcional | 0/ausente retorna até 5000. Padrão: `5000` | | `offset` | `integer / string` | opcional | Deslocamento da página. | | `wa_isGroup` | `boolean / string / integer / null` | opcional | — | | `includeLeft` | `boolean / string / integer / null` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "limit": { "oneOf": [ { "type": "integer", "minimum": 0, "maximum": 5000 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "0/ausente retorna até 5000.", "default": 5000 }, "offset": { "oneOf": [ { "type": "integer", "minimum": 0 }, { "type": "string", "description": "Inteiro em formato decimal.", "pattern": "^\\d+$" } ], "description": "Deslocamento da página." }, "wa_isGroup": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "includeLeft": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] } } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/chat.md # Chat Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | — | | `wa_chatid` | `string` | obrigatório | — | | `name` | `string` | opcional | — | | `wa_name` | `string` | opcional | — | | `wa_contactName` | `string` | opcional | — | | `wa_isGroup` | `boolean` | obrigatório | — | | `wa_unreadCount` | `integer` | opcional | — | | `wa_archived` | `boolean` | opcional | — | | `wa_lastMsgTimestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `wa_lastMessageTime` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `owner` | `string` | opcional | — | | `phone` | `string` | opcional | Vazio para grupo ou LID sem telefone conhecido. | | `pictureId` | `string` | opcional | — | | `wa_isGroup_announce` | `boolean` | opcional | — | | `participantCount` | `integer` | opcional | — | | `topic` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string" }, "wa_chatid": { "type": "string" }, "name": { "type": "string" }, "wa_name": { "type": "string" }, "wa_contactName": { "type": "string" }, "wa_isGroup": { "type": "boolean" }, "wa_unreadCount": { "type": "integer" }, "wa_archived": { "type": "boolean" }, "wa_lastMsgTimestamp": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "wa_lastMessageTime": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "owner": { "type": "string" }, "phone": { "type": "string", "description": "Vazio para grupo ou LID sem telefone conhecido." }, "pictureId": { "type": "string" }, "wa_isGroup_announce": { "type": "boolean" }, "participantCount": { "type": "integer" }, "topic": { "type": "string" } }, "required": [ "id", "wa_chatid", "wa_isGroup", "wa_lastMsgTimestamp", "wa_lastMessageTime" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/find-chats-result.md # FindChatsResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `chats` | `array` | obrigatório | — | | `chats[].id` | `string` | obrigatório | — | | `chats[].wa_chatid` | `string` | obrigatório | — | | `chats[].name` | `string` | opcional | — | | `chats[].wa_name` | `string` | opcional | — | | `chats[].wa_contactName` | `string` | opcional | — | | `chats[].wa_isGroup` | `boolean` | obrigatório | — | | `chats[].wa_unreadCount` | `integer` | opcional | — | | `chats[].wa_archived` | `boolean` | opcional | — | | `chats[].wa_lastMsgTimestamp` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `chats[].wa_lastMessageTime` | `integer` | obrigatório | Unix em segundos. Formato: `int64` | | `chats[].owner` | `string` | opcional | — | | `chats[].phone` | `string` | opcional | Vazio para grupo ou LID sem telefone conhecido. | | `chats[].pictureId` | `string` | opcional | — | | `chats[].wa_isGroup_announce` | `boolean` | opcional | — | | `chats[].participantCount` | `integer` | opcional | — | | `chats[].topic` | `string` | opcional | — | | `hasMore` | `boolean` | obrigatório | — | | `pagination` | `object` | obrigatório | — | | `pagination.limit` | `integer` | obrigatório | — | | `pagination.offset` | `integer` | obrigatório | — | | `pagination.returned` | `integer` | obrigatório | — | | `nextOffset` | `integer` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "chats": { "type": "array", "items": { "$ref": "#/components/schemas/Chat" } }, "hasMore": { "type": "boolean" }, "pagination": { "type": "object", "properties": { "limit": { "type": "integer" }, "offset": { "type": "integer" }, "returned": { "type": "integer" } }, "required": [ "limit", "offset", "returned" ] }, "nextOffset": { "type": "integer" } }, "required": [ "chats", "hasMore", "pagination" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-participant.md # GroupParticipant Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `JID` | `string` | obrigatório | — | | `PhoneNumber` | `string` | opcional | — | | `LID` | `string` | opcional | — | | `IsAdmin` | `boolean` | obrigatório | — | | `IsSuperAdmin` | `boolean` | obrigatório | — | | `DisplayName` | `string` | obrigatório | — | | `Error` | `integer` | obrigatório | Código por participante; 0 indica ausência de erro registrado. | ## Definição OpenAPI ```json { "type": "object", "properties": { "JID": { "type": "string" }, "PhoneNumber": { "type": "string" }, "LID": { "type": "string" }, "IsAdmin": { "type": "boolean" }, "IsSuperAdmin": { "type": "boolean" }, "DisplayName": { "type": "string" }, "Error": { "type": "integer", "description": "Código por participante; 0 indica ausência de erro registrado." } }, "required": [ "JID", "IsAdmin", "IsSuperAdmin", "DisplayName", "Error" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group.md # Group Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `JID` | `string` | obrigatório | — | | `Name` | `string` | obrigatório | — | | `Topic` | `string` | opcional | — | | `OwnerJID` | `string` | opcional | — | | `OwnerPN` | `string` | opcional | — | | `IsLocked` | `boolean` | opcional | — | | `IsAnnounce` | `boolean` | opcional | — | | `AddressingMode` | `string` | opcional | — | | `ParticipantCount` | `integer` | obrigatório | — | | `Participants` | `array` | opcional | — | | `Participants[].JID` | `string` | obrigatório | — | | `Participants[].PhoneNumber` | `string` | opcional | — | | `Participants[].LID` | `string` | opcional | — | | `Participants[].IsAdmin` | `boolean` | obrigatório | — | | `Participants[].IsSuperAdmin` | `boolean` | obrigatório | — | | `Participants[].DisplayName` | `string` | obrigatório | — | | `Participants[].Error` | `integer` | obrigatório | Código por participante; 0 indica ausência de erro registrado. | | `invite_link` | `string` | obrigatório | Vazio se não solicitado ou sem permissão de admin. | | `PictureID` | `string` | opcional | — | | `lastMessageAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `syncedAt` | `integer` | opcional | Unix em segundos. Formato: `int64` | | `left` | `boolean` | opcional | — | | `GroupCreated` | `string` | opcional | RFC 3339. Formato: `date-time` | ## Definição OpenAPI ```json { "type": "object", "properties": { "JID": { "type": "string" }, "Name": { "type": "string" }, "Topic": { "type": "string" }, "OwnerJID": { "type": "string" }, "OwnerPN": { "type": "string" }, "IsLocked": { "type": "boolean" }, "IsAnnounce": { "type": "boolean" }, "AddressingMode": { "type": "string" }, "ParticipantCount": { "type": "integer" }, "Participants": { "type": "array", "items": { "$ref": "#/components/schemas/GroupParticipant" } }, "invite_link": { "type": "string", "description": "Vazio se não solicitado ou sem permissão de admin." }, "PictureID": { "type": "string" }, "lastMessageAt": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "syncedAt": { "type": "integer", "description": "Unix em segundos.", "format": "int64" }, "left": { "type": "boolean" }, "GroupCreated": { "type": "string", "description": "RFC 3339.", "format": "date-time" } }, "required": [ "JID", "Name", "ParticipantCount", "invite_link" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-info-request.md # GroupInfoRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `force` | `boolean / string / integer / null` | opcional | — | | `getInviteLink` | `boolean / string / integer / null` | opcional | — | | `getRequestsParticipants` | `any` | opcional | Aceito e ignorado. | ## Definição OpenAPI ```json { "type": "object", "properties": { "groupjid": { "type": "string", "description": "Identificador do grupo terminado em @g.us.", "minLength": 1 }, "force": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "getInviteLink": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ] }, "getRequestsParticipants": { "description": "Aceito e ignorado." } }, "required": [ "groupjid" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/create-group-request.md # CreateGroupRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `name` | `string` | obrigatório | Comprimento mínimo: `1`. Comprimento máximo: `100` | | `participants` | `array` | obrigatório | Mínimo de itens: `1`. Máximo de itens: `50` | ## Definição OpenAPI ```json { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "participants": { "type": "array", "items": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "maxItems": 50, "minItems": 1 } }, "required": [ "name", "participants" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-participants-request.md # GroupParticipantsRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `action` | `string` | obrigatório | Valores: `"add"`, `"remove"`, `"promote"`, `"demote"` | | `participants` | `array` | obrigatório | Mínimo de itens: `1` | ## Definição OpenAPI ```json { "type": "object", "properties": { "groupjid": { "type": "string", "description": "Identificador do grupo terminado em @g.us.", "minLength": 1 }, "action": { "type": "string", "enum": [ "add", "remove", "promote", "demote" ] }, "participants": { "type": "array", "items": { "type": "string", "description": "Dígitos com DDI (8–15) ou identificador @s.whatsapp.net, @g.us ou @lid. Nunca inferir telefone de um LID.", "minLength": 1 }, "minItems": 1 } }, "required": [ "groupjid", "action", "participants" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-participants-result.md # GroupParticipantsResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupUpdated` | `array` | obrigatório | — | | `groupUpdated[].JID` | `string` | obrigatório | — | | `groupUpdated[].Error` | `integer` | obrigatório | — | | `needs_refresh` | `boolean` | obrigatório | Valores: `true` | ## Definição OpenAPI ```json { "type": "object", "properties": { "groupUpdated": { "type": "array", "items": { "type": "object", "properties": { "JID": { "type": "string" }, "Error": { "type": "integer" } }, "required": [ "JID", "Error" ] } }, "needs_refresh": { "type": "boolean", "enum": [ true ] } }, "required": [ "groupUpdated", "needs_refresh" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-name-request.md # GroupNameRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `name` | `string` | obrigatório | Comprimento mínimo: `1`. Comprimento máximo: `100` | ## Definição OpenAPI ```json { "type": "object", "properties": { "groupjid": { "type": "string", "description": "Identificador do grupo terminado em @g.us.", "minLength": 1 }, "name": { "type": "string", "minLength": 1, "maxLength": 100 } }, "required": [ "groupjid", "name" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-image-request.md # GroupImageRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `groupjid` | `string` | obrigatório | Identificador do grupo terminado em @g.us. Comprimento mínimo: `1` | | `image` | `string` | obrigatório | Data URI/base64/URL permitida (JPEG, PNG, GIF; até 8 MiB), ou remove/delete. Convertida para JPEG até 640×640. Comprimento mínimo: `1` | ## Definição OpenAPI ```json { "type": "object", "properties": { "groupjid": { "type": "string", "description": "Identificador do grupo terminado em @g.us.", "minLength": 1 }, "image": { "type": "string", "description": "Data URI/base64/URL permitida (JPEG, PNG, GIF; até 8 MiB), ou remove/delete. Convertida para JPEG até 640×640.", "minLength": 1 } }, "required": [ "groupjid", "image" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/group-update-result.md # GroupUpdateResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `response` | `string` | obrigatório | — | | `needs_refresh` | `boolean` | obrigatório | Valores: `true` | | `pictureId` | `string` | opcional | Presente na atualização de imagem. | ## Definição OpenAPI ```json { "type": "object", "properties": { "response": { "type": "string" }, "needs_refresh": { "type": "boolean", "enum": [ true ] }, "pictureId": { "type": "string", "description": "Presente na atualização de imagem." } }, "required": [ "response", "needs_refresh" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/proxy-request.md # ProxyRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `mode` | `string` | obrigatório | Valores: `"custom"`, `"none"`, `"internal"` | | `proxy_url` | `string` | condicional | Obrigatória em custom; http/https/socks5/socks5h; sondada antes da gravação. Somente na requisição; não é devolvido | | `confirm_no_proxy` | `boolean` | condicional | Obrigatório true em mode=none. | Quando `mode` = `"custom"`, informe `proxy_url`. Quando `mode` = `"none"`, informe `confirm_no_proxy`. ## Definição OpenAPI ```json { "type": "object", "properties": { "mode": { "type": "string", "enum": [ "custom", "none", "internal" ] }, "proxy_url": { "type": "string", "description": "Obrigatória em custom; http/https/socks5/socks5h; sondada antes da gravação.", "writeOnly": true }, "confirm_no_proxy": { "type": "boolean", "description": "Obrigatório true em mode=none." } }, "required": [ "mode" ], "allOf": [ { "if": { "properties": { "mode": { "const": "custom" } } }, "then": { "required": [ "proxy_url" ] } }, { "if": { "properties": { "mode": { "const": "none" } } }, "then": { "required": [ "confirm_no_proxy" ], "properties": { "confirm_no_proxy": { "const": true } } } } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/proxy.md # Proxy Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `mode` | `string` | obrigatório | Valores: `"custom"`, `"none"` | | `effective_mode` | `string` | obrigatório | Valores: `"custom"`, `"none"` | | `effective_detail` | `string` | opcional | Valores: `"direct"`, `"instance"`, `"sealed"` | | `fallback` | `object` | obrigatório | — | | `fallback.active` | `boolean` | opcional | Valores: `false` | | `fallback.reason` | `string` | opcional | — | | `fallback.since` | `integer` | opcional | — | | `proxy_url` | `string` | obrigatório | Credenciais redigidas. | | `proxy_fallback` | `string` | opcional | Valores: `"never"` | | `managed` | `boolean` | opcional | Valores: `false` | | `last_test_at` | `integer` | opcional | Unix em milissegundos. | | `last_test_error` | `string` | opcional | — | | `validation_error` | `boolean` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "mode": { "type": "string", "enum": [ "custom", "none" ] }, "effective_mode": { "type": "string", "enum": [ "custom", "none" ] }, "effective_detail": { "type": "string", "enum": [ "direct", "instance", "sealed" ] }, "fallback": { "type": "object", "properties": { "active": { "type": "boolean", "enum": [ false ] }, "reason": { "type": "string" }, "since": { "type": "integer" } } }, "proxy_url": { "type": "string", "description": "Credenciais redigidas." }, "proxy_fallback": { "type": "string", "enum": [ "never" ] }, "managed": { "type": "boolean", "enum": [ false ] }, "last_test_at": { "type": "integer", "description": "Unix em milissegundos." }, "last_test_error": { "type": "string" }, "validation_error": { "type": "boolean" } }, "required": [ "mode", "effective_mode", "fallback", "proxy_url" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/proxy-result.md # ProxyResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `details` | `string` | obrigatório | — | | `proxy` | `object` | obrigatório | Modelo: [Proxy](https://wpp.atendro.cloud/docs/modelos/proxy.md). | | `restart_requested` | `boolean` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "details": { "type": "string" }, "proxy": { "$ref": "#/components/schemas/Proxy" }, "restart_requested": { "type": "boolean" } }, "required": [ "details", "proxy", "restart_requested" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/webhook-request.md # WebhookRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `action` | `string` | condicional | Valores: `"add"`, `"update"`, `"delete"`, `"inherit"`. Padrão: `"add"` | | `enabled` | `boolean` | opcional | Padrão: `true` | | `url` | `string` | condicional | HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist. Comprimento máximo: `2048` | | `events` | `string / array` | condicional | Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados. | | `excludeMessages` | `string / array` | opcional | wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo. | | `addUrlEvents` | `boolean / string / integer / null` | opcional | Deve ser false. | | `addUrlTypesMessages` | `boolean / string / integer / null` | opcional | Deve ser false. | | `secret` | `string` | opcional | Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido. Comprimento máximo: `256`. Somente na requisição; não é devolvido | Pelo menos uma destas combinações deve ser válida: - `action`; `action`: Valores: `"delete"`, `"inherit"` - `url`, `events` ## Definição OpenAPI ```json { "type": "object", "properties": { "action": { "type": "string", "enum": [ "add", "update", "delete", "inherit" ], "default": "add" }, "enabled": { "type": "boolean", "default": true }, "url": { "type": "string", "description": "HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist.", "maxLength": 2048 }, "events": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ], "description": "Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados." }, "excludeMessages": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ], "description": "wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo." }, "addUrlEvents": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ], "description": "Deve ser false." }, "addUrlTypesMessages": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ], "description": "Deve ser false." }, "secret": { "type": "string", "description": "Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido.", "maxLength": 256, "writeOnly": true } }, "anyOf": [ { "required": [ "action" ], "properties": { "action": { "enum": [ "delete", "inherit" ] } } }, { "required": [ "url", "events" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/delivery-status.md # DeliveryStatus Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `consecutiveFailures` | `integer` | opcional | — | | `lastStatus` | `integer` | opcional | — | | `lastError` | `string` | opcional | — | | `paused` | `boolean` | opcional | — | | `pausedUntil` | `string` | opcional | RFC 3339. Formato: `date-time` | | `lastDeliveredAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `pending` | `integer` | opcional | — | | `dead` | `integer` | opcional | — | | `oldestPendingSeconds` | `integer` | opcional | — | | `statsError` | `boolean` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "consecutiveFailures": { "type": "integer" }, "lastStatus": { "type": "integer" }, "lastError": { "type": "string" }, "paused": { "type": "boolean" }, "pausedUntil": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "lastDeliveredAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "pending": { "type": "integer" }, "dead": { "type": "integer" }, "oldestPendingSeconds": { "type": "integer" }, "statsError": { "type": "boolean" } } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/webhook.md # Webhook Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | ## Definição OpenAPI ```json { "type": "object", "properties": { "registered": { "type": "boolean" }, "id": { "type": "string", "format": "uuid" }, "url": { "type": "string" }, "events": { "type": "array", "items": { "type": "string" } }, "enabled": { "type": "boolean" }, "excludeMessages": { "type": [ "array", "null" ], "items": { "type": "string" } }, "hasSecret": { "type": "boolean" }, "secretSealed": { "type": "boolean" }, "createdAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "updatedAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "deliveryStatus": { "$ref": "#/components/schemas/DeliveryStatus" }, "ignoredEvents": { "type": "array", "items": { "type": "string" } }, "webhooks": { "type": "array", "items": { "type": "object" } }, "inheritedGlobal": { "type": "boolean", "description": "Indica que a inscrição segue o webhook global do servidor." } }, "required": [ "registered" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/webhook-write-result.md # WebhookWriteResult Estrutura de dados do contrato OpenAPI. ## Campos ### Variante 1 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `id` | `string` | opcional | Formato: `uuid` | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deliveryStatus` | `object` | opcional | Modelo: [DeliveryStatus](https://wpp.atendro.cloud/docs/modelos/delivery-status.md). | | `ignoredEvents` | `array` | opcional | — | | `webhooks` | `array` | opcional | — | | `inheritedGlobal` | `boolean` | opcional | Indica que a inscrição segue o webhook global do servidor. | ### Variante 2 | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | Valores: `true` | | `deleted` | `boolean` | obrigatório | Valores: `true` | ## Definição OpenAPI ```json { "oneOf": [ { "$ref": "#/components/schemas/Webhook" }, { "type": "object", "properties": { "success": { "type": "boolean", "enum": [ true ] }, "deleted": { "type": "boolean", "enum": [ true ] } }, "required": [ "success", "deleted" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/webhook-errors.md # WebhookErrors Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `errors` | `array` | obrigatório | — | | `worker` | `string` | obrigatório | — | | `lastStatus` | `integer` | opcional | — | | `lastError` | `string` | opcional | — | | `consecutiveFailures` | `integer` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "errors": { "type": "array", "items": { "type": "object", "description": "Falhas recentes do worker, sem payload." } }, "worker": { "type": "string" }, "lastStatus": { "type": "integer" }, "lastError": { "type": "string" }, "consecutiveFailures": { "type": "integer" } }, "required": [ "errors", "worker" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/event.md # Event Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `id` | `string` | obrigatório | Formato: `uuid` | | `seq` | `integer` | obrigatório | — | | `type` | `string` | obrigatório | — | | `payload` | `object` | obrigatório | Evento interno; o envelope HTTP entregue ao consumidor é uma projeção. Ver EVENTS.md. | | `createdAt` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `attempts` | `integer` | obrigatório | — | | `status` | `string` | obrigatório | Valores: `"pending"`, `"delivered"`, `"dead"` | | `deliveredAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `deadAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `lastAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `lastStatus` | `integer` | opcional | — | | `lastError` | `string` | opcional | — | | `nextAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | ## Definição OpenAPI ```json { "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "seq": { "type": "integer" }, "type": { "type": "string" }, "payload": { "type": "object", "description": "Evento interno; o envelope HTTP entregue ao consumidor é uma projeção. Ver EVENTS.md." }, "createdAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "attempts": { "type": "integer" }, "status": { "type": "string", "enum": [ "pending", "delivered", "dead" ] }, "deliveredAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "deadAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "lastAttemptAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "lastStatus": { "type": "integer" }, "lastError": { "type": "string" }, "nextAttemptAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" } }, "required": [ "id", "seq", "type", "payload", "createdAt", "attempts", "status" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/events-result.md # EventsResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `events` | `array` | obrigatório | — | | `events[].id` | `string` | obrigatório | Formato: `uuid` | | `events[].seq` | `integer` | obrigatório | — | | `events[].type` | `string` | obrigatório | — | | `events[].payload` | `object` | obrigatório | Evento interno; o envelope HTTP entregue ao consumidor é uma projeção. Ver EVENTS.md. | | `events[].createdAt` | `string` | obrigatório | RFC 3339. Formato: `date-time` | | `events[].attempts` | `integer` | obrigatório | — | | `events[].status` | `string` | obrigatório | Valores: `"pending"`, `"delivered"`, `"dead"` | | `events[].deliveredAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].deadAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].lastAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `events[].lastStatus` | `integer` | opcional | — | | `events[].lastError` | `string` | opcional | — | | `events[].nextAttemptAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `status` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "events": { "type": "array", "items": { "$ref": "#/components/schemas/Event" } }, "status": { "type": "string" } }, "required": [ "events" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/replay-result.md # ReplayResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `success` | `boolean` | obrigatório | — | | `event` | `object` | obrigatório | Modelo: [Event](https://wpp.atendro.cloud/docs/modelos/event.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "success": { "type": "boolean" }, "event": { "$ref": "#/components/schemas/Event" } }, "required": [ "success", "event" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/admin-restart-result.md # AdminRestartResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `message` | `string` | obrigatório | — | | `worker` | `string` | obrigatório | — | ## Definição OpenAPI ```json { "type": "object", "properties": { "message": { "type": "string" }, "worker": { "type": "string" } }, "required": [ "message", "worker" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/global-webhook-request.md # GlobalWebhookRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `action` | `string` | condicional | Valores: `"add"`, `"update"`, `"delete"`. Padrão: `"add"` | | `enabled` | `boolean` | opcional | Padrão: `true` | | `url` | `string` | condicional | HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist. Comprimento máximo: `2048` | | `events` | `string / array` | condicional | Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados. | | `excludeMessages` | `string / array` | opcional | wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo. | | `addUrlEvents` | `boolean / string / integer / null` | opcional | Deve ser false. | | `addUrlTypesMessages` | `boolean / string / integer / null` | opcional | Deve ser false. | | `secret` | `string` | opcional | Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido. Comprimento máximo: `256`. Somente na requisição; não é devolvido | Pelo menos uma destas combinações deve ser válida: - `action`; `action`: Valor fixo: `"delete"` - `url`, `events` ## Definição OpenAPI ```json { "type": "object", "properties": { "action": { "type": "string", "enum": [ "add", "update", "delete" ], "default": "add" }, "enabled": { "type": "boolean", "default": true }, "url": { "type": "string", "description": "HTTPS público, sem credenciais/redirects; exceções de laboratório na allowlist.", "maxLength": 2048 }, "events": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ], "description": "Entregues: connection, messages, messages_update, messages_edit, groups, limits, undecryptable, call e call_settings. call_settings exige inscrição explícita, independentemente de call. Instâncias calls filtram mensagens, recibos, edições, grupos e undecryptable, inclusive no backlog. Nomes de compatibilidade documentados são aceitos e ignorados." }, "excludeMessages": { "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ], "description": "wasSentByApi, wasNotSentByApi, fromMeYes, fromMeNo, isGroupYes, isGroupNo." }, "addUrlEvents": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ], "description": "Deve ser false." }, "addUrlTypesMessages": { "oneOf": [ { "type": "boolean" }, { "type": "string", "enum": [ "true", "false", "1", "0", "" ] }, { "type": "integer", "enum": [ 0, 1 ] }, { "type": "null" } ], "description": "Deve ser false." }, "secret": { "type": "string", "description": "Segredo de assinatura do webhook; até 256 ASCII sem espaços. Nunca é devolvido.", "maxLength": 256, "writeOnly": true } }, "anyOf": [ { "required": [ "action" ], "properties": { "action": { "const": "delete" } } }, { "required": [ "url", "events" ] } ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/global-webhook.md # GlobalWebhook Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `registered` | `boolean` | obrigatório | — | | `url` | `string` | opcional | — | | `events` | `array` | opcional | — | | `enabled` | `boolean` | opcional | — | | `excludeMessages` | `array / null` | opcional | — | | `hasSecret` | `boolean` | opcional | — | | `secretSealed` | `boolean` | opcional | — | | `createdAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `updatedAt` | `string` | opcional | RFC 3339. Formato: `date-time` | | `ignoredEvents` | `array` | opcional | — | | `scope` | `string` | obrigatório | Valor fixo: `"server"` | ## Definição OpenAPI ```json { "type": "object", "properties": { "registered": { "type": "boolean" }, "url": { "type": "string" }, "events": { "type": "array", "items": { "type": "string" } }, "enabled": { "type": "boolean" }, "excludeMessages": { "type": [ "array", "null" ], "items": { "type": "string" } }, "hasSecret": { "type": "boolean" }, "secretSealed": { "type": "boolean" }, "createdAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "updatedAt": { "type": "string", "description": "RFC 3339.", "format": "date-time" }, "ignoredEvents": { "type": "array", "items": { "type": "string" } }, "scope": { "type": "string", "const": "server" } }, "required": [ "registered", "scope" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/make-call-request.md # MakeCallRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `number` | `string` | obrigatório | Telefone com DDI (formatação removida pela API) ou JID de conversa direta. Resolve as duas formas do nono dígito brasileiro. Comprimento mínimo: `1` | | `video` | `boolean` | opcional | Inicia uma chamada de vídeo: a oferta anuncia vídeo e o envio da câmera abre quando a mídia começa. Exige capabilities.calls_video=true; caso contrário 501 calls_video_not_supported. Padrão: `false` | ## Definição OpenAPI ```json { "type": "object", "properties": { "number": { "type": "string", "minLength": 1, "description": "Telefone com DDI (formatação removida pela API) ou JID de conversa direta. Resolve as duas formas do nono dígito brasileiro." }, "video": { "type": "boolean", "default": false, "description": "Inicia uma chamada de vídeo: a oferta anuncia vídeo e o envio da câmera abre quando a mídia começa. Exige capabilities.calls_video=true; caso contrário 501 calls_video_not_supported." } }, "required": [ "number" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-action-request.md # CallActionRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | ## Definição OpenAPI ```json { "type": "object", "properties": { "callId": { "type": "string", "minLength": 1 } }, "required": [ "callId" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call.md # Call Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | ## Definição OpenAPI ```json { "type": "object", "properties": { "callId": { "type": "string" }, "direction": { "type": "string", "enum": [ "inbound", "outbound" ] }, "number": { "type": "string", "description": "Identidade telefônica canônica, quando conhecida." }, "jid": { "type": "string" }, "status": { "type": "string", "enum": [ "ringing", "connecting", "active", "ended" ] }, "startedAt": { "type": "string", "format": "date-time" }, "answeredAt": { "type": "string", "format": "date-time", "description": "Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio." }, "endedAt": { "type": "string", "format": "date-time" }, "endReason": { "type": "string", "description": "hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados." }, "endedBy": { "type": "string", "enum": [ "local", "remote" ] }, "answered": { "type": "boolean", "description": "Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar." }, "mediaStartedAt": { "type": "string", "format": "date-time", "description": "Momento em que o motor confirmou mídia recebida." }, "durationSeconds": { "type": "number", "minimum": 0, "description": "Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso." }, "recording": { "$ref": "#/components/schemas/CallRecording" }, "video": { "type": "boolean", "description": "Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico." }, "videoState": { "$ref": "#/components/schemas/CallVideoState" }, "videoRecording": { "$ref": "#/components/schemas/CallVideoRecording" }, "incomingCallMode": { "$ref": "#/components/schemas/IncomingCallMode" }, "callsConfigVersion": { "type": "integer", "format": "int64", "minimum": 0, "description": "Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão." }, "rejectionSource": { "type": "string", "enum": [ "policy", "busy", "manual" ], "description": "Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo." }, "autoReplyRequested": { "type": "boolean", "description": "Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta." } }, "required": [ "callId", "direction", "number", "status", "startedAt", "video" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/active-calls.md # ActiveCalls Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `calls` | `array` | obrigatório | — | | `calls[].callId` | `string` | obrigatório | — | | `calls[].direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `calls[].number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `calls[].jid` | `string` | opcional | — | | `calls[].status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `calls[].startedAt` | `string` | obrigatório | Formato: `date-time` | | `calls[].answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `calls[].endedAt` | `string` | opcional | Formato: `date-time` | | `calls[].endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `calls[].endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `calls[].answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `calls[].mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `calls[].durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `calls[].recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `calls[].video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `calls[].videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `calls[].videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `calls[].incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `calls[].callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `calls[].rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `calls[].autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | ## Definição OpenAPI ```json { "type": "object", "properties": { "calls": { "type": "array", "items": { "$ref": "#/components/schemas/Call" } } }, "required": [ "calls" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-recording.md # CallRecording Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"not_recorded"`, `"recording"`, `"ready"`, `"failed"`, `"expired"` | | `contentType` | `string` | opcional | Valores: `"audio/wav"` | | `bytes` | `integer` | opcional | — | | `durationSeconds` | `number` | opcional | — | | `downloadPath` | `string` | opcional | Caminho relativo autenticado com header token; somente quando ready. | | `expiresAt` | `string` | opcional | Formato: `date-time` | | `failureReason` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "required": [ "status" ], "properties": { "status": { "type": "string", "enum": [ "not_recorded", "recording", "ready", "failed", "expired" ] }, "contentType": { "type": "string", "enum": [ "audio/wav" ] }, "bytes": { "type": "integer" }, "durationSeconds": { "type": "number" }, "downloadPath": { "type": "string", "description": "Caminho relativo autenticado com header token; somente quando ready." }, "expiresAt": { "type": "string", "format": "date-time" }, "failureReason": { "type": "string" } }, "additionalProperties": false } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-history.md # CallHistory Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `calls` | `array` | obrigatório | — | | `calls[].callId` | `string` | obrigatório | — | | `calls[].direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `calls[].number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `calls[].jid` | `string` | opcional | — | | `calls[].status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `calls[].startedAt` | `string` | obrigatório | Formato: `date-time` | | `calls[].answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `calls[].endedAt` | `string` | opcional | Formato: `date-time` | | `calls[].endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `calls[].endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `calls[].answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `calls[].mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `calls[].durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `calls[].recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `calls[].video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `calls[].videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `calls[].videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `calls[].incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `calls[].callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `calls[].rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `calls[].autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | | `hasMore` | `boolean` | obrigatório | — | | `nextCursor` | `string` | obrigatório | Usar como before na próxima página; vazio quando não há mais resultados. | ## Definição OpenAPI ```json { "type": "object", "required": [ "calls", "hasMore", "nextCursor" ], "properties": { "calls": { "type": "array", "items": { "$ref": "#/components/schemas/Call" } }, "hasMore": { "type": "boolean" }, "nextCursor": { "type": "string", "description": "Usar como before na próxima página; vazio quando não há mais resultados." } }, "additionalProperties": false } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-settings-request.md # CallSettingsRequest Atualização parcial: informe callsMaxConcurrent e/ou incomingCallMode. Campos omitidos são preservados. Cada atualização aceita incrementa callsConfigVersion. Alterar o modo afeta apenas novas chamadas. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callsMaxConcurrent` | `integer` | condicional | Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais. Mínimo: `1`. Máximo: `8` | | `incomingCallMode` | `string` | condicional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `expectedCallsConfigVersion` | `integer` | opcional | Comparação condicional opcional. Se diferente da versão salva, retorna 409 settings_version_conflict sem alterar a instância. Enviar junto a pelo menos um campo de configuração. Mínimo: `0`. Formato: `int64` | Pelo menos uma destas combinações deve ser válida: - `callsMaxConcurrent` - `incomingCallMode` ## Definição OpenAPI ```json { "type": "object", "properties": { "callsMaxConcurrent": { "type": "integer", "minimum": 1, "maximum": 8, "description": "Limite próprio de ligações simultâneas da instância calls: voz e vídeo, recebidas e realizadas, incluindo ringing/connecting/active e reservas de discagem. Acima de 1 ainda depende de homologação em chamadas reais." }, "incomingCallMode": { "$ref": "#/components/schemas/IncomingCallMode" }, "expectedCallsConfigVersion": { "type": "integer", "format": "int64", "minimum": 0, "description": "Comparação condicional opcional. Se diferente da versão salva, retorna 409 settings_version_conflict sem alterar a instância. Enviar junto a pelo menos um campo de configuração." } }, "anyOf": [ { "required": [ "callsMaxConcurrent" ] }, { "required": [ "incomingCallMode" ] } ], "description": "Atualização parcial: informe callsMaxConcurrent e/ou incomingCallMode. Campos omitidos são preservados. Cada atualização aceita incrementa callsConfigVersion. Alterar o modo afeta apenas novas chamadas." } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-settings-result.md # CallSettingsResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `instance` | `object` | obrigatório | Modelo: [Instance](https://wpp.atendro.cloud/docs/modelos/instance.md). | ## Definição OpenAPI ```json { "type": "object", "properties": { "instance": { "$ref": "#/components/schemas/Instance" } }, "required": [ "instance" ] } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-video-state.md # CallVideoState Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `active` | `boolean` | obrigatório | Vídeo ligado em pelo menos uma direção. | | `sending` | `boolean` | obrigatório | O fluxo de vídeo deste lado está aberto: quadros enviados pela ponte de vídeo chegam ao contato. | | `receiving` | `boolean` | obrigatório | A câmera do contato está ligada. | | `requested` | `boolean` | obrigatório | O contato pediu para adicionar vídeo e aguarda action=accept. O WhatsApp retira o pedido sozinho se ninguém responder. | | `pending` | `boolean` | obrigatório | Este lado pediu vídeo (action=start em chamada de áudio) e o contato ainda não respondeu. | | `orientation` | `integer` | obrigatório | Orientação da câmera do contato em quartos de volta no sentido horário; gire os quadros recebidos por orientation×90° para exibir em pé. Mínimo: `0`. Máximo: `3` | ## Definição OpenAPI ```json { "type": "object", "description": "Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando.", "required": [ "active", "sending", "receiving", "requested", "pending", "orientation" ], "properties": { "active": { "type": "boolean", "description": "Vídeo ligado em pelo menos uma direção." }, "sending": { "type": "boolean", "description": "O fluxo de vídeo deste lado está aberto: quadros enviados pela ponte de vídeo chegam ao contato." }, "receiving": { "type": "boolean", "description": "A câmera do contato está ligada." }, "requested": { "type": "boolean", "description": "O contato pediu para adicionar vídeo e aguarda action=accept. O WhatsApp retira o pedido sozinho se ninguém responder." }, "pending": { "type": "boolean", "description": "Este lado pediu vídeo (action=start em chamada de áudio) e o contato ainda não respondeu." }, "orientation": { "type": "integer", "minimum": 0, "maximum": 3, "description": "Orientação da câmera do contato em quartos de volta no sentido horário; gire os quadros recebidos por orientation×90° para exibir em pé." } }, "additionalProperties": false } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-video-request.md # CallVideoRequest Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | Comprimento mínimo: `1` | | `action` | `string` | obrigatório | start liga a câmera deste lado: em chamada só de áudio vira pedido ao contato (pending até a resposta); em chamada que já negociou vídeo apenas reabre o fluxo. accept aceita o pedido do contato (videoState.requested). stop desliga a câmera deste lado ou retira o pedido pendente; o vídeo do contato e o áudio continuam. Valores: `"start"`, `"accept"`, `"stop"` | ## Definição OpenAPI ```json { "type": "object", "required": [ "callId", "action" ], "properties": { "callId": { "type": "string", "minLength": 1 }, "action": { "type": "string", "enum": [ "start", "accept", "stop" ], "description": "start liga a câmera deste lado: em chamada só de áudio vira pedido ao contato (pending até a resposta); em chamada que já negociou vídeo apenas reabre o fluxo. accept aceita o pedido do contato (videoState.requested). stop desliga a câmera deste lado ou retira o pedido pendente; o vídeo do contato e o áudio continuam." } }, "additionalProperties": false } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-settings-event-data.md # CallSettingsEventData Snapshot em data do webhook EventType=call_settings; assinado no envelope existente e entregue somente a inscritos. Cada POST call-settings aceito grava este snapshot e a configuração atomicamente, inclusive desconectado e sem mudança de valor. A configuração inicial é consultada no status. O evento connection usa campos opcionais em instance, não este data. Inclui incomingCallMode; limite e modo formam um único snapshot versionado. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `kind` | `string` | obrigatório | Valor fixo: `"calls"` | | `callsMaxConcurrent` | `integer` | obrigatório | Limite compartilhado de voz/vídeo e chamadas recebidas/realizadas. Redução não encerra chamadas vivas. Mínimo: `1`. Máximo: `8` | | `callsConfigVersion` | `integer` | obrigatório | Versão crescente por instância, incrementada a cada POST aceito; independente de seq do envelope. Retries do mesmo evento preservam a versão. Mínimo: `1`. Formato: `int64` | | `updatedAt` | `string` | obrigatório | Horário UTC da atualização em RFC3339Nano. Comparar versões, não timestamps, para aplicar snapshots. Formato: `date-time` | | `incomingCallMode` | `string` | obrigatório | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | ## Definição OpenAPI ```json { "type": "object", "description": "Snapshot em data do webhook EventType=call_settings; assinado no envelope existente e entregue somente a inscritos. Cada POST call-settings aceito grava este snapshot e a configuração atomicamente, inclusive desconectado e sem mudança de valor. A configuração inicial é consultada no status. O evento connection usa campos opcionais em instance, não este data. Inclui incomingCallMode; limite e modo formam um único snapshot versionado.", "properties": { "kind": { "type": "string", "const": "calls" }, "callsMaxConcurrent": { "type": "integer", "minimum": 1, "maximum": 8, "description": "Limite compartilhado de voz/vídeo e chamadas recebidas/realizadas. Redução não encerra chamadas vivas." }, "callsConfigVersion": { "type": "integer", "format": "int64", "minimum": 1, "description": "Versão crescente por instância, incrementada a cada POST aceito; independente de seq do envelope. Retries do mesmo evento preservam a versão." }, "updatedAt": { "type": "string", "format": "date-time", "description": "Horário UTC da atualização em RFC3339Nano. Comparar versões, não timestamps, para aplicar snapshots." }, "incomingCallMode": { "$ref": "#/components/schemas/IncomingCallMode" } }, "required": [ "kind", "callsMaxConcurrent", "callsConfigVersion", "updatedAt", "incomingCallMode" ], "additionalProperties": true, "example": { "kind": "calls", "callsMaxConcurrent": 2, "callsConfigVersion": 3, "updatedAt": "2026-09-19T15:00:00.123456789Z", "incomingCallMode": "allow" } } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-video-recording.md # CallVideoRecording Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `status` | `string` | obrigatório | Valores: `"recording"`, `"processing"`, `"ready"`, `"failed"`, `"expired"` | | `contentType` | `string` | opcional | Valores: `"video/mp4"` | | `bytes` | `integer` | opcional | — | | `durationSeconds` | `number` | opcional | — | | `downloadPath` | `string` | opcional | Caminho relativo GET /call/{id}/recording/video, autenticado somente pelo header token; presente apenas quando ready. | | `expiresAt` | `string` | opcional | Formato: `date-time` | | `failureReason` | `string` | opcional | — | ## Definição OpenAPI ```json { "type": "object", "required": [ "status" ], "properties": { "status": { "type": "string", "enum": [ "recording", "processing", "ready", "failed", "expired" ] }, "contentType": { "type": "string", "enum": [ "video/mp4" ] }, "bytes": { "type": "integer" }, "durationSeconds": { "type": "number" }, "downloadPath": { "type": "string", "description": "Caminho relativo GET /call/{id}/recording/video, autenticado somente pelo header token; presente apenas quando ready." }, "expiresAt": { "type": "string", "format": "date-time" }, "failureReason": { "type": "string" } }, "additionalProperties": false, "description": "Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado." } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/call-video-recording-event-data.md # CallVideoRecordingEventData Subevento no data do envelope existente EventType=call, entregue a inscritos em call. video_recording_ready/video_recording_failed atualizam apenas o vídeo: não são ended, não liberam vaga e não substituem recording do WAV. Deduplicar por eventId e ordenar pelo seq do envelope. Pode chegar antes ou depois do ended devido à entrega assíncrona; não há data.seq do ciclo da chamada. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `event` | `string` | obrigatório | Valores: `"video_recording_ready"`, `"video_recording_failed"` | | `videoRecording` | `object` | obrigatório | — | | `videoRecording.status` | `string` | obrigatório | Valores: `"ready"`, `"failed"` | | `videoRecording.contentType` | `string` | obrigatório | Valor fixo: `"video/mp4"` | | `videoRecording.durationMs` | `integer` | obrigatório | — | | `videoRecording.bytes` | `integer` | obrigatório | — | | `videoRecording.failureReason` | `string` | obrigatório | — | | `timestamp` | `integer` | obrigatório | Horário do registro do evento em segundos Unix. | ## Definição OpenAPI ```json { "type": "object", "description": "Subevento no data do envelope existente EventType=call, entregue a inscritos em call. video_recording_ready/video_recording_failed atualizam apenas o vídeo: não são ended, não liberam vaga e não substituem recording do WAV. Deduplicar por eventId e ordenar pelo seq do envelope. Pode chegar antes ou depois do ended devido à entrega assíncrona; não há data.seq do ciclo da chamada.", "required": [ "callId", "event", "videoRecording", "timestamp" ], "properties": { "callId": { "type": "string" }, "event": { "type": "string", "enum": [ "video_recording_ready", "video_recording_failed" ] }, "videoRecording": { "type": "object", "required": [ "status", "contentType", "durationMs", "bytes", "failureReason" ], "properties": { "status": { "type": "string", "enum": [ "ready", "failed" ] }, "contentType": { "type": "string", "const": "video/mp4" }, "durationMs": { "type": "integer" }, "bytes": { "type": "integer" }, "failureReason": { "type": "string" } }, "additionalProperties": false }, "timestamp": { "type": "integer", "description": "Horário do registro do evento em segundos Unix." } }, "additionalProperties": false } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-cpu.md # HostHealthCPU Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `ioWaitPercent` | `number / null` | obrigatório | — | | `logicalCPUs` | `integer / null` | obrigatório | — | | `stealPercent` | `number / null` | obrigatório | — | | `usagePercent` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "ioWaitPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "logicalCPUs": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "stealPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "usagePercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "logicalCPUs", "usagePercent", "ioWaitPercent", "stealPercent" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-directory.md # HostHealthDirectory Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `auxiliaryBytes` | `integer / null` | obrigatório | — | | `auxiliaryFiles` | `integer / null` | obrigatório | — | | `bytes` | `integer / null` | obrigatório | — | | `complete` | `boolean` | obrigatório | false identifica varredura parcial/interrompida: os bytes/arquivos observados são um limite inferior, não um total completo. | | `compressedBytes` | `integer / null` | obrigatório | — | | `compressedFiles` | `integer / null` | obrigatório | — | | `files` | `integer / null` | obrigatório | — | | `incompleteBytes` | `integer / null` | obrigatório | — | | `incompleteFiles` | `integer / null` | obrigatório | — | | `latestAgeSeconds` | `number / null` | obrigatório | — | | `oldestAgeSeconds` | `number / null` | obrigatório | — | | `rawBytes` | `integer / null` | obrigatório | — | | `rawFiles` | `integer / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "auxiliaryBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "auxiliaryFiles": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "bytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "complete": { "description": "false identifica varredura parcial/interrompida: os bytes/arquivos observados são um limite inferior, não um total completo.", "type": "boolean" }, "compressedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "compressedFiles": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "files": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "incompleteBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "incompleteFiles": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "latestAgeSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "oldestAgeSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "rawBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "rawFiles": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] } }, "required": [ "complete", "bytes", "files", "rawBytes", "rawFiles", "compressedBytes", "compressedFiles", "incompleteBytes", "incompleteFiles", "auxiliaryBytes", "auxiliaryFiles", "oldestAgeSeconds", "latestAgeSeconds" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-disk-io.md # HostHealthDiskIO Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `busyPercent` | `number / null` | obrigatório | — | | `inFlight` | `integer / null` | obrigatório | — | | `readBytesPerSecond` | `number / null` | obrigatório | — | | `readsPerSecond` | `number / null` | obrigatório | — | | `scope` | `string` | obrigatório | Valores: `"root_device"` | | `writeBytesPerSecond` | `number / null` | obrigatório | — | | `writesPerSecond` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "busyPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "inFlight": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "readBytesPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "readsPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "scope": { "enum": [ "root_device" ], "type": "string" }, "writeBytesPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "writesPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "scope", "inFlight", "readBytesPerSecond", "writeBytesPerSecond", "readsPerSecond", "writesPerSecond", "busyPercent" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-docker.md # HostHealthDocker Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `available` | `boolean` | obrigatório | — | | `services` | `object / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "available": { "type": "boolean" }, "services": { "anyOf": [ { "additionalProperties": { "$ref": "#/components/schemas/HostHealthService" }, "type": "object" }, { "type": "null" } ] } }, "required": [ "available", "services" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-filesystem.md # HostHealthFilesystem Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `availableBytes` | `integer / null` | obrigatório | — | | `availablePercent` | `number / null` | obrigatório | — | | `freeBytes` | `integer / null` | obrigatório | — | | `inodesFree` | `integer / null` | obrigatório | — | | `inodesTotal` | `integer / null` | obrigatório | — | | `inodesUsedPercent` | `number / null` | obrigatório | — | | `reservedBytes` | `integer / null` | obrigatório | — | | `totalBytes` | `integer / null` | obrigatório | — | | `usedBytes` | `integer / null` | obrigatório | — | | `usedPercent` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "availableBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "availablePercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "freeBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "inodesFree": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "inodesTotal": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "inodesUsedPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "reservedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "totalBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "totalBytes", "freeBytes", "availableBytes", "reservedBytes", "usedBytes", "usedPercent", "availablePercent", "inodesTotal", "inodesFree", "inodesUsedPercent" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-load.md # HostHealthLoad Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `fifteen` | `number / null` | obrigatório | — | | `fifteenPerCPU` | `number / null` | obrigatório | — | | `five` | `number / null` | obrigatório | — | | `fivePerCPU` | `number / null` | obrigatório | — | | `one` | `number / null` | obrigatório | — | | `onePerCPU` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "fifteen": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "fifteenPerCPU": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "five": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "fivePerCPU": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "one": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "onePerCPU": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "one", "five", "fifteen", "onePerCPU", "fivePerCPU", "fifteenPerCPU" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-memory.md # HostHealthMemory Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `availableBytes` | `integer / null` | obrigatório | — | | `totalBytes` | `integer / null` | obrigatório | — | | `usedBytes` | `integer / null` | obrigatório | — | | `usedPercent` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "availableBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "totalBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "totalBytes", "availableBytes", "usedBytes", "usedPercent" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-network.md # HostHealthNetwork Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `interfaces` | `integer / null` | obrigatório | — | | `receivedBytes` | `integer / null` | obrigatório | — | | `receivedBytesPerSecond` | `number / null` | obrigatório | — | | `scope` | `string` | obrigatório | Agrega interfaces não loopback, incluindo interfaces virtuais; não equivale ao tráfego externo faturado pelo provedor. Valores: `"all_non_loopback"` | | `transmittedBytes` | `integer / null` | obrigatório | — | | `transmittedBytesPerSecond` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "interfaces": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "receivedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "receivedBytesPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "scope": { "description": "Agrega interfaces não loopback, incluindo interfaces virtuais; não equivale ao tráfego externo faturado pelo provedor.", "enum": [ "all_non_loopback" ], "type": "string" }, "transmittedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "transmittedBytesPerSecond": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "scope", "interfaces", "receivedBytes", "transmittedBytes", "receivedBytesPerSecond", "transmittedBytesPerSecond" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-operations.md # HostHealthOperations Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `backupVerification` | `object / null` | obrigatório | — | | `docker` | `object / null` | obrigatório | — | | `storage` | `object / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "backupVerification": { "anyOf": [ { "$ref": "#/components/schemas/HostHealthVerification" }, { "type": "null" } ] }, "docker": { "anyOf": [ { "$ref": "#/components/schemas/HostHealthDocker" }, { "type": "null" } ] }, "storage": { "anyOf": [ { "additionalProperties": { "$ref": "#/components/schemas/HostHealthDirectory" }, "type": "object" }, { "type": "null" } ] } }, "required": [ "docker", "storage", "backupVerification" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-result.md # HostHealthResult Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `ageSeconds` | `number / null` | obrigatório | — | | `errors` | `array / null` | obrigatório | — | | `snapshot` | `object / null` | obrigatório | — | | `status` | `string` | obrigatório | Valores: `"ok"`, `"degraded"`, `"stale"`, `"unavailable"` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "ageSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "errors": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ] }, "snapshot": { "anyOf": [ { "$ref": "#/components/schemas/HostHealthSnapshot" }, { "type": "null" } ] }, "status": { "enum": [ "ok", "degraded", "stale", "unavailable" ], "type": "string" } }, "required": [ "status", "ageSeconds", "snapshot", "errors" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-service.md # HostHealthService Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `containers` | `integer` | obrigatório | Mínimo: `0` | | `health` | `string` | obrigatório | Valores: `"unknown"`, `"none"`, `"healthy"`, `"starting"`, `"unhealthy"` | | `oomKilled` | `integer` | obrigatório | Mínimo: `0` | | `restarting` | `integer` | obrigatório | Mínimo: `0` | | `restarts` | `integer` | obrigatório | Mínimo: `0` | | `running` | `integer` | obrigatório | Mínimo: `0` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "containers": { "minimum": 0, "type": "integer" }, "health": { "enum": [ "unknown", "none", "healthy", "starting", "unhealthy" ], "type": "string" }, "oomKilled": { "minimum": 0, "type": "integer" }, "restarting": { "minimum": 0, "type": "integer" }, "restarts": { "minimum": 0, "type": "integer" }, "running": { "minimum": 0, "type": "integer" } }, "required": [ "containers", "running", "restarting", "oomKilled", "restarts", "health" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-snapshot.md # HostHealthSnapshot Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `cpu` | `object` | obrigatório | Modelo: [HostHealthCPU](https://wpp.atendro.cloud/docs/modelos/host-health-cpu.md). | | `diskIO` | `object` | obrigatório | Modelo: [HostHealthDiskIO](https://wpp.atendro.cloud/docs/modelos/host-health-disk-io.md). | | `errors` | `array / null` | obrigatório | — | | `intervalSeconds` | `number / null` | obrigatório | — | | `load` | `object` | obrigatório | Modelo: [HostHealthLoad](https://wpp.atendro.cloud/docs/modelos/host-health-load.md). | | `memory` | `object` | obrigatório | Modelo: [HostHealthMemory](https://wpp.atendro.cloud/docs/modelos/host-health-memory.md). | | `network` | `object` | obrigatório | Modelo: [HostHealthNetwork](https://wpp.atendro.cloud/docs/modelos/host-health-network.md). | | `operations` | `object / null` | opcional | — | | `rootFilesystem` | `object` | obrigatório | Modelo: [HostHealthFilesystem](https://wpp.atendro.cloud/docs/modelos/host-health-filesystem.md). | | `sampledAt` | `string` | obrigatório | Formato: `date-time` | | `schemaVersion` | `integer` | obrigatório | Valor fixo: `1`. Mínimo: `0` | | `source` | `string` | obrigatório | Valores: `"host"` | | `swap` | `object` | obrigatório | Modelo: [HostHealthSwap](https://wpp.atendro.cloud/docs/modelos/host-health-swap.md). | | `uptimeSeconds` | `number / null` | obrigatório | — | | `validForSeconds` | `integer` | obrigatório | Mínimo: `1`. Máximo: `3600` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "cpu": { "$ref": "#/components/schemas/HostHealthCPU" }, "diskIO": { "$ref": "#/components/schemas/HostHealthDiskIO" }, "errors": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ] }, "intervalSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "load": { "$ref": "#/components/schemas/HostHealthLoad" }, "memory": { "$ref": "#/components/schemas/HostHealthMemory" }, "network": { "$ref": "#/components/schemas/HostHealthNetwork" }, "operations": { "anyOf": [ { "$ref": "#/components/schemas/HostHealthOperations" }, { "type": "null" } ] }, "rootFilesystem": { "$ref": "#/components/schemas/HostHealthFilesystem" }, "sampledAt": { "format": "date-time", "type": "string" }, "schemaVersion": { "const": 1, "minimum": 0, "type": "integer" }, "source": { "enum": [ "host" ], "type": "string" }, "swap": { "$ref": "#/components/schemas/HostHealthSwap" }, "uptimeSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "validForSeconds": { "maximum": 3600, "minimum": 1, "type": "integer" } }, "required": [ "schemaVersion", "source", "sampledAt", "validForSeconds", "intervalSeconds", "uptimeSeconds", "cpu", "memory", "swap", "load", "rootFilesystem", "network", "diskIO", "errors" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-swap.md # HostHealthSwap Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `freeBytes` | `integer / null` | obrigatório | — | | `totalBytes` | `integer / null` | obrigatório | — | | `usedBytes` | `integer / null` | obrigatório | — | | `usedPercent` | `number / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "freeBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "totalBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "usedPercent": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] } }, "required": [ "totalBytes", "freeBytes", "usedBytes", "usedPercent" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/host-health-verification.md # HostHealthVerification Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `ageSeconds` | `number / null` | obrigatório | — | | `verified` | `boolean` | obrigatório | Indica marcador local de pg_verifybackup bem-sucedido. Não comprova sozinho teste de restauração, cópia externa ou continuidade de toda a cadeia PITR. | | `verifiedAt` | `string / null` | obrigatório | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "ageSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "verified": { "description": "Indica marcador local de pg_verifybackup bem-sucedido. Não comprova sozinho teste de restauração, cópia externa ou continuidade de toda a cadeia PITR.", "type": "boolean" }, "verifiedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ] } }, "required": [ "verified", "verifiedAt", "ageSeconds" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status.md # SystemStatus Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `database` | `object` | obrigatório | Modelo: [SystemStatusDatabase](https://wpp.atendro.cloud/docs/modelos/system-status-database.md). | | `host` | `object` | obrigatório | Modelo: [HostHealthResult](https://wpp.atendro.cloud/docs/modelos/host-health-result.md). | | `process` | `object` | obrigatório | Processo Go/API: heap e runtimeSys não são RAM usada da VPS; gomaxprocs não mede núcleos físicos nem CPU do host. Modelo: [SystemStatusProcess](https://wpp.atendro.cloud/docs/modelos/system-status-process.md). | | `sampledAt` | `string` | obrigatório | Instante UTC da amostragem do worker. O host tem sampledAt e idade próprios. Formato: `date-time` | | `schemaVersion` | `integer` | obrigatório | Valor fixo: `1`. Mínimo: `0` | | `status` | `string` | obrigatório | HTTP 200 significa que o observador respondeu. Verificar available/status em cada bloco; valores indisponíveis não representam consumo zero. Valores: `"ok"`, `"degraded"` | | `version` | `string` | opcional | — | | `workerId` | `string` | obrigatório | Padrão de formato: `^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$` | | `workload` | `object` | obrigatório | Modelo: [SystemStatusWorkload](https://wpp.atendro.cloud/docs/modelos/system-status-workload.md). | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "database": { "$ref": "#/components/schemas/SystemStatusDatabase" }, "host": { "$ref": "#/components/schemas/HostHealthResult" }, "process": { "$ref": "#/components/schemas/SystemStatusProcess", "description": "Processo Go/API: heap e runtimeSys não são RAM usada da VPS; gomaxprocs não mede núcleos físicos nem CPU do host." }, "sampledAt": { "description": "Instante UTC da amostragem do worker. O host tem sampledAt e idade próprios.", "format": "date-time", "type": "string" }, "schemaVersion": { "const": 1, "minimum": 0, "type": "integer" }, "status": { "description": "HTTP 200 significa que o observador respondeu. Verificar available/status em cada bloco; valores indisponíveis não representam consumo zero.", "enum": [ "ok", "degraded" ], "type": "string" }, "version": { "type": "string" }, "workerId": { "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$", "type": "string" }, "workload": { "$ref": "#/components/schemas/SystemStatusWorkload" } }, "required": [ "schemaVersion", "sampledAt", "status", "workerId", "process", "database", "workload", "host" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-archiver.md # SystemStatusArchiver Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `archiveTimeoutSeconds` | `number / null` | opcional | — | | `archivedCount` | `integer` | obrigatório | Mínimo: `0` | | `available` | `boolean` | obrigatório | — | | `backlogErrorCode` | `string` | opcional | Valores: `"archiver_backlog_unavailable"` | | `commandSource` | `string` | opcional | Origem enumerada de pg_settings.source; nunca o comando, caminho ou conteúdo da configuração. Valores: `"unknown"`, `"default"`, `"environment variable"`, `"configuration file"`, `"command line"`, `"global"`, `"database"`, `"user"`, `"database user"`, `"client"`, `"override"`, `"interactive"`, `"test"`, `"session"` | | `errorCode` | `string` | opcional | Valores: `"database_unavailable"`, `"archiver_stats_unavailable"`, `"monitoring_unsupported"` | | `failedCount` | `integer` | obrigatório | Falhas acumuladas desde statsResetAt; não indica, isoladamente, falha atual. Mínimo: `0` | | `lastArchivedAt` | `string / null` | opcional | — | | `lastFailedAt` | `string / null` | opcional | — | | `mode` | `string` | opcional | Valores: `"off"`, `"on"`, `"always"` | | `readyFiles` | `integer / null` | opcional | — | | `segmentBytes` | `integer / null` | opcional | — | | `statsResetAt` | `string / null` | opcional | — | | `status` | `string` | obrigatório | blocked: última falha posterior ao último sucesso e readyFiles>0. failedCount é cumulativo e sozinho não dispara alarme. disabled corresponde a archive_mode=off. degraded indica backlog não consultável. Valores: `"ok"`, `"disabled"`, `"degraded"`, `"blocked"`, `"unavailable"` | | `timeoutSource` | `string` | opcional | Origem enumerada de pg_settings.source; nunca o comando, caminho ou conteúdo da configuração. Valores: `"unknown"`, `"default"`, `"environment variable"`, `"configuration file"`, `"command line"`, `"global"`, `"database"`, `"user"`, `"database user"`, `"client"`, `"override"`, `"interactive"`, `"test"`, `"session"` | | `walBytes` | `integer / null` | opcional | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "archiveTimeoutSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "archivedCount": { "minimum": 0, "type": "integer" }, "available": { "type": "boolean" }, "backlogErrorCode": { "enum": [ "archiver_backlog_unavailable" ], "type": "string" }, "commandSource": { "description": "Origem enumerada de pg_settings.source; nunca o comando, caminho ou conteúdo da configuração.", "enum": [ "unknown", "default", "environment variable", "configuration file", "command line", "global", "database", "user", "database user", "client", "override", "interactive", "test", "session" ], "type": "string" }, "errorCode": { "enum": [ "database_unavailable", "archiver_stats_unavailable", "monitoring_unsupported" ], "type": "string" }, "failedCount": { "description": "Falhas acumuladas desde statsResetAt; não indica, isoladamente, falha atual.", "minimum": 0, "type": "integer" }, "lastArchivedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ] }, "lastFailedAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ] }, "mode": { "enum": [ "off", "on", "always" ], "type": "string" }, "readyFiles": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "segmentBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] }, "statsResetAt": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ] }, "status": { "description": "blocked: última falha posterior ao último sucesso e readyFiles>0. failedCount é cumulativo e sozinho não dispara alarme. disabled corresponde a archive_mode=off. degraded indica backlog não consultável.", "enum": [ "ok", "disabled", "degraded", "blocked", "unavailable" ], "type": "string" }, "timeoutSource": { "description": "Origem enumerada de pg_settings.source; nunca o comando, caminho ou conteúdo da configuração.", "enum": [ "unknown", "default", "environment variable", "configuration file", "command line", "global", "database", "user", "database user", "client", "override", "interactive", "test", "session" ], "type": "string" }, "walBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] } }, "required": [ "available", "status", "archivedCount", "failedCount" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-call-counts.md # SystemStatusCallCounts Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `active` | `integer` | obrigatório | Mínimo: `0` | | `connecting` | `integer` | obrigatório | Mínimo: `0` | | `live` | `integer` | obrigatório | Chamadas persistidas abertas com lease vigente deste worker. Exclui snapshots cujo lease expirou ou mudou; não mede fluxo RTP/saúde de mídia. Mínimo: `0` | | `persistedOpen` | `integer` | obrigatório | Mínimo: `0` | | `ringing` | `integer` | obrigatório | Mínimo: `0` | | `scope` | `string` | obrigatório | Valores: `"worker"` | | `source` | `string` | obrigatório | Valores: `"database_snapshot"` | | `stale` | `integer` | obrigatório | Mínimo: `0` | | `video` | `integer` | obrigatório | Mínimo: `0` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "active": { "minimum": 0, "type": "integer" }, "connecting": { "minimum": 0, "type": "integer" }, "live": { "description": "Chamadas persistidas abertas com lease vigente deste worker. Exclui snapshots cujo lease expirou ou mudou; não mede fluxo RTP/saúde de mídia.", "minimum": 0, "type": "integer" }, "persistedOpen": { "minimum": 0, "type": "integer" }, "ringing": { "minimum": 0, "type": "integer" }, "scope": { "enum": [ "worker" ], "type": "string" }, "source": { "enum": [ "database_snapshot" ], "type": "string" }, "stale": { "minimum": 0, "type": "integer" }, "video": { "minimum": 0, "type": "integer" } }, "required": [ "source", "scope", "persistedOpen", "live", "stale", "ringing", "connecting", "active", "video" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-database.md # SystemStatusDatabase Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `archiver` | `object` | obrigatório | Modelo: [SystemStatusArchiver](https://wpp.atendro.cloud/docs/modelos/system-status-archiver.md). | | `available` | `boolean` | obrigatório | — | | `errorCode` | `string` | opcional | Valores: `"database_unavailable"`, `"database_size_unavailable"`, `"monitoring_unsupported"` | | `pool` | `object / null` | opcional | — | | `sizeBytes` | `integer / null` | opcional | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "archiver": { "$ref": "#/components/schemas/SystemStatusArchiver" }, "available": { "type": "boolean" }, "errorCode": { "enum": [ "database_unavailable", "database_size_unavailable", "monitoring_unsupported" ], "type": "string" }, "pool": { "anyOf": [ { "$ref": "#/components/schemas/SystemStatusPool" }, { "type": "null" } ] }, "sizeBytes": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] } }, "required": [ "available", "archiver" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-instance-counts.md # SystemStatusInstanceCounts Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callSlotsConfigured` | `integer` | obrigatório | Soma dos limites de instâncias calls; valores herdados usam o padrão deste worker. Não é capacidade física medida. Mínimo: `0` | | `callSlotsOwned` | `integer` | obrigatório | Soma dos limites das instâncias calls sob lease vigente deste worker. Mínimo: `0` | | `calls` | `object` | obrigatório | Modelo: [SystemStatusInstanceState](https://wpp.atendro.cloud/docs/modelos/system-status-instance-state.md). | | `ownedByWorker` | `integer` | obrigatório | Leases deste worker ainda não expirados. Mínimo: `0` | | `scope` | `string` | obrigatório | Valores: `"database"` | | `staleConnected` | `integer` | obrigatório | Status persistido connected sem lease vigente. Os totais por estado são snapshots persistidos, não sondas da conexão WhatsApp. Mínimo: `0` | | `total` | `integer` | obrigatório | Instâncias não excluídas neste banco. Bancos compartilhados entre workers duplicam esse total: não somar os nós sem considerar o escopo. Mínimo: `0` | | `whatsapp` | `object` | obrigatório | Modelo: [SystemStatusInstanceState](https://wpp.atendro.cloud/docs/modelos/system-status-instance-state.md). | | `workerSessionLimit` | `integer / null` | opcional | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "callSlotsConfigured": { "description": "Soma dos limites de instâncias calls; valores herdados usam o padrão deste worker. Não é capacidade física medida.", "minimum": 0, "type": "integer" }, "callSlotsOwned": { "description": "Soma dos limites das instâncias calls sob lease vigente deste worker.", "minimum": 0, "type": "integer" }, "calls": { "$ref": "#/components/schemas/SystemStatusInstanceState" }, "ownedByWorker": { "description": "Leases deste worker ainda não expirados.", "minimum": 0, "type": "integer" }, "scope": { "enum": [ "database" ], "type": "string" }, "staleConnected": { "description": "Status persistido connected sem lease vigente. Os totais por estado são snapshots persistidos, não sondas da conexão WhatsApp.", "minimum": 0, "type": "integer" }, "total": { "description": "Instâncias não excluídas neste banco. Bancos compartilhados entre workers duplicam esse total: não somar os nós sem considerar o escopo.", "minimum": 0, "type": "integer" }, "whatsapp": { "$ref": "#/components/schemas/SystemStatusInstanceState" }, "workerSessionLimit": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ] } }, "required": [ "scope", "total", "whatsapp", "calls", "ownedByWorker", "staleConnected", "callSlotsConfigured", "callSlotsOwned" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-instance-state.md # SystemStatusInstanceState Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `connected` | `integer` | obrigatório | Mínimo: `0` | | `connecting` | `integer` | obrigatório | Mínimo: `0` | | `disconnected` | `integer` | obrigatório | Mínimo: `0` | | `total` | `integer` | obrigatório | Mínimo: `0` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "connected": { "minimum": 0, "type": "integer" }, "connecting": { "minimum": 0, "type": "integer" }, "disconnected": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" } }, "required": [ "total", "connected", "connecting", "disconnected" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-pool.md # SystemStatusPool Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `idle` | `integer` | obrigatório | Mínimo: `0` | | `inUse` | `integer` | obrigatório | Mínimo: `0` | | `maxIdleClosed` | `integer` | obrigatório | Mínimo: `0` | | `maxLifetimeClosed` | `integer` | obrigatório | Mínimo: `0` | | `maxOpenConnections` | `integer` | obrigatório | Mínimo: `0` | | `openConnections` | `integer` | obrigatório | Mínimo: `0` | | `waitCount` | `integer` | obrigatório | Mínimo: `0` | | `waitDurationSeconds` | `number` | obrigatório | Mínimo: `0` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "idle": { "minimum": 0, "type": "integer" }, "inUse": { "minimum": 0, "type": "integer" }, "maxIdleClosed": { "minimum": 0, "type": "integer" }, "maxLifetimeClosed": { "minimum": 0, "type": "integer" }, "maxOpenConnections": { "minimum": 0, "type": "integer" }, "openConnections": { "minimum": 0, "type": "integer" }, "waitCount": { "minimum": 0, "type": "integer" }, "waitDurationSeconds": { "minimum": 0, "type": "number" } }, "required": [ "maxOpenConnections", "openConnections", "inUse", "idle", "waitCount", "waitDurationSeconds", "maxIdleClosed", "maxLifetimeClosed" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-process.md # SystemStatusProcess Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `goVersion` | `string` | obrigatório | — | | `gomaxprocs` | `integer` | obrigatório | Mínimo: `0` | | `goroutines` | `integer` | obrigatório | Mínimo: `0` | | `heapAllocBytes` | `integer` | obrigatório | Mínimo: `0` | | `heapInuseBytes` | `integer` | obrigatório | Mínimo: `0` | | `runtimeSysBytes` | `integer` | obrigatório | Mínimo: `0` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `uptimeSeconds` | `number` | obrigatório | Mínimo: `0` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "goVersion": { "type": "string" }, "gomaxprocs": { "minimum": 0, "type": "integer" }, "goroutines": { "minimum": 0, "type": "integer" }, "heapAllocBytes": { "minimum": 0, "type": "integer" }, "heapInuseBytes": { "minimum": 0, "type": "integer" }, "runtimeSysBytes": { "minimum": 0, "type": "integer" }, "startedAt": { "format": "date-time", "type": "string" }, "uptimeSeconds": { "minimum": 0, "type": "number" } }, "required": [ "startedAt", "uptimeSeconds", "goVersion", "gomaxprocs", "goroutines", "heapAllocBytes", "heapInuseBytes", "runtimeSysBytes" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-webhook-counts.md # SystemStatusWebhookCounts Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `dead` | `integer` | obrigatório | Eventos mortos de instâncias não excluídas, inclusive se o webhook foi desabilitado. Mínimo: `0` | | `enabledDestinations` | `integer` | obrigatório | Mínimo: `0` | | `failingDestinations` | `integer` | obrigatório | Mínimo: `0` | | `oldestPendingAgeSeconds` | `number / null` | opcional | — | | `pausedDestinations` | `integer` | obrigatório | Mínimo: `0` | | `pending` | `integer` | obrigatório | Eventos sem entrega nem dead_at, posteriores ao start_seq, com webhook habilitado e instância não excluída. Inclui destinos temporariamente pausados. Mínimo: `0` | | `retriedPending` | `integer` | obrigatório | Eventos elegíveis pendentes com attempts>0; não é contador histórico de todas as falhas. Mínimo: `0` | | `scope` | `string` | obrigatório | Valores: `"database"` | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "dead": { "description": "Eventos mortos de instâncias não excluídas, inclusive se o webhook foi desabilitado.", "minimum": 0, "type": "integer" }, "enabledDestinations": { "minimum": 0, "type": "integer" }, "failingDestinations": { "minimum": 0, "type": "integer" }, "oldestPendingAgeSeconds": { "anyOf": [ { "minimum": 0, "type": "number" }, { "type": "null" } ] }, "pausedDestinations": { "minimum": 0, "type": "integer" }, "pending": { "description": "Eventos sem entrega nem dead_at, posteriores ao start_seq, com webhook habilitado e instância não excluída. Inclui destinos temporariamente pausados.", "minimum": 0, "type": "integer" }, "retriedPending": { "description": "Eventos elegíveis pendentes com attempts>0; não é contador histórico de todas as falhas.", "minimum": 0, "type": "integer" }, "scope": { "enum": [ "database" ], "type": "string" } }, "required": [ "scope", "pending", "dead", "retriedPending", "enabledDestinations", "failingDestinations", "pausedDestinations" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/system-status-workload.md # SystemStatusWorkload Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `available` | `boolean` | obrigatório | — | | `calls` | `object / null` | opcional | — | | `errorCode` | `string` | opcional | Valores: `"database_unavailable"`, `"workload_unavailable"`, `"monitoring_unsupported"` | | `instances` | `object / null` | opcional | — | | `webhooks` | `object / null` | opcional | — | ## Definição OpenAPI ```json { "additionalProperties": true, "properties": { "available": { "type": "boolean" }, "calls": { "anyOf": [ { "$ref": "#/components/schemas/SystemStatusCallCounts" }, { "type": "null" } ] }, "errorCode": { "enum": [ "database_unavailable", "workload_unavailable", "monitoring_unsupported" ], "type": "string" }, "instances": { "anyOf": [ { "$ref": "#/components/schemas/SystemStatusInstanceCounts" }, { "type": "null" } ] }, "webhooks": { "anyOf": [ { "$ref": "#/components/schemas/SystemStatusWebhookCounts" }, { "type": "null" } ] } }, "required": [ "available" ], "type": "object" } ``` --- Fonte: https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md # IncomingCallMode Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. ## Campos Tipo: `string`. Valores: `"allow"`, `"reject"`, `"reject_reply"` ## Definição OpenAPI ```json { "type": "string", "enum": [ "allow", "reject", "reject_reply" ], "description": "Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa." } ```