WhatsApp Business Oficial · Meta Cloud API
META CLOUD API · OFICIAL

WhatsApp Business Oficial

Documentação da integração oficial Meta Cloud API na APIFacil. Envio de mensagens, templates HSM, webhook de eventos recebidos e gestão completa.

8
ENDPOINTS
5
STATUS TEMPLATE
80/s
RATE LIMIT
24h
JANELA CLIENTE
PRO
Por que Meta Oficial
Vantagens da Cloud API

A Meta Cloud API é a integração oficial do WhatsApp Business. Você usa direto pela Graph API da Meta, com conformidade total e recursos exclusivos.

SEL VERDE
Numero verificado — clientes confiam
TEMPLATES HSM
Disparo fora da janela 24h, aprovados pela Meta
SEM BANIMENTO
Conformidade total — risco zero
DISPARO EM MASSA
Marketing/transacional em escala
WEBHOOK OFICIAL
Status + mensagens recebidas (HMAC SHA-256)
MIDIA COMPLETA
Imagem, áudio, vídeo, documento, localização
Como funciona: Você conecta seu Business Manager da Meta via painel (wizard OAuth). A APIFacil guarda o token de acesso criptografado (revogável). Você é dono do BM/WABA/número — pode desconectar a qualquer momento.
AUTH
Autenticação
Todas as rotas usam o mesmo token da APIFacil no header Authorization: {seu_token} (sem prefixo "Bearer "). O token é gerado no painel do usuário. A APIFacil autentica você na Meta internamente — você não precisa do token Meta.
BASH
# Header correto: Authorization + token direto (SEM "Bearer") curl -X POST https://apifacil.dev/api/v1/whatsapp/enviar-mensagem \ -H "Authorization: SEU_TOKEN_AQUI" \ -H "Content-Type: application/json" \ -d '{"mensagem":"Olá","telefone":"5511999999999","instancia":"14"}'
Erro comum: Enviar Authorization: Bearer SEU_TOKEN retorna 401. O middleware valida o token direto — não use prefixo "Bearer ".
Identificador da instância: O campo instancia aceita o ID, código ou public_token da instância Meta Oficial. O roteamento é automático.
FLOW
Como o envio funciona
Fluxo do POST até a Graph API

Quando você chama /enviar-mensagem, /enviar-template ou qualquer endpoint de mídia, a APIFacil valida a credencial Meta e despacha o envio para a Graph API da Meta de forma assíncrona.

1
Sua requisição
POST /enviar-mensagem + dados
2
Validar credencial
Número verificado e ativo na Meta
3
Fila de envio
Processamento assíncrono
4
Graph API Meta
Entrega ao destinatário
5
Webhook de status
sent · delivered · read
Pré-requisitos para envio: A instância precisa ser Meta Oficial com credencial ativa (número verificado + token válido). Se a credencial não estiver pronta, o sistema aguarda e retenta automaticamente.
SEND
Envio de Mensagens
Texto via Graph API
POST /api/v1/whatsapp/enviar-mensagem Enviar texto (roteamento automatico)

Envia uma mensagem de texto para a Graph API da Meta de forma assíncrona. Retorna 202 imediatamente com o notificação_id para rastrear o status via webhook.

PARAMETROTIPOREQ?DESCRIÇÃO
mensagemstringobrigatórioTexto da mensagem
telefonestringobrigatórioDDI+DDD+número (ex: 5511999999999)
instanciastringopcionalID, código ou public_token da instância
grupostringignoradoNao usado em Meta Oficial
BASH
POST https://apifacil.dev/api/v1/whatsapp/enviar-mensagem Authorization: SEU_TOKEN Content-Type: application/json { "mensagem": "Ola, seja bem-vindo!", "telefone": "5511999999999", "instancia": "14" }
202 Accepted Mensagem enfileirada para envio via Meta
JSON · RESPOSTA
{ "error": false, "message": "Mensagem enfileirada para envio via Meta", "data": { "notificação_id": 1234, "status": "queued" } }
Assíncrono: O envio é processado em fila. O notificação_id permite rastrear o status via webhook (sent/delivered/read/failed). Em caso de falha temporária, o sistema retenta automaticamente.
HSM
Envio de Template (HSM)
Exclusivo Meta Oficial
Exclusivo Meta: Este endpoint só funciona em instâncias Meta Oficial com credencial operacional. Retorna 422 se a instância não for Meta Oficial.
Templates HSM (Highly Structured Message): Modelos pré-aprovados pela Meta para enviar fora da janela de 24h. Permitem disparos em massa sem limite de horário. Status deve ser APPROVED para uso.
POST /api/v1/whatsapp/enviar-template Enviar template HSM aprovado

