/campaigns
Lê as campanhas de WhatsApp e as contagens de envio de cada uma.
Escopo necessário: campaigns:write. Limite: 120 requisições por minuto.
Endpoints
| Método | Rota | Devolve |
|---|---|---|
| GET | /campaigns |
Lista paginada |
| GET | /campaigns/{id} |
Uma campanha, com métricas |
| GET | /campaigns/{id}/recipients |
Quem recebeu e o que aconteceu com cada envio |
| POST | /campaigns |
Cria como rascunho |
| POST | /campaigns/{id}/start |
Dispara agora |
| POST | /campaigns/{id}/schedule |
Agenda para uma data |
| POST | /campaigns/{id}/cancel |
Cancela |
Filtros: status e connection_id.
Exemplo
curl "https://api.wevi.chat/functions/v1/campaigns?status=completed" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
const res = await fetch("https://api.wevi.chat/functions/v1/campaigns?status=completed", {
headers: { Authorization: "Bearer wevi_SUA_CHAVE" },
});
const { data } = await res.json();
Objeto da campanha
{
"id": "dddd0000-0000-4000-8000-0000000000c1",
"name": "Promoção clareamento de junho",
"status": "completed",
"connection_id": "dddd0000-...",
"template": {
"name": "promocao_clareamento",
"language_code": "pt_BR",
"body_params": ["{{contact_name}}"],
"header_image_url": null
},
"audience": { "mode": "tags", "tag_ids": ["aaaa..."], "match": "any" },
"open_conversation": "always",
"metrics": {
"total_recipients": 240,
"sent": 238,
"delivered": 231,
"read": 180,
"failed": 2
},
"scheduled_at": null,
"started_at": "2026-06-21T13:00:00Z",
"completed_at": "2026-06-21T13:07:41Z",
"created_at": "2026-06-21T12:40:00Z"
}
As contagens vêm dos avisos de entrega da Meta, os mesmos que alimentam os tiques do inbox. sent é o que a Meta aceitou, delivered o que chegou no aparelho e read o que a pessoa abriu.
Criar e disparar
Criar deixa a campanha em rascunho. Disparar é um segundo passo, de propósito: campanha criada por engano não sai sozinha.
curl -X POST "https://api.wevi.chat/functions/v1/campaigns" \
-H "Authorization: Bearer wevi_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"name": "Retorno de clareamento",
"connection_id": "dddd0000-...",
"template_name": "promocao_clareamento",
"body_params": ["{{contact_name}}"],
"audience": { "mode": "tags", "tag_ids": ["aaaa..."], "match": "any" }
}'
audience.mode aceita all, tags, agent, contact_ids e csv, os mesmos do painel. Template precisa estar aprovado pela Meta.
# dispara agora
curl -X POST "https://api.wevi.chat/functions/v1/campaigns/{id}/start" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
# ou agenda
curl -X POST "https://api.wevi.chat/functions/v1/campaigns/{id}/schedule" \
-H "Authorization: Bearer wevi_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{"scheduled_at":"2026-09-15T13:00:00Z"}'
# ou cancela, enquanto ainda dá
curl -X POST "https://api.wevi.chat/functions/v1/campaigns/{id}/cancel" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
Cancelar vale para campanha em rascunho, agendada ou em andamento. O que já saiu não volta.
Acompanhar destinatário a destinatário
curl "https://api.wevi.chat/functions/v1/campaigns/{id}/recipients?status=failed" \
-H "Authorization: Bearer wevi_SUA_CHAVE"
{
"data": [
{
"id": "...",
"contact_id": "...",
"phone": "5511999998888",
"status": "delivered",
"wamid": "wamid.HBg...",
"error": null,
"sent_at": "2026-09-15T13:00:04Z",
"delivered_at": "2026-09-15T13:00:07Z",
"read_at": null
}
],
"next_cursor": null,
"has_more": false
}
Filtre por status (pending, sent, delivered, read, failed, skipped) para achar rapidamente quem não recebeu e por quê.