Sesiones y configuración del Customer Portal
Cómo un cliente inicia sesión en el portal — el flujo de magic-link, la sesión actual, los datos de bootstrap y la configuración del portal.
El Customer Portal permite que un cliente gestione sus propias suscripciones y métodos de pago sin necesidad de contactar al soporte. Una sesión comienza con un magic link: el cliente solicita un enlace por correo electrónico y, luego, el paso de verificación intercambia el token enviado por correo por una cookie de sesión. Estos endpoints cubren ese handshake, la sesión actual, el payload de bootstrap que la interfaz carga primero, y la configuración del portal.
Todo lo demás en el portal — suscripciones, métodos de pago, cuenta — funciona sobre la cookie establecida aquí. El portal es white-label, por lo que su branding y las acciones permitidas provienen de la configuración del portal del Merchant.
Estos endpoints impulsan el Customer Portal — la superficie de self-service que usan tus clientes finales, bajo tu marca. Se autentican mediante una cookie de sesión del portal, establecida a través del flujo de magic-link (solicitar un enlace y luego verificar el token), y no mediante una clave de API. Consulta Sesiones y configuración.
La sesión del portal
Devuelto por los endpoints de listado y consulta de esta página.
| Field | Type | Description |
|---|---|---|
id | string | Id de la cuenta del portal. |
organization_id | string | — |
merchant_id | string | Merchant al que está vinculada la sesión. |
email | string | — |
expires_in | number | Tiempo de vida de la sesión en segundos. |
Endpoints
GET/api/v1/merchants/:merchant_id/portal-config
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Branding y comportamiento del portal self-service que usan tus clientes para gestionar sus suscripciones. Devuelve valores predeterminados cuando aún no se ha configurado nada.
Parámetros de ruta
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Sí | — |
Ejemplo de solicitud
curl https://api.tokeflow.com/api/v1/merchants/mrc_8a3f12d9/portal-config \
-H "Cookie: tf_portal_session=…"Ejemplo de respuesta — 200
{
"merchant_id": "mrc_123",
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}PUT/api/v1/merchants/:merchant_id/portal-config
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Hace upsert de la configuración — la primera llamada la crea, las llamadas posteriores reemplazan los campos que envías.
Parámetros de ruta
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Sí | — |
Campos de la solicitud
| Field | Type | Required | Description |
|---|---|---|---|
allow_cancellation | boolean | No | Permite que los clientes cancelen a través del portal. |
allow_plan_change | boolean | No | Permite que los clientes cambien de plan a través del portal. |
allow_payment_method_change | boolean | No | Permite que los clientes agreguen una tarjeta durante el dunning. |
cancellation_survey | boolean | No | Muestra una encuesta de cancelación. |
custom_cancellation_message | string | No | Markdown que se muestra en la pantalla de cancelación. |
Ejemplo de solicitud
curl -X PUT https://api.tokeflow.com/api/v1/merchants/mrc_8a3f12d9/portal-config \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}'Ejemplo de respuesta — 200
{
"merchant_id": "mrc_123",
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": true,
"custom_cancellation_message": "Operation completed successfully"
}POST/api/v1/portal/auth/email-change/confirm
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Confirma un cambio de correo electrónico mediante el token enviado por correo.
Campos de la solicitud
| Field | Type | Required | Description |
|---|---|---|---|
token | string | Sí | Token del correo de confirmación. |
Ejemplo de solicitud
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/email-change/confirm \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"token": "string"
}'POST/api/v1/portal/auth/logout
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Borra la cookie de sesión del portal.
Ejemplo de solicitud
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/logout \
-H "Cookie: tf_portal_session=…"GET/api/v1/portal/auth/me
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Obtiene la cuenta de la sesión actual del portal.
Ejemplo de solicitud
curl https://api.tokeflow.com/api/v1/portal/auth/me \
-H "Cookie: tf_portal_session=…"Ejemplo de respuesta — 200
{
"id": "cpa_123",
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com",
"expires_in": 1800
}POST/api/v1/portal/auth/request-link
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Solicita un correo electrónico de magic-link del portal.
Campos de la solicitud
| Field | Type | Required | Description |
|---|---|---|---|
organization_id | string | Sí | Organization a la que pertenece el portal. |
merchant_id | string | Sí | Merchant al que está vinculada la sesión del portal (a partir de la respuesta de bootstrap). Obligatorio — el portal es de Merchant único, y una sesión sin Merchant no puede estar vinculada a nada. |
email | string | Sí | Correo electrónico del cliente. |
Ejemplo de solicitud
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/request-link \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com"
}'POST/api/v1/portal/auth/verify
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Verifica un token de magic-link; establece la cookie de sesión.
Campos de la solicitud
| Field | Type | Required | Description |
|---|---|---|---|
token | string | Sí | Token en bruto del magic link enviado por correo. |
Ejemplo de solicitud
curl -X POST https://api.tokeflow.com/api/v1/portal/auth/verify \
-H "Cookie: tf_portal_session=…" \
-H "Content-Type: application/json" \
-d '{
"token": "string"
}'Ejemplo de respuesta — 200
{
"id": "cpa_123",
"organization_id": "org_123",
"merchant_id": "mrc_123",
"email": "customer@example.com",
"expires_in": 1800
}GET/api/v1/portal/bootstrap
Auth: Customer Portal session (cookie establecida por el flujo de magic-link).
Resuelve el branding y las flags del Merchant para el portal.
Parámetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | No | — |
organization_id | string | No | — |
merchant | string | No | — |
Ejemplo de solicitud
curl -G https://api.tokeflow.com/api/v1/portal/bootstrap \
-H "Cookie: tf_portal_session=…" \
--data-urlencode "merchant_id=mrc_123" \
--data-urlencode "organization_id=org_123" \
--data-urlencode "merchant=acme-store"Ejemplo de respuesta — 200
{
"organization_id": "org_123",
"merchant_id": "mrc_123",
"merchant_slug": "acme-store",
"merchant_name": "Acme Store",
"branding": {
"site_title": "Acme Store",
"favicon": "string",
"logo_light_mode": "string",
"logo_dark_mode": "string",
"theme_primary_color": "#1A73E8",
"theme_secondary_color": "#0B5394",
"custom_url": "https://acme.example.com",
"show_name_with_logo": false
},
"config": {
"allow_cancellation": true,
"allow_plan_change": true,
"allow_payment_method_change": true,
"cancellation_survey": false,
"custom_cancellation_message": "Operation completed successfully"
}
}Errores
Los errores usan el sobre estándar. Los casos más comunes aquí:
| HTTP | Meaning |
|---|---|
400 | Parámetros inválidos o un estado que no permite esta operación. |
401 | Token de sesión del Dashboard ausente, expirado o inválido. |
403 | Autenticado, pero el usuario que inició sesión no tiene acceso a esta entidad. |
404 | El registro no existe o no es visible para esta entidad. |