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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| MISSING_API_KEY | 401 | ClĂ© 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_KEY | 401 | Clé 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| ACCOUNT_DISABLED | 403 | Compte 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_FROZEN | 403 | Compte 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_ALLOWED | 403 | Adresse 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| MISSING_REQUIRED_FIELD | 400 | Champ 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_FORMAT | 400 | Format 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_VALUE | 400 | Valeur 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_LENGTH | 400 | Longueur 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_FORMAT | 400 | Format 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_QUANTITY | 400 | QuantitĂ© invalideLa quantitĂ© doit ĂȘtre un entier positif. | Indiquez une quantitĂ© entiĂšre >= 1.action: FIX_INPUT · retryable: false · retry_after: null |
| INVALID_CATEGORY_ID | 400 | ID 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_ID | 400 | ID 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_ID | 400 | ID 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_SUBCATEGORY | 400 | Sous-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_CONFIG | 400 | Configuration 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_PAGINATION | 400 | ParamÚ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_FORMAT | 400 | Format 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| PLAYER_NOT_FOUND | 400 | Joueur 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_UNAVAILABLE | 503 | Impossible 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_BUSY | 429 | Cet 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_FAILED | 400 | Ă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_MISMATCH | 400 | La 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| INSUFFICIENT_BALANCE | 400 | Solde 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_STOCK | 400 | Produit 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_STOCK | 400 | Moins 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_UNAVAILABLE | 409 | Ce 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_UPDATING | 409 | Le 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_FOUND | 400 | Cette 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_ORDER | 409 | ID 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_INCREASED | 400 | Le 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_DISABLED | 400 | Sous-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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| ORDER_NOT_FOUND | 404 | Commande 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_FOUND | 404 | Article 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_FOUND | 404 | Aucun 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_AVAILABLE | 404 | Article 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| INVALID_ORDER_IDS_FORMAT | 400 | Format 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_IDS | 400 | Tableau 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_IDS | 400 | Trop 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| RATE_LIMIT_EXCEEDED | 429 | Limite 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)
| Code | HTTP | Signification | Comment le corriger |
|---|---|---|---|
| INTERNAL_ERROR | 500 | Erreur 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_UNAVAILABLE | 503 | Service 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.