Sesiones de Checkout
Crea y administra sesiones de checkout de Tokeflow: captura una instantánea de offers y precios, identifica al cliente, registra el comportamiento del comprador y transfiere el control a una transacción para el cobro.
Una sesión de checkout es el estado del lado del servidor de una compra individual en curso. Captura una instantánea de las offers y los precios que un comprador está a punto de pagar, registra quién es, anota lo que hace y se convierte en la única fuente de verdad para el monto y la moneda que finalmente se cobrarán.
Las sesiones desacoplan la construcción del carrito del cobro del mismo. Ensamblas los ítems de línea e identificas al cliente a lo largo de la vida de la sesión, y luego creas una única transacción que referencia la sesión por su ID. El monto y la moneda se derivan de la sesión, de modo que el cobro siempre coincide con lo que vio el comprador.
Dado que una sesión captura una instantánea de los precios de la offer en el momento de su creación, las ediciones posteriores del catálogo nunca cambian el precio de un checkout que ya está en curso: el comprador paga exactamente lo que se le cotizó.
Tokeflow orquesta pagos; no procesa ni liquida fondos. Una sesión de checkout modela la intención de compra y los ítems; la autorización, la captura y la liquidación ocurren en el proveedor de pagos conectado una vez que creas la transacción que cobra la sesión.
Cómo fluye una sesión
El objeto de sesión de checkout
| Field | Type | Descripción |
|---|---|---|
id | string | Identificador de la sesión, con prefijo cks_. |
merchant_id | string | Merchant propietario, con prefijo mrc_. |
offer_id | string | Offer principal que inició el checkout, con prefijo ofr_. |
customer_id | string | null | Se establece una vez que el cliente es identificado, con prefijo cust_. |
customer_email | string | null | Email del cliente, poblado al identificar. |
customer_name | string | null | Nombre del cliente, cuando se conoce. |
selected_currency | string | null | Moneda ISO 4217 de la sesión. Por defecto es la moneda predeterminada de la offer. |
status | enum | Estado del ciclo de vida de la sesión. Consulta Estados. |
external_session_id | string | null | Tu propia referencia de sesión o cuenta. Única por Merchant cuando se establece. |
expires_at | string | null | Hora ISO 8601 después de la cual la sesión se considera expirada. |
completed_at | string | null | Se establece cuando la sesión pasa a completed. |
created_at | string | Marca de tiempo de creación ISO 8601. |
updated_at | string | Marca de tiempo de última actualización ISO 8601. |
items | array | Ítems de línea. Incluidos por defecto al obtener por id; consulta Ítems de línea. |
events | array | Eventos de seguimiento. Incluidos cuando se solicitan; consulta Eventos. |
Estados
| Status | Significado |
|---|---|
initiated | Sesión creada; aún no se ha identificado a ningún cliente. |
customer_identified | Se ha adjuntado un cliente a la sesión. |
payment_pending | Se ha iniciado un cobro contra la sesión. |
completed | La sesión fue pagada; completed_at está establecido. |
expired | La sesión superó expires_at sin completarse. |
abandoned | La sesión fue marcada explícitamente como abandonada. |
Endpoints
Todos los endpoints están bajo https://api.tokeflow.com/api/v1.
Los endpoints de checkout tienen alcance de Merchant. Con una clave de Organization, identifica el Merchant objetivo con el parámetro de consulta merchant_id (en list/get) o el campo del cuerpo (en create); con una clave de Merchant el Merchant se infiere. Las lecturas requieren el scope checkout:read; las escrituras requieren checkout:write.
POST/api/v1/checkout-sessions
Crear una sesión de checkout.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
Proporciona un offer_id principal. Identifica al comprador con un customer_id existente o con un objeto customer en línea (proporciona exactamente uno): el customer en línea se resuelve de forma idempotente por email, de modo que se reutiliza un customer existente con el mismo email. Omite items para que Tokeflow capture una instantánea de un único ítem predeterminado a partir de offer_id, o pasa un array items explícito.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
offer_id | string | Sí | Offer principal que inició el checkout. |
customer_id | string | Condicional | Id de customer existente. Proporciona este o customer. |
customer | object | Condicional | Customer en línea para crear/reutilizar. Proporciona este o customer_id. |
selected_currency | string | No | Código ISO 4217. Omítelo para usar la moneda predeterminada de la offer. |
external_session_id | string | No | Tu referencia de sesión/cuenta. Única por Merchant. |
expires_at | string | No | Marca de tiempo ISO 8601; debe estar en el futuro. |
items | array | No | Ítems de línea (ver más abajo). Omítelo para un único ítem predeterminado. |
Cada entrada en items:
| Field | Type | Requerido | Descripción |
|---|---|---|---|
offer_id | string | Sí | Offer para incluir como ítem de línea. |
quantity | integer | No | Unidades de esta offer. Mín 1, por defecto 1. |
installments | integer | No | Cuotas seleccionadas por el comprador. Mín 1, por defecto 1 (cobro único). |
El objeto customer en línea acepta email, name, phone (E.164), document_type (cpf, cnpj, passport, tax_id), document_number, billing_address y metadata opcional. Consulta Customers para conocer la estructura completa.
Envía un encabezado Idempotency-Key al crear para que una solicitud reintentada devuelva la sesión original en lugar de crear un duplicado. Consulta Idempotencia y límites de tasa.
curl -X POST https://api.tokeflow.com/api/v1/checkout-sessions \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1d2c9a-2b8e-4c3a-9f0d-7a1e2b3c4d5e" \
-d '{
"offer_id": "ofr_a1b2c3d4e5",
"customer": {
"email": "joao@example.com",
"name": "Joao da Silva",
"phone": "+5511999990000",
"document_type": "cpf",
"document_number": "123.456.789-00",
"billing_address": {
"line_1": "Av Paulista, 1000",
"line_2": "Apto 42",
"zip_code": "01310-100",
"city": "Sao Paulo",
"state": "SP",
"country": "BR"
}
},
"selected_currency": "BRL",
"external_session_id": "sess_external_42",
"expires_at": "2026-05-20T18:00:00Z",
"items": [
{ "offer_id": "ofr_a1b2c3d4e5", "quantity": 1, "installments": 1 }
]
}'Respuesta 201 Created (una solicitud idempotente reproducida devuelve 200 OK):
{
"success": true,
"data": {
"id": "cks_a1b2c3d4e5",
"merchant_id": "mrc_a1b2c3d4e5",
"offer_id": "ofr_a1b2c3d4e5",
"customer_id": "cust_a1b2c3d4e5",
"customer_email": "joao@example.com",
"customer_name": "Joao da Silva",
"selected_currency": "BRL",
"status": "customer_identified",
"external_session_id": "sess_external_42",
"expires_at": "2026-05-20T18:00:00.000Z",
"completed_at": null,
"created_at": "2026-05-19T12:00:00.000Z",
"updated_at": "2026-05-19T12:00:00.000Z",
"items": [
{
"id": "cki_a1b2c3d4e5",
"checkout_session_id": "cks_a1b2c3d4e5",
"offer_id": "ofr_a1b2c3d4e5",
"currency": "BRL",
"amount": 15000,
"first_charge_amount": null,
"quantity": 1,
"installments": 1,
"created_at": "2026-05-19T12:00:00.000Z"
}
]
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-05-19T12:00:00.000Z"
}GET/api/v1/checkout-sessions
Lista las sesiones de checkout, las más recientes primero.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Query param | Type | Descripción |
|---|---|---|
page | integer | Número de página, indexado desde 1. Por defecto 1. |
limit | integer | Ítems por página. Por defecto 20, máx 100. |
status | enum | Filtra por status de la sesión. |
offer_id | string | Sesiones vinculadas a una offer principal específica. |
customer_id | string | Sesiones de un customer específico. |
customer_email | string | Sesiones que coinciden con un email de customer. |
external_session_id | string | Búsqueda por tu referencia de sesión externa. |
merchant_id | string | Requerido con una clave de Organization para apuntar a un Merchant. |
curl -G https://api.tokeflow.com/api/v1/checkout-sessions \
-H "Authorization: Bearer sk_live_mer_…" \
--data-urlencode "status=initiated" \
--data-urlencode "offer_id=ofr_a1b2c3d4e5" \
--data-urlencode "page=1" \
--data-urlencode "limit=20"Respuesta 200 OK:
{
"success": true,
"data": [
{
"id": "cks_a1b2c3d4e5",
"merchant_id": "mrc_a1b2c3d4e5",
"offer_id": "ofr_a1b2c3d4e5",
"customer_id": null,
"customer_email": null,
"customer_name": null,
"selected_currency": "BRL",
"status": "initiated",
"external_session_id": "sess_external_42",
"expires_at": "2026-05-20T18:00:00.000Z",
"completed_at": null,
"created_at": "2026-05-19T12:00:00.000Z",
"updated_at": "2026-05-19T12:00:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"total_pages": 1,
"has_next": false,
"has_prev": false
}
},
"request_id": "req_3a9d7c2e",
"timestamp": "2026-05-19T12:05:00.000Z"
}GET/api/v1/checkout-sessions/:id
Recupera una única sesión de checkout.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Query param | Type | Descripción |
|---|---|---|
include_items | boolean | Incluye el array items. Por defecto true; pasa false para omitirlo. |
include_events | boolean | Incluye el array events. Por defecto false; pasa true para incluirlo. |
curl -G https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5 \
-H "Authorization: Bearer sk_live_mer_…" \
--data-urlencode "include_items=true" \
--data-urlencode "include_events=true"Respuesta 200 OK:
{
"success": true,
"data": {
"id": "cks_a1b2c3d4e5",
"merchant_id": "mrc_a1b2c3d4e5",
"offer_id": "ofr_a1b2c3d4e5",
"customer_id": "cust_a1b2c3d4e5",
"customer_email": "jane@acme.com",
"customer_name": "Jane Doe",
"selected_currency": "BRL",
"status": "customer_identified",
"external_session_id": "sess_external_42",
"expires_at": "2026-05-20T18:00:00.000Z",
"completed_at": null,
"created_at": "2026-05-19T12:00:00.000Z",
"updated_at": "2026-05-19T12:03:00.000Z",
"items": [
{
"id": "cki_a1b2c3d4e5",
"checkout_session_id": "cks_a1b2c3d4e5",
"offer_id": "ofr_a1b2c3d4e5",
"currency": "BRL",
"amount": 15000,
"first_charge_amount": null,
"quantity": 1,
"installments": 1,
"created_at": "2026-05-19T12:00:00.000Z"
}
],
"events": [
{
"id": "cke_a1b2c3d4e5",
"checkout_session_id": "cks_a1b2c3d4e5",
"event_type": "customer_identified",
"source_url": "https://acme.com/checkout",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring_sale",
"ip_address": "203.0.113.42",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15",
"metadata": null,
"created_at": "2026-05-19T12:03:00.000Z"
}
]
},
"request_id": "req_5c1e8b4f",
"timestamp": "2026-05-19T12:10:00.000Z"
}PATCH/api/v1/checkout-sessions/:id
Actualiza los campos mutables de la sesión. El offer_id principal y los items son inmutables aquí: administra los ítems de línea con los endpoints de ítems.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
customer_id | string | No | Adjunta un customer existente. |
customer | object | No | Customer en línea para crear/reutilizar. |
selected_currency | string | No | Cambia la moneda de la sesión (ISO 4217). |
external_session_id | string | No | Actualiza tu referencia externa. |
expires_at | string | No | Extiende la expiración (debe estar en el futuro). |
curl -X PATCH https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5 \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "selected_currency": "USD", "expires_at": "2026-05-21T18:00:00Z" }'Respuesta 200 OK — devuelve el objeto de sesión actualizado (misma estructura que obtener por id).
POST/api/v1/checkout-sessions/:id/identify
Adjunta un customer a la sesión. Proporciona customer_id o customer_email (requerido cuando no se proporciona un id). Cuando solo se proporciona un email, Tokeflow busca o crea el customer correspondiente para el Merchant. En caso de éxito, la sesión pasa a customer_identified.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
customer_id | string | Condicional | Id de customer existente. Proporciona este o customer_email. |
customer_email | string | Condicional | Email del customer; resuelve o crea el customer. |
customer_name | string | No | Nombre para mostrar opcional. |
curl -X POST https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/identify \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "customer_email": "jane@acme.com", "customer_name": "Jane Doe" }'Respuesta 200 OK — devuelve la sesión con customer_id, customer_email y status: customer_identified.
POST/api/v1/checkout-sessions/:id/abandon
Marca una sesión como abandonada, por ejemplo cuando el comprador abandona la página. La sesión pasa a abandoned. No recibe cuerpo.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
curl -X POST https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/abandon \
-H "Authorization: Bearer sk_live_mer_…"Respuesta 200 OK — devuelve la sesión con status: abandoned.
Ítems de línea
Cada ítem de línea captura una instantánea del precio de una offer en el momento en que se agrega, en unidades menores enteras. Editar tu catálogo posteriormente nunca cambia los totales de una sesión existente.
| Field | Type | Descripción |
|---|---|---|
id | string | Identificador del ítem, con prefijo cki_. |
checkout_session_id | string | Sesión principal, con prefijo cks_. |
offer_id | string | Offer que este ítem de línea referencia. |
currency | string | Moneda ISO 4217 de la instantánea. |
amount | integer | Instantánea del precio recurrente/estándar, en unidades menores. |
first_charge_amount | integer | null | Cuánto cobra el primer pago, en unidades menores, cuando eso difiere de amount. null significa que el primer pago factura el precio del ciclo. Lo establece un cargo de configuración, y también un periodo de prueba gratuito — que resuelve a 0, porque una prueba no cobra nada al inicio. |
quantity | integer | Unidades de esta offer. |
installments | integer | Cuotas seleccionadas por el comprador (1 = cobro único). |
created_at | string | Marca de tiempo de creación ISO 8601. |
POST/api/v1/checkout-sessions/:id/items
Agrega un ítem de línea.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
offer_id | string | Sí | Offer para agregar. |
quantity | integer | No | Mín 1, por defecto 1. |
installments | integer | No | Mín 1, por defecto 1. |
curl -X POST https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/items \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "offer_id": "ofr_f6g7h8i9j0", "quantity": 2, "installments": 1 }'Respuesta 201 Created:
{
"success": true,
"data": {
"id": "cki_f6g7h8i9j0",
"checkout_session_id": "cks_a1b2c3d4e5",
"offer_id": "ofr_f6g7h8i9j0",
"currency": "BRL",
"amount": 4990,
"first_charge_amount": null,
"quantity": 2,
"installments": 1,
"created_at": "2026-05-19T12:08:00.000Z"
},
"request_id": "req_9b2f4d6a",
"timestamp": "2026-05-19T12:08:00.000Z"
}PATCH/api/v1/checkout-sessions/:id/items/:itemId
Actualiza el quantity o installments de un ítem de línea. El offer_id es inmutable; elimina y vuelve a agregar para intercambiar offers.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
quantity | integer | No | Mín 1. |
installments | integer | No | Mín 1. |
curl -X PATCH https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/items/cki_f6g7h8i9j0 \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "quantity": 3 }'Respuesta 200 OK — devuelve el objeto de ítem actualizado.
DELETE/api/v1/checkout-sessions/:id/items/:itemId
Elimina un ítem de línea.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
curl -X DELETE https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/items/cki_f6g7h8i9j0 \
-H "Authorization: Bearer sk_live_mer_…"Respuesta 204 No Content — cuerpo vacío.
Eventos
Los eventos son un registro de comportamiento de solo adición para una sesión, útil para el análisis de conversión, el seguimiento del embudo y la depuración de abandonos. Registrar un evento nunca cambia por sí solo el status de la sesión; las transiciones de status se controlan mediante los endpoints del ciclo de vida y mediante el cobro.
| Field | Type | Descripción |
|---|---|---|
id | string | Identificador del evento, con prefijo cke_. |
checkout_session_id | string | Sesión principal, con prefijo cks_. |
event_type | enum | Tipo de evento (ver más abajo). |
source_url | string | null | URL en la que estaba el comprador cuando se disparó el evento. |
utm_source | string | null | Fuente de atribución. |
utm_medium | string | null | Medio de atribución. |
utm_campaign | string | null | Campaña de atribución. |
ip_address | string | null | IP del comprador en el momento del evento. |
user_agent | string | null | User agent del comprador en el momento del evento. |
metadata | object | null | Payload de formato libre para contexto específico del evento. |
created_at | string | Marca de tiempo de creación ISO 8601. |
Tipos de evento
event_type | Cuándo registrarlo |
|---|---|
initiated | La página de checkout se cargó por primera vez. |
customer_identified | El comprador proporcionó datos de identificación. |
currency_changed | El comprador cambió la moneda de visualización/cobro. |
payment_started | El comprador envió los datos de pago. |
payment_failed | Un intento de cobro fue rechazado o dio error. |
payment_succeeded | Un intento de cobro tuvo éxito. |
completed | El checkout finalizó con éxito. |
expired | La sesión caducó tras su expiración. |
abandoned | El comprador se fue sin completar. |
POST/api/v1/checkout-sessions/:id/events
Registra un evento.
Auth: clave de Organization (con merchant_id) o clave de Merchant.
| Field | Type | Requerido | Descripción |
|---|---|---|---|
event_type | enum | Sí | Uno de los tipos de evento anteriores. |
source_url | string | No | URL de la página cuando se disparó el evento. |
utm_source | string | No | Fuente de atribución. |
utm_medium | string | No | Medio de atribución. |
utm_campaign | string | No | Campaña de atribución. |
ip_address | string | No | Dirección IP válida. |
user_agent | string | No | User agent del comprador. |
metadata | object | No | Contexto de formato libre (por ejemplo, un motivo de rechazo). |
curl -X POST https://api.tokeflow.com/api/v1/checkout-sessions/cks_a1b2c3d4e5/events \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{
"event_type": "payment_failed",
"source_url": "https://acme.com/checkout",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring_sale",
"ip_address": "203.0.113.42",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15",
"metadata": { "decline_code": "insufficient_funds" }
}'Respuesta 201 Created:
{
"success": true,
"data": {
"id": "cke_a1b2c3d4e5",
"checkout_session_id": "cks_a1b2c3d4e5",
"event_type": "payment_failed",
"source_url": "https://acme.com/checkout",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring_sale",
"ip_address": "203.0.113.42",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15",
"metadata": { "decline_code": "insufficient_funds" },
"created_at": "2026-05-19T12:12:00.000Z"
},
"request_id": "req_2e7a9c5d",
"timestamp": "2026-05-19T12:12:00.000Z"
}Cobrar una sesión de checkout
Una sesión de checkout nunca se cobra a sí misma. Cuando el comprador paga, crea una transacción que referencia la sesión por su checkout_session_id. Tokeflow deriva el amount y el currency de la sesión, y construye la orden a partir de los ítems de línea de la sesión, de modo que el cobro siempre coincide con la instantánea que vio el comprador.
Cuando se proporciona checkout_session_id, cualquier amount y currency enviados en la solicitud de transacción se ignoran.
curl -X POST https://api.tokeflow.com/api/v1/transactions \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0a9b8c7d-6e5f-4a3b-2c1d-0e9f8a7b6c5d" \
-d '{
"checkout_session_id": "cks_a1b2c3d4e5",
"payment_method": "credit_card",
"charge_type": "payment",
"country": "BR"
}'En caso de éxito, la sesión pasa a completed y se establece completed_at. Cuando el cobro se resuelve solo más tarde — un pago PIX confirmado por el proveedor, un cobro con tarjeta al que el proveedor no respondió de inmediato, un código QR que expiró —, la sesión se liquida en ese momento: se completa cuando el pago tiene éxito, y un pago fallido o expirado la libera para que el comprador pueda intentarlo de nuevo.
Un cliente que regresa también puede pagar la sesión con una tarjeta que guardó antes: envía payment_instrument_id y credential_on_file: true junto con el checkout_session_id. Esto requiere el opt-in saved_card_checkout_enabled del merchant; consulta Checkout con tarjeta guardada.
Primero recopila los datos de la tarjeta de forma segura en el cliente: los campos seguros de Tokeflow se ejecutan dentro de iframes aislados y de origen cruzado; los datos de la tarjeta se cifran en el navegador y nunca tocan tus servidores. Consulta Transactions para conocer el flujo de cobro completo.
Envía un Idempotency-Key en el cobro para que una solicitud reintentada devuelva la transacción original en lugar de cobrar dos veces.
Errores
Los endpoints de checkout usan el envelope de error estándar. Casos comunes:
| HTTP | type | Cuándo |
|---|---|---|
400 | validation_error | Campos faltantes/inválidos, o no se proporcionó ni customer_id ni customer/customer_email. |
401 | authentication_error | Clave de API faltante o inválida. |
403 | authorization_error | La clave carece de checkout:read / checkout:write. |
404 | not_found_error | Sesión, ítem, offer o customer no encontrado para este Merchant. |
409 | conflict_error | external_session_id duplicado para el Merchant. |
Relacionado
- Transactions — cobra una sesión y ejecuta el pago.
- Customers — los registros de customer a los que se adjuntan las sesiones.
- Offers — las offers con precio que los ítems de línea capturan como instantánea.
- Idempotencia y límites de tasa — reintentos seguros al crear y cobrar.
- Resumen de la referencia de API — envelopes, IDs, dinero y paginación.