@pilot-status/embed.
Pré-requisitos compartilhados (Chat + Connect)
- Chave de API do tenant (
ps_, com escopo de tenant) — gerada em Perfil → API. Ela nunca sai do seu backend. (Uma chave com escopo de número só pode incorporar o próprio número.) - SDK —
<script src="https://embed.pilotstatus.com.br/embed.js">ounpm i @pilot-status/embed; chamePilotStatus.init(). allowedOrigins— ao emitir o token do Chat, liste as origens exatas (scheme://host[:port], 1–20) autorizadas a incorporar.- Token por superfície — o Chat usa
POST /v1/embed/sessions(surface: "chat", um JWT de curta duração mantido em memória). O Connect usaPOST /v1/numbers/remote-pairing(um token de pareamento na URL — veja Incorpore a Página de Connect). - Renovação — o TTL do token do Chat é de 15 min com uma janela de atualização deslizante; ao expirar por completo, o SDK chama
onSessionExpired.
Fluxo do Chat
Configuração única
Seu backend lista os números com
GET /v1/numbers (x-api-key) e armazena o mapa cliente → [whatsappNumberIds].Emita um token a cada carregamento de página
Seu frontend solicita um token ao seu backend; o backend chama:Resposta
201: { token, surface, whatsappNumberIds, allowedOrigins, expiresAt }. O backend encaminha apenas o JWT para o frontend.Protocolo postMessage (pai ↔ iframe)
Envelope:{ source: "pilot-status-embed", v: 1, type, payload }. Mensagens sem esse source são ignoradas; a origem é validada em ambos os lados.
| Passo | Quem | Mensagem |
|---|---|---|
| A | SDK (pai) | cria <iframe src="chat.pilotstatus.com.br/?parentOrigin=<origin>"> (sandbox allow-scripts allow-same-origin allow-forms allow-popups) |
| B | iframe → pai | ready (o SDK valida origin === chat.pilotstatus.com.br) |
| C | SDK → iframe | init{ token, locale, theme } (o iframe valida origin === parentOrigin) |
| D | iframe | mantém o token em memória apenas — nunca na URL/localStorage |
| E | iframe → pai | resize{height}, chat:unread-count{count}, chat:conversation-opened{conversationId}, session-expired |
| — | SDK → iframe | set-theme{theme}, set-locale{locale} em tempo de execução |
Modelo de segurança
- A
x-api-keyfica apenas no seu backend; o navegador só manipula o JWT de curta duração. - O JWT tem escopo rígido para os seus
whatsappNumberIds— as rotas do chat reverificam a cada requisição (defesa em profundidade). - Token apenas em memória, TTL de ~15 min com atualização deslizante;
allowedOriginsfixa quem pode incorporar; a origem do postMessage é validada em ambos os lados.