Codes d'erreur et statuts HTTP

Chaque Ă©chec renvoie un code stable, lisible par une machine, Ă  cĂŽtĂ© du statut HTTP. Branchez-vous sur le code, jamais sur le texte du message : les messages sont Ă©crits pour des humains et peuvent ĂȘtre reformulĂ©s, tandis que les codes font partie du contrat.

L'ensemble des 42 codes que l'API revendeur peut renvoyer, regroupés par nature du problÚme. Chaque entrée précise le statut HTTP qui l'accompagne et le changement qui la résout.

Authentification (401)

CodeHTTPSignificationComment le corriger
MISSING_API_KEY401ClĂ© API requiseAucun en-tĂȘte Authorization n'a Ă©tĂ© envoyĂ©, ou son format est incorrect.Ajoutez l'en-tĂȘte : Authorization: Bearer <keyId>.<secret>action: FIX_INPUT · retryable: false · retry_after: null
INVALID_API_KEY401Clé API invalideLa clé API fournie ne correspond à aucune clé active.Vérifiez votre ID de clé et votre secret. Au besoin, régénérez la clé depuis le panneau AccÚs API.action: FIX_INPUT · retryable: false · retry_after: null

Autorisation (403)

CodeHTTPSignificationComment le corriger
ACCOUNT_DISABLED403Compte désactivéCe code n'est plus renvoyé. Un compte qui ne peut pas passer de commande reçoit ACCOUNT_FROZEN (HTTP 403).Gérez ACCOUNT_FROZEN à la place.Plus renvoyé, remplacé par ACCOUNT_FROZEN
ACCOUNT_FROZEN403Compte geléVotre compte a été gelé temporairement, en général à cause d'une activité suspecte.Contactez le support pour faire dégeler votre compte.action: CONTACT_SUPPORT · retryable: false · retry_after: null
IP_NOT_ALLOWED403Adresse IP absente de la liste autorisĂ©eLa requĂȘte provient d'une adresse IP qui ne figure pas dans la liste autorisĂ©e de votre clĂ© API.Ajoutez l'IP de votre serveur Ă  la liste autorisĂ©e dans le panneau AccĂšs API, ou supprimez les restrictions d'IP.action: FIX_INPUT · retryable: false · retry_after: null

Validation de la requĂȘte (400)

CodeHTTPSignificationComment le corriger
MISSING_REQUIRED_FIELD400Champ obligatoire manquantUn champ obligatoire manque dans le corps de la requĂȘte. Pour les champs liĂ©s au joueur, details.field indique le champ manquant.Consultez la documentation de l'endpoint, ainsi que GET /catalog/category/:categoryId/requirements pour les champs joueur, puis envoyez tous les champs obligatoires.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_FORMAT400Format de paramÚtre invalideUn champ requis n'a pas le bon format (du texte dans un champ numérique, par exemple). La propriété details.field indique de quel champ il s'agit.Relisez les champs requis de la catégorie et envoyez ce champ au format attendu par son data_type et ses rÚgles de validation.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_VALUE400Valeur de paramÚtre invalideLa valeur d'un champ requis sort des valeurs autorisées : sous le minimum, au-dessus du maximum ou absente de ses select_options. Le champ en cause figure dans details.field.Envoyez une valeur que les champs requis de la catégorie acceptent pour ce champ.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PARAMETER_LENGTH400Longueur de paramÚtre invalideUn champ requis est trop court ou trop long par rapport à la limite autorisée. Vous retrouvez dans details.field le nom du champ en question.Vérifiez min_length / max_length dans les champs requis de la catégorie.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_UUID_FORMAT400Format UUID invalideL'order_id n'est pas un UUID valide.Utilisez n'importe quel format UUID valide (v1, v4, v7, etc.). Format : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_QUANTITY400QuantitĂ© invalideLa quantitĂ© doit ĂȘtre un entier positif.Indiquez une quantitĂ© entiĂšre >= 1.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_CATEGORY_ID400ID de catégorie invalideLe categoryId fourni n'est pas un nombre valide.Retrouvez les ID de catégorie valides avec l'explorateur de catalogue ou GET /catalog/categories.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_BIG_CATEGORY_ID400ID de catégorie principale invalideLe bigCategoryId fourni n'est pas un nombre valide.L'explorateur de catalogue ou GET /catalog/big-categories vous donne les ID de catégorie principale valides.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_ITEM_ID400ID d'article invalideL'ID d'article fourni n'est pas valide.Consultez l'explorateur de catalogue ou GET /catalog/subcategories pour trouver des ID d'article valides.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_SUBCATEGORY400Sous-catégorie invalideCet ID de sous-catégorie n'existe pas.Vérifiez le sub_category_id via les endpoints du catalogue.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_PRODUCT_CONFIG400Configuration produit invalideCe code n'est plus renvoyĂ©. Un champ requis manquant renvoie dĂ©sormais MISSING_REQUIRED_FIELD, et un produit qui ne peut pas ĂȘtre vendu pour le moment renvoie PRODUCT_UNAVAILABLE.GĂ©rez plutĂŽt MISSING_REQUIRED_FIELD et PRODUCT_UNAVAILABLE.Plus renvoyĂ©, remplacĂ© par MISSING_REQUIRED_FIELD
INVALID_PAGINATION400ParamÚtres de pagination invalidesLes valeurs de page ou de limit sortent de la plage autorisée.Utilisez page >= 1 et un limit compris entre 1 et 100.action: FIX_INPUT · retryable: false · retry_after: null
INVALID_DATE_FORMAT400Format de date invalideLe paramÚtre created_after ou created_before n'est pas une date ISO 8601 valide.Respectez le format ISO 8601 : 2024-01-01T00:00:00Z.action: FIX_INPUT · retryable: false · retry_after: null