Envia um template HSM aprovado. O template deve existir na instância e ter status APPROVED. Os components preenchem os placeholders {{1}}, {{2}} do template.

PARAMETROTIPOREQ?DESCRIÇÃO
instanciastringobrigatórioID, código ou public_token da instância Meta
telefonestringobrigatórioDDI+DDD+número
templatestringobrigatórioNome do template (ex: boas_vindas_v1)
languagestringopcionalCódigo do idioma (default: pt_BR)
componentsobjectopcionalParâmetros do template (header/body/buttons)
BASH · TEMPLATE SIMPLES (body)
POST https://apifacil.dev/api/v1/whatsapp/enviar-template Authorization: SEU_TOKEN Content-Type: application/json { "instancia": "14", "telefone": "5511999999999", "template": "boas_vindas_v1", "components": { "body": ["Joao", "APIFacil"] } }
BASH · COMPLETO (header+body+button URL)
POST https://apifacil.dev/api/v1/whatsapp/enviar-template Authorization: SEU_TOKEN Content-Type: application/json { "instancia": "14", "telefone": "5511999999999", "template": "promocao_v1", "components": { "header": ["Promo Julho"], "body": ["Joao", "50%"], "buttons": ["julho50"] } }
202 Accepted Template enfileirado para envio
JSON · RESPOSTA
{ "error": false, "message": "Template enfileirado para envio", "data": { "notificação_id": 1235, "template": "boas_vindas_v1", "status": "queued" } }
422 Instância não é Meta Oficial
404 Template não encontrado ou não aprovado
Formato dos components: A APIFacil mapeia automaticamente para o formato da Graph API. Você passa arrays simples — header[0] preenche {{1}}, body[0] preenche {{1}}, etc. Não precisa montar o payload completo da Meta.
MID
Envio de Mídia
Foto, vídeo, áudio, documento — URL ou base64
Para instâncias Meta Oficial, todos os endpoints de mídia roteiam automaticamente para a Graph API. A URL da mídia deve ser publicamente acessível (a Meta faz download para enviar).
MÉTODOENDPOINTTIPOOBSERVAÇÃO
POST/api/v1/whatsapp/enviar-fotoimageURL pública + caption opcional
POST/api/v1/whatsapp/enviar-audioaudioURL pública (MP3/OGG)
POST/api/v1/whatsapp/enviar-videovideoURL pública + caption opcional
POST/api/v1/whatsapp/enviar-arquivodocumentURL pública + caption + nome do arquivo
POST/api/v1/whatsapp/enviar-foto-64imageBase64 — upload para S3, depois Meta
POST/api/v1/whatsapp/enviar-audio-64audioBase64 — upload para S3, depois Meta
POST/api/v1/whatsapp/enviar-arquivo-64documentBase64 — upload para S3, depois Meta

Enviar foto (URL)

POST /api/v1/whatsapp/enviar-foto
PARÂMETROTIPOOBRIG.DESCRIÇÃO
instanciastringsimID, código ou public_token
telefonestringsimDDI+DDD+número
linkstringsimURL pública da imagem (JPG/PNG)
nomestringsimNome do arquivo
mensagemstringnãoLegenda (caption) da imagem
POST https://apifacil.dev/api/v1/whatsapp/enviar-foto -H "Authorization: SEU_TOKEN" \ -d '{ "instancia": "A1B2C3", "telefone": "5511999999999", "link": "https://meudominio.com.br/foto.jpg", "nome": "produto.jpg", "mensagem": "Veja nosso produto" }'

Enviar áudio (URL)

