API · Atualizado em 12/10/2026

Mensagens ativas e campanhas pela API

Dispare modelos aprovados para até 15 contatos de uma vez ou crie campanhas de até 5000 destinatários, com agendamento, relatório e cancelamento.

Mensagem ativa é a empresa começando a conversa, sempre com um modelo aprovado pela Meta. A API oferece dois jeitos: o disparo imediato para poucos contatos e a campanha para listas maiores, com ritmo e acompanhamento.

Quando usar

  • Disparo imediato: avisar até 15 pessoas de uma vez, como um aviso de entrega ou uma cobrança pontual.
  • Campanha: promoção, pesquisa ou aviso para uma lista grande, com acompanhamento de entregas e erros.

Pré-requisitos

  • Chave com mensagens:escrever para disparar e mensagens:ler para consultar.
  • Um canal WhatsApp conectado e um modelo aprovado e ativo. Veja Modelos de mensagem.
  • O envio de mensagens ativas ligado nas Configurações gerais da conta.

Rotas

MétodoRotaEscopoO que faz
POST/v1/messages-activemensagens:escreverDispara um modelo para até 15 contatos
GET/v1/messages-activemensagens:lerLista os envios recentes (horas, padrão 72, até 720)
GET/v1/messages-active/limitsmensagens:lerMostra os limites do disparo
POST/v1/campaignsmensagens:escreverCria uma campanha
GET/v1/campaignsmensagens:lerLista campanhas
GET/v1/campaigns/:idmensagens:lerDetalha uma campanha e seus destinatários
POST/v1/campaigns/:id/cancelmensagens:escreverCancela uma campanha agendada ou em envio
GET/v1/campaigns/limitsmensagens:lerLimite de destinatários e ritmo de envio
GET/v1/campaigns/number-qualitymensagens:lerQualidade do número do canal na Meta
GET/v1/campaigns/reply-optionsmensagens:lerBlocos e atendentes que podem receber as respostas

Passo a passo: disparo imediato

  1. Pegue o id do canal e o id do modelo. Os modelos estão em Consultar cadastros.
  2. Envie o disparo, com contatos por contactId ou phone:
curl -s -X POST https://http.pipebr.app/v1/messages-active \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "channelId": "b3a1c9de-0000-4000-8000-000000000700",
    "template_id": "b3a1c9de-0000-4000-8000-000000000400",
    "queueId": "b3a1c9de-0000-4000-8000-000000000001",
    "contacts": [
      { "phone": "+5511955550101", "name": "Maria Exemplo", "parametros": ["Maria", "1234"] },
      { "contactId": "b3a1c9de-0000-4000-8000-000000000011", "parametros": ["João", "1235"] }
    ]
  }'
  1. A resposta é 201, com um resultado por contato. Um contato recusado não impede os outros:
{
  "enviadas": 1,
  "recusadas": 1,
  "data": [
    {
      "telefone": "+5511955550101",
      "contato_id": "b3a1c9de-0000-4000-8000-000000000010",
      "enviada": true,
      "mensagem_id": "b3a1c9de-0000-4000-8000-000000000201",
      "conversa_id": "b3a1c9de-0000-4000-8000-000000000100",
      "motivo": null,
      "detalhe": null,
      "codigo_blip": null
    },
    {
      "telefone": "+5511955550102",
      "contato_id": "b3a1c9de-0000-4000-8000-000000000011",
      "enviada": false,
      "mensagem_id": null,
      "conversa_id": null,
      "motivo": "ja_em_atendimento",
      "detalhe": null,
      "codigo_blip": 1602
    }
  ]
}
Campo do corpoPara que serve
channelId, template_idCanal e modelo aprovado. Obrigatórios
contactsLista de { contactId ou phone, name?, parametros? }
parametrosValores das variáveis do modelo para todos os contatos que não tiverem os seus
queueIdFila de destino do ticket que o envio abre
destinoRespostaPara onde vai a resposta: { "tipo": "bloco", "blocoId": "...", "fluxoId": "..." } ou { "tipo": "atendente", "atendenteId": "..." }

Motivos de recusa por contato: numero_invalido, ja_em_atendimento, limite_diario, contact_duplicated e atendente_indisponivel. O limite diário por contato vem desligado (0) por padrão. Consulte GET /v1/messages-active/limits para ver maxContactsByTrigger e dailyLimitByContact.

