External 3DS
Cobra con un resultado de 3-D Secure obtenido con tu propio proveedor — una sola llamada, sin reto.
Si autenticas al tarjetahabiente con tu propio proveedor de 3DS antes de cobrar, ya tienes el
resultado: el criptograma, el ECI y el ID de transacción del Directory Server. External 3DS te
permite pasar ese resultado a Tonder dentro de la petición a /process/ que ya envías. Tonder
no corre su propio 3DS — reenvía tus datos de autenticación al adquirente y procesa el pago.
En corto: tú autenticas → nos envías el resultado → nosotros cobramos con él.
Disponible solo en la API Direct (POST /process/). Los SDKs y Hosted Checkout corren 3DS
por ti, así que no hay nada que pasar.
Requisitos
External 3DS está desactivado por defecto. Pide a tu representante de Tonder que lo habilite en
tu cuenta. Si no está habilitado y envías threeDomainSecure, la petición se rechaza con un error
claro.
- Tu integración API Direct actual — mismo endpoint, mismo
Authorization: Token <API_KEY>, misma tarjeta tokenizada. No hay endpoint ni credenciales nuevos. - Una autenticación 3DS completada con tu proveedor, de la que tengas el criptograma (CAVV o UCAF), el ECI y — para Mastercard — el ID de transacción del Directory Server.
Qué cambia en la petición
Una sola adición: un objeto threeDomainSecure en el nivel superior con tu resultado. También
recomendamos mucho enviar card_brand dentro de payment_method (ver abajo). Todo lo demás
queda exactamente igual.
threeDomainSecure
| Campo | Requerido | Descripción |
|---|---|---|
eci | Sí | Electronic Commerce Indicator de tu resultado 3DS. |
cavv | Visa | Criptograma de autenticación en Base64 (Visa). |
ucaf | Mastercard | Criptograma de autenticación / AAV en Base64 (Mastercard). Misma familia de valor que cavv. |
directoryServerTransactionID | Mastercard | ID de transacción del Directory Server de tu resultado 3DS. |
specificationVersion | No | Versión del protocolo EMVCo. Por defecto 2.2.0. |
collectionIndicator | No (Mastercard) | Collection indicator de Mastercard. Se deriva del eci si se omite. |
acceptRisk | Condicional | Debe ser true cuando el eci indica no autenticado (Mastercard 00 / Visa 07) — aceptas la responsabilidad. |
Dónde va cada cosa
Tres cosas viven en tres niveles distintos. Confundirlos es el error de integración más común:
| Elemento | Dónde va |
|---|---|
threeDomainSecure (el objeto completo) | Nivel superior del cuerpo de la petición |
eci, cavv, ucaf, directoryServerTransactionID, acceptRisk, … | Dentro de threeDomainSecure |
card_brand | Dentro de payment_method |
Si anidas threeDomainSecure dentro de payment_method, se ignora: el pago no usa tus datos de
autenticación y Tonder corre su propio 3DS. Debe ir en el nivel superior.
Valores de ECI y reglas
| Red | ECI | Significado |
|---|---|---|
| Visa | 05 | Autenticado |
| Visa | 06 | Intentado |
| Visa | 07 | No autenticado — requiere acceptRisk: true |
| Mastercard | 02 | Autenticado |
| Mastercard | 01 | Intentado |
| Mastercard | 00 | No autenticado — requiere acceptRisk: true |
Formato del criptograma. cavv / ucaf debe ser el criptograma en Base64 que devolvió tu
proveedor, no en hex. Un string en hex se rechaza.
card_brand — recomendado. Tonder recibe una tarjeta tokenizada, no el PAN, así que no siempre
puede determinar la red por sí mismo. Tú acabas de autenticar la tarjeta, así que la conoces —
envíala:
- Con
card_brand: Tonder validathreeDomainSecurecontra la red desde el inicio y responde un400claro si algo es inconsistente (un ECI de Visa en una Mastercard, por ejemplo). - Sin él: la validación es más ligera y una inconsistencia la detecta después el adquirente,
como rechazo.
card_brandte da errores más rápidos y más claros.
Valores aceptados: "visa", "mastercard" (sin distinguir mayúsculas).
Ejemplos
Mastercard
curl -X POST "https://stage.tonder.io/api/v1/process/" \
-H "Authorization: Token YOUR_TONDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operation_type": "payment",
"amount": 150.00,
"currency": "MXN",
"customer": {
"name": "Jane Doe",
"email": "jane@testuser.com"
},
"payment_method": {
"type": "CARD",
"card_number": "9230-0892-4469-1474",
"cardholder_name": "c05d89b2-299c-4f93-b49a-42be00d3b64b",
"cvv": "d31f0da3-0ed3-4ad8-8b68-14c2669a99a7",
"expiration_month": "e401a32e-4174-424f-9688-727005f6a80e",
"expiration_year": "bd9ccc23-3d00-4109-9626-fc6581389063",
"card_brand": "mastercard"
},
"threeDomainSecure": {
"ucaf": "kCO52e75N318oAB3MPZU6EhB2Td6",
"eci": "02",
"directoryServerTransactionID": "9e8c4ff6-23d9-4fba-8446-6e8e9d13f42e",
"specificationVersion": "2.2.0",
"collectionIndicator": "2"
},
"client_reference": "ORD-001",
"return_url": "https://tonder.io"
}'Visa
La misma petición, con cavv en lugar de ucaf y sin ID del Directory Server:
{
"operation_type": "payment",
"amount": 150.00,
"currency": "MXN",
"customer": { "name": "Jane Doe", "email": "jane@testuser.com" },
"payment_method": {
"type": "CARD",
"card_number": "9230-0892-4469-1474",
"cardholder_name": "c05d89b2-299c-4f93-b49a-42be00d3b64b",
"cvv": "d31f0da3-0ed3-4ad8-8b68-14c2669a99a7",
"expiration_month": "e401a32e-4174-424f-9688-727005f6a80e",
"expiration_year": "bd9ccc23-3d00-4109-9626-fc6581389063",
"card_brand": "visa"
},
"threeDomainSecure": {
"cavv": "AAABBoVBaZKAR3BkdkFpELpWIiE=",
"eci": "05",
"specificationVersion": "2.2.0"
},
"client_reference": "ORD-002",
"return_url": "https://tonder.io"
}ECI no autenticado (acceptRisk)
Cuando el eci es 00 (Mastercard) o 07 (Visa) debes aceptar la responsabilidad de forma
explícita, con acceptRisk: true dentro de threeDomainSecure:
"threeDomainSecure": {
"ucaf": "kCO52e75N318oAB3MPZU6EhB2Td6",
"eci": "00",
"directoryServerTransactionID": "9e8c4ff6-23d9-4fba-8446-6e8e9d13f42e",
"specificationVersion": "2.2.0",
"collectionIndicator": "2",
"acceptRisk": true
}Qué esperar en la respuesta
- Un cobro exitoso regresa aprobado en una sola llamada, sin paso de reto — ya autenticaste al tarjetahabiente, así que Tonder no inicia su propio 3DS.
- Una respuesta
Pendingconnext_action(un reto) significa que tus datos de autenticación no se aplicaron. Las causas habituales:threeDomainSecureanidado dentro depayment_methoden lugar del nivel superior; tu cuenta no está habilitada para External 3DS; el objeto faltaba o iba vacío.
Como con cualquier pago, verifica el estado final en GET /api/v1/transactions/{id}/ — es la
fuente de verdad.
Errores comunes
| Respuesta | Causa | Solución |
|---|---|---|
4xx "not enabled for this business" | External 3DS no está habilitado en tu cuenta | Pide a Tonder que lo habilite |
Pending / reto en lugar de un cobro directo | threeDomainSecure anidado en payment_method, o vacío | Muévelo al nivel superior; asegúrate de que tenga valores |
400 "eci … is not valid for {brand}" | El ECI no corresponde a la red de la tarjeta | Envía el ECI correcto para la red |
400 "ucaf/directoryServerTransactionID is required" | Faltan campos de Mastercard | Incluye ucaf y directoryServerTransactionID |
400 "cavv is required" | Falta el criptograma de Visa | Incluye cavv |
400 "requires acceptRisk=true" | ECI no autenticado (00/07) sin aceptación | Agrega acceptRisk: true dentro de threeDomainSecure |
400 "must be a base64-encoded cryptogram" | Criptograma enviado en hex | Envía el valor Base64 de tu proveedor |
Rechazado en el adquirente (200, declinado) | Inconsistencia red/ECI no detectada al inicio | Envía card_brand para que Tonder valide antes del adquirente |
Siguientes pasos
Process Transaction
El esquema completo de /process/ — con threeDomainSecure y card_brand.
Pagos con tarjeta
El flujo tokenizado sobre el que se construye esta petición.
Ciclo de vida 3DS
Cómo funciona el 3DS que corre Tonder cuando no traes el tuyo.
Tarjetas de prueba
Tarjetas de sandbox para los flujos 3DS y sin 3DS estándar.
Procesar transacción
Procesa pagos y retiros con una sola llamada. Este endpoint unificado maneja todos los tipos de transacción según el campo `operation_type`.
Reembolsar un pago con tarjeta
Reembolsa un pago con tarjeta sin indicar el procesador — Tonder lo resuelve del lado del servidor a partir de la referencia de la transacción. Solo para integraciones API Direct y Web SDK.
