O passkey do WhatsApp Web, resolvido no navegador.
O WebAuthn Solver executa o desafio de passkey (WebAuthn) do WhatsApp Web direto no navegador do seu cliente — onde o celular dele está por perto — e devolve a assertion pronta para o seu sistema.
Sem permissão ampla (<all_urls>). A chave privada nunca sai do dispositivo.
import "https://app.z-api.io/webauthn-sdk.js";
// desafio que o WhatsApp devolveu
const disponivel = await ZapiWebAuthn.isAvailable();
const assertion = await ZapiWebAuthn.solve(publicKey);
// envie a assertion ao seu backend → WhatsApp
O problema
A passkey não roda num servidor
Ao conectar uma sessão do WhatsApp Web, o protocolo pode devolver um desafio WebAuthn. Responder a ele tem três exigências que impedem rodar em backend ou numa página comum:
A chave está no celular
A passkey (chave privada) fica no dispositivo do cliente. Ninguém consegue extraí-la — só o próprio aparelho assina.
Precisa de proximidade
O fluxo “usar telefone” (hybrid/caBLE) exige Bluetooth de proximidade: quem roda o get() precisa estar perto do celular que aprova.
Só na origin certa
rpId whatsapp.com só funciona rodando em web.whatsapp.com, que não pode ser embutido em iframe (CSP frame-ancestors).
Conclusão: só uma extensão consegue injetar no web.whatsapp.com e ainda falar com o seu servidor. É exatamente o que o WebAuthn Solver faz.
Como funciona
SDK → connector → extensão
Qualquer domínio de cliente usa a extensão através de um SDK hospedado no seu domínio — sem a extensão precisar de permissão ampla.
Seu app chama o SDK
A página do cliente inclui o webauthn-sdk.js (hospedado no seu domínio) e chama ZapiWebAuthn.solve(publicKey) com o desafio.
A extensão abre o WhatsApp
Um iframe-ponte no seu domínio aciona a extensão, que abre/foca a aba do web.whatsapp.com e executa navigator.credentials.get() na origin correta.
O cliente aprova e recebe a assertion
A UI nativa de passkey aparece, o cliente aprova no celular (proximidade BLE) e a assertion volta para a sua página — pronta para enviar ao WhatsApp.
A chave nunca sai do celular. A extensão só recebe o desafio, pede a assinatura e devolve a assertion — nunca a chave.
Recursos
Feito para onboarding seguro
Chave nunca é exposta
A extensão não acessa a chave privada. Ela só recebe a assertion (assinatura + dados) depois da aprovação do usuário.
Permissões específicas
Sem <all_urls>. Só web.whatsapp.com e o seu domínio (app.z-api.io) — revisão mais tranquila nas lojas.
Nada é armazenado
Sem storage, cookies ou analytics. O desafio e a assertion existem apenas em memória, durante a operação.
Gerencia a aba sozinha
Abre o web.whatsapp.com se não estiver aberto, espera carregar, captura a assertion, fecha a aba e devolve o foco à origem.
Integra em qualquer domínio
Um SDK leve e um iframe-ponte deixam qualquer página do cliente acionar a extensão, sem instalar nada além dela.
Chromium e Firefox
Publicada como Manifest V3 para Chrome, Edge e Brave, e com build assinado para o Firefox.
Privacidade por design
A extensão não coleta, não armazena e não transmite dados pessoais a servidores próprios. Todo o tráfego ocorre apenas entre a sua página, o navegador e o web.whatsapp.com.
- A chave privada permanece no dispositivo
- Nenhum dado enviado ao desenvolvedor
- Sem storage, cookies ou analytics
- Permissões mínimas e específicas
Pronto para resolver o passkey?
Instale a extensão e conclua a etapa de passkey do WhatsApp no dispositivo do próprio usuário.