Saltar al contenido principal

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​

DeA
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.

Antes — llamando a Meta directamente
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!" } }'
Después — a través de Joinotify
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 rutaPor qué está bloqueado
subscribed_appsVolver a suscribir la app rompería el enrutado de webhooks.
register · deregisterEl registro del número se hace en el panel, durante el onboarding.
request_code · verify_codeLa verificación por SMS/voz pertenece al flujo de conexión.
assigned_users · system_usersGestión de usuarios de nuestro Business Manager.
debug_token · oauthExpondrían metadatos de la credencial real.
uploadsSubida 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).

403 Forbidden
{
"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í:

HTTPtypeSituación
400invalid_requestNingún ID de recurso después de /v1/.
403forbidden_endpointRuta en la lista de bloqueo.
403forbiddenEl recurso no pertenece a tu cuenta.
502upstream_errorNo se pudo alcanzar a Meta.
504upstream_errorMeta 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.