Pré-requisitos
/v1).
O que acontece, em resumo
- Seu backend chama
POST /v1/entrypoints/whatsapp/connection-sessionse recebesessionId,urleexpiresAt. - Você direciona a pessoa para
url(página do Spark). Ela faz login na Meta e autoriza o número. - O Spark finaliza a conexão e cria o entrypoint (canal WhatsApp oficial) na organização.
- Você descobre o resultado por webhook (
entrypoints.whatsapp.connectedouentrypoints.whatsapp.connection_failed) ou por polling emGET …/connection-sessions/{sessionId}.
Endpoints
A referência OpenAPI ao lado documenta cada campo, exemplo e código de erro.
Criar uma sessão
Corpo (application/json):
Resposta 202:
Como abrir a url
- Abra em janela de topo ou nova aba (
window.opencom_blankou redirecionamento). A resposta 202 da API descreve explicitamente “janela de topo” — popups bloqueados ou iframes costumam quebrar o fluxo da Meta. - Guarde
sessionIdno seu backend antes de enviar o usuário àurl. - A
urlé de uso único e sensível: trate como link de convite (não logue em analytics públicos, não compartilhe em canais inseguros).
Consultar a sessão
GET /v1/entrypoints/whatsapp/connection-sessions/{sessionId} com a mesma chave sk_.
Status possíveis:
Enquanto
pending, entrypoint é null. Em completed, você recebe, entre outros:
entrypoint.id— use em envios e listagens (GET /v1/entrypoints, mensageria, etc.).phoneNumberId,wabaId,displayPhone,namefunnelId,funnelStepId,isCoexistence— espelham o que foi configurado na sessão.
reason):
O campo
message pode trazer texto legível para exibir ao usuário; para lógica no código, prefira status e reason.
Webhooks
Cadastre no portal Svix (aba Webhooks do painel) os eventos do grupo entrypoints:
Formato geral, assinatura Svix, retentativas e idempotência: Webhooks.
Exemplo enxuto de sucesso:
Fluxo recomendado para integradores
1
Criar sessão no servidor
Chame
POST com sk_, opcionalmente funil e returnUrl. Persista sessionId associado ao usuário ou tenant da sua aplicação.2
Abrir a URL para o usuário
Redirecione ou abra
url em janela de topo. Mostre contagem regressiva até expiresAt se quiser melhorar a UX.3
Aguardar o resultado
No handler de webhook, filtre por
sessionId. Atualize seu banco com entrypoint.id em connected. Em connection_failed, informe o usuário e ofereça criar nova sessão.4
Usar o canal conectado
Liste entrypoints (
GET /v1/entrypoints?platform=whatsapp) ou use o id do webhook para enviar mensagens pela API de mensageria e automações já documentadas.SDK TypeScript
Com o pacotesparkcrm:
EntrypointsWhatsappConnectedWebhook e EntrypointsWhatsappConnectionFailedWebhook em TypeScript — webhooks e tipos.
Limitações e boas práticas
- Uma sessão, um fluxo: cada
POSTgera novaurle novo prazo. Se expirar ou falhar, crie outra sessão; não reutilizeurlantiga. - Prazo fixo de 20 minutos: após
expiresAt, o status passa aexpired(webhookconnection_failedcomreason: expired). - Somente API oficial: este fluxo não substitui WhatsApp Lite (QR code); use os entrypoints
whatsapp_litepelo painel ou outras APIs conforme a referência. - Funil opcional: sem
funnelStepId, o número conecta sem etapa padrão; você pode ajustar depois no painel em Canais. - Coexistência: só marque
coexistence: truequando o caso de uso exigir o modo coexistência com o app Business; o fluxo na página do Spark difere do Embedded Signup padrão. - Rate limit: respeite
429(RATE_LIMIT_EXCEEDED) com backoff; evite polling agressivo em muitas sessões paralelas. - Segurança: nunca exponha
sk_no front-end. Crie a sessão sempre no backend; o front só recebe aurl(ou um redirect controlado por você).
Erros comuns
Leitura adicional
- Lista e detalhe de entrypoints — depois de conectar.
- Webhooks de saída — configuração Svix e verificação de assinatura.
- Disparos de campanha — uso do canal WhatsApp oficial com templates aprovados.

