Crear una sesión de pago
El cuerpo de la petición que crea una sesión de pago, campo por campo, y la URL que devuelve.
Este es el endpoint principal para iniciar un pago con Hosted Checkout. Crea una nueva sesión de pago y devuelve una URL segura donde tu cliente completa su pago.
POST https://api-stage.tonder.io/checkout/v1/sessions # Sandbox
POST https://api.tonder.io/checkout/v1/sessions # ProducciónCómo funciona
- Tu servidor llama a este endpoint con los datos del pago (monto, artículos, datos del cliente).
- Tonder crea una sesión segura y devuelve una URL de checkout.
- Rediriges a tu cliente a esa URL.
- El cliente completa el pago en la página alojada de Tonder.
- El cliente es redirigido de vuelta a tu
success_urloreturn_url.
Incluye el header x-idempotency-key para evitar sesiones duplicadas (consulta
Idempotencia) y el objeto ui_config para personalizar la
página (consulta Personalizar el checkout).
El campo payment_method_types por defecto es ["card"]. Valores aceptados: card,
mercadopago, oxxopay, spei, safetypayCash, safetypayTransfer, neosurf, saved_cards.
Tarjetas guardadas
Incluye saved_cards en payment_method_types y el cajero muestra las tarjetas que el cliente ya
guardó, junto al formulario de tarjeta nueva. Listarlas, seleccionarlas y eliminarlas se maneja
solo — no hay un endpoint extra que llamar.
Esta es la vía de Hosted Checkout. Si renderizas tu propio formulario con el SDK Web, las tarjetas
guardadas funcionan distinto — ver
Tarjetas guardadas (secure_token).
La casilla de guardar tarjeta
Pon payment_method_config.saved_cards.show_save_card_checkbox en true para mostrar una casilla
Guardar tarjeta para futuros pagos en el formulario de tarjeta nueva, para que el cliente
decida si quiere guardarla.
| Campo | Tipo | Descripción |
|---|---|---|
show_save_card_checkbox | boolean | Muestra una casilla "Guardar tarjeta para futuros pagos" en el formulario de tarjeta nueva, para que el cliente decida si quiere guardarla. |
curl -X POST 'https://api-stage.tonder.io/checkout/v1/sessions' \
-H 'Authorization: Token YOUR_TEST_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"customer": { "first_name": "Maria", "last_name": "Garcia", "email": "maria@example.com" },
"amount_total": 150.00,
"currency": "MXN",
"line_items": [
{ "name": "Premium Plan", "quantity": 1, "unit_price": 150.00 }
],
"payment_method_types": ["card", "saved_cards"],
"payment_method_config": {
"saved_cards": { "show_save_card_checkbox": true }
},
"external_id": "ORD-001",
"return_url": "https://tu-tienda.com/checkout/complete"
}'curl -X POST 'https://api.tonder.io/checkout/v1/sessions' \
-H 'Authorization: Token YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"customer": { "first_name": "Maria", "last_name": "Garcia", "email": "maria@example.com" },
"amount_total": 150.00,
"currency": "MXN",
"line_items": [
{ "name": "Premium Plan", "quantity": 1, "unit_price": 150.00 }
],
"payment_method_types": ["card", "saved_cards"],
"payment_method_config": {
"saved_cards": { "show_save_card_checkbox": true }
},
"external_id": "ORD-001",
"return_url": "https://tu-tienda.com/checkout/complete"
}'Card-on-File
Card-on-File (COF) guarda las tarjetas automáticamente y permite que el cliente vuelva a pagar sin volver a capturar su CVV. Funciona sobre la infraestructura de suscripciones y tokenización de Tonder.
Cuando tu negocio tiene una conexión activa con Tonder con active_subscription, el cajero:
- Ejecuta la verificación 3DS al guardar la tarjeta.
- Crea una suscripción para esa tarjeta.
- Acepta pagos sin CVV con ella en visitas posteriores.
No hay nada que configurar. Si Card-on-File está habilitado para tu cuenta, el cajero se encarga de
todo esto solo. Es la misma suscripción que el SDK expone como subscription_id — ver la
Referencia del SDK Web.
Enviar show_save_card_checkbox: true con Card-on-File activo no mostrará la casilla. Es el
comportamiento esperado: Card-on-File tiene precedencia y las tarjetas se guardan automáticamente
de cualquier forma.
Referencia de la API
Autorización
Authorization Tu API key con prefijo Token , p. ej. Token <API_KEY>
In: header
Cuerpo de la petición
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Cuerpo de la respuesta
application/json
curl -X POST "https://example.com/checkout/v1/sessions" \ -H "Content-Type: application/json" \ -d '{ "customer": { "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com" }, "amount_total": 350, "currency": "MXN", "line_items": [ { "name": "Product 1", "quantity": 1, "unit_price": 150, "product_id": "prod-001" }, { "name": "Product 2", "quantity": 2, "unit_price": 100, "product_id": "prod-002" } ], "return_url": "https://my-store.com/checkout/complete", "external_id": "ORD-12345" }'{
"id": "cs_97_41521_d11ba771527b4056c7f85786cfbb980bc105efaf42af113d",
"url": "https://stage-payflow.tonder.io/checkout/cs_97_41521_d11ba771527b4056c7f85786cfbb980bc105efaf42af113d",
"status": "pending",
"payment_id": 41521,
"amount_total": 350,
"currency": "MXN",
"expires_at": 1751564943,
"external_id": "ORD-12345",
"session_type": "payment",
"checkout_type": "hosted",
"return_url": "https://my-store.com/checkout/complete",
"metadata": {},
"payment_method_types": [
"card"
],
"ui_config": {},
"ui_config_version": "V1",
"created_at": 1751478543567,
"modified_at": 1751478543567,
"customer": {
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"line_items": [
{
"name": "Product 1",
"quantity": 1,
"unit_price": 150,
"product_id": "prod-001"
}
],
"transaction_status": "Pending",
"provider": "tonder"
}La sesión empieza en pending y avanza a un estado final. Consulta los valores completos en la
Referencia.
