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.
$CPW_API_BASE e os escopos como$ESCOPOS.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ície | Credenciais | Para que serve |
|---|---|---|
| API do Parceiro | Do parceiro, com escopo elevado | Criar aplicações, ativar o WhatsApp delas e ler métricas agregadas. |
| API da Aplicação | Da própria aplicação | Enviar notificação, gerenciar modelos e ler métricas daquela aplicação. |
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.
/oauth/tokencurl -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.
Criar aplicação
Provisiona um ambiente isolado e devolve as credenciais dele. Use o token de parceiro.
/api/v1/partner/tenants| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome da aplicação. Obrigatório. |
billingEmail | string | E-mail de cobrança. Opcional. |
scopes | array | Escopos 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"]
}'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.
/api/v1/partner/tenantsDetalhe da aplicação
Mesma projeção da listagem, para uma aplicação. Identificador de outro contrato devolve 404, nunca 403.
/api/v1/partner/tenants/:idDesativar aplicação
Encerra a aplicação, revoga as credenciais, derruba os tokens vivos e libera o número para reconexão. Idempotente.
/api/v1/partner/tenants/:idLink de ativação
Gera o link de uso único, com validade curta, que o responsável abre para conectar o número pelo login do Facebook.
/api/v1/partner/tenants/:id/whatsapp/integration-linkcurl -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.
/api/v1/partner/tenants/:id/whatsapp/byoaStatus do número
Situação da conexão daquela aplicação: se há canal ativo, qual número e o estado da verificação.
/api/v1/partner/tenants/:id/whatsapp/statusMétricas do parceiro
Números agregados do contrato e por aplicação, na janela consultada.
/api/v1/partner/metricsEnviar notificação
Um destinatário por chamada, com um modelo já aprovado. Responde 202 com a notificação em queued.
/api/v1/notifications| Campo | Tipo | Descrição |
|---|---|---|
to | string | Telefone do destinatário, normalizado para E.164. |
template.name | string | Nome do modelo aprovado. |
template.language | string | Idioma do modelo, por exemplo pt_BR. |
variables | objeto ou array | Valores dos parâmetros do corpo. |
reference | string | Seu 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"
}'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.
/api/v1/notificationsDetalhe da notificação
Estado atual de um envio: queued, sent, delivered, read ou failed, com o código do erro quando houver.
/api/v1/notifications/:idMétricas de envio
Números da aplicação na janela consultada, mais a cota diária da Meta para o número conectado.
/api/v1/notifications/metricsListar modelos
Modelos da aplicação, com filtro por status e categoria. Informa quantos parâmetros o corpo espera.
/api/v1/templatescurl "$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.
/api/v1/templatesAs 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.
/api/v1/channelsWebhooks 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.
| Evento | Quando dispara |
|---|---|
message.sent | A mensagem saiu para a Meta. |
message.status | Mudou para entregue, lida ou falha. |
message.received | O cliente respondeu e a janela de atendimento abriu. |
Erros
Todos os erros seguem o mesmo formato, com código HTTP e um identificador estável.
| HTTP | Código | Quando acontece |
|---|---|---|
| 400 | invalid_request | Faltou campo obrigatório ou o formato está errado. |
| 401 | invalid_token | Token ausente, expirado ou inválido. |
| 403 | insufficient_scope | O token não tem o escopo exigido pelo endpoint. |
| 404 | not_found | Recurso inexistente ou fora do seu contrato. |
| 409 | conflict | Estado incompatível, como número já conectado em outra aplicação. |
| 422 | template_not_available | O modelo não existe ou não está aprovado para a aplicação. |
| 429 | rate_limited | Limite de requisições atingido na janela. |
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.
