Compatibilidad con Meta
Joinotify expone toda la Meta Cloud API bajo el prefijo /v1. Si ya tienes código escrito
contra el Graph, la migración es un cambio de dos cadenas.
La sustitución
| De | A |
|---|---|
https://graph.facebook.com/v21.0/ | https://api.joinotify.com/v1/ |
Authorization: Bearer <META_TOKEN> | Authorization: Bearer sk_live_xxx |
Nada más cambia. Rutas, cuerpos de petición, respuestas, códigos de estado y mensajes de error siguen siendo idénticos — reenviamos la respuesta de Meta byte a byte.
curl -X POST https://graph.facebook.com/v21.0/106540352242922/messages \
-H 'Authorization: Bearer EAAG...' \
-H 'Content-Type: application/json' \
-d '{ "messaging_product": "whatsapp", "to": "5541987111527", "type": "text", "text": { "body": "¡Hola!" } }'
curl -X POST https://api.joinotify.com/v1/106540352242922/messages \
-H 'Authorization: Bearer sk_live_xxx' \
-H 'Content-Type: application/json' \
-d '{ "messaging_product": "whatsapp", "to": "5541987111527", "type": "text", "text": { "body": "¡Hola!" } }'
Dónde encontrar los IDs
El espejo exige los mismos identificadores que Meta: phone_number_id, waba_id y, para
algunos endpoints, business_id. Si solo tienes el token de Joinotify, descúbrelos con:
curl https://api.joinotify.com/me \
-H 'Authorization: Bearer sk_live_xxx'
El token va siempre en la cabecera
Los ejemplos de Meta suelen pasar el token como ?access_token= en la URL. El espejo no
lo acepta. El token debe estar siempre en Authorization.
# Correcto
curl 'https://api.joinotify.com/v1/{WABA_ID}?fields=analytics' \
-H 'Authorization: Bearer sk_live_xxx'
# No funciona
curl 'https://api.joinotify.com/v1/{WABA_ID}?fields=analytics&access_token=sk_live_xxx'
Internamente, cada endpoint de Meta espera el token de una forma distinta — el proxy lo resuelve por ti. Tu credencial real de Meta nunca llega a tu código.
Endpoints bloqueados
Algunas rutas alterarían la configuración de nuestra integración con Meta y afectarían a
otros clientes. Devuelven 403 con type: forbidden_endpoint:
| Segmento en la ruta | Por qué está bloqueado |
|---|---|
subscribed_apps | Volver a suscribir la app rompería el enrutado de webhooks. |
register · deregister | El registro del número se hace en el panel, durante el onboarding. |
request_code · verify_code | La verificación por SMS/voz pertenece al flujo de conexión. |
assigned_users · system_users | Gestión de usuarios de nuestro Business Manager. |
debug_token · oauth | Expondrían metadatos de la credencial real. |
uploads | Subida reanudable; usa POST /v1/{phone_number_id}/media. |
También está bloqueado el POST directo sobre el ID de un número
(POST /v1/{phone_number_id} sin subrecurso).
{
"error": {
"message": "This endpoint is not available through the Joinotify proxy.",
"type": "forbidden_endpoint"
}
}
Propiedad de los recursos
El primer segmento después de /v1/ debe ser un phone_number_id o waba_id que
pertenezca a tu cuenta. Si no lo es, la respuesta es 403 forbidden — la comprobación
ocurre antes de cualquier llamada a Meta.
La excepción son los IDs de medios (GET /v1/{media_id}), que no se pueden emparejar de
antemano: en ese caso es Meta quien juzga la propiedad.
Errores del proxy
Cuando Meta responde, recibes su respuesta — errores incluidos, en su formato. El sobre de Joinotify solo aparece en los fallos que ocurren antes de llegar allí:
| HTTP | type | Situación |
|---|---|---|
400 | invalid_request | Ningún ID de recurso después de /v1/. |
403 | forbidden_endpoint | Ruta en la lista de bloqueo. |
403 | forbidden | El recurso no pertenece a tu cuenta. |
502 | upstream_error | No se pudo alcanzar a Meta. |
504 | upstream_error | Meta tardó más de 30 segundos. |
¿Y los webhooks?
No configuras ningún callback en Meta — nosotros recibimos los eventos y los reenviamos a
los endpoints que registres, en el mismo sobre
({ object, entry[].changes[].value }). Los handlers escritos para Meta funcionan sin
cambios; solo cambia la validación de firma, de X-Hub-Signature-256 a
X-Joinotify-Signature-256.
Detalles en Webhooks.
Endpoints no listados
La referencia cubre los endpoints más usados. Para cualquier otro, consulta la documentación oficial de Meta y aplica la sustitución del principio de esta página.