Referência da API /v1

Todos os endpoints REST da BotoZap, agrupados por recurso, com o escopo exigido, o modelo de paginação e as honestidades que valem a pena saber antes de integrar.

Esta é a lista completa das rotas /v1. O contrato exato de cada request/response é a combinação desta referência com os exemplos testados nas páginas de guia (Enviar mensagens, Webhooks, Transmissões e limites). Cada exemplo roda contra o handler real antes de ser publicado, então request e resposta mostrados nunca divergem do comportamento em produção.

Convenções

Base URL de todas as rotas:

https://botozap.com.br/api/v1

Toda requisição leva a sua chave de API no header, como Authorization: Bearer ou como X-API-Key. A conta é derivada da chave, então você nunca passa um id de conta (o isolamento multi-tenant é garantido no servidor). Detalhes de autenticação e escopos em Autenticação.

Authorization: Bearer $BOTOZAP_KEY
# ou
X-API-Key: $BOTOZAP_KEY

As respostas seguem um envelope fixo:

  • Sucesso singular: { "data": <objeto> }.
  • Lista: { "data": [...], "paging" | "meta": {...} }.
  • Exceção: POST /api/v1/messages retorna direto { id, wamid, to, status }, sem envelope.

Erros vêm num envelope estruturado com código e mensagem:

{
  "error": {
    "code": "forbidden_scope",
    "message": "Esta chave de API não tem o escopo 'messages:send'."
  }
}

Escopos

Cada rota exige um escopo específico (coluna Escopo nas tabelas abaixo). Uma chave criada com a lista de escopos vazia tem acesso total a todas as rotas: é o comportamento legado para chaves criadas antes de o sistema de escopos existir. Veja a explicação completa em Autenticação.

Ambiente sandbox

Uma chave bz_sandbox_ só pode acessar uma allow-list fail-closed de rotas. Hoje, apenas POST /api/v1/messages, GET /api/v1/messages, GET /api/v1/messages/{id}, GET /api/v1/media/{id} e GET /api/v1/media/{id}/download(marcadas "sandbox" nas tabelas abaixo; nas rotas de mídia, uma chave sandbox só consulta a mídia sintética sandbox-media-0001). Qualquer outra rota responde 403 sandbox_forbidden para uma chave sandbox. Veja Sandbox vs. produção.

Paginação

Dois modelos coexistem, dependendo do recurso, nunca os dois na mesma rota:

Por cursor

Para coleções grandes e de append (mensagens, contatos, conversas, webhooks, entregas de webhook, logs de API, destinatários de transmissão). Query params: limit (padrão 20, máximo 100), after e before. A resposta traz:

{
  "data": [...],
  "paging": {
    "cursors": { "before": "...", "after": "..." },
    "next": "...",
    "previous": "..."
  }
}

Rotas por cursor: /api/v1/messages, /api/v1/contacts, /api/v1/conversations, /api/v1/webhooks, /api/v1/webhook_deliveries, /api/v1/api_logs, /api/v1/broadcasts/{id}/recipients.

Por página (offset)

Para coleções pequenas e estáveis (clientes, números, templates, usuários, transmissões, flows, links de onboarding, atribuições de conversa). Query params: page e per_page (padrão 20, máximo 100). A resposta traz:

{
  "data": [...],
  "meta": { "page": 1, "per_page": 20, "total_pages": 3, "total_count": 42 }
}

Os mesmos números também vêm nos headers X-Page, X-Per-Page, X-Total-Pages e X-Total. Rotas por página: /api/v1/customers, /api/v1/phone_numbers, /api/v1/templates, /api/v1/users, /api/v1/broadcasts, /api/v1/flows, /api/v1/flows/{id}/versions, /api/v1/customers/{id}/setup_links, /api/v1/conversations/{id}/assignments.

Mensagens

MétodoCaminhoEscopoDescrição
POST/api/v1/messagesmessages:sendEnvia uma mensagem (texto ou template). Aceita chave sandbox.
GET/api/v1/messagesmessages:readLista as mensagens da conta, paginada por cursor. Aceita chave sandbox.
GET/api/v1/messages/{id}messages:readConsulta uma mensagem por UUID interno ou wamid. Aceita chave sandbox.

Clientes

