Suscripciones
Suscripciones de tus clientes a tus planes, su ciclo de vida y el acceso que debes dar.
Listar suscripciones
GET/v1/subscriptions
Más recientes primero, paginado por cursor. Filtros: status
(repetible o separado por comas), access_status (calculado ahora con
la gracia del tenant), customer_id y plan_id.
Autenticación: Authorization: Bearer <API key>.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
status | query | array<SubscriptionStatus> | Valores: |
access_status | query | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
customer_id | query | string | |
plan_id | query | string | |
limit | query | integer | Tamaño de página (1–100, por defecto 50). Por defecto: |
starting_after | query | string | Id ( sub_…) de la última suscripción de la página anterior; otro formato → 422 invalid_cursor; excluyente con ending_before (422 invalid_cursor). |
ending_before | query | string | Id ( sub_…) de la primera suscripción de la página actual, para pedir la anterior (más recientes); excluyente con starting_after (422 invalid_cursor). Mismo orden (más recientes primero); has_more indica si hay más antes de esta página. |
Respuestas
200Una página de suscripciones.
Esquema SubscriptionList
| Campo | Tipo | Descripción |
|---|---|---|
dataobligatorio | array<Subscription> | |
data[].idobligatorio | string | Ejemplo: |
data[].environmentobligatorio | string | Valores: |
data[].statusobligatorio | string | Valores: |
data[].access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
data[].access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
data[].access_reasonobligatorio | string | Valores: |
data[].customer_idobligatorio | string | |
data[].customerobligatorio | object | |
data[].customer.idobligatorio | string | |
data[].customer.external_idobligatorio | string | |
data[].customer.emailobligatorio | string (email) | |
data[].plan_idobligatorio | string | |
data[].planobligatorio | object | |
data[].plan.idobligatorio | string | |
data[].plan.nameobligatorio | string | |
data[].plan.amount_in_centsobligatorio | integer (int64) | |
data[].plan.currencyobligatorio | string | Valores: |
data[].payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
data[].payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
data[].payment_method.idobligatorio | string | Ejemplo: |
data[].payment_method.typeobligatorio | string | Valores: |
data[].payment_method.brandobligatorio | string | null | Ejemplo: |
data[].payment_method.last4obligatorio | string | null | Ejemplo: |
data[].payment_method.exp_monthobligatorio | integer | null | |
data[].payment_method.exp_yearobligatorio | integer | null | |
data[].payment_method.statusobligatorio | string | Valores: |
data[].current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
data[].trial_ends_atobligatorio | string (date-time) | null | |
data[].cancel_at_period_endobligatorio | boolean | |
data[].canceled_atobligatorio | string (date-time) | null | |
data[].cancel_reasonobligatorio | string | null | Valores: |
data[].paused_atobligatorio | string (date-time) | null | |
data[].resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
data[].pending_plan_changeobligatorio | object | null | |
data[].pending_plan_change.plan_idobligatorio | string | |
data[].pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
data[].pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].latest_chargeobligatorio | object | null | |
data[].latest_charge.idobligatorio | string | Ejemplo: |
data[].latest_charge.statusobligatorio | string | Valores: |
data[].latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
data[].latest_charge.currencyobligatorio | string | Valores: |
data[].latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].latest_charge.attempt_countobligatorio | integer | |
data[].latest_charge.next_retry_atobligatorio | string (date-time) | null | |
data[].latest_charge.last_failure_reasonobligatorio | string | null | |
data[].latest_charge.paid_atobligatorio | string (date-time) | null | |
data[].latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
data[].charges[].idobligatorio | string | Ejemplo: |
data[].charges[].statusobligatorio | string | Valores: |
data[].charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
data[].charges[].currencyobligatorio | string | Valores: |
data[].charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].charges[].attempt_countobligatorio | integer | |
data[].charges[].next_retry_atobligatorio | string (date-time) | null | |
data[].charges[].last_failure_reasonobligatorio | string | null | |
data[].charges[].paid_atobligatorio | string (date-time) | null | |
data[].charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].metadataobligatorio | object<string, string> | |
data[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
data[].updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
has_moreobligatorio | boolean |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl https://api.paygumi.com/v1/subscriptions \
-H "Authorization: Bearer pgm_test_..."{
"data": [
{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}
],
"has_more": false
}Crear una suscripción
POST/v1/subscriptions
Suscribe a un plan a un cliente que ya tiene tarjeta (si no la
tiene, usa POST /v1/checkout-sessions en modo SUBSCRIPTION). Con
prueba (los trial_days del plan o los de la petición) queda
TRIALING sin cobro; sin prueba, ACTIVE con el primer cobro
SCHEDULED que se procesa de inmediato (o en start_at). Si ese
cobro es rechazado, la suscripción pasa a PAST_DUE.
Errores: cliente, plan o medio inexistentes → 404
(customer_not_found, plan_not_found, payment_method_not_found);
409 plan_archived, payment_method_required (sin medio activo),
payment_method_not_active, tenant_not_ready; 409 subscription_exists si ya hay una viva del cliente al plan (con
resource_id); 422 invalid_trial_days, invalid_start_at,
invalid_metadata.
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Cuerpo (application/json, CreateSubscriptionRequest)
| Campo | Tipo | Descripción |
|---|---|---|
customer_idobligatorio | string | |
plan_idobligatorio | string | |
payment_method_id | string | Medio explícito ( ACTIVE); por defecto, el predeterminado del cliente. |
trial_days | integer | Sobrescribe los días de prueba del plan. |
start_at | string (date-time) | Por defecto ahora; futura, máx. un año. |
metadata | object<string, string> |
Respuestas
201La suscripción creada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 400
JSON mal formado o tipos inválidos (p. ej. decimales donde va un entero) (
codeinvalid_body).- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "string",
"plan_id": "string"
}'{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Consultar una suscripción
GET/v1/subscriptions/{id}
Estado, acceso, periodo actual y último cobro. Con
include_charges=true, los últimos 12 cobros en charges. De otro
entorno → 404.
Autenticación: Authorization: Bearer <API key>.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
include_charges | query | boolean | Por defecto: |
Respuestas
200La suscripción.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl https://api.paygumi.com/v1/subscriptions/{id} \
-H "Authorization: Bearer pgm_test_..."{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Cancelar una suscripción
POST/v1/subscriptions/{id}/cancel
at_period_end: true programa la cancelación (sigue con acceso hasta
current_period_end; 409 subscription_cancel_at_period_end_not_allowed
si está PAUSED o UNPAID); si no, la cancela ya (CANCELED, acceso
REVOKED) y anula el cobro abierto SCHEDULED/FAILED (uno en curso
en Wompi espera su resultado). Cancelar una cancelada es idempotente.
Concurrencia: 409 subscription_version_conflict (reintenta).
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Cuerpo (application/json, CancelSubscriptionRequest, opcional)
| Campo | Tipo | Descripción |
|---|---|---|
at_period_end | boolean | |
reason | string | Valores: |
Respuestas
200La suscripción actualizada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/cancel \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Pausar una suscripción
POST/v1/subscriptions/{id}/pause
Solo ACTIVE o PAST_DUE (si no, 409 subscription_not_pausable).
Sin cobros ni acceso (REVOKED); anula el cobro abierto. resume_at
opcional (futura, máx. un año; 422 invalid_resume_at) programa la
reanudación automática.
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Cuerpo (application/json, PauseSubscriptionRequest, opcional)
| Campo | Tipo | Descripción |
|---|---|---|
resume_at | string (date-time) |
Respuestas
200La suscripción actualizada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/pause \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Reanudar una suscripción
POST/v1/subscriptions/{id}/resume
Solo PAUSED (409 subscription_not_paused). Empieza un periodo
desde hoy (el ancla pasa a ser el día de hoy) con cobro inmediato;
requiere un medio activo (409 payment_method_required).
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Respuestas
200La suscripción actualizada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/resume \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Cambiar el plan
POST/v1/subscriptions/{id}/change-plan
Solo ACTIVE o TRIALING (409 subscription_not_changeable).
timing: NEXT_PERIOD (por defecto) lo programa para el cierre del
periodo (pending_plan_change); IMMEDIATE empieza un periodo desde
hoy con un cobro por el precio completo del plan nuevo (sin
prorrateo). Errores: 422 same_plan, plan_interval_mismatch,
invalid_timing; 409 plan_archived, subscription_exists (el
cliente ya tiene una viva al plan nuevo); 404 plan_not_found.
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Cuerpo (application/json, ChangeSubscriptionPlanRequest, opcional)
| Campo | Tipo | Descripción |
|---|---|---|
new_plan_idobligatorio | string | |
timing | string | Valores: |
Respuestas
200La suscripción actualizada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/change-plan \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14" \
-H "Content-Type: application/json" \
-d '{
"new_plan_id": "string"
}'{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}Acceso de una suscripción
GET/v1/subscriptions/{id}/access
El mismo access_status que llevan los webhooks, calculado ahora
(sin llamar a Wompi). Inexistente → 404 subscription_not_found.
Autenticación: Authorization: Bearer <API key>.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Respuestas
200El acceso.
Esquema AccessStatusResult
| Campo | Tipo | Descripción |
|---|---|---|
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | |
subscription_idobligatorio | string | null | null sin suscripciones. |
subscription_statusobligatorio | string | null | Valores: |
last_payment_statusobligatorio | string | Valores: |
reasonobligatorio | string | Valores: |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl https://api.paygumi.com/v1/subscriptions/{id}/access \
-H "Authorization: Bearer pgm_test_..."{
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"subscription_id": "string",
"subscription_status": "TRIALING",
"last_payment_status": "PAID",
"reason": "ACTIVE"
}Acceso de un usuario por su id en tu sistema
GET/v1/customers/by-external-id/{externalId}/access
Evalúa las suscripciones del cliente (filtradas por plan_id si
viene) y devuelve la de mejor acceso (GRANTED > RESTRICTED >
REVOKED). Sin cliente o sin suscripciones → 200 con
access_status: REVOKED y reason: NO_SUBSCRIPTION.
Autenticación: Authorization: Bearer <API key>.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
externalIdobligatorio | ruta | string | Id del usuario en tu sistema ( external_id del cliente), codificado para URL.Ejemplo: |
plan_id | query | string |
Respuestas
200El acceso.
Esquema AccessStatusResult
| Campo | Tipo | Descripción |
|---|---|---|
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | |
subscription_idobligatorio | string | null | null sin suscripciones. |
subscription_statusobligatorio | string | null | Valores: |
last_payment_statusobligatorio | string | Valores: |
reasonobligatorio | string | Valores: |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 422
La entrada no cumple las reglas (
typeinvalid_request;paramindica el campo).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl https://api.paygumi.com/v1/customers/by-external-id/{externalId}/access \
-H "Authorization: Bearer pgm_test_..."{
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"subscription_id": "string",
"subscription_status": "TRIALING",
"last_payment_status": "PAID",
"reason": "ACTIVE"
}Deshacer una cancelación programada
POST/v1/subscriptions/{id}/undo-cancel
Quita cancel_at_period_end antes de que termine el periodo y emite
subscription.updated. Sin cancelación programada, ya cancelada o con
el periodo terminado → 409 subscription_cancel_not_scheduled.
Concurrencia: 409 subscription_version_conflict (reintenta). Acepta
Idempotency-Key.
Autenticación: Authorization: Bearer <API key>. Acepta Idempotency-Key.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la suscripción ( sub_…). Uno mal formado responde 404.Ejemplo: |
Idempotency-Key | cabecera | string | Clave elegida por el cliente (1–255 caracteres ASCII visibles; se
recomienda un UUID v4) para reintentar un
Ejemplo: |
Respuestas
200La suscripción actualizada.
Esquema Subscription
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
statusobligatorio | string | Valores: |
access_statusobligatorio | string | Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso). Valores: |
access_untilobligatorio | string (date-time) | null | Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso. |
access_reasonobligatorio | string | Valores: |
customer_idobligatorio | string | |
customerobligatorio | object | |
customer.idobligatorio | string | |
customer.external_idobligatorio | string | |
customer.emailobligatorio | string (email) | |
plan_idobligatorio | string | |
planobligatorio | object | |
plan.idobligatorio | string | |
plan.nameobligatorio | string | |
plan.amount_in_centsobligatorio | integer (int64) | |
plan.currencyobligatorio | string | Valores: |
payment_method_idobligatorio | string | null | null: se cobra con el medio predeterminado del cliente. |
payment_methodobligatorio | object | null | Resumen (sin datos sensibles) del medio con que se cobrará: el de payment_method_id o, si es null, el predeterminado ACTIVE del cliente. null si no hay ninguno (o el explícito ya no está disponible). |
payment_method.idobligatorio | string | Ejemplo: |
payment_method.typeobligatorio | string | Valores: |
payment_method.brandobligatorio | string | null | Ejemplo: |
payment_method.last4obligatorio | string | null | Ejemplo: |
payment_method.exp_monthobligatorio | integer | null | |
payment_method.exp_yearobligatorio | integer | null | |
payment_method.statusobligatorio | string | Valores: |
current_period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
current_period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
billing_anchor_dayobligatorio | integer | Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día. |
trial_ends_atobligatorio | string (date-time) | null | |
cancel_at_period_endobligatorio | boolean | |
canceled_atobligatorio | string (date-time) | null | |
cancel_reasonobligatorio | string | null | Valores: |
paused_atobligatorio | string (date-time) | null | |
resume_atobligatorio | string (date-time) | null | Reanudación automática programada. |
pending_plan_changeobligatorio | object | null | |
pending_plan_change.plan_idobligatorio | string | |
pending_plan_change.plan_nameobligatorio | string | Nombre del plan al que se cambia. |
pending_plan_change.effective_atobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_chargeobligatorio | object | null | |
latest_charge.idobligatorio | string | Ejemplo: |
latest_charge.statusobligatorio | string | Valores: |
latest_charge.amount_in_centsobligatorio | integer (int64) | Ejemplo: |
latest_charge.currencyobligatorio | string | Valores: |
latest_charge.period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
latest_charge.attempt_countobligatorio | integer | |
latest_charge.next_retry_atobligatorio | string (date-time) | null | |
latest_charge.last_failure_reasonobligatorio | string | null | |
latest_charge.paid_atobligatorio | string (date-time) | null | |
latest_charge.created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
charges | array<ChargeSummary> | Solo con include_charges=true (últimos 12, más recientes primero). |
charges[].idobligatorio | string | Ejemplo: |
charges[].statusobligatorio | string | Valores: |
charges[].amount_in_centsobligatorio | integer (int64) | Ejemplo: |
charges[].currencyobligatorio | string | Valores: |
charges[].period_startobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].period_endobligatorio | string (date-time) | RFC 3339 en UTC. |
charges[].attempt_countobligatorio | integer | |
charges[].next_retry_atobligatorio | string (date-time) | null | |
charges[].last_failure_reasonobligatorio | string | null | |
charges[].paid_atobligatorio | string (date-time) | null | |
charges[].created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
metadataobligatorio | object<string, string> | |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
updated_atobligatorio | string (date-time) | RFC 3339 en UTC. |
Errores
- 401
Credencial ausente, inválida, expirada o revocada (
codeunauthorized).- 404
El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).
- 409
Conflicto.
code:already_member,api_key_limit_exceeded,last_owner,invitation_expired,invitation_not_pending,webhook_endpoint_limit_exceeded,plan_name_taken(paramname),customer_external_id_taken(conresource_idyparamexternal_id; enPOST /v1/checkout-sessions,customer.external_id),last_payment_method_in_use,payment_method_not_active,idempotency_key_in_use,tenant_not_ready(el entorno no tiene credenciales de Wompi verificadas),checkout_session_completed,checkout_session_expired,checkout_session_canceled,plan_archived,subscription_exists(conresource_id),subscription_version_conflict(reintenta),payment_method_required,subscription_not_pausable,subscription_not_paused,subscription_not_changeable,subscription_cancel_at_period_end_not_allowed,subscription_cancel_not_scheduled,portal_disabled(el tenant deshabilitó el portal en el entorno).- 429
Demasiadas peticiones (
typerate_limited,coderate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indiqueRetry-After.- Otros
Error con el formato estándar.
Todos con el formato de error estándar.
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/undo-cancel \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"{
"id": "sub_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"status": "TRIALING",
"access_status": "GRANTED",
"access_until": "2026-11-01T05:00:00Z",
"access_reason": "ACTIVE",
"customer_id": "string",
"customer": {
"id": "string",
"external_id": "string",
"email": "cliente@ejemplo.co"
},
"plan_id": "string",
"plan": {
"id": "string",
"name": "string",
"amount_in_cents": 0,
"currency": "COP"
},
"payment_method_id": "string",
"payment_method": {
"id": "pm_01JB86R800ABCDEFGHJKMNPQRS",
"type": "CARD",
"brand": "VISA",
"last4": "4242",
"exp_month": 1,
"exp_year": 0,
"status": "ACTIVE"
},
"current_period_start": "2026-11-01T05:00:00Z",
"current_period_end": "2026-11-01T05:00:00Z",
"billing_anchor_day": 1,
"trial_ends_at": "2026-11-01T05:00:00Z",
"cancel_at_period_end": false,
"canceled_at": "2026-11-01T05:00:00Z",
"cancel_reason": "CUSTOMER_REQUEST",
"paused_at": "2026-11-01T05:00:00Z",
"resume_at": "2026-11-01T05:00:00Z",
"pending_plan_change": {
"plan_id": "string",
"plan_name": "string",
"effective_at": "2026-11-01T05:00:00Z"
},
"latest_charge": {
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
},
"charges": [
{
"id": "chg_01JB86R800ABCDEFGHJKMNPQRS",
"status": "SCHEDULED",
"amount_in_cents": 4990000,
"currency": "COP",
"period_start": "2026-11-01T05:00:00Z",
"period_end": "2026-11-01T05:00:00Z",
"attempt_count": 0,
"next_retry_at": "2026-11-01T05:00:00Z",
"last_failure_reason": "string",
"paid_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}
],
"metadata": {},
"created_at": "2026-11-01T05:00:00Z",
"updated_at": "2026-11-01T05:00:00Z"
}