Unified Error Catalog — Kushki ONE Connect

We simplify error management in Kushki ONE Connect. In the event of any operation failure, our API returns a structured payload in JSON format (LinkFailure) that standardizes the response regardless of whether the problem originated at the terminal, in validation, in authentication, or at the acquirer. This allows you to build more robust integrations, automate recovery flows, and stop relying exclusively on HTTP Status Codes.

This manual is your primary diagnostic tool. It details the structure of the new data model, the code catalogs by category, how we map third-party rejections, and a quick guide to resolving common problems.

1. Error Models

All errors share the same response structure. The type field should be evaluated first to classify the source of the failure, and then the corresponding code should be consulted.

FieldTypeAlways presentDescription
typeStringYesError category. Identifies the source of the failure. See Section 3.
codeStringYesUnique error code. Format: prefix + number (e.g., PAR-001, TER-002, ACQ-13).
paramStringNoThe exact field or parameter that caused the error. Primarily used in PARAMETER errors.
messageStringYesHuman-readable description of the reason for the failure.
objectObjectNoTraceability data. Includes client_transaction_id, terminal_id, and serial_number where applicable.

HTTP Status Code

The HTTP status code is consistent with the body’s type. For ACQUIRER errors, the same HTTP status originally returned by Kushki is preserved.

Canonical example

{
"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. Error Categories (type field)

typeOriginDescription
PARAMETERValidationIncorrect field submission: missing required fields, wrong type, or invalid format.
TERMINALTerminalTerminal physical state errors: busy, offline, not linked, incompatible mode.
AUTHENTICATIONSecurityUnable to authenticate the user or insufficient permissions to execute the action.
NOT_FOUNDRoutingService or endpoint not found. Invalid URL.
ACQUIRERAcquirerErrors related to transaction processing or authorization by the Kushki acquirer. Code with ACQ- prefix.
INTERNALApplicationUnexpected errors: services down, internal application errors.
CONFIGURATIONDMS ConfigurationThe requested operation is not enabled or exceeds the limits configured for this terminal in the DMS.
TERMINAL-PRINTERHardwareErrors thrown by the integrated thermal printer (out of paper, cover open, paper jam, etc.).
MANUFACTURERHardware SDKErrors from the manufacturer SDK (Sunmi, Landi). Code with MAN- prefix.

3. Validation Errors — type: “PARAMETER”

Generated when the sent request contains incorrectly formatted fields, values out of range, or missing required fields. The param field identifies the specific field that caused the error. All are 100% preventable by validating the payload before calling the API.

codeDescriptionMessage (template)Example
PAR-001Required field was not sent.Field {{field}} is required.Field amount.currency is required.
PAR-002Field of incorrect type.Field {{field}} must be a/an {{type}}Field amount.subtotal_iva must be an integer.
PAR-002Field with incorrect format or invalid value.Field {{field}} must satisfy: {{condition}}Field amount.iva must satisfy: value >= 0.

3.1 Request Validation Errors - type: “PARAMETER”

When the type is PARAMETER, the code field is always a positive numeric code in the 2001–2037 range. All are preventable by validating the payload in the checkout system before calling the API. There are also two special system format codes.

3.2 System Codes

codeError description
BAD_FORMATJSON/JVM parsing error. The request body is not a valid JSON or contains an incorrect data type in a field.
BUSYThe terminal is processing another request. The integrator must retry once the terminal becomes available.

3.3 Amount and Payment Field Validators (2001–2013)

CodeParameter / ObjectError messageApplies to
2001amount.currencyInvalid currency: {value}. Expected one of: [MXN, CLP, PEN, COP]All
2002amount.ivaamount.iva cannot be negativeAll
2003amount.subtotalIvaamount.subtotalIva cannot be negativeAll
2004amount.subtotalIva0amount.subtotalIva0 cannot be negativeAll
2005amount.tipamount.tip cannot be negative/pos_tip only
2006airportTaxairportTax cannot be negativeAll
2007iaciac cannot be negativeAll
2008iceice cannot be negativeAll
2009travelAgencytravelAgency cannot be negativeAll
2012deferredMonthsdeferredMonths must be > 0 when isDeferred is trueAll
2013cashbackAmountcashbackAmount must be > 0 when isCashback is true/pos_tip only

3.4 Transaction Identifier Validators (2010–2015)

CodeParameter / ObjectError message
2010clientTransactionIdclientTransactionId must be a valid UUID format
2011clientTransactionIdclientTransactionId is required
2014transactionReferencetransactionReference must be a valid UUID format
2015transactionReferencetransactionReference is required

3.5 Pagination and Date Validators (2016-2021)

CodeParameter / ObjectError message
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 Configuration Validators (2022-2037)

CodeParameter / ObjectError message
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. Terminal Errors — type: “TERMINAL”

Generated when the physical terminal cannot accept the requested operation. Unlike hardware errors, these indicate a status or connectivity issue with the terminal, not a component failure.

codeDescriptionMessage (template)Example
TER-001Terminal not linked to the merchant.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 not responding (offline or off-network).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 busy processing a transaction.Terminal {{serial_number}} is busy processing transaction (client_transaction_id: {{id}}).Terminal SN71652 is busy processing transaction (client_transaction_id: 8886523).
TER-004Terminal busy with an action other than payment.Terminal {{serial_number}} is busy executing action {{action}}.Terminal JH152353 is busy executing action PRINT.
TER-005Terminal in a mode incompatible with the operation.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 not enabled for this type of operation.The terminal is not allowed to process {{type}}.The terminal is not allowed to process TIP.

5. Authentication Errors — type: “AUTHENTICATION”

Generated when credentials are invalid or do not have sufficient permissions to execute the requested action.

codeDescriptionMessageExample
AUTH-001Credentials cannot be authenticated.Invalid or expired credentialsInvalid or expired credentials
AUTH-002Credentials are valid but without permission for the action.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. Routing and Internal Errors

type: “NOT_FOUND”

codeDescriptionMessage (template)Example
NF-001Service or endpoint not found.Service not found: {{url}}Service not found: https://api.kushkipagos.com/cobrar

type: “INTERNAL”

codeDescriptionMessageExample
INT-001Unexpected server or application error.Internal server error.Internal server error.

7. Acquirer Errors — type: “ACQUIRER”

Errors originated by the Kushki acquirer are encapsulated under type: ACQUIRER applying the following mapping rule.

Mapping Rule

  • code: Original Kushki code with prefix ”ACQ-”. Example: code ”13” → ACQ-13.
  • message: Same as the original message returned by Kushki.
  • object: Includes at least the following fields when applicable.
    • Client_transaction_id
    • terminal_id
    • serial_number
  • HTTP status: The same HTTP status originally returned by Kushki is preserved.

Mapping Example

Original Kushki error:

HTTP/1.1 400 Bad Request
{
"code": "13",
"message": "Either Invalid amount or Currency conversion field overflow"
}

Mapped error — Kushki ONE Connect response:

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. Manufacturer Errors — type: “MANUFACTURER”

Manufacturer SDK errors (Sunmi, Landi) are encapsulated under type: “MANUFACTURER” with code MAN-{manufacturer_code}. Negative codes from the Sunmi SDK are documented exactly as returned by the SDK.

Mapping Rule

  • code: Manufacturer SDK code with prefix ”MAN-”. Example: code ”-2001” → MAN—2001.
  • message: Original message from the manufacturer SDK.
  • object: Includes the following fields when applicable.
    • 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"
}
}