Passo a passo: campanha

  1. Confira o ritmo e o teto de destinatários em GET /v1/campaigns/limits e a saúde do número em GET /v1/campaigns/number-quality?channelId=.... Qualidade baixa deixa apto: false.
  2. Crie a campanha:
curl -s -X POST https://http.pipebr.app/v1/campaigns \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "nome": "Aviso de reposição",
    "channelId": "b3a1c9de-0000-4000-8000-000000000700",
    "templateId": "b3a1c9de-0000-4000-8000-000000000400",
    "modo": "massa",
    "tags": ["reposicao"],
    "agendadaPara": "2026-10-15T13:00:00.000Z",
    "destinoResposta": { "tipo": "atendente", "atendenteId": "b3a1c9de-0000-4000-8000-000000000020" },
    "destinatarios": [
      { "telefone": "+5511955550101", "nome": "Maria Exemplo", "parametros": ["Maria", "1234"] },
      { "telefone": "+5511955550102", "nome": "João Exemplo", "parametros": ["João", "1235"] }
    ]
  }'
  1. A resposta é 201, com a campanha e duplicados (telefones repetidos que foram ignorados):
{
  "id": "b3a1c9de-0000-4000-8000-000000000800",
  "nome": "Aviso de reposição",
  "canal_id": "b3a1c9de-0000-4000-8000-000000000700",
  "template_id": "b3a1c9de-0000-4000-8000-000000000400",
  "modo": "massa",
  "estado": "agendada",
  "agendada_para": "2026-10-15T13:00:00.000Z",
  "contadores": { "audiencia": 2, "erros": 0, "enviadas": 0, "entregues": 0, "lidas": 0, "pendentes": 2 },
  "duplicados": 0
}
  1. Acompanhe com GET /v1/campaigns/:id. O detalhe traz destinatarios paginados, que aceitam estado (pendente, enviando, enviada, recusada ou falhou), pagina e porPagina.
  2. Para parar, POST /v1/campaigns/:id/cancel. O que já saiu fica; o resto permanece pendente.

Regras da campanha:

  • modo: massa (padrão) ou individual, que exige exatamente um destinatário.
  • Até 5000 destinatários por campanha. Telefones inválidos recusam a campanha inteira e a resposta lista as linhas com problema.
  • Todo destinatário precisa ter os valores de todas as variáveis do modelo.
  • agendadaPara pode ser até 90 dias à frente. Data no passado significa enviar já.
  • Até 10 tags, com até 50 caracteres cada.
  • Estados da campanha: rascunho, agendada, enviando, concluida, cancelada e falhou.

Resultado esperado

Os modelos saem para os contatos, cada resposta cai onde você definiu e você acompanha os contadores de audiência, enviadas, entregues, lidas e erros.

Problemas comuns

  • 409 template_nao_aprovado ou template_inativo: o modelo não está aprovado na Meta ou foi desativado.
  • 409 active_messages_disabled: o envio de mensagens ativas está desligado nas Configurações gerais.
  • 400 limit_of_contacts: a lista passou do máximo de destinatários.
  • 400 template_unsupported: campanhas ainda não aceitam modelos com mídia no cabeçalho nem botões de valor variável.
  • Resposta de cliente que não chega ao bot: confira o destinoResposta e o bloco publicado. GET /v1/campaigns/reply-options?channelId=... lista os destinos válidos.

Boas práticas

  • Teste o modelo com um disparo imediato para um número seu antes de lançar uma campanha.
  • Olhe a qualidade do número antes de listas grandes: qualidade baixa aumenta o risco de bloqueio.
  • Para um disparo único em horário futuro de uma mensagem simples, veja também Agendamentos.

Próximos passos

Perguntas frequentes

Qual a diferença entre mensagem ativa e campanha?

A mensagem ativa dispara na hora para até 15 contatos e devolve o resultado de cada um. A campanha aceita até 5000 destinatários, tem fila, ritmo, agendamento, contadores e cancelamento.

Posso usar qualquer modelo?

Só modelos aprovados pela Meta e ativos. Em campanhas, modelos com mídia no cabeçalho ou com botão de valor variável ainda não são aceitos.

O que acontece se o contato já está em atendimento?

O envio é recusado para ele, com motivo ja_em_atendimento e codigo_blip 1602. Os outros contatos do mesmo disparo seguem normalmente.

Para onde vai a resposta do cliente?

Você escolhe em destinoResposta: um bloco do bot ou um atendente. Sem isso, a resposta abre um ticket na fila.