Vérification du joueur (400 / 429 / 503)

CodeHTTPSignificationComment le corriger
PLAYER_NOT_FOUND400Joueur introuvableLe jeu a confirmĂ© que cet ID joueur n'existe pas. Ce code n'apparaĂźt que sur une rĂ©ponse confirmĂ©e. Si l'ID ne peut pas ĂȘtre vĂ©rifiĂ©, vous recevez PLAYER_CHECK_UNAVAILABLE.VĂ©rifiez l'ID joueur. Regardez aussi si le jeu exige un zone_id.action: FIX_INPUT · retryable: false · retry_after: null
PLAYER_CHECK_UNAVAILABLE503Impossible de vĂ©rifier les ID joueur de ce jeu pour le momentLes ID joueur de ce jeu ne peuvent pas ĂȘtre vĂ©rifiĂ©s en ce moment. L'ID joueur n'a PAS Ă©tĂ© refusĂ©.Renvoyez la mĂȘme requĂȘte aprĂšs retry_after secondes. N'annoncez pas Ă  votre client que son ID est faux.action: RETRY_LATER · retryable: true · retry_after: 60
PLAYER_BUSY429Cet ID joueur est dĂ©jĂ  en cours de vĂ©rificationUne autre requĂȘte pour le mĂȘme ID joueur est encore en cours de vĂ©rification.RĂ©essayez aprĂšs retry_after secondes.action: RETRY_SOON · retryable: true · retry_after: 5
PLAYER_VALIDATION_FAILED400Échec de la validation du joueurCe code n'est plus renvoyĂ©. Un ID joueur impossible Ă  vĂ©rifier pour le moment renvoie PLAYER_CHECK_UNAVAILABLE (HTTP 503).GĂ©rez plutĂŽt PLAYER_CHECK_UNAVAILABLE.Plus renvoyĂ©, remplacĂ© par PLAYER_CHECK_UNAVAILABLE
REGION_MISMATCH400La rĂ©gion de ce joueur ne peut pas recevoir ce produitLe joueur appartient Ă  une rĂ©gion oĂč ce produit ne peut pas ĂȘtre livrĂ©. L'erreur contient player_region et player_name.Choisissez le produit qui correspond Ă  la rĂ©gion du joueur.action: CHOOSE_OTHER · retryable: false · retry_after: null

RÚgles métier (400 / 409)