Most frequent Sunmi codes in production

code (MAN-)DescriptionRecommended action
MAN--2001Have no cardThe customer did not present the card. Request retry.
MAN--2002Multiple cardsThere is more than one card in the NFC field. Ask the customer to remove additional cards.
MAN--2581User canceledThe customer canceled. Handle as an expected cancellation.
MAN--2582MSR or IC interruptedReading interrupted. Request not to remove the card until the terminal indicates so.
MAN--3023DUKPT overflowDUKPT counter exhausted. Requires key reinjection. Contact support.
MAN--4104Card is lockedCard locked. The customer must contact their bank.
MAN--4111Card expiredCard expired. Inform the customer.
MAN--4120Amount exceeds contactless limitAmount exceeds NFC limit. Use chip (ICC).
MAN--50020PIN entry cancelThe customer canceled PIN entry. Handle as cancellation.
MAN--60001Input PIN timeoutThe customer did not enter the PIN in time. Request retry.

9. Configuration Errors — type: “CONFIGURATION”

Generated when the requested operation is not enabled for this terminal in the DMS, or when the submitted amount exceeds the configured limits. Unlike PARAMETER errors, these cannot be fixed by modifying the request payload — they require a configuration change on the terminal by the Kushki Operations team.

codeCauseRecommended action
-4001Tip is not enabled in the terminal configuration.Contact Kushki Operations to enable the tip feature in the DMS.
-4002Cashback is not enabled in the terminal configuration.Contact Kushki Operations to enable the cashback feature in the DMS.
-4003The requested cashback amount exceeds the configured maximum limit.Inform the customer of the available limit. Do not retry with the same amount.
-4006The transaction amount exceeds the configured maximum limit for this payment type.Inform the customer. Contact Kushki Operations if the limit needs to be adjusted.
{
"type": "CONFIGURATION",
"code": "-4001",
"message": "Tip is not enabled",
"object": {
"client_transaction_id": "c5a3f3be-9d6f-4d39-8af5-58dbb589af69",
"terminal_id": "172653",
"serial_number": "SN816265"
}
}

10. Quick Diagnostic Guide

When an error is received, follow these recommendations:

  • Is type AUTHENTICATION? → Verify credentials (AUTH-001) or permissions (AUTH-002).
  • Is type PARAMETER? → Check the field indicated in param. Add validation in the POS before calling the API.
  • Is type TERMINAL and code TER-002? → The terminal is offline. Verify network connectivity.
  • Is type TERMINAL and code TER-003 or TER-004? → The terminal is busy. Wait for the current operation to finish or use abort.
  • Is type TERMINAL and code TER-006? → Functionality not enabled on the terminal. Contact Kushki Operations to enable.
  • Is type DEVICE? → Physical hardware condition. Show the message to the operator with resolution instructions.
  • Is type MANUFACTURER and code starts with MAN—200? → Card reading problem. Request retry from the customer.
  • Is type MANUFACTURER and code is MAN—50020 or MAN—60001? → The customer canceled or did not enter the PIN. Treat as an expected cancellation.
  • Is type ACQUIRER? → Processor rejection. Show the message to the customer. Log the code (e.g., ACQ-13) with the client_transaction_id for support.
  • Is type INTERNAL or NOT_FOUND? → Log the full payload and escalate to Kushki technical support.
  • type is CONFIGURATION? → The feature is not enabled on the terminal or the amount exceeds the configured limit. Do not retry with the same payload. Contact Kushki Operations to adjust the configuration in the DMS.