Asigna una CLABE por usuario
Da a cada uno de tus usuarios su propia CLABE SPEI: una llamada, idempotente por usuario, y cada transferencia que reciba se acredita a tu cuenta.
POST /api/v1/clabe-assignments da a cada uno de tus usuarios finales su propia CLABE SPEI.
Cualquier transferencia SPEI que tu usuario envíe a esa CLABE se acredita a tu cuenta de comercio.
Llámalo una vez por usuario — por ejemplo cuando se registra, o la primera vez que abre tu pantalla
de depósitos. La llamada es idempotente por usuario: volver a llamarla con el mismo user_id
devuelve la misma CLABE en vez de crear una nueva. Cada user_id corresponde a exactamente una
CLABE dentro de tu cuenta de comercio, y dos valores distintos de user_id siempre reciben dos
CLABEs distintas.
Las transferencias que llegan a una CLABE asignada son las transferencias directas que describe Frictionless SPEI: el cliente paga desde su app bancaria sin checkout, y tú confirmas cada depósito con un webhook.
URL base
Usa el dominio del API de Tonder de tu entorno y agrega /deposits antes de la ruta del endpoint.
| Entorno | URL base | Endpoint completo |
|---|---|---|
| Sandbox | https://api-stage.tonder.io/deposits | https://api-stage.tonder.io/deposits/api/v1/clabe-assignments |
| Producción | https://api.tonder.io/deposits | https://api.tonder.io/deposits/api/v1/clabe-assignments |
Si tu integración llama hoy a una URL execute-api.amazonaws.com, sigue funcionando. Cambia a los
dominios de arriba: se mantienen iguales si la infraestructura de Tonder cambia.
Autenticación
Envía tu llave API de Tonder en el header Authorization, con el prefijo Token y un espacio:
Authorization: Token <tu-llave-api>Usa la misma llave API que usas para el resto del API de Tonder. Tonder identifica tu cuenta de comercio a partir de la llave, así que la petición no lleva id de comercio. Una llave faltante o inválida se rechaza antes de que la petición llegue al endpoint.
Mantén la llave solo en tu servidor. Nunca llames a este endpoint desde un navegador o una app móvil.
Paso a paso
Asigna la CLABE
POST /api/v1/clabe-assignments con un cuerpo JSON y los headers
Authorization: Token <tu-llave-api> y Content-Type: application/json.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
user_id | string | Sí | Tu propio identificador del usuario final. Usa un valor que nunca cambie para ese usuario, como tu ID interno de cliente. |
curl -X POST https://api-stage.tonder.io/deposits/api/v1/clabe-assignments \
-H "Authorization: Token $TONDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id": "customer-48213"}'curl -X POST https://api.tonder.io/deposits/api/v1/clabe-assignments \
-H "Authorization: Token $TONDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id": "customer-48213"}'Desde tu servidor, en Node.js (18+) o Python — cambia el dominio a https://api-stage.tonder.io y
usa tu llave API de sandbox para probar:
const res = await fetch(
"https://api.tonder.io/deposits/api/v1/clabe-assignments",
{
method: "POST",
headers: {
Authorization: `Token ${process.env.TONDER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ user_id: "customer-48213" }),
}
);
if (!res.ok) throw new Error(`CLABE assignment failed: ${res.status}`);
const { clabe, is_new } = await res.json();import os, requests
res = requests.post(
"https://api.tonder.io/deposits/api/v1/clabe-assignments",
headers={"Authorization": f"Token {os.environ['TONDER_API_KEY']}"},
json={"user_id": "customer-48213"},
timeout=30,
)
res.raise_for_status()
clabe = res.json()["clabe"]Muestra la CLABE a tu usuario
Una CLABE nueva devuelve 201 Created. Si el usuario ya tenía una, recibes 200 OK con la misma
CLABE e is_new: false. Ambos casos comparten el mismo cuerpo:
{
"assignment_id": "9b2f6c1e-4d3a-4f7b-8a51-2c6e0d9f7a14",
"clabe": "710969000012345678",
"merchant_id": "1234",
"user_id": "customer-48213",
"provider_type": "Tonder",
"assigned_at": "2026-10-13T18:22:05.123456+00:00",
"is_new": true
}| Campo | Tipo | Descripción |
|---|---|---|
clabe | string | La CLABE de 18 dígitos que muestras a tu usuario. Él envía transferencias SPEI a ella. |
assignment_id | string (UUID) | El ID de Tonder para esta asignación. Guárdalo para solicitudes de soporte. |
user_id | string | El user_id que enviaste. |
merchant_id | string | Tu ID de comercio, resuelto a partir de tu llave API. |
provider_type | string | Siempre Tonder. |
assigned_at | string (ISO 8601, UTC) | Cuándo se asignó la CLABE por primera vez. No cambia en llamadas repetidas. |
is_new | boolean | true si esta llamada creó la CLABE, false si ya existía. |
Recibe los depósitos
Cada transferencia SPEI a esa CLABE se acredita a tu cuenta de comercio. Confirma cada depósito con un webhook — las claves de conciliación y el flujo de transferencias directas están en Frictionless SPEI — o consulta un depósito con el endpoint de status de depósitos.
Errores
Los errores del endpoint devuelven un cuerpo JSON con error y message. Los dos errores de
autenticación vienen del gateway y solo incluyen message.
| Status HTTP | error | Cuándo ocurre | Qué hacer |
|---|---|---|---|
| 400 | INVALID_PARAMETER | user_id falta o no es un string. | Corrige el cuerpo de la petición. No reintentes sin cambios. |
| 400 | DOMAIN_ERROR | No se pudo asignar la CLABE, por ejemplo porque el proveedor bancario no estaba disponible. | Reintenta con backoff. Reintentar es seguro: nunca recibes dos CLABEs para el mismo user_id. |
| 401 | ninguno ("message": "Unauthorized") | Falta el header Authorization. | Agrega el header. |
| 403 | ninguno ("message": "User is not authorized to access this resource…") | La llave API es inválida, o el header no usa el formato Token <llave>. | Revisa la llave y el prefijo Token . |
| 500 | INTERNAL_ERROR | Error inesperado del lado de Tonder. | Reintenta con backoff. Si persiste, contacta a soporte de Tonder. |
{
"error": "INVALID_PARAMETER",
"message": "user_id is required"
}Referencia de la API
Autorización
Authorization Your public API key, with the word Token and a space in front of it. Example: Token 6534bc0a7e1f4d2b9c8e3a5f7b1d2c4e6f8a9b0c — that whole value is the header. Sending the key alone returns 401 'Authentication credentials were not provided'. In this playground you may paste just the key; the prefix is added for you.
In: header
Cuerpo de la petición
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Cuerpo de la respuesta
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/v1/clabe-assignments" \ -H "Content-Type: application/json" \ -d '{ "user_id": "customer-48213" }'{
"assignment_id": "9b2f6c1e-4d3a-4f7b-8a51-2c6e0d9f7a14",
"clabe": "710969000012345678",
"merchant_id": "1234",
"user_id": "customer-48213",
"provider_type": "Tonder",
"assigned_at": "2026-10-13T18:22:05.123456+00:00",
"is_new": false
}{
"assignment_id": "9b2f6c1e-4d3a-4f7b-8a51-2c6e0d9f7a14",
"clabe": "710969000012345678",
"merchant_id": "1234",
"user_id": "customer-48213",
"provider_type": "Tonder",
"assigned_at": "2026-10-13T18:22:05.123456+00:00",
"is_new": true
}{
"error": "INVALID_PARAMETER",
"message": "user_id is required"
}{
"message": "Unauthorized"
}{
"message": "User is not authorized to access this resource"
}{
"error": "INTERNAL_ERROR",
"message": "Unexpected error"
}