Saltar al contenido

Referencia de la API

Eventos de webhook

Lo que Paygumi envía a tus endpoints. Para recibirlos y verificar la firma, sigue la guía de webhooks.

Webhook que Paygumi envía a tus endpoints

POSThttps://tu-endpoint.example/…

Paygumi hace POST a cada endpoint ACTIVE del entorno del evento suscrito a su tipo (o a *). Responde cualquier 2xx en menos de 10 s; otro código, timeout o error de conexión se reintenta a 1 min, 5 min, 30 min, 2 h, 6 h, 12 h y 24 h (8 intentos, ≈ 45 h) y luego la entrega queda EXHAUSTED. No se siguen redirects. Tras 100 fallos seguidos durante 3 días el endpoint se deshabilita y se avisa por correo a los OWNER y ADMIN.

Tipos: los de WebhookEventType (sin *), más ping (prueba manual).

Cabeceras

Cabeceras del webhook
ParámetroEnTipoDescripción
Paygumi-Event-Idobligatoriocabecerastring
Id del evento (evt_…); igual en reintentos y reenvíos. Deduplica por él.
Paygumi-Timestampobligatoriocabecerastring
Segundos Unix del envío. Rechaza diferencias de más de 5 min.

Ejemplo: 1793509212

Paygumi-Signatureobligatoriocabecerastring
v1=<hex(HMAC_SHA256(secret, timestamp + "." + body))>; durante una rotación, v1=<nuevo>,v1=<anterior> (acepta si alguna coincide).

Cuerpo (WebhookEnvelope)

Cuerpo de todo webhook. Firmado con Paygumi-Signature: v1=<hex(HMAC_SHA256(secret, Paygumi-Timestamp + "." + body))> (dos firmas separadas por coma durante una rotación) sobre los bytes exactos del cuerpo. Rechaza timestamps con más de 5 min de diferencia y deduplica por Paygumi-Event-Id (= id): la entrega es al menos una vez y sin orden garantizado (usa created_at).

Campos del cuerpo del webhook
CampoTipoDescripción
idobligatoriostring

Ejemplo: evt_01JB86R800ABCDEFGHJKMNPQRS

typeobligatoriostring

Ejemplo: payment.declined

created_atobligatoriostring (date-time)
RFC 3339 en UTC.
api_versionobligatoriostring

Ejemplo: 2026-10-01

livemodeobligatorioboolean
true en producción.
initiated_byobligatoriostring

Valores: system, tenant_api, dashboard, customer_portal, payment_link

testboolean
Solo en los envíos de prueba (true).
dataobligatorioobject
Estado completo al momento del evento (estados en minúsculas). Trae subscription en los eventos subscription.* y payment.*, charge en payment.*, payment_method en payment_method.* y checkout_session.completed, y checkout_session en checkout_session.*. cancellation solo en subscription.canceled y subscription.updated de una cancelación hecha por el cliente en el portal.
data.subscriptionobject
data.subscription.idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

data.subscription.statusobligatoriostring

Valores: trialing, active, past_due, unpaid, paused, canceled

data.subscription.access_statusobligatoriostring
Con este campo el tenant decide si da acceso.

Valores: granted, restricted, revoked

data.subscription.access_untilobligatoriostring (date-time) | null
data.subscription.cancel_at_period_endboolean
data.subscription.canceled_atstring (date-time) | null
data.subscription.customerobligatorioobject
data.subscription.customer.idobligatoriostring
data.subscription.customer.external_idstring
data.subscription.customer.namestring
data.subscription.planobligatorioobject
data.subscription.plan.idobligatoriostring
data.subscription.plan.external_idstring
data.subscription.plan.namestring
data.subscription.previous_planobject
data.subscription.previous_plan.idobligatoriostring
data.subscription.previous_plan.external_idstring
data.subscription.previous_plan.namestring
data.subscription.current_periodobligatorioobject
data.subscription.current_period.startobligatoriostring (date-time)
RFC 3339 en UTC.
data.subscription.current_period.endobligatoriostring (date-time)
RFC 3339 en UTC.
data.subscription.trial_ends_atstring (date-time) | null
data.subscription.pending_plan_changeobject | null
data.subscription.pending_plan_change.plan_idstring
data.subscription.pending_plan_change.effective_atstring (date-time)
RFC 3339 en UTC.
data.subscription.metadataobject<string, string>
data.chargeobject
data.charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

data.charge.statusobligatoriostring

Valores: scheduled, processing, pending, paid, failed, uncollectible, voided

data.charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

data.charge.currencyobligatoriostring

Valores: COP

data.charge.periodobligatorioobject
data.charge.period.startobligatoriostring (date-time)
RFC 3339 en UTC.
data.charge.period.endobligatoriostring (date-time)
RFC 3339 en UTC.
data.charge.attemptobligatoriointeger
data.charge.failure_reasonstring | null

Ejemplo: INSUFFICIENT_FUNDS

data.charge.next_retry_atstring (date-time) | null
data.charge.paid_atstring (date-time) | null
data.payment_methodobject
Con type NEQUI: brand NEQUI, last4 del celular y sin vencimiento. Con BANCOLOMBIA_TRANSFER: brand BANCOLOMBIA_AHORROS / BANCOLOMBIA_CORRIENTE / BANCOLOMBIA, last4 de la cuenta y sin vencimiento. En payment_method.invalidated, status: invalid.
data.payment_method.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

data.payment_method.statusobligatoriostring

Ejemplo: active

data.payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

Ejemplo: CARD

data.payment_method.brandstring

Ejemplo: VISA

data.payment_method.last4string

Ejemplo: 4242

data.payment_method.exp_monthinteger
data.payment_method.exp_yearinteger
data.payment_method.customerobligatorioobject
data.payment_method.customer.idobligatoriostring
data.payment_method.customer.external_idstring
data.payment_method.customer.namestring
data.checkout_sessionobject
data.checkout_session.idobligatoriostring

Ejemplo: cs_01JB86R800ABCDEFGHJKMNPQRS

data.checkout_session.modeobligatoriostring

Valores: setup, subscription

data.checkout_session.statusobligatoriostring

Ejemplo: completed

data.checkout_session.metadataobject<string, string>
data.cancellationobject
Motivo y comentario del cliente al cancelar desde el portal (initiated_by customer_portal).
data.cancellation.reasonstring | null
data.cancellation.commentstring | null

Tipos de evento

  • payment.approved
  • payment.pending
  • payment.declined
  • payment.uncollectible
  • subscription.created
  • subscription.activated
  • subscription.past_due
  • subscription.unpaid
  • subscription.paused
  • subscription.resumed
  • subscription.canceled
  • subscription.plan_changed
  • subscription.updated
  • subscription.access_changed
  • checkout_session.completed
  • checkout_session.expired
  • payment_method.added
  • payment_method.invalidated
  • ping

Cuándo se envía cada uno: catálogo de eventos.