Saltar al contenido principal

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:

IdentificadorQué es
phone_number_idEl número conectado. Se usa en los envíos y en el perfil de empresa.
waba_idLa 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.

Respuesta de POST /keys
{
"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."
}
Guarda el secreto ahora

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
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."
}'
Node.js
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...
Python
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ódigoQué ocurrió
401 authenticationToken ausente, mal formado, desconocido o revocado.
409 no_phone_numberNingún número conectado en la cuenta. Vuelve al paso 1.
422 meta_errorMeta lo rechazó. El cuerpo trae su error original en error.meta.
429 rate_limitSuperaste 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"
}'