POST /api/v1/whatsapp/enviar-audio
PARÂMETROTIPOOBRIG.DESCRIÇÃO
instanciastringsimID, código ou public_token
telefonestringsimDDI+DDD+número
audio_urlstringsimURL pública (MP3/OGG)
POST https://apifacil.dev/api/v1/whatsapp/enviar-audio -H "Authorization: SEU_TOKEN" \ -d '{ "instancia": "A1B2C3", "telefone": "5511999999999", "audio_url": "https://meudominio.com.br/audio.mp3" }'

Enviar vídeo (URL)

POST /api/v1/whatsapp/enviar-video
PARÂMETROTIPOOBRIG.DESCRIÇÃO
instanciastringsimID, código ou public_token
telefonestringsimDDI+DDD+número
video_urlstringsimURL pública (MP4/3GP)
nomestringsimNome do arquivo
mensagemstringnãoLegenda (caption)
POST https://apifacil.dev/api/v1/whatsapp/enviar-video -H "Authorization: SEU_TOKEN" \ -d '{ "instancia": "A1B2C3", "telefone": "5511999999999", "video_url": "https://meudominio.com.br/video.mp4", "nome": "demo.mp4", "mensagem": "Assista ao demo" }'

Enviar documento (URL)

POST /api/v1/whatsapp/enviar-arquivo
PARÂMETROTIPOOBRIG.DESCRIÇÃO
instanciastringsimID, código ou public_token
telefonestringsimDDI+DDD+número
linkstringsimURL pública do arquivo
nomestringsimNome com extensão (ex: contrato.pdf)
mensagemstringnãoLegenda (caption)
Detecção automática: O tipo é detectado pela extensão do nome: jpg/png/gif → image, mp3/ogg/aac → audio, mp4/3gp/mov → video, demais → document.
Endpoints base64: Os endpoints /enviar-foto-64, /enviar-audio-64 e /enviar-arquivo-64 aceitam o binário em base64. A APIFacil faz upload para S3 e então envia a URL pública para a Meta. Mesmos parâmetros dos endpoints URL, trocando link/audio_url/video_url por foto_base64/audio_base64/arquivo_base64 + tipo_arquivo (extensão).

Resposta

{ "error": false, "data": { "notificacao_id": 12345, "message": "Image enfileirado para envio via Meta", "status": "queued" } }
Template com mídia no header: Templates com header IMAGE/VIDEO/DOCUMENT são suportados via /enviar-template. Passe components.header.url com a URL pública da mídia. O sistema preenche o header automaticamente.
TIP
Tipos de Mensagem
Tudo que você pode enviar e receber
A Meta Cloud API suporta diversos tipos de mensagem além de texto. Todos os tipos abaixo são suportados pela APIFacil — no envio (via API) e na recepção (via webhook).
TIPOENVIARRECEBERENDPOINT / OBSERVAÇÃO
textSIMSIM/enviar-mensagem
imageSIMSIM/enviar-foto
audioSIMSIM/enviar-audio
videoSIMSIM/enviar-video
documentSIMSIM/enviar-arquivo
stickerSIMSIMWebP animado — via /enviar-arquivo com extensão .webp
locationSIMSIMLat/long + nome + endereço
template (HSM)SIM/enviar-template
interactive (buttons)SIMSIMBotões de resposta — cliente clica e você recebe via webhook
interactive (list)SIMSIMLista de opções — cliente seleciona e você recebe via webhook
reactionNÃOSIMEmoji reagido a uma mensagem — recebido via webhook
contactsNÃOSIMCartão de contato recebido — nome + telefone + email
systemNÃOSIMMensagem do sistema (ex: usuário mudou de número)
Janela de 24h: Mensagens livres (texto, imagem, áudio, vídeo, documento, localização, botões) só podem ser enviadas se o cliente enviou uma mensagem nas últimas 24h. Fora da janela, use /enviar-template com template HSM aprovado.
TPL
Templates HSM
Gestão no painel, não via API
A criação, edição, sincronização e deleção de templates HSM é feita dentro do painel da APIFacil, não via API. O cliente usa a biblioteca de modelos prontos (31 templates em 9 segmentos, pt_BR + en_US) ou cria do zero — tudo visual, sem código.
BIBLIOTECA
31 modelos prontos · 9 segmentos · pt_BR + en_US
CRIAR DO ZERO
Header, body, footer, botões — tudo visual no painel
SINCRONIZAR
Botão no painel espelha templates da Meta automaticamente
APROVAÇÃO
Status APPROVED/REJECTED chega via webhook
Para enviar template via API: Use o endpoint POST /api/v1/whatsapp/enviar-template (abaixo). O template precisa estar APPROVED — crie e gerencie pelo painel.
HOOK
Webhook de Eventos
Formato APIFacil (serializado)
A APIFacil recebe os eventos da Meta, serializa para um formato próprio e limpo e então envia ao seu webhook. Você não recebe o payload cru da Meta — recebe um formato padronizado e fácil de consumir.
Configuração: Configure webhook_url (mensagens recebidas) e webhook_status (status de envio) no painel da instância. Se webhook_status estiver vazio, o sistema usa webhook_url para tudo.
1
Painel da instância
Configurações › Webhook
2
Ativar webhook
Ligar toggle de webhook
3
Inserir URLs
webhook_url + webhook_status
4
Receber eventos
message_received + message_status

