Skip to main content

Errors

All errors share the same JSON envelope, whatever the endpoint.

{
"message": "Promo code already exists",
"errorCode": "400:PROMO_CODE_ALREADY_EXISTS",
"path": "/coupons",
"date": "2026-01-15T09:30:00.000Z"
}
FieldTypeDescription
messagestringHuman-readable message, translated according to x-lang. Display it, don't test it.
errorCodestring<HTTP status>:<CODE>. Stable: this is the field your code should test.
pathstringThe URL called, including the query string.
datestringISO 8601 timestamp.
detailsobjectOptional. Values that help with diagnosis (e.g. remaining credits).
validationErrorsarrayOnly present for 400:VALIDATION_ERROR: [{field, message}].

Validation errors​

{
"message": "email must be an email",
"errorCode": "400:VALIDATION_ERROR",
"path": "/clients",
"date": "2026-01-15T09:30:00.000Z",
"validationErrors": [
{"field": "email", "message": "email must be an email"},
{"field": "lastName", "message": "lastName must be longer than or equal to 2 characters"}
]
}

message repeats the first error. For nested objects, field holds the name of the leaf field (backgroundColor), not the full path.

Handle errors properly​

const res = await fetch(url, options);
if (!res.ok) {
const err = await res.json();
const [, code] = err.errorCode.split(':');
switch (code) {
case 'UNAUTHORIZED':
// token expired: log in again
break;
case 'VALIDATION_ERROR':
// fix the fields listed in err.validationErrors
break;
case 'PASS_BUILDER_ERROR':
// temporary pass generation error: retry later
break;
default:
throw new Error(`${err.errorCode}: ${err.message}`);
}
}
  • 4xx: the request is at fault. Don't resend it as is.
  • 5xx: an error on eldo wallet's side. Retry with an increasing delay (1 s, 2 s, 4 s…).
  • Each page of the API reference lists the errors specific to that endpoint, with a sample response.

All codes​

