CPW AtendimentoAPI Docsv1

Documentação da API

Referência da integração de parceiro: autenticar, criar aplicações, ativar o número por login do Facebook, enviar notificação e receber o status.

A base da API, as credenciais e os identificadores de escopo chegam quando a sua conta é criada. Nos exemplos, a base aparece como $CPW_API_BASE e os escopos como$ESCOPOS.
O cadastro no portal de parceiros é imediato, mas o acesso passa por liberação do nosso time. Enquanto a conta não é liberada, a criação de aplicações e a emissão de credenciais ficam indisponíveis.

As duas superfícies

São dois conjuntos de credenciais com escopos diferentes. Entender essa separação resolve a maior parte dos erros de integração.

SuperfícieCredenciaisPara que serve
API do ParceiroDo parceiro, com escopo elevadoCriar aplicações, ativar o WhatsApp delas e ler métricas agregadas.
API da AplicaçãoDa própria aplicaçãoEnviar notificação, gerenciar modelos e ler métricas daquela aplicação.
O token do parceiro não envia mensagem e o token da aplicação não cria aplicação. A API rejeita o cruzamento.

Autenticação

OAuth 2.0 com client_credentials. As credenciais vão em Basic auth e o token retornado segue no cabeçalho Authorization das chamadas seguintes.

POST/oauth/token
curl -X POST "$CPW_API_BASE/oauth/token" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=client_credentials" \
  -d "scope=$ESCOPOS"

Cada credencial nasce com um conjunto de escopos que delimita o que ela pode fazer: enviar notificação, ler notificação, ler modelos e ler canais, na API da aplicação, e provisionamento, na API do parceiro. Os escopos são definidos na criação e não mudam depois.

Ativação do número

Você gera um link de curta duração e envia para o responsável pelo número. Ele abre, entra com o login do Facebook, escolhe a conta comercial e o número, e a conexão é confirmada na hora. Sem token para copiar e sem QR Code.

Coexistência: o número pode continuar em uso no aplicativo WhatsApp Business enquanto responde pela API. Na ativação, pedimos à Meta a sincronização de até 6 meses de histórico e dos contatos, então o time não recomeça do zero nem troca de número.

Criar aplicação

Provisiona um ambiente isolado e devolve as credenciais dele. Use o token de parceiro.

POST/api/v1/partner/tenants
CampoTipoDescrição
namestringNome da aplicação. Obrigatório.
billingEmailstringE-mail de cobrança. Opcional.
scopesarrayEscopos concedidos à aplicação. Não mudam depois.
curl -X POST "$CPW_API_BASE/api/v1/partner/tenants" \
  -H "Authorization: Bearer $PARTNER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Loja Centro",
    "scopes": ["$ESCOPO_DE_ENVIO", "$ESCOPO_DE_MODELOS"]
  }'
O clientSecret aparece uma única vez, na criação. Nenhum GET o reexpõe.

Listar aplicações

Devolve as aplicações do seu contrato, com identificador público, nome, status e data de criação.

GET/api/v1/partner/tenants

Detalhe da aplicação

Mesma projeção da listagem, para uma aplicação. Identificador de outro contrato devolve 404, nunca 403.

GET/api/v1/partner/tenants/:id

Desativar aplicação

Encerra a aplicação, revoga as credenciais, derruba os tokens vivos e libera o número para reconexão. Idempotente.

DEL/api/v1/partner/tenants/:id
curl -X POST "$CPW_API_BASE/api/v1/partner/tenants/$APP_ID/whatsapp/integration-link" \
  -H "Authorization: Bearer $PARTNER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "returnUrl": "https://seu-sistema.com.br/integracoes/whatsapp" }'

A tela é hospedada por nós, roda o fluxo oficial da Meta e leva a sua marca.

Conectar número próprio

Para quem já tem o número em um aplicativo Meta próprio e prefere conectar com as credenciais dele, sem passar pela tela hospedada.

