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.

CampoTipoSiempre presenteDescripción
typeStringCategoría del error. Identifica la fuente del fallo. Ver Sección 3.
codeStringCódigo único del error. Formato: prefijo + número (ej. PAR-001, TER-002, ACQ-13).
paramStringNoEl campo o parámetro exacto que causó el error. Usado principalmente en errores PARAMETER.
messageStringDescripción legible del motivo del fallo.
objectObjectNoDatos 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)

typeOrigenDescripción
PARAMETERValidaciónEnvío incorrecto de campos: campos requeridos vacíos, tipo incorrecto o formato inválido.
TERMINALTerminalErrores del estado de la terminal física: ocupada, fuera de línea, no vinculada, modo incompatible.
AUTHENTICATIONSeguridadNo es posible autenticar al usuario o no tiene permisos suficientes para ejecutar la acción.
NOT_FOUNDEnrutamientoServicio o endpoint no encontrado. URL inválida.
ACQUIRERAdquirenteErrores relacionados al procesamiento o autorización de la transacción por el adquirente Kushki. Código con prefijo ACQ-.
INTERNALAplicaciónErrores inesperados: servicios caídos, errores internos de la aplicación.
DEVICEHardwareErrores arrojados por el hardware de la terminal (impresora, lector de tarjetas).
MANUFACTURERHardware SDKErrores 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.

codeDescripciónMensaje (template)Ejemplo
PAR-001Campo requerido no fue enviado.Field {{field}} is required.Field amount.currency is required.
PAR-002Campo de tipo incorrecto.Field {{field}} must be a/an {{type}}Field amount.subtotal_iva must be an integer.
PAR-002Campo 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

codeDescripción del error
BAD_FORMATError 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.
BUSYLa 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ódigoParameter / ObjectMensaje de error
2001amount.currencyInvalid currency: {valor}. Expected one of: [MXN, CLP, PEN, COP]
2002amount.ivaamount.iva cannot be negative
2003amount.subtotalIvaamount.subtotalIva cannot be negative
2004amount.subtotalIva0amount.subtotalIva0 cannot be negative
2005amount.tipamount.tip cannot be negative
2006airportTaxairportTax cannot be negative
2007iaciac cannot be negative
2008iceice cannot be negative
2009travelAgencytravelAgency cannot be negative
2012deferredMonthsdeferredMonths must be > 0 when isDeferred is true
2013cashbackAmountcashbackAmount must be > 0 when isCashback is true

3.4 Validadores de Identificadores de Transacción (2010–2015)

CódigoParameter / ObjectMensaje de error
2010clientTransactionIdclientTransactionId must be a valid UUID format
2011clientTransactionIdclientTransactionId is required
2014transactionReferencetransactionReference must be a valid UUID format
2015transactionReferencetransactionReference is required

3.5 Validadores de Paginación y Fechas (2016-2021)

CódigoParameter / ObjectMensaje de error
2016pagepage must be greater than 0
2017sizesize must be greater than 0
2018sizesize must not exceed 500
2019start_datestart_date cannot be negative
2020end_dateend_date cannot be negative
2021start_datestart_date must be before end_date

3.6 Validadores de Configuración (2022-2037)

CódigoParameter / ObjectMensaje de error
2022envenv is required
2023privateCredentialIdprivateCredentialId is required
2024countrycountry is required
2025pinTimeOutpinTimeOut cannot be negative
2026cardDetectTimeOutcardDetectTimeOut cannot be negative
2027pinKeyIndexpinKeyIndex cannot be negative
2028dataKeyIndexdataKeyIndex cannot be negative
2029timeoutSecondstimeoutSeconds cannot be negative
2030maxChipRetriesmaxChipRetries cannot be negative
2031countryCodecountryCode must be 3 uppercase letters or 3-4 digits (ISO 3166-1)
2032currencyCodecurrencyCode must be 3 uppercase letters or 3-4 digits (ISO 4217)
2033merchantIdmerchantId cannot be blank
2034terminalIdterminalId cannot be blank
2035terminalTypeterminalType cannot exceed 2 characters
2036CardInputAt least one card input method (ICC, NFC, MSR) must be enabled
2037timeoutSecondstimeoutSeconds 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.

codeDescripciónMensaje (template)Ejemplo
TER-001Terminal 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-002Terminal 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-003Terminal 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-004Terminal ocupada con acción distinta a pago.Terminal {{serial_number}} is busy executing action {{action}}.Terminal JH152353 is busy executing action PRINT.
TER-005Terminal 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-006Terminal 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.

codeDescripciónMensajeEjemplo
AUTH-001No se pueden autenticar las credenciales.Invalid or expired credentialsInvalid or expired credentials
AUTH-002Las 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”

codeDescripciónMensaje (template)Ejemplo
NF-001Servicio o endpoint no encontrado.Service not found: {{url}}Service not found: https://api.kushkipagos.com/cobrar

type: “INTERNAL”

codeDescripciónMensajeEjemplo
INT-001Error 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_id
    • terminal_id
    • serial_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_id
    • terminal_id
    • serial_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ónAcción recomendada
MAN--2001Have no cardEl cliente no presentó la tarjeta. Solicitar reintento.
MAN--2002Multiple cardsHay más de una tarjeta en el campo NFC. Pedir al cliente que retire tarjetas adicionales.
MAN--2581User canceledEl cliente canceló. Manejar como cancelación esperada.
MAN--2582MSR or IC interruptedLectura interrumpida. Solicitar que no retire la tarjeta hasta que la terminal lo indique.
MAN--3023DUKPT overflowContador DUKPT agotado. Requiere reinyección de clave. Contactar soporte.
MAN--4104Card is lockedTarjeta bloqueada. El cliente debe contactar a su banco.
MAN--4111Card expiredTarjeta vencida. Informar al cliente.
MAN--4120Amount exceeds contactless limitMonto supera límite NFC. Usar chip (ICC).
MAN--50020PIN entry cancelEl cliente canceló la entrada de PIN. Manejar como cancelación.
MAN--60001Input PIN timeoutEl 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.

codeCausaAcción recomendada para el operador
OUT_OF_PAPERSin rollo de papel.Insertar rollo nuevo y reintentar.
COVER_OPENTapa del compartimento de papel abierta.Cerrar firmemente la tapa.
COVER_INCOMPLETETapa mal cerrada o rodillo sin presión.Abrir y cerrar asegurando el encaje del rodillo.
PAPER_JAMAtasco de papel en el mecanismo.Retirar el papel atascado y cerrar. Insertar rollo nuevo.
BUSYCola ocupada con skiplfBusy: true.Reintentar en unos segundos.
PRINTER_HOTCabezal térmico sobrecalentado.Esperar 2-3 minutos y reintentar.
MOTOR_HOTMotor de arrastre sobrecalentado.Esperar enfriamiento.
CUTTER_ERRORGuillotina de corte bloqueada.Requiere intervención de servicio técnico.
OFFLINEMó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.