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:

  1. Conecta un canal y apúntalo a tu webhook.
  2. Recibe eventos en tu webhook cada vez que llega un mensaje o comentario.
  3. 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

  1. Inicia sesión en Resender y abre Connections.
  2. Conecta tu página de Facebook o tu cuenta profesional de Instagram.
  3. En la conexión, configura la URL de webhook a la que Resender enviará los eventos. Debe ser https.
  4. 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 como pageId.
  • conversation.contactId: PSID (Messenger) o IGSID (Instagram) del contacto. Se envía como recipientId.

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-timestamp y resender-signature. La firma es v1= + 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 2xx en 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. Otros 4xx no 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

  1. En Settings → API Tokens crea una API key. El secreto se muestra una sola vez.
  2. Llama al endpoint del canal con Authorization: Bearer pk_live_…. El ejemplo usa Enviar mensaje de Messenger y responde al conversation.id del 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.error adjunto. Un 502 significa que no se pudo alcanzar Meta: reintenta en breve.
  • Errores de cuenta. 402 indica que agotaste la cuota del plan y 429 que superaste el límite por API key; en ese caso espera los segundos de Retry-After. Solo consume cuota el envío que Meta aceptó.
  • Idempotencia. Manda un header Idempotency-Key si vas a reintentar desde tu lado. Repetir la key devuelve 200 con el resultado original y resender.idempotentReplay: true, sin volver a llamar a Meta ni consumir cuota. Ver el detalle en la introducción de la API.

On this page