Erreurs
Toutes les erreurs suivent la même enveloppe JSON, quel que soit l'endpoint.
{
"message": "Le code promo existe déjà",
"errorCode": "400:PROMO_CODE_ALREADY_EXISTS",
"path": "/coupons",
"date": "2026-01-15T09:30:00.000Z"
}
| Champ | Type | Description |
|---|---|---|
message | string | Message lisible, traduit selon x-lang. À afficher, pas à tester. |
errorCode | string | <statut HTTP>:<CODE>. Stable : c'est ce champ que votre code doit tester. |
path | string | URL appelée, avec la query string. |
date | string | Horodatage ISO 8601. |
details | object | Facultatif. Valeurs utiles au diagnostic (ex. crédits restants). |
validationErrors | array | Présent seulement pour 400:VALIDATION_ERROR : [{field, message}]. |
Erreurs de validation
{
"message": "email doit être un e-mail valide",
"errorCode": "400:VALIDATION_ERROR",
"path": "/clients",
"date": "2026-01-15T09:30:00.000Z",
"validationErrors": [
{"field": "email", "message": "email doit être un e-mail valide"},
{"field": "lastName", "message": "lastName doit contenir au moins 2 caractères"}
]
}
message reprend la première erreur. Pour les objets imbriqués, field contient le nom du champ final (backgroundColor), sans le chemin complet.
Bien gérer les erreurs
const res = await fetch(url, options);
if (!res.ok) {
const err = await res.json();
const [, code] = err.errorCode.split(':');
switch (code) {
case 'UNAUTHORIZED':
// jeton expiré : reconnectez-vous
break;
case 'VALIDATION_ERROR':
// corrigez les champs listés dans err.validationErrors
break;
case 'PASS_BUILDER_ERROR':
// erreur temporaire de génération du pass : réessayez plus tard
break;
default:
throw new Error(`${err.errorCode}: ${err.message}`);
}
}
- 4xx : la requête est en cause. Ne la renvoyez pas telle quelle.
- 5xx : erreur côté eldo wallet. Réessayez avec un délai croissant (1 s, 2 s, 4 s…).
- Chaque page de la référence API liste les erreurs propres à l'endpoint, avec un exemple de réponse.
Tous les codes
| HTTP | messageCode | Message | Que faire |
|---|---|---|---|
204 | NOTHING_TO_UPDATE | Aucune mise à jour nécessaire! | |
400 | ACTIVE_WELCOME_COUPON_ALREADY_EXISTS | Un coupon de bienvenue actif existe déjà | |
400 | ALL_CLIENTS_ALREADY_HAVE_COUPON | Tous les clients fournis possèdent déjà ce coupon | |
400 | ARRIVAL_TIME_MUST_BE_AFTER_DEPARTURE_TIME_CONSIDERING_DATES | La date d'arrivée doit être après la date de départ | |
400 | BATCH_LIMIT_EXCEEDED | Limite de lot dépassée (max 100) | |
400 | CENTER_ROW_IS_REQUIRED | Le centre est requis | |
400 | CHECKOUT_MUST_BE_AFTER_CHECKIN | La date de sortie doit être après la date d'entrée | |
400 | CLIENT_DOES_NOT_BELONG_TO_THIS_WALLET | Le client n'appartient pas à ce portefeuille | |
400 | CLIENTS_EXIST_FOR_THIS_CARD_TYPE | (missing in fr/errors.json; falls back to en) | |
400 | COMMUNICATION_DELETED | La communication est supprimée et ne peut être mise à jour | |
400 | DEFAULT_CLIENT_TYPE_REQUIRED | (missing in fr/errors.json; falls back to en) | |
400 | ERROR_CUSTOMER_TYPE_ASSIGNMENT | Erreur d'assignation du type de client | |
400 | FILE_REQUIRED | Le fichier est requis | |
400 | HOTEL_HAS_PASSES | L'hôtel a des passes! | |
400 | INSTANT_COMMUNICATION_ALREADY_EXISTS | La communication instantanée existe déjà | |
400 | INSUFFICIENT_CREDIT | Crédit {creditType} insuffisant : {required} requis, {remaining} restant(s) | |
400 | INVALID_DATE_RANGE | endDate doit être postérieure ou égale à startDate. | |
400 | INVALID_DEPARTURE_OR_ARRIVAL_DATETIME_FORMAT | Format de date de départ ou d'arrivée non valide | |
400 | INVALID_DEVICE_TYPE | Type d'appareil non valide: {deviceType} | |
400 | INVALID_JSON | Syntaxe JSON invalide dans le corps de la requête | |
400 | INVALID_MULTIPART | Requête multipart invalide : boundary manquant ou malformé dans l'en-tête Content-Type. Utilisez multipart/form-data avec un boundary valide pour les uploads de fichiers, ou application/json pour les mises à jour sans fichier. | |
400 | INVALID_PASS_KIND | Type de pass non valide | |
400 | INVALID_PASS_TYPE | Invalid pass type: {passType} | |
400 | INVALID_STATUS | Statut invalide fourni | |
400 | INVALID_WALLET_OBJECT_TYPE | Type d'objet de portefeuille non valide: {objectType} | |
400 | LEFT_ROW_IS_REQUIRED | Le gauche est requis | |
400 | MAX_WALLET_LOCATIONS_REACHED | Nombre maximum de locations atteint | |
400 | MISSING_ANDROID_OBJECT_ID | ID d'objet Android manquant | |
400 | MISSING_BARCODE | Code-barres manquant | |
400 | MISSING_RECIPIENT_DETAILS_FOR_NON_CLIENT | Informations manquantes (prénom, nom, email) pour un destinataire non-client | |
400 | MISSING_REQUIRED_FIELDS | Champs obligatoires manquants: {fields} | |
400 | NO_CLIENTS_FOUND | Aucun client trouvé | |
400 | NO_CUSTOMERS_FOUND | Aucun client trouvé | |
400 | NO_PASS_DATA_PROVIDED | Aucune donnée de pass fournie | |
400 | NO_RECIPIENTS_PROVIDED | Aucun destinataire fourni | |
400 | OPERATION_TYPE_NOT_ALLOWED | operationType n'est autorisé que lorsque transactionType vaut OPERATION | |
400 | OPERATION_TYPE_REQUIRED | operationType est requis lorsque transactionType vaut OPERATION | |
400 | PACK_ALREADY_EXISTS | Le nom du pack existe déjà | |
400 | PACK_INSUFFICIENT_CREDITS | Impossible d'assigner le pack : ce portefeuille compte {clientsCount} clients, mais le(s) crédit(s) {creditTypes} du pack en autorisent moins | |
400 | PASS_ALREADY_CANCELED | Impossible de mettre à jour un pass annulé | |
400 | PASS_ALREADY_EXPIRED | (missing in fr/errors.json; falls back to en) | |
400 | PASS_ALREADY_GENERATED | Pass déjà généré | |
400 | PASS_ALREADY_REDEEMED | Le pass est déjà utilisé | |
400 | PASS_NOT_REDEEMED | Le pass n'est pas utilisé | |
400 | PROMO_CODE_ALREADY_EXISTS | Le code promo existe déjà | |
400 | RIGHT_ROW_IS_REQUIRED | Le droit est requis | |
400 | SCHEDUle_DATE_PASSED | La date de planification est déjà passée | |
400 | SMS_CONFIG_REQUIRED | (missing in fr/errors.json; falls back to en) | |
400 | SMS_CREDENTIALS_NOT_CONFIGURED | Les identifiants SMS ne sont pas configurés pour ce portefeuille | |
400 | SMS_TITLE_IS_REQUIRED | Le titre du SMS est requis | |
400 | SYNC_EXECUTION_NOT_ALLOWED | L'exécution synchrone n'est pas autorisée pour les opérations par lots avec 1000 ou plus d'éléments. Veuillez définir forceSync sur false ou réduire le nombre d'éléments en dessous de 1000. | |
400 | SYNC_EXECUTION_NOT_ALLOWED_FOR_BULK_UPDATE_CLIENTS | (missing in fr/errors.json; falls back to en) | |
400 | SYSTEM_DOES_NOT_SUPPORT_MORE_THAN_100000_CUSTOMERS | Le système ne supporte pas plus de 100,000 clients | |
400 | UNEXPECTED_FIELD | Champs inattendu: {field} | |
400 | UNLIMITED_COMMUNICATION_ALREADY_EXISTS | La communication illimitée existe déjà | |
400 | UNSUPPORTED_EVENT_TYPE: | Type d'événement non pris en charge: {eventType} | |
400 | USE_OTHER_SERVICE_COMMUNICATION_DELETE | Utilisez le service de suppression pour supprimer la communication | |
400 | USER_ALREADY_EXISTS | L'utilisateur existe déjà | |
400 | VALIDATION_ERROR | Erreur de validation! | |
400 | WALLET_IDENTIFIER_REQUIRED | L'identifiant du portefeuille est requis pour la création du modèle de pass | |
400 | WALLET_NOT_CONFIGURED | (missing in fr/errors.json; falls back to en) | |
401 | PASSBUILDER_TOKEN_MISSING | Le token PassBuilder est manquant | |
401 | UNAUTHORIZED | Non autorisé! | |
403 | FORBIDDEN | Interdit! | |
404 | CERTIFICATE_NOT_FOUND | Certificat introuvable! | |
404 | CLASS_NOT_FOUND | Classe Google Wallet demandée introuvable. | |
404 | COUPON_TEMPLATE_NOT_FOUND | Modèle de coupon introuvable | |
404 | CREATE_WALLET_CLASS_FAILED | Échec de la création de la classe Google Wallet. | |
404 | INITIALIZE_WALLET_OBJECT_CLIENT_FAILED | Échec de l'initialisation du client Google Wallet. | |
404 | MISSING_ANDROID_CLASS_ID | ID de classe Android manquant | |
404 | MISSING_FIELD | champs manquants: {field} | |
404 | MODEL_NOT_FOUND | Modèle introuvable! | |
404 | OBJECT_CREATION_FAILED | Échec de la création de l'objet Google Wallet. | |
404 | OBJECT_NOT_FOUND | Objet introuvable | |
404 | OBJECT_UPDATE_FAILED | Échec de la mise à jour de l'objet Google Wallet. | |
404 | PACK_NOT_ASSIGNED | Aucun pack de crédits n'est assigné à ce portefeuille. | |
404 | PASS_BUILDER_PASS_ID_NOT_FOUND | ID de pass builder non trouvé | |
404 | PASS_NOT_FOUND | Pass introuvable | |
404 | PASSBUILDER_UPDATE_FAILED | Échec de la mise à jour du portefeuille avec les informations PassBuilder | |
404 | PATH_NOT_FOUND | Chemin introuvable! | |
404 | STORECARD_NOT_FOUND | Pass storecard introuvable | |
404 | TEMPLATE_NOT_FOUND | Le modèle n'existe pas : {templateName} | |
404 | TOKEN_MISMATCH_OR_DEVICE_NOT_FOUND | Non valide ou appareil introuvable | |
404 | UNSUPPORTED_WALLET_TYPE | Unsupported wallet type | |
404 | UPDATE_OPERATION_NOT_SUPPORTED | Mise à jour non prise en charge | |
404 | UPDATE_WALLET_CLASS_FAILED | Échec de la mise à jour de la classe Google Wallet. | |
404 | WALLET_NOT_FOUND | wallet introuvable | |
404 | WALLET_UPDATE_FAILED | Échec de la mise à jour du portefeuille | |
409 | BARCODE_ALREADY_EXISTS | Le code barre existe déjà | |
409 | CLIENT_ALREADY_EXISTS | Le client existe déjà | |
409 | EMAIL_ALREADY_EXISTS | L'email existe déjà | |
409 | INSUFFICIENT_CREDIT_PARTIAL | Certains canaux n'ont pas assez de crédits pour notifier tous les clients. Confirmez pour envoyer uniquement sur les canaux disposant de crédits. | |
409 | OVERLAPPING_COMMUNICATIONS | Des communications en surplomb existent pour les dates sélectionnées | |
409 | OVERLAPPING_DATES | L'hôtel est déjà réservé pour les dates sélectionnées | |
409 | PACK_HAS_ASSIGNED_MANAGERS | Impossible de supprimer le pack : des managers y sont encore assignés | |
409 | PASSBUILDER_IDENTITY_INCOMPLETE | L'identité PassBuilder est incomplète ou contradictoire. Réparez le portefeuille avant de continuer. | |
409 | PASSBUILDER_IDENTITY_PROVISIONING | La création de l'identité PassBuilder est déjà en cours. Réessayez dans un instant. | |
409 | PUSH_NOTIFICATION_SCHEDULE_CONFLICT | Une notification est déjà programmée à cette date et heure. Veuillez choisir un autre horaire (à au moins {seconds} secondes d'intervalle). | |
409 | STORE_CARD_ALREADY_EXISTS | Ce wallet a déjà une carte de fidélité | |
409 | TEMPLATE_ALREADY_EXISTS | Le modèle existe déjà | |
415 | UNSUPPORTED_MEDIA_TYPE | Type de contenu non pris en charge. Utilisez application/json ou multipart/form-data. | |
500 | BATCH_OPERATION_FAILED | Échec de l'opération par lots: {error} | |
500 | GOOGLE_AUTH_INIT_FAILED | Échec de l'initialisation du client Google Auth. | |
500 | UNKNOWN_ERROR | Erreur inconnue! | |
500 | WALLET_CLIENT_INIT_FAILED | Échec de l'initialisation du client Google Wallet. | |
500 | WALLET_UPDATE_ERROR | Une erreur est survenue lors de la mise à jour du portefeuille | |
502 | SMS_CREDIT_LOOKUP_FAILED | Échec de la récupération des crédits SMS | |
502 | SMS_LOGIN_FAILED | Échec de l'authentification auprès du fournisseur SMS | |
502 | SMS_SEND_FAILED | Échec de l'envoi du SMS via le fournisseur | |
503 | PASS_BUILDER_ERROR | Service externe en erreur |