CodeHTTPSignificationComment le corriger
INSUFFICIENT_BALANCE400Solde du portefeuille insuffisantVotre portefeuille ne contient pas assez de fonds pour finaliser cette commande.Alimentez votre portefeuille depuis la page de recharge avant de commander.action: TOP_UP · retryable: false · retry_after: null
OUT_OF_STOCK400Produit en rupture de stockCe produit est en rupture de stock pour le moment.Réessayez plus tard ou choisissez un autre produit.action: RETRY_LATER · retryable: true · retry_after: null
INSUFFICIENT_STOCK400Moins d'unitĂ©s disponibles que demandĂ©Le stock disponible est infĂ©rieur Ă  la quantitĂ© commandĂ©e. Contrairement Ă  OUT_OF_STOCK, vous pouvez agir ici : error.max_quantity indique combien d'unitĂ©s peuvent ĂȘtre commandĂ©es en ce moment. Rien n'a Ă©tĂ© dĂ©bitĂ©.Renvoyez la commande avec une quantitĂ© Ă©gale ou infĂ©rieure Ă  error.max_quantity.action: FIX_INPUT · retryable: false · retry_after: null
PRODUCT_UNAVAILABLE409Ce produit est temporairement indisponibleLe produit existe, mais il ne peut pas ĂȘtre vendu pour le moment.RĂ©essayez plus tard ou choisissez un autre produit.action: RETRY_LATER · retryable: true · retry_after: null
PRICING_UPDATING409Le prix du produit est en cours de mise Ă  jourLe prix de ce produit est en train d'ĂȘtre actualisĂ©.AprĂšs retry_after secondes, renvoyez la mĂȘme requĂȘte, puis vĂ©rifiez de nouveau le prix.action: RETRY_SOON · retryable: true · retry_after: 30
OFFER_NOT_FOUND400Cette offre n'est pas disponible pour ce compte joueurUne offre Ă  usage unique (par exemple un bonus de premiĂšre recharge) n'est pas disponible pour ce compte joueur. Elle a peut-ĂȘtre dĂ©jĂ  Ă©tĂ© utilisĂ©e.Choisissez un autre produit pour ce joueur.action: CHOOSE_OTHER · retryable: false · retry_after: null
DUPLICATE_ORDER409ID de commande en doubleUne commande avec cet UUID existe déjà. Il s'agit d'une protection d'idempotence.Générez un nouvel UUID pour une nouvelle commande. Si vous recevez cette erreur lors d'une nouvelle tentative, la premiÚre a abouti : consultez cette commande avec GET /orders/{orderId} au lieu d'en créer une autre.action: CHECK_ORDER · retryable: false · retry_after: null
PRICE_INCREASED400Le prix a augmenté au-delà de la valeur attendueLe prix unitaire actuel est supérieur à la valeur expected_unit_price que vous avez fournie.Récupérez le dernier prix avec GET /catalog/subcategory/:id/price, puis mettez à jour expected_unit_price.action: FIX_INPUT · retryable: false · retry_after: null
SUBCATEGORY_DISABLED400Sous-catĂ©gorie dĂ©sactivĂ©eCette erreur n'est plus renvoyĂ©e. Un produit qui ne peut pas ĂȘtre vendu pour le moment rĂ©pond PRODUCT_UNAVAILABLE (HTTP 409).GĂ©rez plutĂŽt PRODUCT_UNAVAILABLE.Plus renvoyĂ©, remplacĂ© par PRODUCT_UNAVAILABLE

Introuvable (404)

CodeHTTPSignificationComment le corriger
ORDER_NOT_FOUND404Commande introuvableAucune commande n'existe avec l'ID de commande indiqué.Vérifiez que l'ID de commande est correct.action: FIX_INPUT · retryable: false · retry_after: null
ITEM_NOT_FOUND404Article introuvableL'article du catalogue demandé n'existe pas.Utilisez les endpoints du catalogue pour trouver des ID d'article valides.action: FIX_INPUT · retryable: false · retry_after: null
NO_REQUIREMENTS_FOUND404Aucun prérequis trouvé pour cette catégorieCette catégorie n'a aucun prérequis joueur à renvoyer pour le moment.Revenez plus tard ou sélectionnez une autre catégorie.action: RETRY_LATER · retryable: true · retry_after: null
ITEM_NOT_AVAILABLE404Article indisponibleCode retirĂ© : il n'est plus renvoyĂ©. Un article qui existe mais ne peut pas ĂȘtre vendu pour le moment rĂ©pond PRODUCT_UNAVAILABLE (HTTP 409).GĂ©rez PRODUCT_UNAVAILABLE Ă  la place.Plus renvoyĂ©, remplacĂ© par PRODUCT_UNAVAILABLE

