WABA API

Documentação da integração com WhatsApp Business API via rotas públicas da Sendeasy.

Autenticação

Header obrigatório:

Authorization: Bearer <api_token>

Prefixo de rotas

/api/v1/waba/:whatsappId

Templates

MétodoEndpointFinalidade
GET/templatesListar templates
POST/templatesCriar template
PUT/templates/:templateIdAtualizar template
DELETE/templates/:templateNameRemover template

Mensagens

MétodoEndpointFinalidade
POST/sendEnviar template (ou texto simples via body específico)
POST/send-textEnviar texto
POST/send-imageEnviar imagem
POST/send-videoEnviar vídeo
POST/send-audioEnviar áudio
POST/send-documentEnviar documento
POST/marketing-lite/sendEnviar mensagem marketing (Marketing Messages Lite API)
GET/messages/:messageId/statusConsultar histórico de status de uma mensagem

Nova API: mensagem marketing

Endpoint público:

POST /api/v1/waba/:whatsappId/marketing-lite/send

Endpoint Meta utilizado pelo backend:

POST /{phone-number-id}/marketing_messages

Pré-requisitos:

  1. Conta WABA com onboarding de Marketing Messages Lite concluído.
  2. Termos de Marketing Messages Lite aceitos na conta Meta.
  3. Template de categoria MARKETING com status APPROVED.

Payload

CampoTipoObrigatórioObservações
tostringSimnúmero no formato internacional (somente dígitos)
templateNamestringSimnome do template aprovado no Meta
languagestringNãopadrão: pt_BR
componentsarrayNãocomponentes/parametrizações do template
productPolicystringNãoCLOUD_API_FALLBACK (default) ou STRICT
messageActivitySharingbooleanNãopadrão: true
bizOpaqueCallbackDatastringNãovolta no webhook para correlação de campanha

Exemplo: envio de mensagem marketing

curl --location 'https://server.sendeasy.pro/api/v1/waba/SEU_WHATSAPP_ID/marketing-lite/send' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer SEU_API_TOKEN' \
  --data '{
    "to": "5511999999999",
    "templateName": "promo_blackfriday",
    "language": "pt_BR",
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "João" }
        ]
      }
    ],
    "productPolicy": "CLOUD_API_FALLBACK",
    "messageActivitySharing": true,
    "bizOpaqueCallbackData": "campaign_blackfriday_2026"
  }'

Resposta de sucesso (exemplo):

{
  "messages": [
    { "id": "wamid.HBg..." }
  ]
}

Erro de limite/opt-out (exemplo):

{
  "error": "MARKETING_LIMIT_REACHED",
  "message": "User has opted out of marketing messages or reached the limit",
  "details": "..."
}

Exemplo: envio de texto

curl --location 'https://server.sendeasy.pro/api/v1/waba/SEU_WHATSAPP_ID/send-text' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer SEU_API_TOKEN' \
  --data '{
    "to": "5511999999999",
    "text": "Olá! Mensagem enviada pela WABA API."
  }'

Exemplo: envio de template

{
  "to": "5511999999999",
  "templateName": "boas_vindas",
  "language": "pt_BR",
  "components": [
    {
      "type": "body",
      "parameters": [
        { "type": "text", "text": "João" }
      ]
    }
  ]
}

Template com header de mídia (IMAGE / VIDEO / DOCUMENT)

Quando o template aprovado tiver um header de mídia, é obrigatório enviar o componente header com parameters. O type em minúsculo (header/body), e a imagem precisa estar em uma URL pública sua (S3, CDN, etc.) — não use o header_handle retornado na definição do template, ele expira.

{
  "to": "5511999999999",
  "templateName": "promo_lancamento",
  "language": "es_CO",
  "components": [
    {
      "type": "header",
      "parameters": [
        {
          "type": "image",
          "image": { "link": "https://sua-cdn.com/banner.jpg" }
        }
      ]
    }
  ]
}

Alternativamente, em vez de link use id com o media_id retornado pelo upload em /api/v1/waba/:whatsappId/media.

Consulta de status de mensagem

A Cloud API da Meta não expõe um endpoint público para consultar status sob demanda — o status é entregue exclusivamente via webhook (sent / delivered / read / failed). A Sendeasy persiste cada evento recebido e disponibiliza o histórico nesta rota, com o mesmo formato do payload do webhook.

GET /api/v1/waba/:whatsappId/messages/:messageId/status

Exemplo

curl --location 'https://server.sendeasy.pro/api/v1/waba/SEU_WHATSAPP_ID/messages/wamid.HBg.../status' \
  --header 'Authorization: Bearer SEU_API_TOKEN'

Resposta

{
  "statuses": [
    {
      "id": "wamid.HBgMNTUzMT...",
      "status": "sent",
      "timestamp": "1710000000",
      "recipient_id": "5511999999999"
    },
    {
      "id": "wamid.HBgMNTUzMT...",
      "status": "failed",
      "timestamp": "1710000003",
      "recipient_id": "5511999999999",
      "errors": [
        { "code": 131026, "title": "Message undeliverable" }
      ]
    }
  ]
}

Quando ainda não houver evento gravado para o messageId, a resposta é 404 com statuses: [] — basta tentar de novo após alguns segundos. Apenas mensagens enviadas via canal WABA têm status persistido nesta rota.

Códigos de erro comuns

CódigoQuando acontece
WHATSAPP_NOT_FOUNDwhatsappId não existe
WHATSAPP_CREDENTIALS_MISSINGcanal sem credenciais WABA completas
MISSING_PARAMETERSpayload sem campos obrigatórios
MARKETING_LIMIT_REACHEDcontato deu opt-out ou atingiu limite de marketing
WHATSAPP_API_ERRORerro retornado pela API da Meta

Webhooks WABA (contrato público)

Quando o webhook do projeto estiver habilitado, a Sendeasy envia:

  1. event: "messaging" para eventos de mensagem.
  2. event: "message_status" para atualização de estado de envio.

Exemplo (messaging):

{
  "event": "messaging",
  "channel": "waba",
  "data": {},
  "channelId": "uuid-do-canal"
}

Exemplo (message_status):

{
  "event": "message_status",
  "channel": "whatsapp",
  "data": {
    "messageId": "wamid.HBg...",
    "status": "read",
    "timestamp": "1713800010"
  },
  "channelId": "uuid-do-canal"
}

Valores comuns de data.status:

  • sent
  • delivered
  • read
  • failed

Essa informação foi útil?