Saltar al contenido

Referencia de la API

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ámetros de Listar suscripciones
ParámetroEnTipoDescripción
statusqueryarray<SubscriptionStatus>

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusquerystring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

customer_idquerystring
plan_idquerystring
limitqueryinteger
Tamaño de página (1–100, por defecto 50).

Por defecto: 50

starting_afterquerystring
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_beforequerystring
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

Campos de la respuesta 200
CampoTipoDescripción
dataobligatorioarray<Subscription>
data[].idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

data[].environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

data[].statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

data[].access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

data[].access_untilobligatoriostring (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_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

data[].customer_idobligatoriostring
data[].customerobligatorioobject
data[].customer.idobligatoriostring
data[].customer.external_idobligatoriostring
data[].customer.emailobligatoriostring (email)
data[].plan_idobligatoriostring
data[].planobligatorioobject
data[].plan.idobligatoriostring
data[].plan.nameobligatoriostring
data[].plan.amount_in_centsobligatoriointeger (int64)
data[].plan.currencyobligatoriostring

Valores: COP

data[].payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
data[].payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

data[].payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

data[].payment_method.brandobligatoriostring | null

Ejemplo: VISA

data[].payment_method.last4obligatoriostring | null

Ejemplo: 4242

data[].payment_method.exp_monthobligatoriointeger | null
data[].payment_method.exp_yearobligatoriointeger | null
data[].payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

data[].current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
data[].current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
data[].billing_anchor_dayobligatoriointeger
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_atobligatoriostring (date-time) | null
data[].cancel_at_period_endobligatorioboolean
data[].canceled_atobligatoriostring (date-time) | null
data[].cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

data[].paused_atobligatoriostring (date-time) | null
data[].resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
data[].pending_plan_changeobligatorioobject | null
data[].pending_plan_change.plan_idobligatoriostring
data[].pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
data[].pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
data[].latest_chargeobligatorioobject | null
data[].latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

data[].latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

data[].latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

data[].latest_charge.currencyobligatoriostring

Valores: COP

data[].latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
data[].latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
data[].latest_charge.attempt_countobligatoriointeger
data[].latest_charge.next_retry_atobligatoriostring (date-time) | null
data[].latest_charge.last_failure_reasonobligatoriostring | null
data[].latest_charge.paid_atobligatoriostring (date-time) | null
data[].latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
data[].chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
data[].charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

data[].charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

data[].charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

data[].charges[].currencyobligatoriostring

Valores: COP

data[].charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
data[].charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
data[].charges[].attempt_countobligatoriointeger
data[].charges[].next_retry_atobligatoriostring (date-time) | null
data[].charges[].last_failure_reasonobligatoriostring | null
data[].charges[].paid_atobligatoriostring (date-time) | null
data[].charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
data[].metadataobligatorioobject<string, string>
data[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
data[].updated_atobligatoriostring (date-time)
RFC 3339 en UTC.
has_moreobligatorioboolean

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

404

El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).

422

La entrada no cumple las reglas (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl https://api.paygumi.com/v1/subscriptions \
  -H "Authorization: Bearer pgm_test_..."
Respuesta 200
{
  "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ámetros de Crear una suscripción
ParámetroEnTipoDescripción
Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Cuerpo (application/json, CreateSubscriptionRequest)

Campos del cuerpo de Crear una suscripción
CampoTipoDescripción
customer_idobligatoriostring
plan_idobligatoriostring
payment_method_idstring
Medio explícito (ACTIVE); por defecto, el predeterminado del cliente.
trial_daysinteger
Sobrescribe los días de prueba del plan.
start_atstring (date-time)
Por defecto ahora; futura, máx. un año.
metadataobject<string, string>

Respuestas

201La suscripción creada.

Esquema Subscription

Campos de la respuesta 201
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

400

JSON mal formado o tipos inválidos (p. ej. decimales donde va un entero) (code invalid_body).

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
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"
}'
Respuesta 201
{
  "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ámetros de Consultar una suscripción
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

include_chargesqueryboolean

Por defecto: false

Respuestas

200La suscripción.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

404

El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).

422

La entrada no cumple las reglas (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl https://api.paygumi.com/v1/subscriptions/{id} \
  -H "Authorization: Bearer pgm_test_..."
Respuesta 200
{
  "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ámetros de Cancelar una suscripción
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Cuerpo (application/json, CancelSubscriptionRequest, opcional)

Campos del cuerpo de Cancelar una suscripción
CampoTipoDescripción
at_period_endboolean
reasonstring

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

Respuestas

200La suscripción actualizada.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/cancel \
  -H "Authorization: Bearer pgm_test_..." \
  -H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"
Respuesta 200
{
  "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ámetros de Pausar una suscripción
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Cuerpo (application/json, PauseSubscriptionRequest, opcional)

Campos del cuerpo de Pausar una suscripción
CampoTipoDescripción
resume_atstring (date-time)

Respuestas

200La suscripción actualizada.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/pause \
  -H "Authorization: Bearer pgm_test_..." \
  -H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"
Respuesta 200
{
  "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ámetros de Reanudar una suscripción
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Respuestas

200La suscripción actualizada.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl -X POST https://api.paygumi.com/v1/subscriptions/{id}/resume \
  -H "Authorization: Bearer pgm_test_..." \
  -H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"
Respuesta 200
{
  "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ámetros de Cambiar el plan
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Cuerpo (application/json, ChangeSubscriptionPlanRequest, opcional)

Campos del cuerpo de Cambiar el plan
CampoTipoDescripción
new_plan_idobligatoriostring
timingstring

Valores: NEXT_PERIOD, IMMEDIATE

Respuestas

200La suscripción actualizada.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
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"
}'
Respuesta 200
{
  "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ámetros de Acceso de una suscripción
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Respuestas

200El acceso.

Esquema AccessStatusResult

Campos de la respuesta 200
CampoTipoDescripción
access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
subscription_idobligatoriostring | null
null sin suscripciones.
subscription_statusobligatoriostring | null

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

last_payment_statusobligatoriostring

Valores: PAID, PENDING, FAILED, NONE

reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

404

El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).

422

La entrada no cumple las reglas (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl https://api.paygumi.com/v1/subscriptions/{id}/access \
  -H "Authorization: Bearer pgm_test_..."
Respuesta 200
{
  "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ámetros de Acceso de un usuario por su id en tu sistema
ParámetroEnTipoDescripción
externalIdobligatoriorutastring
Id del usuario en tu sistema (external_id del cliente), codificado para URL.

Ejemplo: user_42

plan_idquerystring

Respuestas

200El acceso.

Esquema AccessStatusResult

Campos de la respuesta 200
CampoTipoDescripción
access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
subscription_idobligatoriostring | null
null sin suscripciones.
subscription_statusobligatoriostring | null

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

last_payment_statusobligatoriostring

Valores: PAID, PENDING, FAILED, NONE

reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

404

El recurso no existe o es de otro tenant (nunca 403, para no filtrar existencia).

422

La entrada no cumple las reglas (type invalid_request; param indica el campo).

429

Demasiadas peticiones (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
curl https://api.paygumi.com/v1/customers/by-external-id/{externalId}/access \
  -H "Authorization: Bearer pgm_test_..."
Respuesta 200
{
  "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ámetros de Deshacer una cancelación programada
ParámetroEnTipoDescripción
idobligatoriorutastring
Id de la suscripción (sub_…). Uno mal formado responde 404.

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

Idempotency-Keycabecerastring

Clave elegida por el cliente (1–255 caracteres ASCII visibles; se recomienda un UUID v4) para reintentar un POST sin repetir su efecto. Es única por tenant y entorno de la API key. La respuesta (2xx o 4xx) se guarda 24 h; las 5xx no se guardan.

  • Misma clave y misma petición (método, ruta con query y body idénticos byte a byte): se devuelve la respuesta guardada, con Idempotent-Replayed: true, sin volver a ejecutar.
  • Misma clave con otra petición → 422 idempotency_key_reused.
  • Misma clave mientras la primera sigue en curso → 409 idempotency_key_in_use (reintenta en unos segundos).
  • Clave mal formada → 422 invalid_idempotency_key; body de más de 1 MiB → 413.

Ejemplo: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14

Respuestas

200La suscripción actualizada.

Esquema Subscription

Campos de la respuesta 200
CampoTipoDescripción
idobligatoriostring

Ejemplo: sub_01JB86R800ABCDEFGHJKMNPQRS

environmentobligatoriostring

Valores: SANDBOX, PRODUCTION

statusobligatoriostring

Valores: TRIALING, ACTIVE, PAST_DUE, UNPAID, PAUSED, CANCELED

access_statusobligatoriostring
Qué hacer con el usuario: GRANTED (dar acceso), RESTRICTED (pago vencido tras la gracia), REVOKED (sin acceso).

Valores: GRANTED, RESTRICTED, REVOKED

access_untilobligatoriostring (date-time) | null
Hasta cuándo dura el acceso concedido (fin del periodo, de la prueba o de la gracia); null sin acceso.
access_reasonobligatoriostring

Valores: ACTIVE, TRIAL, GRACE_PERIOD, PAYMENT_FAILED, UNPAID, PAUSED, CANCELED, NO_SUBSCRIPTION

customer_idobligatoriostring
customerobligatorioobject
customer.idobligatoriostring
customer.external_idobligatoriostring
customer.emailobligatoriostring (email)
plan_idobligatoriostring
planobligatorioobject
plan.idobligatoriostring
plan.nameobligatoriostring
plan.amount_in_centsobligatoriointeger (int64)
plan.currencyobligatoriostring

Valores: COP

payment_method_idobligatoriostring | null
null: se cobra con el medio predeterminado del cliente.
payment_methodobligatorioobject | 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.idobligatoriostring

Ejemplo: pm_01JB86R800ABCDEFGHJKMNPQRS

payment_method.typeobligatoriostring

Valores: CARD, NEQUI, BANCOLOMBIA_TRANSFER

payment_method.brandobligatoriostring | null

Ejemplo: VISA

payment_method.last4obligatoriostring | null

Ejemplo: 4242

payment_method.exp_monthobligatoriointeger | null
payment_method.exp_yearobligatoriointeger | null
payment_method.statusobligatoriostring

Valores: ACTIVE, INVALID

current_period_startobligatoriostring (date-time)
RFC 3339 en UTC.
current_period_endobligatoriostring (date-time)
RFC 3339 en UTC.
billing_anchor_dayobligatoriointeger
Día del mes (zona horaria del tenant) en que cierra cada periodo; en meses más cortos, el último día.
trial_ends_atobligatoriostring (date-time) | null
cancel_at_period_endobligatorioboolean
canceled_atobligatoriostring (date-time) | null
cancel_reasonobligatoriostring | null

Valores: CUSTOMER_REQUEST, NON_PAYMENT, OTHER

paused_atobligatoriostring (date-time) | null
resume_atobligatoriostring (date-time) | null
Reanudación automática programada.
pending_plan_changeobligatorioobject | null
pending_plan_change.plan_idobligatoriostring
pending_plan_change.plan_nameobligatoriostring
Nombre del plan al que se cambia.
pending_plan_change.effective_atobligatoriostring (date-time)
RFC 3339 en UTC.
latest_chargeobligatorioobject | null
latest_charge.idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

latest_charge.statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

latest_charge.amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

latest_charge.currencyobligatoriostring

Valores: COP

latest_charge.period_startobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.period_endobligatoriostring (date-time)
RFC 3339 en UTC.
latest_charge.attempt_countobligatoriointeger
latest_charge.next_retry_atobligatoriostring (date-time) | null
latest_charge.last_failure_reasonobligatoriostring | null
latest_charge.paid_atobligatoriostring (date-time) | null
latest_charge.created_atobligatoriostring (date-time)
RFC 3339 en UTC.
chargesarray<ChargeSummary>
Solo con include_charges=true (últimos 12, más recientes primero).
charges[].idobligatoriostring

Ejemplo: chg_01JB86R800ABCDEFGHJKMNPQRS

charges[].statusobligatoriostring

Valores: SCHEDULED, PROCESSING, PENDING, PAID, FAILED, UNCOLLECTIBLE, VOIDED

charges[].amount_in_centsobligatoriointeger (int64)

Ejemplo: 4990000

charges[].currencyobligatoriostring

Valores: COP

charges[].period_startobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].period_endobligatoriostring (date-time)
RFC 3339 en UTC.
charges[].attempt_countobligatoriointeger
charges[].next_retry_atobligatoriostring (date-time) | null
charges[].last_failure_reasonobligatoriostring | null
charges[].paid_atobligatoriostring (date-time) | null
charges[].created_atobligatoriostring (date-time)
RFC 3339 en UTC.
metadataobligatorioobject<string, string>
created_atobligatoriostring (date-time)
RFC 3339 en UTC.
updated_atobligatoriostring (date-time)
RFC 3339 en UTC.

Errores

401

Credencial ausente, inválida, expirada o revocada (code unauthorized).

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 (param name), customer_external_id_taken (con resource_id y param external_id; en POST /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 (con resource_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 (type rate_limited, code rate_limited): más de 100 peticiones por segundo con la misma API key. Reintenta cuando indique Retry-After.

Otros

Error con el formato estándar.

Todos con el formato de error estándar.

Petición (cURL)
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"
Respuesta 200
{
  "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"
}