MétodoCaminhoEscopoDescrição
GET/api/v1/customerscustomers:readLista os seus clientes, paginado por página.
POST/api/v1/customerscustomers:writeCria um cliente.
GET/api/v1/customers/{id}customers:readConsulta um cliente.
PATCH/api/v1/customers/{id}customers:writeAtualiza um cliente.
DELETE/api/v1/customers/{id}customers:writeRemove um cliente.
GET/api/v1/customers/{id}/setup_linkscustomers:readLista os links de onboarding do cliente, paginado por página.
POST/api/v1/customers/{id}/setup_linkscustomers:writeCria um link de onboarding (Embedded Signup).
PATCH/api/v1/customers/{id}/setup_links/{linkId}customers:writeAtualiza status (active/expired/revoked) ou expires_at do link, inclusive para revogá-lo. Não há GET nem DELETE individuais para um link específico.

Templates

MétodoCaminhoEscopoDescrição
GET/api/v1/templatestemplates:readLista os templates sincronizados da conta, paginado por página.
POST/api/v1/templatestemplates:writeCria um template e o submete à Meta para análise.
GET/api/v1/templates/{id}templates:readConsulta um template.

Hoje não existe PATCH nem DELETE de template pela API. Para editar ou remover, use o painel.

Transmissões

MétodoCaminhoEscopoDescrição
GET/api/v1/broadcastsbroadcasts:readLista as transmissões, paginado por página.
POST/api/v1/broadcastsbroadcasts:writeCria uma transmissão em rascunho.
GET/api/v1/broadcasts/{id}broadcasts:readConsulta uma transmissão e seus contadores de progresso.
PATCH/api/v1/broadcasts/{id}broadcasts:writeTransição de estado, não edição de conteúdo: { status: "stopped" } interrompe uma transmissão sending, scheduled ou warming_up (uma transmissão em ondas, aquecendo entre lotes); { status: "draft" } cancela um agendamento, devolvendo uma scheduled para draft. Uma transmissão warming_up só pode ser interrompida com stopped; ela não volta para draft.
GET/api/v1/broadcasts/{id}/recipientsbroadcasts:readLista os destinatários, paginado por cursor.
POST/api/v1/broadcasts/{id}/recipientsbroadcasts:writeAdiciona destinatários (só em rascunho).
DELETE/api/v1/broadcasts/{id}/recipientsbroadcasts:writeRemove todos os destinatários (só em rascunho).
POST/api/v1/broadcasts/{id}/schedulebroadcasts:writeAgenda o envio.
POST/api/v1/broadcasts/{id}/sendbroadcasts:writeDispara o envio (assíncrono, responde 202).
POST/api/v1/broadcasts/{id}/cancelbroadcasts:writeCancela uma transmissão agendada ou em rascunho (não interrompe um envio já em curso nem uma transmissão warming_up; para pará-las use o PATCH acima).

Limites de destinatários por transmissão, quota mensal, rate limit e o messaging limit da Meta (quatro coisas diferentes) estão detalhados em Transmissões e limites.

Contatos

MétodoCaminhoEscopoDescrição
GET/api/v1/contactscontacts:readLista os contatos, paginado por cursor. Filtre por campo personalizado com metadata[chave]=valor.
POST/api/v1/contactscontacts:writeCria um contato. Aceita metadata (campos personalizados) na criação.
GET/api/v1/contacts/{id}contacts:readConsulta um contato.
PATCH/api/v1/contacts/{id}contacts:writeAtualiza um contato. Campos editáveis: profile_name, username, notes, stage_id (etapa do funil; null limpa) e metadata (campos personalizados; merge raso, null remove a chave).
DELETE/api/v1/contacts/{id}contacts:writeRemove um contato.
GET/api/v1/contact-stagescontacts:readLista as etapas do funil da conta, ordenadas por posição.
POST/api/v1/contact-stagescontacts:writeCria uma etapa custom (label + color token).
PATCH/api/v1/contact-stages/{id}contacts:writeRenomeia/recolore/reordena uma etapa (label, color, position).
DELETE/api/v1/contact-stages/{id}contacts:writeExclui uma etapa custom (as de sistema respondem 422).
GET/api/v1/contact-fieldscontacts:readLista os campos personalizados da conta, ordenados por posição.
POST/api/v1/contact-fieldscontacts:writeCria um campo personalizado (label; key opcional, derivada do label).
PATCH/api/v1/contact-fields/{id}contacts:writeRenomeia/reordena um campo (label, position; key imutável).
DELETE/api/v1/contact-fields/{id}contacts:writeExclui a definição do campo (não apaga o dado já gravado no metadata).

Conversas