HTTPmessageCodeMessageWhat to do
204NOTHING_TO_UPDATENothing to update!
400ACTIVE_WELCOME_COUPON_ALREADY_EXISTSActive welcome coupon already exists
400ALL_CLIENTS_ALREADY_HAVE_COUPONAll provided clients already have this coupon
400ARRIVAL_TIME_MUST_BE_AFTER_DEPARTURE_TIME_CONSIDERING_DATESArrival time must be after departure time considering dates
400BATCH_LIMIT_EXCEEDEDBatch limit exceeded (max 100)
400CENTER_ROW_IS_REQUIREDCenter row is required
400CHECKOUT_MUST_BE_AFTER_CHECKINCheckout must be after checkin
400CLIENT_DOES_NOT_BELONG_TO_THIS_WALLETClient does not belong to this wallet
400CLIENTS_EXIST_FOR_THIS_CARD_TYPEClients exist for this card type
400COMMUNICATION_DELETEDCommunication is deleted and cannot be updated
400DEFAULT_CLIENT_TYPE_REQUIREDAt least one client type must remain default
400ERROR_CUSTOMER_TYPE_ASSIGNMENTError customer type assignment
400FILE_REQUIREDFile is required
400HOTEL_HAS_PASSESHotel has passes!
400INSTANT_COMMUNICATION_ALREADY_EXISTSInstant communication already exists
400INSUFFICIENT_CREDITInsufficient {creditType} credit: {required} required, {remaining} remaining
400INVALID_DATE_RANGEendDate must be on or after startDate.
400INVALID_DEPARTURE_OR_ARRIVAL_DATETIME_FORMATInvalid departure or arrival datetime format
400INVALID_DEVICE_TYPEInvalid device type: {deviceType}
400INVALID_JSONInvalid JSON syntax in request body
400INVALID_MULTIPARTInvalid multipart request: missing or malformed boundary in Content-Type header. Use multipart/form-data with a valid boundary for file uploads, or application/json for JSON-only updates.
400INVALID_PASS_KINDInvalid pass kind
400INVALID_PASS_TYPEInvalid pass type: {passType}
400INVALID_STATUSInvalid status provided
400INVALID_WALLET_OBJECT_TYPEInvalid wallet object type: {objectType}
400LEFT_ROW_IS_REQUIREDLeft row is required
400MAX_WALLET_LOCATIONS_REACHEDMax wallet locations reached
400MISSING_ANDROID_OBJECT_IDMissing Android object ID
400MISSING_BARCODEMissing barcode
400MISSING_RECIPIENT_DETAILS_FOR_NON_CLIENTMissing recipient details (firstName, lastName, email) for non-client recipient
400MISSING_REQUIRED_FIELDSMissing required fields: {fields}
400NO_CLIENTS_FOUNDNo clients found
400NO_CUSTOMERS_FOUNDNo customers found
400NO_PASS_DATA_PROVIDEDNo pass data provided
400NO_RECIPIENTS_PROVIDEDNo recipients provided
400OPERATION_TYPE_NOT_ALLOWEDoperationType is only allowed when transactionType is OPERATION
400OPERATION_TYPE_REQUIREDoperationType is required when transactionType is OPERATION
400PACK_ALREADY_EXISTSPack name already exists
400PACK_INSUFFICIENT_CREDITSCannot assign pack: this wallet has {clientsCount} clients, but the pack's {creditTypes} credit(s) allow fewer than that
400PASS_ALREADY_CANCELEDCannot update a canceled pass
400PASS_ALREADY_EXPIREDPass already expired
400PASS_ALREADY_GENERATEDPass already generated
400PASS_ALREADY_REDEEMEDPass is already redeemed
400PASS_NOT_REDEEMEDPass is not redeemed
400PROMO_CODE_ALREADY_EXISTSPromo code already exists
400RIGHT_ROW_IS_REQUIREDRight row is required
400SCHEDUle_DATE_PASSEDSchedule date has already passed
400SMS_CONFIG_REQUIREDSMS configuration is required
400SMS_CREDENTIALS_NOT_CONFIGUREDSMS credentials are not configured for this wallet
400SMS_TITLE_IS_REQUIREDSMS title is required
400SYNC_EXECUTION_NOT_ALLOWEDSynchronous execution is not allowed for bulk operations with 1000 or more items. Please set forceSync to false or reduce the number of items below 1000.
400SYNC_EXECUTION_NOT_ALLOWED_FOR_BULK_UPDATE_CLIENTSSynchronous execution is not allowed for bulk update clients with 1000 or more items. Please set forceSync to false or reduce the number of items below 1000.
400SYSTEM_DOES_NOT_SUPPORT_MORE_THAN_100000_CUSTOMERSSystem does not support more than 100,000 customers
400UNEXPECTED_FIELDUnexpected field: {field}
400UNLIMITED_COMMUNICATION_ALREADY_EXISTSUnlimited communication already exists
400UNSUPPORTED_EVENT_TYPE:Unsupported event type: {eventType}
400USE_OTHER_SERVICE_COMMUNICATION_DELETEUse delete service to delete communication
400USER_ALREADY_EXISTSUser already exists
400VALIDATION_ERRORValidation error!
400WALLET_IDENTIFIER_REQUIREDWallet identifier is required for pass template creation
400WALLET_NOT_CONFIGUREDWallet is not configured with pass-builder. Please complete wallet migration first.
401PASSBUILDER_TOKEN_MISSINGPassBuilder token is missing
401UNAUTHORIZEDUnauthorized!
403FORBIDDENForbidden!
404CERTIFICATE_NOT_FOUNDCertificate not found!
404CLASS_NOT_FOUNDRequested Google Wallet class not found.
404COUPON_TEMPLATE_NOT_FOUNDCoupon template not found
404CREATE_WALLET_CLASS_FAILEDFailed to create Google Wallet class.
404INITIALIZE_WALLET_OBJECT_CLIENT_FAILEDFailed to initialize Google Wallet client.
404MISSING_ANDROID_CLASS_IDMissing Android class ID
404MISSING_FIELDMissing field: {field}
404MODEL_NOT_FOUNDModel not found!
404OBJECT_CREATION_FAILEDFailed to create Google Wallet object.
404OBJECT_NOT_FOUNDObject not found
404OBJECT_UPDATE_FAILEDFailed to update Google Wallet object.
404PACK_NOT_ASSIGNEDNo credit pack is assigned to this wallet.
404PASS_BUILDER_PASS_ID_NOT_FOUNDPass builder pass ID not found
404PASS_NOT_FOUNDPass not found
404PASSBUILDER_UPDATE_FAILEDFailed to update wallet with PassBuilder info
404PATH_NOT_FOUNDPath not found!
404STORECARD_NOT_FOUNDStorecard pass not found
404TEMPLATE_NOT_FOUNDTemplate not found : {templateName}
404TOKEN_MISMATCH_OR_DEVICE_NOT_FOUNDToken mismatch or device not found
404UNSUPPORTED_WALLET_TYPEUnsupported wallet type
404UPDATE_OPERATION_NOT_SUPPORTEDUpdate operation not supported
404UPDATE_WALLET_CLASS_FAILEDFailed to update Google Wallet class.
404WALLET_NOT_FOUNDWallet not found
404WALLET_UPDATE_FAILEDFailed to update wallet
409BARCODE_ALREADY_EXISTSBarcode already exists
409CLIENT_ALREADY_EXISTSClient already exists
409EMAIL_ALREADY_EXISTSEmail already exists
409INSUFFICIENT_CREDIT_PARTIALSome channels do not have enough credit to notify every client. Confirm to send only on the channels that do.
409OVERLAPPING_COMMUNICATIONSOverlapping communications exist for the selected dates
409OVERLAPPING_DATESHotel is already reserved for the selected dates
409PACK_HAS_ASSIGNED_MANAGERSCannot delete pack: managers are still assigned to it
409PASSBUILDER_IDENTITY_INCOMPLETEPassBuilder identity is incomplete or contradictory. Repair the wallet before continuing.
409PASSBUILDER_IDENTITY_PROVISIONINGPassBuilder identity provisioning is already in progress. Retry shortly.
409PUSH_NOTIFICATION_SCHEDULE_CONFLICTA notification is already scheduled at this date and time. Please choose another time at least {seconds} seconds apart.
409STORE_CARD_ALREADY_EXISTSThis wallet already has a loyalty card
409TEMPLATE_ALREADY_EXISTSTemplate already exists
415UNSUPPORTED_MEDIA_TYPEUnsupported Content-Type. Use application/json or multipart/form-data.
500BATCH_OPERATION_FAILEDBatch operation failed: {error}
500GOOGLE_AUTH_INIT_FAILEDFailed to initialize Google Auth client.
500UNKNOWN_ERRORUnknown error!
500WALLET_CLIENT_INIT_FAILEDFailed to initialize Google Wallet client.
500WALLET_UPDATE_ERRORAn error occurred while updating the wallet
502SMS_CREDIT_LOOKUP_FAILEDFailed to retrieve SMS credit information
502SMS_LOGIN_FAILEDFailed to authenticate with the SMS provider
502SMS_SEND_FAILEDFailed to send SMS through the provider
503PASS_BUILDER_ERRORExternal service error

API news, once a month

New endpoints, upcoming changes, guides and use cases. No spam, one-click unsubscribe.

Report a technical problem

An API error, a pass that does not update, an email that does not arrive? Describe the problem: our technical team will answer.

For a fast answer, include:

  • The method and endpoint (e.g. POST /clients)
  • The error code returned (errorCode) and the body sent
  • The date and time of the call
  • The identifiers involved (customer, template, pass)

Never include an API token or a password.

AI assistant

Beta

Loading…

AI-generated answers (Claude): double-check important details.

Sign in to use the assistant