Mensagens
Enviar texto, mídia e modelos; ver status.
Envie texto, mídia (imagem, vídeo, áudio, documento) ou modelo aprovado. O envio vai para a fila e responde 202 na hora; o status (pendente, enviada, entregue, lida, falhou) chega pelo webhook mensagem.status ou por GET /mensagens/{id}. Para consultar mensagens de toda a organização use GET /mensagens; também é possível listar mensagens de uma conversa.
- Para quem:
conversa_id(responder numa conversa que já existe) outelefone(com DDI e DDD). Só um dos dois. - Pelo telefone, a conversa e o contato são criados se ainda não existirem;
nomedá nome ao contato novo. - Pelo telefone, com mais de um WhatsApp conectado, mande
caixa_id(vejaGET /me), senão vem422 caixa_obrigatoria. Comconversa_ida mensagem sai pela caixa da conversa (caixa_idenomesó valem com telefone). responde_a_idcita uma mensagem da mesma conversa.- Na API oficial do WhatsApp, fora da janela de 24 horas desde a última mensagem do contato, só sai modelo aprovado (
422 janela_fechada). Veja os modelos emGET /modelos. - Mídia vai por link https público (
midia.url): o WhatsApp baixa dele na hora do envio. Otextovira a legenda. - Mande
Idempotency-Keypara poder repetir sem mandar duas vezes (veja Idempotência). - Limite próprio: 60 envios por minuto por chave e 120 por organização.
canal(opcional, só WhatsApp):auto(padrão, igual a omitir) segue a regra da caixa;oficialsai só pela API oficial da Meta;qrsai só pelo WhatsApp por QR. A escolha manual nunca troca de canal: se o canal escolhido não puder enviar, vem erro (422 canal_oficial_indisponivel,canal_oficial_sem_grupo,canal_qr_indisponivel,canal_qr_sem_modelo,canal_so_whatsapp; a janela de 24 h vale emoficial) ou, se cair depois de aceito, a mensagem ficafalhoucom o código emerro. Modelo só sai pela oficial. Repetir o mesmoid_clientecom outrocanaldá409 idempotencia_conflito.
Baixar mídia recebida#
Cada item de midia[] nas mensagens e nos webhooks mensagem.recebida / mensagem.enviada traz id estável, além de mime, nome_arquivo, tamanho e duracao_s quando disponíveis. Baixe os bytes por GET /mensagens/{id}/midia, autenticado com escopo mensagens:ler. Use ?item=<id-do-anexo> para escolher um anexo por esse id ou ?item=0 para escolher pelo índice começando em zero; sem item, baixa o primeiro.
- A resposta
200é o arquivo binário, comContent-TypeeContent-Disposition. O endpoint aceitaRange: bytes=...e responde206comContent-Range. - Se o download sob demanda estiver em andamento, recebe
202comerro.codigo: midia_baixandoeRetry-After(aguarde esse número de segundos antes de tentar de novo). Se não for possível obter o arquivo, recebe409 midia_indisponivel. - Mensagem inexistente, de outra organização ou sem mídia responde
404.
{
"conversa_id": "495a7cae-128c-4b66-adbc-807b3959c129",
"tipo": "texto",
"texto": "Perfeito, remarquei para quinta às 10h."
}{
"telefone": "+55 31 98888-7777",
"tipo": "imagem",
"midia": {"url":"https://seu-sistema.com.br/arquivos/orcamento.jpg"},
"texto": "Segue o orçamento."
}{
"conversa_id": "495a7cae-128c-4b66-adbc-807b3959c129",
"tipo": "documento",
"midia": {
"url": "https://seu-sistema.com.br/arquivos/orcamento.pdf",
"nome_arquivo": "Orçamento.pdf"
}
}{
"telefone": "+55 31 98888-7777",
"caixa_id": "7a9d53e9-9d1b-4122-923b-fac67958f445",
"tipo": "modelo",
"modelo": {"nome":"lembrete_consulta","idioma":"pt_BR","corpo":["Maria","9h"]}
}{
"conversa_id": "495a7cae-128c-4b66-adbc-807b3959c129",
"tipo": "texto",
"texto": "Seu pedido saiu para entrega.",
"canal": "oficial"
}Endpoints#
Códigos de erro#
Além dos gerais (chave, limite, JSON), estes podem vir em erro.codigo nas rotas daqui. Todos estão em Erros.
| codigo | O que significa |
|---|---|
| tipo_invalido | tipo deve ser texto, imagem, video, audio, documento ou modelo. |
| texto_vazio | Mensagem de texto precisa de texto. |
| texto_longo | Texto longo demais (máximo de 4096 caracteres). |
| midia_invalida | Link de mídia inválido: use https com um endereço público. |
| midia_indisponivel | O arquivo desta mídia está indisponível. |
| midia_baixando | O download desta mídia está na fila. Tente novamente após Retry-After. |
| janela_fechada | A janela de 24 horas desta conversa está fechada. Na API oficial do WhatsApp, só um modelo aprovado reabre a conversa. |
| conta_restrita | A Meta restringiu esta conta do WhatsApp por spam. Nada foi enviado: erro.ate diz até quando (erro.retry_after_s e o cabeçalho Retry-After, em segundos), erro.escopo o que está barrado e erro.motivo o código. Quem administra pode desligar a trava em Configurações > API. |
| caixa_obrigatoria | A organização tem mais de um WhatsApp conectado: informe caixa_id (veja GET /me). |
| caixa_sem_conexao | Nenhum WhatsApp conectado nesta caixa. |
| caixa_inexistente | Caixa não encontrada (veja GET /me). |
| canal_sem_iniciar | Este canal não permite começar conversa por telefone. Use uma caixa de WhatsApp. |
| modelo_sem_api_oficial | Modelos só saem pela API oficial do WhatsApp. Conecte a API oficial nesta caixa. |
| modelo_inexistente | Modelo não encontrado nesta caixa (veja GET /modelos). |
| telefone_invalido | Telefone inválido. Mande com DDI e DDD. |
| conversa_inexistente | Conversa não encontrada. |
| mensagem_inexistente | Mensagem não encontrada. |
| canal_oficial_indisponivel | canal "oficial": a API oficial do WhatsApp não está conectada nesta caixa. Nada foi enviado pelo QR. |
| canal_oficial_sem_grupo | canal "oficial": a API oficial do WhatsApp não envia para grupo. Use "qr" ou omita o campo. |
| canal_qr_indisponivel | canal "qr": o WhatsApp por QR não está conectado nesta caixa. Nada foi enviado pela API oficial. |
| canal_qr_sem_modelo | canal "qr": modelos só saem pela API oficial do WhatsApp. Use "oficial" ou omita o campo. |
| canal_so_whatsapp | canal "oficial"/"qr" só vale em caixa de WhatsApp. Omita o campo (ou use "auto"). |