Skip to content

Webhooks ​

Referencia completa del sobre de entrega, los headers y el catálogo de eventos que Paytami puede enviarte. Para cómo registrar un endpoint y verificar la firma, ve la guía de webhooks.

El sobre de un evento ​

Toda entrega es un POST con este cuerpo:

json
{
  "id": "evt_7c1a2b3d4e5f60718293a4b5",
  "type": "payment.succeeded",
  "created_at": "2026-08-28T15:10:00.000Z",
  "data": { "...": "el objeto correspondiente al tipo de evento" }
}
CampoDescripción
idIdentificador único del evento, prefijo evt_. Úsalo para deduplicar.
typeUno de los valores del catálogo de eventos.
created_atISO 8601 en UTC.
dataEl recurso afectado, en el mismo formato que devuelve la API pública.

Headers de cada entrega ​

HeaderDescripción
Paytami-Signaturet=<unix>,v1=<hmac_hex> — ver verificación de firma.
Paytami-Event-IdEl mismo id del cuerpo (evt_...), para deduplicar sin tener que parsear el JSON primero.
User-AgentPaytami-Webhooks/1.0.

Catálogo de eventos ​

EventoCuándo se dispara
payment.succeededUn cobro se completó exitosamente.
payment.failedUn intento de cobro falló.
payment.canceledUn cobro se canceló antes de completarse.
refund.succeededUn reembolso se procesó exitosamente.
chargeback.openedSe abrió un contracargo sobre un pago.
chargeback.wonUn contracargo se resolvió a favor del comercio.
payout.completedUn retiro llegó a la cuenta bancaria del comercio.
payout.failedUn retiro falló.

Puedes suscribirte a cualquier subconjunto de estos eventos al registrar tu endpoint, o dejarlo vacío para recibir todos.

payment.succeeded / payment.failed / payment.canceled ​

data es el mismo objeto Payment que devuelve GET /v1/payments/{id}:

json
{
  "id": "pay_8f2c1a9d4e6b7c0a1d2e3f40",
  "status": "captured",
  "currency": "GTQ",
  "amount": "15000",
  "paytami_fee": "435",
  "net_amount": "14565",
  "checkout_url": "https://app.paytami.com/api/v1/checkout/pay_8f2c1a9d4e6b7c0a1d2e3f40",
  "created_at": "2026-08-28T15:04:00.000Z"
}

refund.succeeded ​

json
{
  "id": "refund_4a1f0c2b3d4e5f60718293a4",
  "payment_id": "pay_8f2c1a9d4e6b7c0a1d2e3f40",
  "amount": "5000",
  "currency": "GTQ",
  "reason": "requested_by_customer",
  "status": "succeeded"
}

reason es uno de: requested_by_customer, duplicate_charge, product_not_received, product_unacceptable, merchant_error, fraudulent, other.

chargeback.opened / chargeback.won ​

json
{
  "id": "chb_9a1b2c3d4e5f60718293a4b5",
  "payment_id": "pay_8f2c1a9d4e6b7c0a1d2e3f40",
  "amount": "15000",
  "currency": "GTQ",
  "status": "opened"
}

status es opened o won según el evento. No se incluye el motivo del contracargo: es información sensible del proceso de disputa que se maneja directamente entre Paytami y el emisor de la tarjeta.

payout.completed / payout.failed ​

json
{
  "id": "payout_c7e5b1a2d3e4f5061728394a",
  "currency": "GTQ",
  "amount": "142000",
  "status": "completed",
  "bank_account_id": "ba_2d6a9f1e2c3b4a5061728394",
  "bank_account_masked": "••••4321",
  "requested_at": "2026-08-27T10:00:00.000Z",
  "processing_at": "2026-08-27T10:05:00.000Z",
  "sent_to_bank_at": "2026-08-27T14:00:00.000Z",
  "completed_at": "2026-08-28T09:00:00.000Z",
  "failed_at": null,
  "canceled_at": null,
  "failure_reason": null
}

En payout.failed, failure_reason trae el motivo y completed_at queda null.

Ver también ​

Documentación oficial de Paytami