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:escreverpara disparar emensagens:lerpara 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étodo | Rota | Escopo | O que faz |
|---|---|---|---|
| POST | /v1/messages-active | mensagens:escrever | Dispara um modelo para até 15 contatos |
| GET | /v1/messages-active | mensagens:ler | Lista os envios recentes (horas, padrão 72, até 720) |
| GET | /v1/messages-active/limits | mensagens:ler | Mostra os limites do disparo |
| POST | /v1/campaigns | mensagens:escrever | Cria uma campanha |
| GET | /v1/campaigns | mensagens:ler | Lista campanhas |
| GET | /v1/campaigns/:id | mensagens:ler | Detalha uma campanha e seus destinatários |
| POST | /v1/campaigns/:id/cancel | mensagens:escrever | Cancela uma campanha agendada ou em envio |
| GET | /v1/campaigns/limits | mensagens:ler | Limite de destinatários e ritmo de envio |
| GET | /v1/campaigns/number-quality | mensagens:ler | Qualidade do número do canal na Meta |
| GET | /v1/campaigns/reply-options | mensagens:ler | Blocos e atendentes que podem receber as respostas |
Passo a passo: disparo imediato
- Pegue o
iddo canal e oiddo modelo. Os modelos estão em Consultar cadastros. - Envie o disparo, com contatos por
contactIdouphone:
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"] }
]
}'
- 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 corpo | Para que serve |
|---|---|
channelId, template_id | Canal e modelo aprovado. Obrigatórios |
contacts | Lista de { contactId ou phone, name?, parametros? } |
parametros | Valores das variáveis do modelo para todos os contatos que não tiverem os seus |
queueId | Fila de destino do ticket que o envio abre |
destinoResposta | Para 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
- Confira o ritmo e o teto de destinatários em
GET /v1/campaigns/limitse a saúde do número emGET /v1/campaigns/number-quality?channelId=.... Qualidade baixa deixaapto: false. - 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"] }
]
}'
- 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
}
- Acompanhe com
GET /v1/campaigns/:id. O detalhe trazdestinatariospaginados, que aceitamestado(pendente,enviando,enviada,recusadaoufalhou),paginaeporPagina. - Para parar,
POST /v1/campaigns/:id/cancel. O que já saiu fica; o resto permanece pendente.
Regras da campanha:
modo:massa(padrão) ouindividual, 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.
agendadaParapode 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,canceladaefalhou.
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_aprovadooutemplate_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
destinoRespostae 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
- Veja como a equipe faz isso na tela em Mensagens ativas e Enviar uma mensagem ativa.
- Consulte modelos e filas em Consultar cadastros.
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.
Esse artigo foi útil?
Obrigado pelo retorno!