POST/api/v1/partner/tenants/:id/whatsapp/byoa
O token de acesso enviado aqui nunca é devolvido em nenhuma resposta.

Status do número

Situação da conexão daquela aplicação: se há canal ativo, qual número e o estado da verificação.

GET/api/v1/partner/tenants/:id/whatsapp/status

Métricas do parceiro

Números agregados do contrato e por aplicação, na janela consultada.

GET/api/v1/partner/metrics

Enviar notificação

Um destinatário por chamada, com um modelo já aprovado. Responde 202 com a notificação em queued.

POST/api/v1/notifications
CampoTipoDescrição
tostringTelefone do destinatário, normalizado para E.164.
template.namestringNome do modelo aprovado.
template.languagestringIdioma do modelo, por exemplo pt_BR.
variablesobjeto ou arrayValores dos parâmetros do corpo.
referencestringSeu identificador. É a chave de idempotência.
curl -X POST "$CPW_API_BASE/api/v1/notifications" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5519999999999",
    "template": { "name": "pedido_enviado", "language": "pt_BR" },
    "variables": { "1": "João", "2": "12345" },
    "reference": "pedido-12345"
  }'
A idempotência é permanente por aplicação: repetir a mesma reference devolve a notificação original em vez de enviar de novo. Use um identificador estável do seu domínio, nunca um valor aleatório por tentativa.

Listar notificações

Histórico da aplicação, com filtro por status e paginação.

GET/api/v1/notifications

Detalhe da notificação

Estado atual de um envio: queued, sent, delivered, read ou failed, com o código do erro quando houver.

GET/api/v1/notifications/:id

Métricas de envio

Números da aplicação na janela consultada, mais a cota diária da Meta para o número conectado.

GET/api/v1/notifications/metrics

Listar modelos

Modelos da aplicação, com filtro por status e categoria. Informa quantos parâmetros o corpo espera.

GET/api/v1/templates
curl "$CPW_API_BASE/api/v1/templates?status=approved&category=UTILITY" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Criar modelo

Cria o modelo e submete à aprovação da Meta. O status volta como pending, approved ou rejected.

POST/api/v1/templates

As categorias seguem a classificação da Meta: UTILITY, MARKETING eAUTHENTICATION. A tarifa de cada mensagem entregue muda conforme essa categoria.

Canais conectados

Canais da aplicação, com o número conectado e o estado dele.

GET/api/v1/channels

Webhooks de status

Em produção o caminho recomendado é receber, não consultar. Cadastre a sua URL e os eventos chegam assinados com HMAC-SHA256 no cabeçalho X-CPW-Signature, comX-CPW-Delivery para idempotência do seu lado.

EventoQuando dispara
message.sentA mensagem saiu para a Meta.
message.statusMudou para entregue, lida ou falha.
message.receivedO cliente respondeu e a janela de atendimento abriu.
Confira a assinatura antes de processar o corpo. Entrega repetida é normal em rede instável, e é para isso que existe o identificador de entrega.

Erros

Todos os erros seguem o mesmo formato, com código HTTP e um identificador estável.

HTTPCódigoQuando acontece
400invalid_requestFaltou campo obrigatório ou o formato está errado.
401invalid_tokenToken ausente, expirado ou inválido.
403insufficient_scopeO token não tem o escopo exigido pelo endpoint.
404not_foundRecurso inexistente ou fora do seu contrato.
409conflictEstado incompatível, como número já conectado em outra aplicação.
422template_not_availableO modelo não existe ou não está aprovado para a aplicação.
429rate_limitedLimite de requisições atingido na janela.
Acessar uma aplicação que não é sua devolve 404, nunca 403. Um 403 confirmaria a existência daquele identificador em outro contrato.

Pronto para integrar

Crie a conta para receber a base da API, as credenciais e os escopos da sua primeira aplicação. O plano gratuito cobre a homologação com 500 disparos por mês.