MétodoCaminhoEscopoDescrição
GET/api/v1/conversationsconversations:readLista as conversas, paginado por cursor.
GET/api/v1/conversations/{id}conversations:readConsulta uma conversa.
PATCH/api/v1/conversations/{id}conversations:writeAtualiza o estado de uma conversa.
GET/api/v1/conversations/{id}/assignmentsconversations:readLista as atribuições da conversa, paginado por página.
POST/api/v1/conversations/{id}/assignmentsconversations:writeAtribui a conversa a um usuário.
GET/api/v1/conversations/{id}/assignments/{assignmentId}conversations:readConsulta uma atribuição.
PATCH/api/v1/conversations/{id}/assignments/{assignmentId}conversations:writeAtualiza uma atribuição.

Webhooks

MétodoCaminhoEscopoDescrição
GET/api/v1/webhookswebhooks:readLista os webhooks.
POST/api/v1/webhookswebhooks:writeRegistra um webhook.
GET/api/v1/webhooks/{id}webhooks:readConsulta um webhook.
PATCH/api/v1/webhooks/{id}webhooks:writeAtualiza um webhook.
DELETE/api/v1/webhooks/{id}webhooks:writeRemove um webhook.
POST/api/v1/webhooks/{id}/testwebhooks:writeDispara um evento de teste.

Números

MétodoCaminhoEscopoDescrição
GET/api/v1/phone_numbersnumbers:readLista os números conectados, paginado por página.
GET/api/v1/phone_numbers/{id}numbers:readConsulta um número.
PATCH/api/v1/phone_numbers/{id}numbers:writeHoje sempre responde 422 no_updatable_fields: o schema atual de números não tem nenhum campo local editável (os demais campos são identidade ou sincronizados da Meta). A rota existe para o contrato ficar estável quando um campo editável for adicionado.
DELETE/api/v1/phone_numbers/{id}numbers:writeDesconecta o número do nosso sistema (não desregistra na Meta). Recusa com 409 phone_in_use se houver conversas, mensagens, contatos ou transmissões associados.
GET/api/v1/phone_numbers/{id}/healthnumbers:readConsulta a saúde e a qualidade do número.

Mídia

MétodoCaminhoEscopoDescrição
POST/api/v1/mediamedia:writeFaz upload de um arquivo para envio.
GET/api/v1/media/{id}media:readConsulta uma mídia recebida por id (o media_id da Cloud API): devolve mime_type, file_size, sha256, uma download_url assinada (validade de 1 hora) e expires_at. Se a mídia ainda está sendo espelhada, responde 202 media_not_ready (com Retry-After); tente de novo em instantes. No ambiente sandbox, só o id sandbox-media-0001 responde (mídia sintética de exemplo).
GET/api/v1/media/{id}/downloadmedia:readRedireciona (302) direto para a URL de download da mídia recebida. Mesmos estados da rota acima (incluindo 202 media_not_ready). No sandbox, redireciona para a mídia sintética do id sandbox-media-0001.

Flows

MétodoCaminhoEscopoDescrição
GET/api/v1/flowsflows:readLista os flows, paginado por página.
POST/api/v1/flowsflows:writeCria um flow.
GET/api/v1/flows/{id}flows:readConsulta um flow.
DELETE/api/v1/flows/{id}flows:writeRemove um flow.
POST/api/v1/flows/{id}/publishflows:writePublica o flow.
GET/api/v1/flows/{id}/versionsflows:readLista as versões do flow, paginado por página.
POST/api/v1/flows/{id}/versionsflows:writeCria uma nova versão.
POST/api/v1/flows/{id}/setup_encryptionflows:writeConfigura a criptografia do flow.
GET/api/v1/flows/{id}/data_endpointflows:readConsulta o data endpoint do flow.
POST/api/v1/flows/{id}/data_endpointflows:writeConfigura o data endpoint do flow.

Usuários

MétodoCaminhoEscopoDescrição
GET/api/v1/userslogs:readLista os membros do workspace. Note que o escopo exigido é o mesmo de logs (logs:read), não um escopo próprio de usuários.

Logs de API

MétodoCaminhoEscopoDescrição
GET/api/v1/api_logslogs:readLista as requisições feitas à API, paginado por cursor.

Entregas de webhook

MétodoCaminhoEscopoDescrição
GET/api/v1/webhook_deliverieswebhooks:readLista as tentativas de entrega de webhook, paginado por cursor.

Shapes exatos

Esta referência lista os endpoints, o escopo e o que cada um faz. O contrato exato de campos (o que realmente entra e sai de cada chamada) é a própria API REST, documentada nos exemplos testados das páginas de guia: cada exemplo mostrado neste site roda de verdade contra o handler correspondente antes de ser publicado, então nunca há divergência entre o que você lê aqui e o que a API faz.