Skip to main content

PhonePOS API Error Codes

This page is the canonical reference for shared status codes and terminal error codes used across the low-level and high-level PhonePOS APIs.

Primary Status Codes

These are the top-level status code returns by our APIs.

CodeNameDescription
0STATUS_TERMINAL_OPERATIONALThe terminal is operational and ready for payments.
1STATUS_PERSONALIZATION_NOT_DONE_YETThe terminal has not been personalised yet.
2STATUS_TERMINAL_NOT_OPERATIONALThe personalisation generally finished, but there are still issues that prevent full operation.
3STATUS_PERSONALIZATION_IN_PROGRESSThe personalisation is currently in progress.
100STATUS_PERSONALIZATION_FAILEDThe personalisation failed.
102STATUS_APP_IS_OUTDATEDPhonePOS must be updated first.

Terminal Error Codes

Depending on the API response, you may also receive one of the following terminal error codes. Error codes are classified as either General (🌎) or Personalisation (▶️). During Personalisation you need to handle both scopes. During startup and regular operation you only need to handle the General error codes.

Filter:
CodeNameDescriptionRecommended ActionScope
0100INVALID_JSONThe received provided JSON does not meet the required format specifications or is missing parts.Please check the format of the data you provided to PhonePOS.Personalisation
▶️
0117INVALID_CREDENTIAL_FORMATThe received personalisation data does not meet the required format specifications or is missing parts.Please check the format of the data you provided to PhonePOS.Personalisation
▶️
0120OTP_TYPE_NOT_AVAILABLEThe requested personalisation type is not available for the supplied credentials.Please re-onboard the terminal with your required personalisation type or switch to a supported personalisation type.Personalisation
▶️
0121RESEND_LIMIT_EXCEEDEDThe quota for sending the confirmation challenge has been reached.Please advise your client to wait.Personalisation
▶️
0222NETWORK_UNSTABLEThe device connection is unstable.Instruct the user to establish a stable connection first.General
🌎
0300NETWORK_UNAVAILABLEAn internet connection could not be established.Instruct the user to establish a stable connection first.General
🌎
0504SMS_SENDING_FAILEDErrors occurred while sending the confirmation challenge via SMS.It is likely that the configured phone number for the terminal is incorrect. Please contact our support.Personalisation
▶️
0511EMAIL_SENDING_FAILEDErrors occurred while sending the confirmation challenge via mail.It is likely that the configured mail address for the terminal is incorrect. Please contact our support.Personalisation
▶️
0512EMAIL_VERIFICATION_TIMEOUT_SERVERThe user did not react to the confirmation challenge in time.Please restart the personalisation and advise the user to complete the challenge as soon as possible.Personalisation
▶️
0614INVALID_CREDENTIALSThe provided authentication credentials are invalid.Advise the user to check the credentials and try the personalisation again.Personalisation
▶️
2310BATTERY_TOO_LOWThe battery level is too low for personalisation (<=15%) or transaction (<=10%).Instruct the user to charge the device first.General
🌎
2311INTERNAL_TERMINAL_CONNECTION_TIMEOUTThe connection to the terminal could not be established.Please contact support for further instructions.General
🌎
2314CANCELLED_BY_USERThe user canceled the personalisation process by performing a manual reset.Advise the user to start the personalisation again.Personalisation
▶️
2316PHONEPOS_ALREADY_PERSONALISEDThe terminal is already personalised.Perform a reset first if you want to start a new personalisation.Personalisation
▶️
2317PERSONALISATION_NOT_ALLOWEDThe request for personalisation was rejected.Please contact support for further instructions.Personalisation
▶️
2318EMV_UPLOAD_DENIED_FOR_SECURITY_REASONSThe OPI init with EMV upload was blocked for security reasons.The device is not compliant. Please contact our support.General
🌎
2319EMV_UPLOAD_FAILEDThe OPI init with EMV upload was not successful.Ensure that the merchant's firewall does not block PhonePOS traffic. If the error persists, please contact our support.General
🌎
2321INVALID_OTP_TYPEThe requested OTP confirmation service type is unknown to the terminal.Please check the values you submitted for the personalisation.Personalisation
▶️
2322INVALID_ATTESTATION_PROVIDER_REQUESTThe requested attestation provider is unknown to the terminal.Please check the values you submitted for the personalisation.Personalisation
▶️
2323CANCELED_BY_TERMINAL_HELPERThe personalisation was canceled through a call from the terminal helper service.Instruct the user to retry the personalisation. If the error persists, please contact our support.Personalisation
▶️
2324CANCELED_BY_ATTESTATIONThe personalisation was canceled through a reset action which was transmitted by the attestation service.Instruct the user to retry the personalisation. If the error persists, please contact our support.Personalisation
▶️
2325INSECURE_KEYSTOREThe device keystore is insecure. The device is incompatible with PhonePOS.Inform the user that the device cannot be used for PhonePOS.General
🌎
2527CERTIFICATE_ERRORAn error occurred during the mTLS handshake process. This is often caused by an inaccurate device clock or deep package inspection in the network.Instruct the user to adjust the time of the device. If the error persists, please contact our support.General
🌎
2602BAD_HTTP_CODEThe server responded with an unexpected HTTP code.Please contact our support.General
🌎
2604INVALID_CRYPTO_STATUSPayload decryption failed on the server side or on the client side.Please contact our support.General
🌎
2605INVALID_API_STATUSThe backend service could not process the request and returned a non-OK API response.Please contact our support.General
🌎
2610SERVER_TOO_BUSYThe backend servers are currently under high load.Please contact our support.General
🌎

