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

FieldTypeDescripción
idstringIdentificador de la sesión, con prefijo cks_.
merchant_idstringMerchant propietario, con prefijo mrc_.
offer_idstringOffer principal que inició el checkout, con prefijo ofr_.
customer_idstring | nullSe establece una vez que el cliente es identificado, con prefijo cust_.
customer_emailstring | nullEmail del cliente, poblado al identificar.
customer_namestring | nullNombre del cliente, cuando se conoce.
selected_currencystring | nullMoneda ISO 4217 de la sesión. Por defecto es la moneda predeterminada de la offer.
statusenumEstado del ciclo de vida de la sesión. Consulta Estados.
external_session_idstring | nullTu propia referencia de sesión o cuenta. Única por Merchant cuando se establece.
expires_atstring | nullHora ISO 8601 después de la cual la sesión se considera expirada.
completed_atstring | nullSe establece cuando la sesión pasa a completed.
created_atstringMarca de tiempo de creación ISO 8601.
updated_atstringMarca de tiempo de última actualización ISO 8601.
itemsarrayÍtems de línea. Incluidos por defecto al obtener por id; consulta Ítems de línea.
eventsarrayEventos de seguimiento. Incluidos cuando se solicitan; consulta Eventos.

Estados

StatusSignificado
initiatedSesión creada; aún no se ha identificado a ningún cliente.
customer_identifiedSe ha adjuntado un cliente a la sesión.
payment_pendingSe ha iniciado un cobro contra la sesión.
completedLa sesión fue pagada; completed_at está establecido.
expiredLa sesión superó expires_at sin completarse.
abandonedLa 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.

FieldTypeRequeridoDescripción
offer_idstringSíOffer principal que inició el checkout.
customer_idstringCondicionalId de customer existente. Proporciona este o customer.
customerobjectCondicionalCustomer en línea para crear/reutilizar. Proporciona este o customer_id.
selected_currencystringNoCódigo ISO 4217. Omítelo para usar la moneda predeterminada de la offer.
external_session_idstringNoTu referencia de sesión/cuenta. Única por Merchant.
expires_atstringNoMarca de tiempo ISO 8601; debe estar en el futuro.
itemsarrayNoÍtems de línea (ver más abajo). Omítelo para un único ítem predeterminado.

Cada entrada en items:

FieldTypeRequeridoDescripción
offer_idstringSíOffer para incluir como ítem de línea.
quantityintegerNoUnidades de esta offer. Mín 1, por defecto 1.
installmentsintegerNoCuotas 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 paramTypeDescripción
pageintegerNúmero de página, indexado desde 1. Por defecto 1.
limitintegerÍtems por página. Por defecto 20, máx 100.
statusenumFiltra por status de la sesión.
offer_idstringSesiones vinculadas a una offer principal específica.
customer_idstringSesiones de un customer específico.
customer_emailstringSesiones que coinciden con un email de customer.
external_session_idstringBúsqueda por tu referencia de sesión externa.
merchant_idstringRequerido 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 paramTypeDescripción
include_itemsbooleanIncluye el array items. Por defecto true; pasa false para omitirlo.
include_eventsbooleanIncluye 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.

FieldTypeRequeridoDescripción
customer_idstringNoAdjunta un customer existente.
customerobjectNoCustomer en línea para crear/reutilizar.
selected_currencystringNoCambia la moneda de la sesión (ISO 4217).
external_session_idstringNoActualiza tu referencia externa.
expires_atstringNoExtiende 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.

FieldTypeRequeridoDescripción
customer_idstringCondicionalId de customer existente. Proporciona este o customer_email.
customer_emailstringCondicionalEmail del customer; resuelve o crea el customer.
customer_namestringNoNombre 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.

FieldTypeDescripción
idstringIdentificador del ítem, con prefijo cki_.
checkout_session_idstringSesión principal, con prefijo cks_.
offer_idstringOffer que este ítem de línea referencia.
currencystringMoneda ISO 4217 de la instantánea.
amountintegerInstantánea del precio recurrente/estándar, en unidades menores.
first_charge_amountinteger | nullCuá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.
quantityintegerUnidades de esta offer.
installmentsintegerCuotas seleccionadas por el comprador (1 = cobro único).
created_atstringMarca 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.

FieldTypeRequeridoDescripción
offer_idstringSíOffer para agregar.
quantityintegerNoMín 1, por defecto 1.
installmentsintegerNoMí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.

FieldTypeRequeridoDescripción
quantityintegerNoMín 1.
installmentsintegerNoMí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.

FieldTypeDescripción
idstringIdentificador del evento, con prefijo cke_.
checkout_session_idstringSesión principal, con prefijo cks_.
event_typeenumTipo de evento (ver más abajo).
source_urlstring | nullURL en la que estaba el comprador cuando se disparó el evento.
utm_sourcestring | nullFuente de atribución.
utm_mediumstring | nullMedio de atribución.
utm_campaignstring | nullCampaña de atribución.
ip_addressstring | nullIP del comprador en el momento del evento.
user_agentstring | nullUser agent del comprador en el momento del evento.
metadataobject | nullPayload de formato libre para contexto específico del evento.
created_atstringMarca de tiempo de creación ISO 8601.

Tipos de evento

event_typeCuándo registrarlo
initiatedLa página de checkout se cargó por primera vez.
customer_identifiedEl comprador proporcionó datos de identificación.
currency_changedEl comprador cambió la moneda de visualización/cobro.
payment_startedEl comprador envió los datos de pago.
payment_failedUn intento de cobro fue rechazado o dio error.
payment_succeededUn intento de cobro tuvo éxito.
completedEl checkout finalizó con éxito.
expiredLa sesión caducó tras su expiración.
abandonedEl 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.

FieldTypeRequeridoDescripción
event_typeenumSíUno de los tipos de evento anteriores.
source_urlstringNoURL de la página cuando se disparó el evento.
utm_sourcestringNoFuente de atribución.
utm_mediumstringNoMedio de atribución.
utm_campaignstringNoCampaña de atribución.
ip_addressstringNoDirección IP válida.
user_agentstringNoUser agent del comprador.
metadataobjectNoContexto 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:

HTTPtypeCuándo
400validation_errorCampos faltantes/inválidos, o no se proporcionó ni customer_id ni customer/customer_email.
401authentication_errorClave de API faltante o inválida.
403authorization_errorLa clave carece de checkout:read / checkout:write.
404not_found_errorSesión, ítem, offer o customer no encontrado para este Merchant.
409conflict_errorexternal_session_id duplicado para el Merchant.

Relacionado

En esta página