/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"

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ê.