Java Enum

When you use the Low-Level API this ENUM will help you to process the error codes correctly.
When you use the High-Level PhonePOS API, this ENUM is already included in the library.

public enum TerminalErrorCode {
INVALID_JSON("0100"),
INVALID_CREDENTIAL_FORMAT("0117"),
OTP_TYPE_NOT_AVAILABLE("0120"),
RESEND_LIMIT_EXCEEDED("0121"),
NETWORK_UNSTABLE("0222"),
NETWORK_UNAVAILABLE("0300"),
SMS_SENDING_FAILED("0504"),
EMAIL_SENDING_FAILED("0511"),
EMAIL_VERIFICATION_TIMEOUT_SERVER("0512"),
INVALID_CREDENTIALS("0614"),
BATTERY_TOO_LOW("2310"),
INTERNAL_TERMINAL_CONNECTION_TIMEOUT("2311"),
CANCELLED_BY_USER("2314"),
PHONEPOS_ALREADY_PERSONALISED("2316"),
PERSONALISATION_NOT_ALLOWED("2317"),
EMV_UPLOAD_DENIED_FOR_SECURITY_REASONS("2318"),
EMV_UPLOAD_FAILED("2319"),
INVALID_OTP_TYPE("2321"),
INVALID_ATTESTATION_PROVIDER_REQUEST("2322"),
CANCELED_BY_TERMINAL_HELPER("2323"),
CANCELED_BY_ATTESTATION("2324"),
INSECURE_KEYSTORE("2325"),
CERTIFICATE_ERROR("2527"),
BAD_HTTP_CODE("2602"),
INVALID_CRYPTO_STATUS("2604"),
INVALID_API_STATUS("2605"),
SERVER_TOO_BUSY("2610");

private final String code;

TerminalErrorCode(String code) {
this.code = code;
}

public String getCode() {
return code;
}

public static TerminalErrorCode fromCode(String code) {
for (TerminalErrorCode value : values()) {
if (value.code.equals(code)) {
return value;
}
}

return null;
}

public static TerminalErrorCode fromCode(int code) {
return fromCode(String.format(java.util.Locale.ROOT, "%04d", code));
}
}