O que simula
| Área | Cloud API | O que acontece |
|---|---|---|
| Mensagens | POST /{phone-number-id}/messages | Texto, mídia, localização, contatos, interativas, reações, respostas, templates (cabeçalho, corpo, rodapé, botões, carrossel, oferta por tempo limitado, autenticação). Confirmações enviada, entregue, lida; indicador de digitação. |
| O usuário | a mesma chamada com X-Mock-From | O usuário escreve, responde, manda mídia e áudios, dá confirmações: a mensagem entra como recebida e vai para o seu webhook. |
| Templates | /{waba-id}/message_templates, /{template-id} | Criar, editar, apagar, listar. Uma revisão com veredito e um tempo que você escolhe, o webhook message_template_status_update, os erros de envio da Meta. |
| Mídia | /{phone-number-id}/media, /{media-id} | Upload (multipart, com os tipos e limites da Meta), descrição, download com token, exclusão. Os arquivos ficam no disco. |
| Números | /{waba-id}/phone_numbers, request_code, verify_code, register, settings | Empresa, WABAs e números; o onboarding de um número novo com o código por SMS; PIN de duas etapas; configurações de ligação. Um número não registrado não envia (133010). |
| Ligações | POST /{phone-number-id}/calls, call_permissions | A Calling API com áudio WebRTC real: qualquer lado liga, com o pedido de permissão e a resposta, pre_accept, accept, reject, terminate e os webhooks de calls. |
| Webhooks | POST /{phone-number-id} (webhook_configuration) | Webhook por número verificado com hub.challenge, assinado com x-hub-signature-256, um atraso de resposta opcional, um log de cada tentativa. |
| Todo o resto | o restante da especificação | Roteado, validado e respondido com o próprio exemplo da Meta (Flows, grupos, perfil comercial, QR codes…). |
O arquivo OpenAPI da Meta para a v23.0 vem em spec/v23.0. Toda requisição é validada contra ele, toda resposta segue os schemas de resposta, e um teste de contrato passa todos os exemplos de requisição da especificação pelo mock. Onde a especificação contradiz os próprios exemplos da Meta, a correção fica registrada com o motivo em errata.json.
Ligações e números
O botão de telefone no topo da conversa liga com áudio WebRTC real, o microfone e o alto-falante do navegador. O usuário liga para a empresa (POST /{phone}/calls com X-Mock-From e a oferta) e a aplicação recebe calls / connect, respondendo pre_accept e accept com o seu SDP. A empresa liga para o usuário: sem a permissão dele, manda antes o call_permission_request; com ela, connect com a oferta, e o celular do usuário toca. As ligações ficam na conversa como balões de histórico: atendida com a duração, perdida, recusada.
Sem nada digitado, o botão de enviar vira um microfone, como no celular: grava um áudio de voz (Ogg Opus, mono, 48 kHz) e envia como audio com voice: true.
- Crie um número.
POST /{waba-id}/phone_numberscomcc,phone_numbereverified_name: ele nasce não verificado, não registrado. - Peça o código.
POST /{phone-number-id}/request_code; o código que a Meta mandaria aparece no número e num aviso. - Verifique.
POST /{phone-number-id}/verify_code; um código errado é(#136025). - Registre.
POST /{phone-number-id}/registercom o PIN de seis dígitos; o primeiro fica, outro depois é(#133005). - Ative as ligações.
POST /{phone-number-id}/settingscomcalling; precisa do número registrado e de um webhook ((#138018)). - Tire da Cloud API.
POST /{phone-number-id}/deregister. Um número fora da Cloud API não envia ((#133010)) nem liga.
O painel
Abra http://localhost:3010. Fala inglês e português e não tem rotas privadas: cada ação é a chamada da Cloud API que a sua aplicação faria.
Zoom
WhatsApp Web Ao Vivo
Chat em tempo real com mensagens de cobrança, links clicáveis de pagamento e tiques de envio e leitura.
Zoom
Chamadas de Voz no Navegador
Simulação completa de ligação com áudio real, tela de chamada, animação de toque e controles de microfone.
Zoom
Editor & Prévia no Celular
Crie modelos com cabeçalho de mídia, variáveis no corpo {{1}}, botões e visualização fiel de smartphone.
Zoom
WhatsApp Web no Modo Escuro
Paleta escura nativa com notas de voz, ondas sonoras reproduzíveis e balões de chat noturnos.
Zoom
Entregas de Webhook
Histórico em tempo real de chamadas disparadas, códigos de resposta HTTP (200 OK) e controle de atraso.
Zoom
Nova Conversa
Modal para iniciar conversas simuladas como usuário, enviando dados e mensagens ao seu webhook.
Zoom
Meta Graph API v23.0
Documentação viva da especificação oficial, com exemplos cURL e respostas das operações simuladas.
Zoom
Cards de Carrossel no Celular
Simule mensagens de marketing interativas com múltiplos cartões deslizantes exibidos no celular.
Zoom
Destinos de Webhook & HMAC
Associe números a URLs, configure verificação de assinatura HMAC e pule a validação para testes locais.
Zoom
JSON da Cloud API
Expanda qualquer entrega para auditar o formato idêntico ao da Meta Cloud API: entry, statuses e precificação.
Zoom
Empresas & Telefones WABA
Gerenciamento de contas Meta Business, WABAs, identificadores de telefone e classificação de qualidade.
Zoom
Modo de Entrega
Alterne entre entrega automática (enviada → entregue → lida) e controle manual para testes precisos.
Zoom
Catálogo de Templates
Biblioteca completa de 20 templates aprovados distribuídos entre Marketing, Utilidade e Autenticação.
Zoom
Filtros & Busca de Mensagens
Filtre conversas não lidas, contatos aguardando resposta da clínica e realize buscas em tempo real.
Zoom
Template de Localização com Mapa
Simule templates de localização com card de mapa interativo, endereço e botões de como chegar.
Templates em arquivos
Todo JSON em templates/ é importado no boot e quando muda, e templates/examples/ traz um exemplo de cada componente que a Meta permite. Detalhes em docs/templates.md.
Configuração
| Variável | Padrão | O que faz |
|---|---|---|
PORT | 3010 | Porta HTTP |
WEBHOOK_URL | (vazio) | Webhook padrão; phone:url associa um número |
WEBHOOK_SECRET | (vazio) | Assina os webhooks com x-hub-signature-256 |
WEBHOOK_LOCALHOST_REWRITE | (vazio) | Host que substitui localhost nas URLs de webhook (host.docker.internal) |
MOCK_WEBHOOK_RESPONSE_DELAY_MS | 5000 | Espera antes de cada entrega de webhook (também no painel) |
MOCK_DELIVERY_MODE | auto | manual: os tiques só andam quando o celular do usuário confirma |
MOCK_TEMPLATE_REVIEW_DELAY_MS | 2000 | Duração padrão da revisão de um template |
WHAP_CALL_RING_MS | 60000 | Quanto tempo uma ligação toca antes de cair sem resposta |
WHAP_DATA_DIR | /app/data na imagem | Banco SQLite e arquivos de mídia |
WHAP_DB | (arquivo) | :memory: não guarda nada |
MOCK_PHONE_NUMBER_ID, MOCK_WABA_ID, MOCK_BUSINESS_ID | 1234567890, 100000000000001, 100000000000002 | Os ids do número, da WABA e da empresa padrão |
MOCK_ALLOWED_HOSTS | (vazio) | Nomes de Host extras aceitos (o nome de um serviço do compose) |
Desenvolvimento
bun install
bun run src/index.ts server # http://localhost:3010
bun --bun vitest run --maxWorkers=2 # testes, incluindo o teste de contrato
bun tsc --noEmitUma nova versão da Graph é uma nova pasta spec/<versão> e uma entrada em src/graph/versions.ts; o teste de contrato roda todas as versões. Mais em docs/panel.md e no README.
Licença
Apache-2.0, veja a LICENSE. A especificação OpenAPI da Meta em spec/ é MIT, Copyright (c) Meta Platforms, Inc. and affiliates.
Sem vínculo com a Meta ou o WhatsApp. Um simulador independente da API pública deles, para desenvolvimento local e testes. WhatsApp e Meta são marcas de seus respectivos donos.