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
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
Paygumi-Event-Idobligatorio | cabecera | string | Id del evento ( evt_…); igual en reintentos y reenvíos. Deduplica por él. |
Paygumi-Timestampobligatorio | cabecera | string | Segundos Unix del envío. Rechaza diferencias de más de 5 min. Ejemplo: |
Paygumi-Signatureobligatorio | cabecera | string | 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).
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
typeobligatorio | string | Ejemplo: |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
api_versionobligatorio | string | Ejemplo: |
livemodeobligatorio | boolean | true en producción. |
initiated_byobligatorio | string | Valores: |
test | boolean | Solo en los envíos de prueba ( true). |
dataobligatorio | object | 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.subscription | object | |
data.subscription.idobligatorio | string | Ejemplo: |
data.subscription.statusobligatorio | string | Valores: |
data.subscription.access_statusobligatorio | string | Con este campo el tenant decide si da acceso. Valores: |
data.subscription.access_untilobligatorio | string (date-time) | null | |
data.subscription.cancel_at_period_end | boolean | |
data.subscription.canceled_at | string (date-time) | null | |
data.subscription.customerobligatorio | object | |
data.subscription.customer.idobligatorio | string | |
data.subscription.customer.external_id | string | |
data.subscription.customer.name | string | |
data.subscription.planobligatorio | object | |
data.subscription.plan.idobligatorio | string | |
data.subscription.plan.external_id | string | |
data.subscription.plan.name | string | |
data.subscription.previous_plan | object | |
data.subscription.previous_plan.idobligatorio | string | |
data.subscription.previous_plan.external_id | string | |
data.subscription.previous_plan.name | string | |
data.subscription.current_periodobligatorio | object | |
data.subscription.current_period.startobligatorio | string (date-time) | RFC 3339 en UTC. |
data.subscription.current_period.endobligatorio | string (date-time) | RFC 3339 en UTC. |
data.subscription.trial_ends_at | string (date-time) | null | |
data.subscription.pending_plan_change | object | null | |
data.subscription.pending_plan_change.plan_id | string | |
data.subscription.pending_plan_change.effective_at | string (date-time) | RFC 3339 en UTC. |
data.subscription.metadata | object<string, string> | |
data.charge | object | |
data.charge.idobligatorio | string | Ejemplo: |
data.charge.statusobligatorio | string | Valores: |
data.charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
data.charge.currencyobligatorio | string | Valores: |
data.charge.periodobligatorio | object | |
data.charge.period.startobligatorio | string (date-time) | RFC 3339 en UTC. |
data.charge.period.endobligatorio | string (date-time) | RFC 3339 en UTC. |
data.charge.attemptobligatorio | integer | |
data.charge.failure_reason | string | null | Ejemplo: |
data.charge.next_retry_at | string (date-time) | null | |
data.charge.paid_at | string (date-time) | null | |
data.payment_method | object | 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.idobligatorio | string | Ejemplo: |
data.payment_method.statusobligatorio | string | Ejemplo: |
data.payment_method.typeobligatorio | string | Valores: Ejemplo: |
data.payment_method.brand | string | Ejemplo: |
data.payment_method.last4 | string | Ejemplo: |
data.payment_method.exp_month | integer | |
data.payment_method.exp_year | integer | |
data.payment_method.customerobligatorio | object | |
data.payment_method.customer.idobligatorio | string | |
data.payment_method.customer.external_id | string | |
data.payment_method.customer.name | string | |
data.checkout_session | object | |
data.checkout_session.idobligatorio | string | Ejemplo: |
data.checkout_session.modeobligatorio | string | Valores: |
data.checkout_session.statusobligatorio | string | Ejemplo: |
data.checkout_session.metadata | object<string, string> | |
data.cancellation | object | Motivo y comentario del cliente al cancelar desde el portal ( initiated_by customer_portal). |
data.cancellation.reason | string | null | |
data.cancellation.comment | string | null |
Tipos de evento
payment.approvedpayment.pendingpayment.declinedpayment.uncollectiblesubscription.createdsubscription.activatedsubscription.past_duesubscription.unpaidsubscription.pausedsubscription.resumedsubscription.canceledsubscription.plan_changedsubscription.updatedsubscription.access_changedcheckout_session.completedcheckout_session.expiredpayment_method.addedpayment_method.invalidatedping
Cuándo se envía cada uno: catálogo de eventos.