Crear una sesión del portal del cliente
POST/v1/portal-sessions
Crea el enlace de un solo uso al portal ({CHECKOUT_BASE_URL}/portal/s/{token})
para que tu cliente gestione su suscripción. Créalo justo cuando el
usuario hace clic en "Gestionar mi suscripción" y redirígelo con un
303: vence en 5 minutos y sirve una sola vez. No lo envíes por correo.
- Cliente:
customer_idoexternal_id(uno de los dos:422 customer_required), del entorno de la API key (si no,404 customer_not_found). return_url: a dónde vuelve el botón "Volver"; por defecto, eldefault_return_urldel portal (sin ninguno →422 return_url_required). URL absolutahttp(s)sin fragmento,httpsen producción (422 invalid_return_url).- Portal deshabilitado en el entorno →
409 portal_disabled.
Con Idempotency-Key, el reintento devuelve la misma sesión con
Idempotent-Replayed: true y url: null (el token nunca se guarda):
crea otra sesión.
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, CreatePortalSessionRequest)
customer_id o external_id (uno de los dos).
| Campo | Tipo | Descripción |
|---|---|---|
customer_id | string | Ejemplo: |
external_id | string | Ejemplo: |
return_url | string (uri) | Ejemplo: |
Respuestas
201Sesión creada con su url (Cache-Control: no-store), o la repetición sin url.
Esquema PortalSession
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string | Ejemplo: |
environmentobligatorio | string | Valores: |
customer_idobligatorio | string | |
urlobligatorio | string | null | {CHECKOUT_BASE_URL}/portal/s/{token}: solo en la respuesta de creación; null en la repetición con Idempotency-Key.Ejemplo: |
return_urlobligatorio | string (uri) | |
expires_atobligatorio | string (date-time) | RFC 3339 en UTC. |
created_atobligatorio | string (date-time) | RFC 3339 en UTC. |
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/portal-sessions \
-H "Authorization: Bearer pgm_test_..." \
-H "Idempotency-Key: 3f0c1d7e-8b1a-4f3e-9a51-6d2b7c9e0a14" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cus_01JB86R800ABCDEFGHJKMNPQRS",
"external_id": "user_42",
"return_url": "https://app.acme.co/cuenta"
}'{
"id": "ps_01JB86R800ABCDEFGHJKMNPQRS",
"environment": "SANDBOX",
"customer_id": "string",
"url": "https://checkout.paygumi.com/portal/s/3q2-7wEXAMPLEtokenEXAMPLEtokenEXAMPLEtoke",
"return_url": "https://tuapp.co",
"expires_at": "2026-11-01T05:00:00Z",
"created_at": "2026-11-01T05:00:00Z"
}