Eventos de webhook

INFI usa nombres de evento canónicos y estables. El nombre se entrega en el header X-Infi-Event y en el campo event del cuerpo, siempre en el mismo formato (minúsculas, con puntos).

Compara por igualdad exacta

Los nombres de evento listados abajo son estables entre versiones. Puedes compararlos directamente: if (req.headers['x-infi-event'] === 'transaction.paid') { ... }. Sin necesidad de normalización.

Cobros PIX (type: "transaction")

Eventos del ciclo de un cobro recibido.

EventoCuándo ocurre
transaction.paidPago confirmado y acreditado al saldo.
transaction.failedFalla en el pago (timeout, rechazo del pagador).
transaction.cancelledCobro cancelado antes del pago.
transaction.expiredPlazo expiró sin pago.
transaction.refundedReembolso total. Saldo del comerciante debitado.
transaction.partially_refundedReembolso parcial.
transaction.infractionMED (Mecanismo Especial de Devolución) abierto — saldo bloqueado preventivamente.
transaction.disputeDisputa abierta por el pagador.
transaction.protestProtesto registrado contra la transacción.
transaction.blockedFondos bloqueados por orden judicial o compliance.
transaction.chargebackChargeback aplicado — saldo debitado en definitivo.

Retiros PIX (type: "transfer")

Eventos del ciclo de una transferencia (retiro) iniciada por tu API key o por el panel.

EventoCuándo ocurre
transfer.createdRetiro creado, esperando procesamiento.
transfer.processingRetiro en procesamiento en el banco.
transfer.pending_approvalRetiro por encima del límite — espera aprobación manual interna.
transfer.approvedRetiro aprobado manualmente, sigue al procesamiento.
transfer.rejectedRetiro rechazado manualmente. Saldo devuelto.
transfer.paidRetiro concluido con éxito.
transfer.failedRetiro falló (clave PIX inválida, etc.). Saldo devuelto.
transfer.cancelledRetiro cancelado antes del procesamiento. Saldo devuelto.
transfer.refundedEl destinatario devolvió el monto (PIX Reversal). Saldo reacreditado.
transfer.partially_refundedEl destinatario devolvió parte. Saldo reacreditado proporcionalmente.

Headers en cada POST

HeaderDescripción
X-Infi-EventNombre canónico del evento (p.ej. transaction.paid).
X-Infi-TimestampTimestamp Unix en segundos, parte de la firma.
X-Infi-Signaturesha256=<hex> — HMAC-SHA256 sobre ${timestamp}.${rawBody}. Ver Firma.
X-Infi-Event-IdID único del evento (evt_<ts>_<rand>). Úsalo para dedup entre múltiples URLs y reenvíos manuales.

Campos opcionales (PIX)

En eventos donde el pago fue efectivamente liquidado, el webhook trae datos del PIX desde la red SPI/BACEN:

CampoDónde apareceContenido
endToEndIdtransaction.paid / transaction.refunded / transaction.partially_refunded / transfer.paid / transfer.refunded / transfer.partially_refundedE2E ID estándar BACEN (formato E<ISPB><YYYYMMDDhhmm><id>). Único por PIX.
payertransaction.* (PIX recibido — quién te pagó)Objeto con name, document, documentType y bankAccount.
beneficiarytransfer.* (PIX enviado — quién recibió tu retiro)Objeto con name, document, documentType y bankAccount.
refundEndToEndIdtransfer.refunded / transfer.partially_refunded solamenteE2E ID del PIX de devolución (distinto del endToEndId del PIX original).

Estructura de payer y beneficiary:

{
  "name": "Maria Santos",
  "document": "98765432100",
  "documentType": "cpf",
  "bankAccount": {
    "ispb": "18236120",
    "branch": "1",
    "account": "914453272"
  }
}
Privacidad (LGPD)

Los campos payer.* y beneficiary.* contienen datos personales (nombre, CPF/CNPJ, cuenta bancaria). Trátalos como cualquier dato personal: guarda solo lo necesario, con acceso restringido, y respeta el derecho de eliminación del titular. INFI entrega esos datos porque vienen de la red PIX — tú eres el controlador del tratamiento posterior.

