Enviar uma mensagem de WhatsApp
- Envio de template —
templateId(+variablesopcional) - Envio de texto livre —
text - Envio de mídia direta —
media+mediaType(semtemplateId, semtext)
Exatamente um modo deve ser usado por requisição. Não existem endpoints separados
/messages/text, /messages/media ou /messages/interactive.Headers
Content-Type: application/jsonx-api-key: ps_...(oux-api-key-id: <api_key_id>) — uma chave com escopo de número
Destino (exatamente um)
Telefone de destino em E.164 com um
+ inicial (ex.: +5511999999999).JID do grupo do WhatsApp terminando em
@g.us.JID do canal do WhatsApp terminando em
@newsletter.Campos de modo
Template do painel
/templates. Mutuamente exclusivo com text e com o modo de mídia direta.Mapa chave→valor para as variáveis do template. Variáveis obrigatórias ausentes produzem
MISSING_TEMPLATE_VARIABLES.Corpo de uma mensagem de texto livre. Obrigatório se
templateId não for enviado (e não se tratar de um envio de mídia direta).Uma URL http(s) pública ou um data URI base64 (ex.:
data:audio/ogg;base64,AAAA...) para um arquivo de imagem, vídeo, documento ou áudio. Base64 é aceito para todos os tipos de mídia em números Meta Cloud API. Em números não oficiais (Pilot Status web), base64 não é aceito — use uma URL http(s) pública. Sobrescreve qualquer mediaUrl embutido no template.image, video, document ou audio. Defina explicitamente quando a extensão da URL não for óbvia (ex.: PDFs cuja URL não termina em .pdf). Quando mediaType é audio, o arquivo é entregue como uma nota de voz (PTT) do WhatsApp em todos os provedores. Em números não oficiais (Pilot Status web), um indicador de presença “gravando áudio” é exibido logo antes da entrega; a Meta Cloud API não possui API de presença de saída, então nenhum indicador é exibido para envios de áudio pela Meta.Envio de mídia direta
Envie mídia por conta própria fornecendomedia + mediaType sem templateId e sem text. Nesse modo, buttons, header, footer e variables não são permitidos; um caption opcional é permitido para image, video e document, mas não para audio.
Envios de mídia estão disponíveis em todos os planos, incluindo o Free — eles contam na cota de mensagens do número como qualquer outra mensagem. Não há uma cobrança paga separada para enviar mídia.
Agendamento e janela de entrega
Data e hora ISO 8601 para agendar o envio.
Prazo ISO 8601 para a entrega. Se expirar, a mensagem falha (veja Códigos de erro de log).
Outros campos
Marque o destino com Labels (escopo do tenant). Processados de forma assíncrona. Com a chave de API
retentionDays = 0, as Labels são criadas, mas a vinculação com o telefone/grupo pode não ser persistida (PII).Apenas para templates MARKETING.
aiRewriteEnabled: true habilita a variação automática do texto final da mensagem para reduzir padrões repetitivos (anti-spam) preservando a intenção. Se a variação não puder ser aplicada, o texto original é enviado. Envios MARKETING também recebem um atraso automático de fila variável (padrão 8–25 s) para espaçar o ritmo de envio.Até 3 botões que sobrescrevem os botões do template. Cada botão possui
type e displayText mais campos específicos do tipo:{ "type": "reply", "displayText": "Yes", "id": "yes" }— resposta rápida{ "type": "url", "displayText": "Site", "url": "https://example.com" }— botão de URL{ "type": "call", "displayText": "Call", "phoneNumber": "+5511999999999" }— botão de chamada{ "type": "copy", "displayText": "Code", "copyCode": "ABC123" }— botão de copiar
buttons pode ser combinado com qualquer mediaType. A API não rejeita botões com mediaType: "video" ou mediaType: "document" (números não oficiais os aceitam); observe que a Meta Cloud API pode rejeitar algumas combinações de botões com vídeo/documento no momento da entrega.Header para uma mensagem interativa de texto livre. Requer
buttons. Tipos: { "type": "text", "content": "Header title" } (até 60 caracteres), ou image / video / document com uma URL pública como content.Rodapé da mensagem (máximo 60 caracteres). Requer
buttons.Restrições de texto livre
mediaemediaTypenão podem ser usados comtext(texto livre).headerefootersó são suportados quandobuttonsestá presente (limitação da Meta Cloud API).- Em números Meta, mensagens de texto livre só funcionam dentro da janela de conversa de 24h do WhatsApp. Fora da janela, um erro
META_OUTSIDE_24H_WINDOWé retornado no webhookmessage.failed— use um template aprovado em vez disso.
Exemplos
Resposta (202)
ID interno da mensagem. Persista este valor — é o valor a ser usado com
GET /v1/messages/{id} e corresponde a internalMessageId nos webhooks.Identificador de correlação para a requisição de envio.
Sempre
QUEUED na aceitação.Correlação com webhooks
- O campo
idna resposta é o mesmo queinternalMessageIdemmessage.sent,message.delivered,message.reademessage.failed, e corresponde amessageRepliedIdemmessage.replyquando a plataforma vincula a resposta ao seu envio. - O
messageIddo WhatsApp (wamid) não está no corpo do202; ele aparece pela primeira vez no webhookmessage.sent(e se repete nos eventos de status daquela mensagem). - Persista
idquando receber o202e useGET /v1/messages/{id}com o mesmo valor.
Erros comuns
| Status | Significado |
|---|---|
400 | Payload inválido (ex.: telefone fora do E.164, campos obrigatórios ausentes, MISSING_TEMPLATE_VARIABLES, ou texto livre não suportado pelo provedor: code: FREE_FORM_NOT_SUPPORTED) |
401 | Header de chave de API ausente/inválido (x-api-key / x-api-key-id) |
403 | Uma chave com escopo de tenant usada em um endpoint com escopo de número |
404 | Template não encontrado ou sem uma versão aprovada |
422 | Cobrança do tenant suspensa (code: BILLING_SUSPENDED) — inadimplência, ou saldo WALLET / de extras não pago; regularize seus créditos ou cartão para retomar os envios |
429 | Limite de taxa |
META_OUTSIDE_24H_WINDOW, META_TEMPLATE_NOT_APPROVED, WHATSAPP_NOT_EXIST) aparecem via webhook message.failed e nos Logs — veja Códigos de erro de log.