Validation des requĂȘtes groupĂ©es (400)

CodeHTTPSignificationComment le corriger
INVALID_ORDER_IDS_FORMAT400Format de order_ids invalideLe champ order_ids doit ĂȘtre un tableau de chaĂźnes de caractĂšres.Envoyez order_ids sous cette forme : { "order_ids": ["uuid1", "uuid2"] }.action: FIX_INPUT · retryable: false · retry_after: null
EMPTY_ORDER_IDS400Tableau order_ids videLe tableau order_ids ne peut pas ĂȘtre vide.Indiquez au moins un ID de commande dans le tableau.action: FIX_INPUT · retryable: false · retry_after: null
TOO_MANY_ORDER_IDS400Trop d'ID de commandeVous pouvez interroger 50 ID de commande au maximum en une seule fois.RĂ©partissez votre requĂȘte en lots de 50 ou moins.action: FIX_INPUT · retryable: false · retry_after: null

Limitation de débit (429)

CodeHTTPSignificationComment le corriger
RATE_LIMIT_EXCEEDED429Limite de requĂȘtes dĂ©passĂ©eVous avez dĂ©passĂ© la limite de cet endpoint. Les quotas par minute (catalog, orders, account) renvoient X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset Ă  chaque rĂ©ponse, et details reprend limit, remaining (0), retry_after et window_seconds. POST /player/validate est dĂ©comptĂ© sur votre quota quotidien de vĂ©rifications joueur : il n'envoie aucun en-tĂȘte X-RateLimit, et sa rĂ©ponse 429 contient limit, current, remaining, reset_at et reset_in_seconds dans error. Dans les deux cas, error.retry_after et l'en-tĂȘte Retry-After indiquent le nombre de secondes Ă  attendre.Attendez le nombre de secondes indiquĂ© dans retry_after ou dans l'en-tĂȘte Retry-After avant de rĂ©essayer. Sur les endpoints limitĂ©s Ă  la minute, surveillez X-RateLimit-Remaining pour Ă©viter d'atteindre la limite.action: RETRY_LATER · retryable: true · retry_after: secondes avant la rĂ©initialisation

CÎté serveur (5xx)

CodeHTTPSignificationComment le corriger
INTERNAL_ERROR500Erreur interne du serveurUne erreur inattendue s'est produite sur le serveur.Renvoyez la requĂȘte aprĂšs retry_after secondes. Pour POST /orders/create, rĂ©utilisez le mĂȘme order_id : la commande ne pourra ainsi jamais ĂȘtre créée deux fois. Si le problĂšme persiste, contactez le support.action: RETRY_LATER · retryable: true · retry_after: 30
SERVICE_UNAVAILABLE503Service temporairement indisponibleCe code n'est plus renvoyĂ©. Une panne cĂŽtĂ© serveur rĂ©pond INTERNAL_ERROR (HTTP 500) ; le seul code 503 est PLAYER_CHECK_UNAVAILABLE, lorsqu'un ID joueur ne peut pas ĂȘtre vĂ©rifiĂ© pour le moment.Traitez plutĂŽt INTERNAL_ERROR et PLAYER_CHECK_UNAVAILABLE.Plus renvoyĂ©, remplacĂ© par INTERNAL_ERROR

Nouveau sur la plateforme ? Commencez par la présentation de l'API de recharge de jeux pour revendeurs, ou lisez la présentation du programme revendeur SHOP2TOPUP pour comprendre le fonctionnement du compte partenaire.

Codes d'erreur de l'API — Chaque code et sa solution