Empieza aquí
Conecta un canal, recibe eventos en tu webhook y responde desde la API
Resender conecta páginas de Facebook y cuentas profesionales de Instagram, recibe los mensajes y comentarios que llegan por webhook de Meta y los reenvía a tu automatización (n8n, agentes de IA, etc.). Desde ahí respondes usando la API.
El flujo tiene tres pasos:
- Conecta un canal y apúntalo a tu webhook.
- Recibe eventos en tu webhook cada vez que llega un mensaje o comentario.
- Responde con el endpoint que corresponda: Messenger, Instagram Direct, o un comentario de Instagram en público o por privado.
Paso 1 — Conecta un canal
- Inicia sesión en Resender y abre Connections.
- Conecta tu página de Facebook o tu cuenta profesional de Instagram.
- En la conexión, configura la URL de webhook a la que Resender enviará los eventos. Debe ser
https. - Opcional pero recomendado: genera un secreto de firma (
whsec_…). Se muestra una sola vez, guárdalo.
Paso 2 — Recibe eventos en tu webhook
Resender hace un POST con Content-Type: application/json por cada mensaje o postback entrante (Evento de Messenger). En Instagram la misma URL también recibe comentarios nuevos en posts y reels, discriminados por el campo type (Evento de Instagram).
{
"type": "message",
"tenant": { "id": "2b7f2a1c-0d3e-4f5a-9b6c-7d8e9f0a1b2c" },
"page": {
"id": "5d2c1b0a-9f8e-4d7c-b6a5-4c3b2a1f0e9d",
"channel": "messenger",
"metaPageId": "1234567890",
"name": "Zapatería Central",
"username": null
},
"conversation": {
"id": "6f0e5a2c-8a5e-4a3d-9c2b-1f2e3d4c5b6a",
"contactId": "24681357900000000"
},
"message": {
"id": "0c9d2f6e-3b7a-4e1d-8f5c-2a1b3c4d5e6f",
"metaMessageId": "m_AbCdEfGhIjKlMnOpQrStUvWxYz0123456789",
"eventType": "message",
"postbackPayload": null,
"direction": "inbound",
"status": "received",
"text": "Hola, ¿tienen stock?",
"attachment": null,
"createdAt": "2026-09-10T14:05:12.000Z"
}
}Para responder un mensaje basta con guardar conversation.id: se envía como conversationId y Resender resuelve la página y el contacto por ti.
Si prefieres identificar el destino de forma explícita, guarda estos dos campos:
page.metaPageId: id de la página de Facebook o IG user id de la cuenta profesional. Se envía comopageId.conversation.contactId: PSID (Messenger) o IGSID (Instagram) del contacto. Se envía comorecipientId.
En los eventos de tipo comment no hay conversación. El valor a conservar es comment.igCommentId, el id de Meta del comentario, que se pasa como commentId a Responder públicamente o Responder por privado.
Firma y reintentos
- Si configuraste un secreto, cada request lleva
resender-event-id,resender-timestampyresender-signature. La firma esv1=+HMAC-SHA256(secret, "{eventId}.{timestamp}.{rawBody}")en hexadecimal, calculada sobre el cuerpo crudo. Verifícala en tiempo constante y rechaza timestamps con más de 300 segundos de diferencia. - Responde
2xxen menos de 5 segundos. El cuerpo de tu respuesta se ignora. 408,429,5xx, timeout o error de red se reintentan hasta cinco veces con esperas de 5 s, 30 s, 2 min, 5 min y 15 min. Otros4xxno se reintentan.- Deduplica por
resender-event-id: es estable por evento y los reintentos lo repiten.
El detalle completo del payload está en Evento de Messenger y Evento de Instagram.
Paso 3 — Responde
- En Settings → API Tokens crea una API key. El secreto se muestra una sola vez.
- Llama al endpoint del canal con
Authorization: Bearer pk_live_…. El ejemplo usa Enviar mensaje de Messenger y responde alconversation.iddel webhook:
curl -X POST https://pontiun.com/api/meta/send \
-H "Authorization: Bearer pk_live_<secreto>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-8841-confirmation" \
-d '{
"conversationId": "6f0e5a2c-8a5e-4a3d-9c2b-1f2e3d4c5b6a",
"reply": "¡Hola! Sí, tenemos stock."
}'El mismo cuerpo sirve para Enviar mensaje directo de Instagram cambiando la ruta a /api/meta/instagram/send. Si mandas pageId + recipientId en lugar de conversationId, el resultado es el mismo.
Para responder un comentario de Instagram se usa pageId + commentId:
curl -X POST https://pontiun.com/api/meta/instagram/comments/private-reply \
-H "Authorization: Bearer pk_live_<secreto>" \
-H "Content-Type: application/json" \
-d '{
"pageId": "17841400000000000",
"commentId": "17900000000000000",
"reply": "¡Hola! Te paso el precio por aquí."
}'Una respuesta exitosa devuelve { meta, resender }. meta es la respuesta cruda de Graph y resender es el registro persistido, con resender.status en sent o failed.
Ten en cuenta:
- Límites por canal. Messenger acepta texto (hasta 2000 caracteres) o un adjunto por URL, nunca ambos. Instagram Direct acepta texto (hasta 1000 bytes UTF-8) o un adjunto por URL (imagen, audio, video o PDF), nunca ambos. Una respuesta pública a un comentario admite 2200 caracteres y una privada 1000 bytes.
- Ventanas de tiempo. Messenger e Instagram solo permiten responder dentro de las 24 horas siguientes al último mensaje del contacto. La respuesta privada a un comentario se puede enviar una sola vez y dentro de los 7 días; un segundo intento responde
409. - Errores de Meta. Los endpoints de envío devuelven el mismo status HTTP que devolvió Graph con
meta.erroradjunto. Un502significa que no se pudo alcanzar Meta: reintenta en breve. - Errores de cuenta.
402indica que agotaste la cuota del plan y429que superaste el límite por API key; en ese caso espera los segundos deRetry-After. Solo consume cuota el envío que Meta aceptó. - Idempotencia. Manda un header
Idempotency-Keysi vas a reintentar desde tu lado. Repetir la key devuelve200con el resultado original yresender.idempotentReplay: true, sin volver a llamar a Meta ni consumir cuota. Ver el detalle en la introducción de la API.
Enviar por Messenger
Texto o adjunto por URL a un contacto de una página de Facebook.
Enviar por Instagram
Texto (máximo 1000 bytes) o adjunto por URL a un contacto de Instagram.
Responder un comentario
Respuesta pública bajo el comentario.
Responder por privado
Mensaje directo al autor del comentario, una sola vez.