Eventos enviados ao seu webhook:

EVENTOQUANDOURL
message_receivedMensagem recebida de um contatowebhook_url
message_statusStatus de envio atualizadowebhook_status *
* Se webhook_status estiver vazio, usa webhook_url.
Segurança: A APIFacil valida a assinatura HMAC da Meta internamente. Você não precisa se preocupar com verificação de assinatura — recebe apenas eventos válidos e serializados.
JSON
Formato do Payload (Serializado)
Formato limpo APIFacil
JSON · MESSAGE_RECEIVED (texto)
{ "event": "message_received", "instancia": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "message_id": "wamid.HBgLNTU...", "tipo": "text", "de": "5511999999999", "para": "+55 11 8888-8888", "contato": null, "texto": "Ola, quero saber sobre o pedido", "midia": null, "localizacao": null, "interação": null, "resposta_id": null, "timestamp": "2026-07-30T12:00:00Z" }
JSON · MESSAGE_RECEIVED (imagem)
{ "event": "message_received", "instancia": "a1b2c3d4-...", "message_id": "wamid.HBgLNTU...", "tipo": "image", "de": "5511999999999", "para": "+55 11 8888-8888", "contato": null, "texto": "Olha que legal", "midia": { "id": "123456789", "mime_type": "image/jpeg", "nome": "foto.jpg", "tamanho": 102400, "url": "https://app.apifacil.com.br/storage/media/token/foto.jpg" }, "localizacao": null, "interação": null, "resposta_id": null, "timestamp": "2026-07-30T12:00:00Z" }
JSON · MESSAGE_RECEIVED (botao clicado)
{ "event": "message_received", "instancia": "a1b2c3d4-...", "message_id": "wamid.HBgLNTU...", "tipo": "interactive", "de": "5511999999999", "para": "+55 11 8888-8888", "contato": null, "texto": "Confirmar Pedido", "midia": null, "localizacao": null, "interação": { "tipo": "button_reply", "id": "btn_confirmar", "titulo": "Confirmar Pedido" }, "resposta_id": null, "timestamp": "2026-07-30T12:00:00Z" }
JSON · MESSAGE_STATUS (delivered)
{ "event": "message_status", "instancia": "a1b2c3d4-...", "message_id": "wamid.HBgLNTU...", "status": "delivered", "para": "5511999999999", "erro": null, "timestamp": "2026-07-30T12:00:01Z" }
JSON · MESSAGE_STATUS (failed)
{ "event": "message_status", "instancia": "a1b2c3d4-...", "message_id": "wamid.HBgLNTU...", "status": "failed", "para": "5511999999999", "erro": { "codigo": 131047, "titulo": "Receptive number not allowed", "detalhe": "Message undeliverable" }, "timestamp": "2026-07-30T12:00:05Z" }
CAMPOTIPOEVENTODESCRIÇÃO
eventstringambosmessage_received ou message_status
instanciastringambosCodigo UUID da instancia
message_idstringambosID da mensagem na Meta
tipostringreceivedtext, image, audio, video, document, sticker, location, interactive, button, reaction, contact, system
destringreceivedNúmero de origem (quem enviou)
parastringambosNúmero de destino (seu WhatsApp Business)
contatostringreceivedNome do contato (se enviado pela Meta)
textostringreceivedConteúdo textual ou caption da mídia
midiaobjectreceivedDados da mídia (id, mime_type, nome, tamanho, url)
localizacaoobjectreceivedlatitude, longitude, nome, endereco
interaçãoobjectreceivedtipo, id, título (button_reply/list_reply/button/reaction)
resposta_idstringreceivedID da mensagem original (se for resposta)
statusstringstatussent, delivered, read, failed, deleted
erroobjectstatuscódigo, título, detalhe (quando status=failed)
timestampstringambosISO 8601
Vantagem do formato serializado: Você não precisa lidar com a estrutura complexa e verbosa da Meta. O payload é limpo, consistente e fácil de parser. Tipos de mídia, interações e erros são normalizados.
WIZ
Onboarding
Conexão via painel (não API)
O onboarding da Meta é feito via painel (wizard de 5 etapas), não via API. O cliente conecta o Facebook Business, escolhe o número e submete — fica conectado imediatamente (auto-aprovação). A API só é usada após a instância estar operacional.
1
Criar instância
Tipo Meta Oficial
2
Abrir wizard
Painel › WhatsApp › Meta
3
OAuth Meta (Embedded Signup)
Conecta Facebook Business
4
Dados empresa + número
CNPJ, nome, telefone
5
Submeter (auto-aprova)
status=verified imediato
Custódia: O cliente é dono do BM/WABA/número. A APIFacil só guarda o token de acesso criptografado (revogável). Botão "Desconectar Meta" no painel. Dados Meta deletados ao fechar conta (LGPD).
STA
Status & Qualidade
STATUSDESCRIÇÃOPODE ENVIAR?
verifiedNúmero ativo e operacionalSIM
pendingAguardando verificaçãoNÃO
bannedNumero banido pela MetaNÃO
disconnectedDesconectado pelo clienteNÃO
QUALIDADESIGNIFICADOAÇÃO
greenQualidade boaNormal
yellowQualidade baixaReduzir volume, revisar templates
redCritico — risco de banimentoPausar envios imediatamente
LIM
Limites & Janela 24h
Rate limit: 80 mensagens/segundo por número. A APIFacil controla isso automaticamente — se exceder, aplica uma pequena pausa para respeitar o limite da Meta.
Janela de 24h (Customer Care Window): Após o cliente enviar uma mensagem para você, você tem 24h para responder com mensagens livres (texto, mídia). Após 24h, só pode enviar template HSM aprovado.
CENÁRIOO QUE ENVIAR
Cliente enviou msg nas últimas 24hMensagem livre (texto/mídia) ou template
Cliente não fala há +24hSÓ template HSM (APPROVED)
Disparo em massa (marketing)SÓ template HSM (MARKETING)
Notificação de pedido (transacional)Template HSM (UTILITY)
Autenticação (2FA)Template HSM (AUTHENTICATION)
ERR
Erros Comuns
STATUSCÓDIGOCAUSASOLUÇÃO
401token invalidoToken da APIFacil errado ou com BearerRemover "Bearer ", usar token do painel
404instância não encontradaID/código/public_token não pertence ao usuárioVerificar o ID no painel
404template não aprovadoTemplate não existe ou status != APPROVEDSincronizar templates, verificar status
422não é Meta OficialInstância não é Meta OficialVerificar o tipo da instância no painel
422credencial não ativaNúmero não verificado ou sem token válidoReconectar Meta no painel (wizard)
429rate limitMais de 80 envios/segundoA APIFacil controla automaticamente
500falha Graph APIMeta rejeitou o envio (número inválido, fora da janela)Verificar telefone e se cliente está na janela 24h
Suporte: Qualquer duvida, chame no WhatsApp 55 51 9 8033-1519. Nao temos sistema de tickets.