Catálogo Unificado de Errores — Kushki ONE Connect
Simplificamos la gestión de errores en Kushki ONE Connect. Ante cualquier fallo en una operación, nuestra API devuelve un payload estructurado en formato JSON (LinkFailure) que estandariza la respuesta sin importar si el problema se originó en la terminal, en una validación, en la autenticación o en el adquirente. Esto te permite construir integraciones más robustas, automatizar flujos de recuperación y dejar de depender exclusivamente de los HTTP Status Codes.
Este manual es tu herramienta principal de diagnóstico. En este detallamos la estructura del nuevo modelo de datos, los catálogos de códigos por categoría, cómo mapeamos los rechazos de terceros y una guía rápida para resolver problemas comunes.
1. Modelos de Errores
Todos los errores comparten la misma estructura de respuesta. Se debe evaluar primero el campo type para clasificar la fuente del fallo y luego consultar el code correspondiente.
| Campo | Tipo | Siempre presente | Descripción |
|---|---|---|---|
type | String | Sí | Categoría del error. Identifica la fuente del fallo. Ver Sección 3. |
code | String | Sí | Código único del error. Formato: prefijo + número (ej. PAR-001, TER-002, ACQ-13). |
param | String | No | El campo o parámetro exacto que causó el error. Usado principalmente en errores PARAMETER. |
message | String | Sí | Descripción legible del motivo del fallo. |
object | Object | No | Datos de trazabilidad. Incluye client_transaction_id, terminal_id y serial_number cuando corresponda. |
HTTP Status Code
El HTTP status code es coherente con el type del body. Para errores ACQUIRER, se conserva el mismo HTTP status retornado originalmente por Kushki.
Ejemplo canónico
{"type": "PARAMETER","code": "PAR-003","param": "amount","message": "Amount must be a value greater than 0","object": {"client_transaction_id": "1018282","terminal_id": "172653","serial_number": "PJ715652"}}
2. Categorías de Error (campo type)
| type | Origen | Descripción |
|---|---|---|
PARAMETER | Validación | Envío incorrecto de campos: campos requeridos vacíos, tipo incorrecto o formato inválido. |
TERMINAL | Terminal | Errores del estado de la terminal física: ocupada, fuera de línea, no vinculada, modo incompatible. |
AUTHENTICATION | Seguridad | No es posible autenticar al usuario o no tiene permisos suficientes para ejecutar la acción. |
NOT_FOUND | Enrutamiento | Servicio o endpoint no encontrado. URL inválida. |
ACQUIRER | Adquirente | Errores relacionados al procesamiento o autorización de la transacción por el adquirente Kushki. Código con prefijo ACQ-. |
INTERNAL | Aplicación | Errores inesperados: servicios caídos, errores internos de la aplicación. |
DEVICE | Hardware | Errores arrojados por el hardware de la terminal (impresora, lector de tarjetas). |
MANUFACTURER | Hardware SDK | Errores del SDK del fabricante (Sunmi, Landi). Código con prefijo MAN-. |
3. Errores de Validación — type: “PARAMETER”
Generados cuando el request enviado contiene campos con formato incorrecto, valores fuera de rango o campos requeridos ausentes. El campo param identifica el campo específico que causó el error. Todos son 100% prevenibles validando el payload antes de llamar a la API.
| code | Descripción | Mensaje (template) | Ejemplo |
|---|---|---|---|
PAR-001 | Campo requerido no fue enviado. | Field {{field}} is required. | Field amount.currency is required. |
PAR-002 | Campo de tipo incorrecto. | Field {{field}} must be a/an {{type}} | Field amount.subtotal_iva must be an integer. |
PAR-002 | Campo con formato incorrecto o valor no válido. | Field {{field}} must satisfy: {{condition}} | Field amount.iva must satisfy: value >= 0. |
3.1 Errores de Validación de Request - type: “PARAMETER”
Cuando el type es PARAMETER, el campo code es siempre un código numérico positivo del rango 2001–2037. Todos son prevenibles validando el payload en el sistema de caja antes de llamar a la API. También existen dos códigos especiales de formato de sistema.
3.2 Códigos de Sistema
| code | Descripción del error |
|---|---|
| BAD_FORMAT | Error de parseo JSON/JVM. El body del request no es un JSON válido o contiene un tipo de dato incorrecto en algún campo. |
| BUSY | La terminal está procesando otra solicitud. El integrador debe reintentar una vez que la terminal quede disponible. |
3.3 Validadores de Amount y Campos de Pago (2001–2013)
| Código | Parameter / Object | Mensaje de error |
|---|---|---|
| 2001 | amount.currency | Invalid currency: {valor}. Expected one of: [MXN, CLP, PEN, COP] |
| 2002 | amount.iva | amount.iva cannot be negative |
| 2003 | amount.subtotalIva | amount.subtotalIva cannot be negative |
| 2004 | amount.subtotalIva0 | amount.subtotalIva0 cannot be negative |
| 2005 | amount.tip | amount.tip cannot be negative |
| 2006 | airportTax | airportTax cannot be negative |
| 2007 | iac | iac cannot be negative |
| 2008 | ice | ice cannot be negative |
| 2009 | travelAgency | travelAgency cannot be negative |
| 2012 | deferredMonths | deferredMonths must be > 0 when isDeferred is true |
| 2013 | cashbackAmount | cashbackAmount must be > 0 when isCashback is true |
3.4 Validadores de Identificadores de Transacción (2010–2015)
| Código | Parameter / Object | Mensaje de error |
|---|---|---|
| 2010 | clientTransactionId | clientTransactionId must be a valid UUID format |
| 2011 | clientTransactionId | clientTransactionId is required |
| 2014 | transactionReference | transactionReference must be a valid UUID format |
| 2015 | transactionReference | transactionReference is required |
3.5 Validadores de Paginación y Fechas (2016-2021)
| Código | Parameter / Object | Mensaje de error |
|---|---|---|
| 2016 | page | page must be greater than 0 |
| 2017 | size | size must be greater than 0 |
| 2018 | size | size must not exceed 500 |
| 2019 | start_date | start_date cannot be negative |
| 2020 | end_date | end_date cannot be negative |
| 2021 | start_date | start_date must be before end_date |
3.6 Validadores de Configuración (2022-2037)
| Código | Parameter / Object | Mensaje de error |
|---|---|---|
| 2022 | env | env is required |
| 2023 | privateCredentialId | privateCredentialId is required |
| 2024 | country | country is required |
| 2025 | pinTimeOut | pinTimeOut cannot be negative |
| 2026 | cardDetectTimeOut | cardDetectTimeOut cannot be negative |
| 2027 | pinKeyIndex | pinKeyIndex cannot be negative |
| 2028 | dataKeyIndex | dataKeyIndex cannot be negative |
| 2029 | timeoutSeconds | timeoutSeconds cannot be negative |
| 2030 | maxChipRetries | maxChipRetries cannot be negative |
| 2031 | countryCode | countryCode must be 3 uppercase letters or 3-4 digits (ISO 3166-1) |
| 2032 | currencyCode | currencyCode must be 3 uppercase letters or 3-4 digits (ISO 4217) |
| 2033 | merchantId | merchantId cannot be blank |
| 2034 | terminalId | terminalId cannot be blank |
| 2035 | terminalType | terminalType cannot exceed 2 characters |
| 2036 | CardInput | At least one card input method (ICC, NFC, MSR) must be enabled |
| 2037 | timeoutSeconds | timeoutSeconds cannot exceed 300 seconds (5 minutes) |
4. Errores de Terminal — type: “TERMINAL”
Generados cuando la terminal física no puede aceptar la operación solicitada. A diferencia de los errores de hardware, estos indican un problema de estado o conectividad de la terminal, no un fallo de componente.
| code | Descripción | Mensaje (template) | Ejemplo |
|---|---|---|---|
TER-001 | Terminal no vinculada al comercio. | Terminal {{serial_number}} does not exist, or is not linked to your account. | Terminal SN816265 does not exist, or is not linked to your account. |
TER-002 | Terminal no responde (offline o fuera de red). | Terminal {{serial_number}} is not responding. It may be offline or not connected to the local network. | Terminal PB651542 is not responding. It may be offline or not connected to the local network. |
TER-003 | Terminal ocupada procesando una transacción. | Terminal {{serial_number}} is busy processing transaction (client_transaction_id: {{id}}). | Terminal SN71652 is busy processing transaction (client_transaction_id: 8886523). |
TER-004 | Terminal ocupada con acción distinta a pago. | Terminal {{serial_number}} is busy executing action {{action}}. | Terminal JH152353 is busy executing action PRINT. |
TER-005 | Terminal en modo incompatible con la operación. | The terminal is in {{mode}} mode and does not allow the requested action. | The terminal is in STANDALONE mode and does not allow the requested action. |
TER-006 | Terminal no habilitada para ese tipo de operación. | The terminal is not allowed to process {{type}}. | The terminal is not allowed to process TIP. |
5. Errores de Autenticación — type: “AUTHENTICATION”
Generados cuando las credenciales son inválidas o no tienen permisos suficientes para ejecutar la acción solicitada.
| code | Descripción | Mensaje | Ejemplo |
|---|---|---|---|
AUTH-001 | No se pueden autenticar las credenciales. | Invalid or expired credentials | Invalid or expired credentials |
AUTH-002 | Las credenciales son válidas pero sin permiso para la acción. | Your credentials are valid but do not grant access to this resource. | Your credentials are valid but do not grant access to this resource. |
{ "type": "AUTHENTICATION", "code": "AUTH-001", "message": "Invalid or expired credentials" }
6. Errores de Enrutamiento e Internos
type: “NOT_FOUND”
| code | Descripción | Mensaje (template) | Ejemplo |
|---|---|---|---|
NF-001 | Servicio o endpoint no encontrado. | Service not found: {{url}} | Service not found: https://api.kushkipagos.com/cobrar |
type: “INTERNAL”
| code | Descripción | Mensaje | Ejemplo |
|---|---|---|---|
INT-001 | Error inesperado del servidor o aplicación. | Internal server error. | Internal server error. |
7. Errores del Adquirente — type: “ACQUIRER”
Los errores originados por el adquirente Kushki se encapsulan bajo type: ACQUIRER aplicando la siguiente regla de mapeo.
Regla de Mapeo
- code: Código Kushki original con prefijo ”ACQ-”. Ejemplo: código ”13” →
ACQ-13. - message: Igual al message original retornado por Kushki.
- object: Incluye al menos los siguientes campos cuando corresponda.
Client_transaction_idterminal_idserial_number
- HTTP status: Se conserva el mismo HTTP status retornado originalmente por Kushki.
Ejemplo de Mapeo
Error original Kushki:
HTTP/1.1 400 Bad Request{"code": "13","message": "Either Invalid amount or Currency conversion field overflow"}
Error mapeado — respuesta de Kushki ONE Connect:
HTTP/1.1 400 Bad Request{"type": "ACQUIRER","code": "ACQ-13","param": "","message": "Either Invalid amount or Currency conversion field overflow","object": {"client_transaction_id": "1018282","terminal_id": "172653","serial_number": "PJ715652"}}
8. Errores del Fabricante — type: “MANUFACTURER”
Los errores del SDK del fabricante (Sunmi, Landi) se encapsulan bajo type: “MANUFACTURER” con código MAN-{codigo_fabricante}. Los códigos negativos del SDK de Sunmi se documentan tal como los retorna el SDK.
Regla de Mapeo
- code: Código del SDK del fabricante con prefijo ”MAN-”. Ejemplo: código ”-2001” → MAN—2001.
- message: Mensaje original del SDK del fabricante.
- object: Incluye los siguientes campos cuando corresponda.
Client_transaction_idterminal_idserial_number
{"type": "MANUFACTURER","code": "MAN--2001","message": "Have no card","object": {"client_transaction_id": "c5a3f3be-9d6f-4d39-8af5-58dbb589af69","terminal_id": "172653","serial_number": "SN816265"}}
Códigos Sunmi más frecuentes en producción
| code (MAN-) | Descripción | Acción recomendada |
|---|---|---|
MAN--2001 | Have no card | El cliente no presentó la tarjeta. Solicitar reintento. |
MAN--2002 | Multiple cards | Hay más de una tarjeta en el campo NFC. Pedir al cliente que retire tarjetas adicionales. |
MAN--2581 | User canceled | El cliente canceló. Manejar como cancelación esperada. |
MAN--2582 | MSR or IC interrupted | Lectura interrumpida. Solicitar que no retire la tarjeta hasta que la terminal lo indique. |
MAN--3023 | DUKPT overflow | Contador DUKPT agotado. Requiere reinyección de clave. Contactar soporte. |
MAN--4104 | Card is locked | Tarjeta bloqueada. El cliente debe contactar a su banco. |
MAN--4111 | Card expired | Tarjeta vencida. Informar al cliente. |
MAN--4120 | Amount exceeds contactless limit | Monto supera límite NFC. Usar chip (ICC). |
MAN--50020 | PIN entry cancel | El cliente canceló la entrada de PIN. Manejar como cancelación. |
MAN--60001 | Input PIN timeout | El cliente no ingresó el PIN a tiempo. Solicitar reintento. |
9. Errores de Impresora Kushki — type: “TERMINAL-PRINTER”
Errores arrojados por el hardware de la terminal. Incluye la impresora térmica integrada. Estos códigos están estandarizados independientemente del fabricante de la terminal.
| code | Causa | Acción recomendada para el operador |
|---|---|---|
OUT_OF_PAPER | Sin rollo de papel. | Insertar rollo nuevo y reintentar. |
COVER_OPEN | Tapa del compartimento de papel abierta. | Cerrar firmemente la tapa. |
COVER_INCOMPLETE | Tapa mal cerrada o rodillo sin presión. | Abrir y cerrar asegurando el encaje del rodillo. |
PAPER_JAM | Atasco de papel en el mecanismo. | Retirar el papel atascado y cerrar. Insertar rollo nuevo. |
BUSY | Cola ocupada con skiplfBusy: true. | Reintentar en unos segundos. |
PRINTER_HOT | Cabezal térmico sobrecalentado. | Esperar 2-3 minutos y reintentar. |
MOTOR_HOT | Motor de arrastre sobrecalentado. | Esperar enfriamiento. |
CUTTER_ERROR | Guillotina de corte bloqueada. | Requiere intervención de servicio técnico. |
OFFLINE | Módulo no responde al sistema Android. | Reiniciar la terminal. |
10. Guía Rápida de Diagnóstico
Ante un error recibido, sigue estas recomendaciones:
- ¿type es AUTHENTICATION? → Verificar credenciales (AUTH-001) o permisos (AUTH-002).
- ¿type es PARAMETER? → Revisar el campo indicado en param. Agregar validación en el POS antes de llamar a la API.
- ¿type es TERMINAL y code es TER-002? → La terminal está offline. Verificar conectividad de red.
- ¿type es TERMINAL y code es TER-003 o TER-004? → La terminal está ocupada. Esperar que termine la operación en curso o usar abort.
- ¿type es TERMINAL y code es TER-006? → Funcionalidad no habilitada en la terminal. Contactar Operaciones Kushki para habilitar.
- ¿type es DEVICE? → Condición física del hardware. Mostrar el message al operador con instrucciones de resolución.
- ¿type es MANUFACTURER y code empieza en MAN—200? → Problema de lectura de tarjeta. Solicitar reintento al cliente.
- ¿type es MANUFACTURER y code es MAN—50020 o MAN—60001? → El cliente canceló o no ingresó el PIN. Tratar como cancelación esperada.
- ¿type es ACQUIRER? → Rechazo del procesador. Mostrar el message al cliente. Registrar el code (ej. ACQ-13) con el client_transaction_id para soporte.
- ¿type es INTERNAL o NOT_FOUND? → Registrar el payload completo y escalar a soporte técnico Kushki.
Chile
Colombia
Ecuador
Peru