Eventos que no traen esos campos: transaction.failed, transaction.cancelled, transaction.expired, transfer.created, transfer.processing, transfer.pending_approval, transfer.approved, transfer.rejected, transfer.failed, transfer.cancelled. Los campos se omiten del JSON cuando no están disponibles (no vienen como null).

Ejemplo: transaction.paid

{
  "event": "transaction.paid",
  "eventId": "evt_1715000000000_abcdef12",
  "transactionId": "Q4t9aV...",
  "status": "paid",
  "amountCents": 1000,
  "feeCents": 8,
  "netCents": 992,
  "paidAt": "2026-05-08T03:30:00.000Z",
  "timestamp": "1715000000",
  "endToEndId": "E18236120202605080330abc123",
  "payer": {
    "name": "Maria Santos",
    "document": "98765432100",
    "documentType": "cpf",
    "bankAccount": {
      "ispb": "18236120",
      "branch": "1",
      "account": "914453272"
    }
  }
}

Ejemplo: transaction.refunded

{
  "event": "transaction.refunded",
  "eventId": "evt_1715003600000_def456",
  "transactionId": "Q4t9aV...",
  "status": "refunded",
  "amountCents": 1000,
  "feeCents": 8,
  "netCents": 992,
  "paidAt": null,
  "timestamp": "1715003600",
  "endToEndId": "E18236120202605080330abc123",
  "payer": {
    "name": "Maria Santos",
    "document": "98765432100",
    "documentType": "cpf",
    "bankAccount": {
      "ispb": "18236120",
      "branch": "1",
      "account": "914453272"
    }
  }
}

El monto del reembolso (parcial o total) se debita automáticamente de tu saldo INFI. Sin acción adicional. transaction.partially_refunded tiene el mismo schema.

Ejemplo: transfer.paid

{
  "event": "transfer.paid",
  "eventId": "evt_1715000300000_345678ab",
  "transactionId": "...",
  "status": "paid",
  "amountCents": 5000,
  "feeCents": 4,
  "netCents": 4996,
  "paidAt": "2026-05-08T03:35:00.000Z",
  "timestamp": "1715000300",
  "endToEndId": "E04838403202605080335ABCDEF",
  "beneficiary": {
    "name": "João Silva",
    "document": "12345678901",
    "documentType": "cpf",
    "bankAccount": {
      "ispb": "18236120",
      "branch": "0001",
      "account": "123456789"
    }
  }
}

Ejemplo: transfer.refunded (devolución de retiro)

{
  "event": "transfer.refunded",
  "eventId": "evt_1715004000000_999",
  "transactionId": "...",
  "status": "transfer_refunded",
  "amountCents": 5000,
  "feeCents": 4,
  "netCents": 4996,
  "paidAt": null,
  "timestamp": "1715004000",
  "endToEndId": "E04838403202605080335ABCDEF",
  "refundEndToEndId": "D18236120202605080500abc789",
  "beneficiary": {
    "name": "João Silva",
    "document": "12345678901",
    "documentType": "cpf",
    "bankAccount": {
      "ispb": "18236120",
      "branch": "0001",
      "account": "123456789"
    }
  }
}

Cuando el destinatario devuelve un PIX que enviaste, el saldo se reacredita automáticamente. transfer.partially_refunded tiene el mismo schema con amountCents igual al valor parcialmente devuelto.

Ejemplo: transfer.failed

{
  "event": "transfer.failed",
  "eventId": "evt_1715000600000_9abc1234",
  "transactionId": "...",
  "status": "failed",
  "amountCents": 5000,
  "feeCents": 4,
  "netCents": 4996,
  "paidAt": null,
  "timestamp": "1715000600"
}

En retiros que terminan en failed, cancelled o rejected, el saldo se devuelve automáticamente. Sin acción adicional de tu lado más allá de marcar la operación. Estos eventos no traen endToEndId ni beneficiary (no hubo liquidación).

Categorías para multi-webhook

Puedes configurar una URL por categoría o mezclar a tu gusto usando filtros de evento. Ver Configurando para el setup completo.

CategoríaEventos cubiertos
cashin (pagos)transaction.paid, transaction.failed, transaction.cancelled, transaction.expired
refund (reembolsos)transaction.refunded, transaction.partially_refunded
dispute (disputas / holds)transaction.infraction, transaction.dispute, transaction.protest, transaction.blocked
chargebacktransaction.chargeback
cashout (retiros)transfer.* (los 10 eventos)