Sesiones de checkout
Enlaces a la página de pago donde tu cliente registra su tarjeta y, si quieres, se suscribe.
Crear una sesión de checkout
POST/v1/checkout-sessions
Crea el enlace a la página de pago de Paygumi donde tu cliente registra
su tarjeta (modo SETUP) o, además, se suscribe a un plan (modo
SUBSCRIPTION).
Redirige a tu usuario a url (o envíasela): es la única vez que la
recibes, porque Paygumi guarda solo el hash del token.
- Cliente:
customer_id(existente en el entorno de la API key; si no,404 customer_not_found) ocustomercon los datos para crearlo al completar (no ambos:422 customer_required). Uncustomer.external_idya registrado →409 customer_external_id_takencon su id enresource_id. success_urlycancel_url: URLs absolutashttp(s), sin fragmento;httpsen producción (invalid_success_url,invalid_cancel_url). Al completar, Paygumi redirige asuccess_url?session_id=cs_…; confirma el resultado conGET /v1/checkout-sessions/{id}(o el webhook), no solo por la URL.expires_at: por defecto 24 h; entre 30 min y 7 días (invalid_expires_at).- El entorno debe tener credenciales de Wompi verificadas: si no,
409 tenant_not_ready. - Modo
SUBSCRIPTION:plan_idobligatorio (422 plan_required), del entorno (404 plan_not_found) yACTIVE(409 plan_archived); si el cliente existente ya tiene una suscripción viva al plan,409 subscription_existscon su id enresource_id.metadatase copia a la suscripción. Al completar, Paygumi registra la tarjeta, crea la suscripción (TRIALINGsi el plan tiene prueba; si no,ACTIVEcon el primer cobroSCHEDULED) y la deja ensubscription_id. - Modo
SETUPconplan_id→422 plan_not_allowed.
Con Idempotency-Key, el reintento devuelve la misma sesión con
Idempotent-Replayed: true y url: null (el token nunca se guarda);
si perdiste la URL, cancela la sesión y crea otra.
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, CreateCheckoutSessionRequest)
| Campo | Tipo | Descripción |
|---|---|---|
modeobligatorio | string | SETUP (solo registrar el medio de pago) o SUBSCRIPTION (registrarlo y suscribir a plan_id), sin distinguir mayúsculas.Ejemplo: |
customer_id | string | Cliente existente ( cus_…). |
customer | object | Datos para crear el cliente al completar; los errores llevan param customer.<campo>. |
customer.external_idobligatorio | string | Ejemplo: |
customer.emailobligatorio | string (email) | |
customer.full_name | string | |
customer.phone | string | E.164 ( +573001234567) o número colombiano de 10 dígitos. |
customer.legal_id_type | string | Valores: |
customer.legal_id_number | string | |
customer.metadata | object<string, string> | |
plan_id | string | Obligatorio en modo SUBSCRIPTION (plan ACTIVE del entorno); no se admite en SETUP. |
success_urlobligatorio | string (uri) | Ejemplo: |
cancel_urlobligatorio | string (uri) | Ejemplo: |
expires_at | string (date-time) | Por defecto ahora + 24 h; entre 30 min y 7 días. |
metadata | object<string, string> | Hasta 20 llaves; en modo SUBSCRIPTION se copia a la suscripción. |
Respuestas
201Sesión creada con su url (Cache-Control: no-store), o la repetición sin url.
Esquema CheckoutSession
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
modeobligatorio | string | SETUP registra o reemplaza la tarjeta. SUBSCRIPTION además suscribe al cliente a plan_id. Valores: |
statusobligatorio | string | Estado efectivo; una sesión OPEN vencida se lee EXPIRED. Valores: |
urlobligatorio | string | null | {CHECKOUT_BASE_URL}/c/{token}. Solo en la respuesta de creación; null en el resto (y en la repetición por Idempotency-Key).Ejemplo: |
customer_idobligatorio | string | null | null si el cliente se crea al completar y aún no se completó. |
plan_idobligatorio | string | null | |
payment_method_idobligatorio | string | null | Medio de pago registrado al completar. |
subscription_idobligatorio | string | null | Suscripción creada al completar en modo SUBSCRIPTION. |
success_urlobligatorio | string | |
cancel_urlobligatorio | string | |
metadataobligatorio | object<string, string> | |
failed_attemptsobligatorio | integer | Tarjetas rechazadas en la sesión (con 5, se cancela). |
expires_atobligatorio | string (date-time) | RFC 3339 en UTC. |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
completed_atobligatorio | string (date-time) | null |
Idempotent-Replayed:truesi la respuesta es la guardada de una petición anterior con la mismaIdempotency-Key.
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/checkout-sessions \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14" \
-H "Content-Type: application/json" \
-d '{
"mode": "setup",
"success_url": "https://tuapp.co/billing/ok",
"cancel_url": "https://tuapp.co/billing"
}'{
"id": "cs_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"mode": "SETUP",
"status": "OPEN",
"url": "https://checkout.paygumi.com/c/3q2-7wEmWbIu4pS1Jx7bS1Kc0yQe9Gm9cXyZ0aBcDeF",
"customer_id": "string",
"plan_id": "string",
"payment_method_id": "string",
"subscription_id": "string",
"success_url": "string",
"cancel_url": "string",
"metadata": {},
"failed_attempts": 0,
"expires_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z",
"completed_at": "2026-11-01T05:00:00Z"
}Consultar una sesión de checkout
GET/v1/checkout-sessions/{id}
Estado efectivo de la sesión (una OPEN vencida responde EXPIRED),
sin url. Completada: payment_method_id y customer_id (también
cuando el cliente se creó al completar). De otro entorno → 404.
Autenticación: Authorization: Bearer <API key>.
Parámetros
| Parámetro | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | Id de la sesión ( cs_…). Uno mal formado responde 404.Ejemplo: |
Respuestas
200La sesión.
Esquema CheckoutSession
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
modeobligatorio | string | SETUP registra o reemplaza la tarjeta. SUBSCRIPTION además suscribe al cliente a plan_id. Valores: |
statusobligatorio | string | Estado efectivo; una sesión OPEN vencida se lee EXPIRED. Valores: |
urlobligatorio | string | null | {CHECKOUT_BASE_URL}/c/{token}. Solo en la respuesta de creación; null en el resto (y en la repetición por Idempotency-Key).Ejemplo: |
customer_idobligatorio | string | null | null si el cliente se crea al completar y aún no se completó. |
plan_idobligatorio | string | null | |
payment_method_idobligatorio | string | null | Medio de pago registrado al completar. |
subscription_idobligatorio | string | null | Suscripción creada al completar en modo SUBSCRIPTION. |
success_urlobligatorio | string | |
cancel_urlobligatorio | string | |
metadataobligatorio | object<string, string> | |
failed_attemptsobligatorio | integer | Tarjetas rechazadas en la sesión (con 5, se cancela). |
expires_atobligatorio | string (date-time) | RFC 3339 en UTC. |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
completed_atobligatorio | string (date-time) | null |
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).
- 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/checkout-sessions/{id} \
-H "Authorization: Bearer pgm_test_..."{
"id": "cs_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"mode": "SETUP",
"status": "OPEN",
"url": "https://checkout.paygumi.com/c/3q2-7wEmWbIu4pS1Jx7bS1Kc0yQe9Gm9cXyZ0aBcDeF",
"customer_id": "string",
"plan_id": "string",
"payment_method_id": "string",
"subscription_id": "string",
"success_url": "string",
"cancel_url": "string",
"metadata": {},
"failed_attempts": 0,
"expires_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z",
"completed_at": "2026-11-01T05:00:00Z"
}Cancelar una sesión de checkout
POST/v1/checkout-sessions/{id}/cancel
Invalida el enlace. Idempotente si ya estaba CANCELED. Completada →
409 checkout_session_completed; vencida → 409 checkout_session_expired. 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 sesión ( cs_…). 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 sesión cancelada.
Esquema CheckoutSession
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
modeobligatorio | string | SETUP registra o reemplaza la tarjeta. SUBSCRIPTION además suscribe al cliente a plan_id. Valores: |
statusobligatorio | string | Estado efectivo; una sesión OPEN vencida se lee EXPIRED. Valores: |
urlobligatorio | string | null | {CHECKOUT_BASE_URL}/c/{token}. Solo en la respuesta de creación; null en el resto (y en la repetición por Idempotency-Key).Ejemplo: |
customer_idobligatorio | string | null | null si el cliente se crea al completar y aún no se completó. |
plan_idobligatorio | string | null | |
payment_method_idobligatorio | string | null | Medio de pago registrado al completar. |
subscription_idobligatorio | string | null | Suscripción creada al completar en modo SUBSCRIPTION. |
success_urlobligatorio | string | |
cancel_urlobligatorio | string | |
metadataobligatorio | object<string, string> | |
failed_attemptsobligatorio | integer | Tarjetas rechazadas en la sesión (con 5, se cancela). |
expires_atobligatorio | string (date-time) | RFC 3339 en UTC. |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
completed_atobligatorio | string (date-time) | null |
Idempotent-Replayed:truesi la respuesta es la guardada de una petición anterior con la mismaIdempotency-Key.
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/checkout-sessions/{id}/cancel \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14"{
"id": "cs_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"mode": "SETUP",
"status": "OPEN",
"url": "https://checkout.paygumi.com/c/3q2-7wEmWbIu4pS1Jx7bS1Kc0yQe9Gm9cXyZ0aBcDeF",
"customer_id": "string",
"plan_id": "string",
"payment_method_id": "string",
"subscription_id": "string",
"success_url": "string",
"cancel_url": "string",
"metadata": {},
"failed_attempts": 0,
"expires_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z",
"completed_at": "2026-11-01T05:00:00Z"
}