Docs

O que acontece por trás de cada chamada da Cloud API, o painel onde você faz o papel do usuário, e cada configuração.

O que simula

ÁreaCloud APIO que acontece
MensagensPOST /{phone-number-id}/messagesTexto, 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árioa mesma chamada com X-Mock-FromO 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, settingsEmpresa, 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çõesPOST /{phone-number-id}/calls, call_permissionsA 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.
WebhooksPOST /{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 restoo restante da especificaçãoRoteado, 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_numbers com cc, phone_number e verified_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}/register com o PIN de seis dígitos; o primeiro fica, outro depois é (#133005).
  • Ative as ligações. POST /{phone-number-id}/settings com calling; 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.

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ávelPadrãoO que faz
PORT3010Porta 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_MS5000Espera antes de cada entrega de webhook (também no painel)
MOCK_DELIVERY_MODEautomanual: os tiques só andam quando o celular do usuário confirma
MOCK_TEMPLATE_REVIEW_DELAY_MS2000Duração padrão da revisão de um template
WHAP_CALL_RING_MS60000Quanto tempo uma ligação toca antes de cair sem resposta
WHAP_DATA_DIR/app/data na imagemBanco SQLite e arquivos de mídia
WHAP_DB(arquivo):memory: não guarda nada
MOCK_PHONE_NUMBER_ID, MOCK_WABA_ID, MOCK_BUSINESS_ID1234567890, 100000000000001, 100000000000002Os 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 --noEmit

Uma 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.