Início rápido
Da conta criada à primeira mensagem entregue. Você vai precisar de um número de telefone que não esteja registrado em uma conta WhatsApp comum — apenas não conectado, ou já em uso no WhatsApp Business App (modo coexistência).
1. Conecte um número
Entre em app.joinotify.com, crie sua conta e clique em Conectar número. O fluxo é o Embedded Signup da própria Meta: você autoriza pela janela do Facebook e volta ao painel com o número já ativo.
Ao final, o painel mostra dois identificadores que aparecem em vários endpoints:
| Identificador | O que é |
|---|---|
phone_number_id | O número conectado. Usado em envios e no perfil empresarial. |
waba_id | A conta empresarial (WhatsApp Business Account). Usada em templates. |
2. Gere uma chave de API
Em Chaves de API, clique em Nova chave. O segredo completo aparece uma única vez — copie e guarde em um cofre de segredos.
{
"data": {
"id": "key_01J8ZK...",
"name": "producao",
"prefix": "sk_live_AbCdEf",
"environment": "live",
"createdAt": "2026-07-27T14:02:11.482Z",
"secret": "sk_live_AbCdEf0123456789abcdefgh"
},
"warning": "Store the \"secret\" now — it will not be shown again."
}
Só o hash da chave fica salvo no nosso banco. Se você perder o segredo, não há como recuperá-lo — só criar uma chave nova e revogar a antiga.
3. Envie a primeira mensagem
Substitua sk_live_xxx pelo seu token e 5541987111527 por um número que já tenha
conversado com você nas últimas 24 horas.
curl -X POST https://api.joinotify.com/messages \
-H 'Authorization: Bearer sk_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"type": "text",
"to": "5541987111527",
"body": "Olá! Esta é a primeira mensagem enviada pela API do Joinotify."
}'
const response = await fetch('https://api.joinotify.com/messages', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_live_xxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'text',
to: '5541987111527',
body: 'Olá! Esta é a primeira mensagem enviada pela API do Joinotify.',
}),
});
const payload = await response.json();
console.log(payload.data.messages[0].id); // wamid.HBgN...
import requests
response = requests.post(
"https://api.joinotify.com/messages",
headers={"Authorization": "Bearer sk_live_xxx"},
json={
"type": "text",
"to": "5541987111527",
"body": "Olá! Esta é a primeira mensagem enviada pela API do Joinotify.",
},
timeout=30,
)
print(response.json()["data"]["messages"][0]["id"])
Uma resposta 201 traz o WAMID da mensagem — o identificador que aparece depois nos
eventos de status (sent, delivered, read).
4. Receba as respostas
Envio é metade do trabalho. Para saber quando o cliente responde, cadastre um endpoint de webhook:
curl -X POST https://api.joinotify.com/webhook-endpoints \
-H 'Authorization: Bearer sk_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"name": "producao",
"url": "https://seu-servidor.com/webhooks/joinotify",
"events": ["messages"]
}'
A resposta traz um segredo whsec_..., também exibido uma única vez, usado para validar
a assinatura de cada entrega. O passo a passo está em Webhooks.
E se der erro?
| Código | O que aconteceu |
|---|---|
401 authentication | Token ausente, malformado, desconhecido ou revogado. |
409 no_phone_number | Nenhum número conectado na conta. Volte ao passo 1. |
422 meta_error | A Meta recusou. O corpo traz o erro original dela em error.meta. |
429 rate_limit | Você passou do limite da categoria. Veja Limites de uso. |
A tabela completa está em Erros.
Fora da janela de 24 horas
O WhatsApp só permite mensagem livre dentro de 24 horas contadas a partir da última mensagem do cliente. Fora disso, é preciso usar um template aprovado:
curl -X POST https://api.joinotify.com/messages \
-H 'Authorization: Bearer sk_live_xxx' \
-H 'Content-Type: application/json' \
-d '{
"type": "text",
"to": "5541987111527",
"name": "confirmacao_pedido",
"language": "pt_BR"
}'