Inicio rápido
De la cuenta recién creada al primer mensaje entregado. Necesitarás un número de teléfono que no esté registrado en una cuenta de WhatsApp normal — simplemente sin conectar, o ya en uso en la aplicación WhatsApp Business (modo coexistencia).
1. Conecta un número
Entra en app.joinotify.com, crea tu cuenta y pulsa Conectar número. El flujo es el Embedded Signup de la propia Meta: autorizas desde la ventana de Facebook y vuelves al panel con el número ya activo.
Al final, el panel muestra dos identificadores que aparecen en varios endpoints:
| Identificador | Qué es |
|---|---|
phone_number_id | El número conectado. Se usa en los envíos y en el perfil de empresa. |
waba_id | La cuenta de empresa (WhatsApp Business Account). Se usa en las plantillas. |
2. Genera una clave de API
En Claves de API, pulsa Nueva clave. El secreto completo aparece una sola vez — cópialo y guárdalo en un gestor de secretos.
{
"data": {
"id": "key_01J8ZK...",
"name": "produccion",
"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."
}
En nuestra base de datos solo queda el hash de la clave. Si pierdes el secreto no hay forma de recuperarlo — únicamente crear una clave nueva y revocar la antigua.
3. Envía el primer mensaje
Sustituye sk_live_xxx por tu token y 5541987111527 por un número que te haya escrito
en las ú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": "¡Hola! Este es el primer mensaje enviado con la API de 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: '¡Hola! Este es el primer mensaje enviado con la API de 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": "¡Hola! Este es el primer mensaje enviado con la API de Joinotify.",
},
timeout=30,
)
print(response.json()["data"]["messages"][0]["id"])
Una respuesta 201 trae el WAMID del mensaje — el identificador que después aparece
en los eventos de estado (sent, delivered, read).
4. Recibe las respuestas
Enviar es la mitad del trabajo. Para saber cuándo responde el cliente, registra un 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": "produccion",
"url": "https://tu-servidor.com/webhooks/joinotify",
"events": ["messages"]
}'
La respuesta trae un secreto whsec_..., también mostrado una sola vez, que se usa para
validar la firma de cada entrega. El paso a paso está en Webhooks.
¿Y si falla?
| Código | Qué ocurrió |
|---|---|
401 authentication | Token ausente, mal formado, desconocido o revocado. |
409 no_phone_number | Ningún número conectado en la cuenta. Vuelve al paso 1. |
422 meta_error | Meta lo rechazó. El cuerpo trae su error original en error.meta. |
429 rate_limit | Superaste el límite de la categoría. Consulta Límites de uso. |
La tabla completa está en Errores.
Fuera de la ventana de 24 horas
WhatsApp solo permite mensajes libres dentro de las 24 horas posteriores al último mensaje del cliente. Fuera de ese plazo hace falta una plantilla aprobada:
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"
}'