Référence

Codes d’erreur

Une erreur dit toujours ce qui n’allait pas et, quand c’est possible, ce qu’il fallait écrire à la place. Cette page recense les cas, canal par canal, et sépare ce qui mérite un réessai de ce qui n’en mérite aucun.

#La forme d’une erreur

Le détail est porté par la clé detail. Sur les erreurs de validation, il nomme la valeur fautive et, lorsqu’une liste finie existe, l’énumère.

400
{
  "detail": "Symbole 'PEPEUSDT' inconnu. Valeurs acceptees : BTCUSDT, ETHUSDT, ..."
}

Les refus liés à l’offre ont une forme fixe, posée par la passerelle : status, timestamp et detail, plus retry_after sur les refus temporels — également présent dans l’en-tête Retry-After. L’en-tête X-Deny-Reason nomme le motif : rate, quota, family, websocket ou key.

{
  "status": "error",
  "timestamp": 1775648290510,
  "detail": "Debit depasse : votre offre autorise un nombre limite de requetes par minute.",
  "retry_after": 1
}

Le 403 de profondeur est rendu par la route elle-même, sans X-Deny-Reason : son detail commence toujours par « Profondeur d’historique hors offre » et donne le limit maximal utilisable sur ce pas de temps. Les fenêtres par offre sont sur la page Limites d’usage.

#Codes HTTP

CodeCauseCorrection
400
Requête refusée
Un symbole inconnu ou désactivé, une profondeur au-delà du plafond du champ, un paramètre d’indicateur hors bornes.Le corps de la réponse nomme la valeur fautive et, pour un symbole, liste celles qui sont acceptées.
403
Refusé par l’offre ou par la clé
Quatre motifs, nommés par l’en-tête X-Deny-Reason : clé absente, invalide ou révoquée (key) ; famille de données hors offre (family) ; flux WebSocket hors offre (websocket) ; ou une profondeur d’historique au-delà de la fenêtre de l’offre, dont le detail commence par « Profondeur d’historique hors offre ».Sur key, vérifiez que l’en-tête est bien transmis : certains clients HTTP le suppriment après une redirection. Sur family et websocket, la donnée existe mais n’est pas dans votre offre. Sur la profondeur, le detail donne le limit maximal à utiliser.
422
Paramètre manquant ou mal formé
symbol absent, timeframe hors liste, champ multi-timeframe demandé sans suffixe @tf, champ inconnu dans ?fields=, corps JSON invalide.Sur ?fields=, la réponse propose le champ le plus proche. Sur un timeframe, elle liste les valeurs acceptées.
429
Débit ou quota dépassé
Soit plus de requêtes par minute que votre offre n’en autorise, ou une rafale trop dense (X-Deny-Reason: rate, Retry-After: 1) ; soit le quota mensuel du compte épuisé (X-Deny-Reason: quota, Retry-After: 3600).Sur rate, attendez la seconde indiquée par Retry-After. Sur quota, le compteur repart au premier jour du mois (UTC) — ou changez d’offre depuis la console.
503
Indisponibilité momentanée
Une dépendance de lecture est en cours de reprise, ou le plafond de connexions simultanées du flux est atteint.Réessayez après le délai porté par Retry-After. L’erreur est transitoire par construction.
500
Erreur inattendue
Un défaut côté service, jamais causé par la requête.Réessayez ; si la réponse persiste, signalez-la avec l’horodatage porté par la réponse.

Les confusions les plus fréquentes

SymptômeCause réelle
403 alors que la clé est bonneLisez X-Deny-Reason. family : la famille de cet endpoint n’est pas dans votre offre. websocket : le flux n’y est pas. Un detail « Profondeur d’historique hors offre » : la requête remonte au-delà de la fenêtre de l’offre. key sans raison apparente : un client HTTP qui supprime les en-têtes personnalisés après une redirection — appelez l’URL finale.
429 alors que le rythme est faibleLe quota mensuel du compte est épuisé (X-Deny-Reason: quota, Retry-After: 3600), pas le débit. Il repart le premier jour du mois, en UTC, ou dès un changement d’offre.
422 sans message clair sur un snapshotUn champ multi-timeframe demandé sans son suffixe @tf, ou l’inverse sur un champ à forme unique.
400 sur une profondeur qui semble raisonnableChaque champ du snapshot a son propre plafond, dans son unité. Le CVD s’arrête à 200 fenêtres, les écarts entre places à 50.
422 sur un timeframe pourtant valide ailleursLe ratio long/short refuse 1m, les instruments macro intraday refusent 30m, et la semaine n’existe que sur les indicateurs.
Une réponse vide qui n’est pas une erreurUn stablecoin sur une métrique à terme, ou les options sur un actif autre que BTC et ETH. La clé unavailable du snapshot dit laquelle des trois raisons s’applique.
Un paramètre ignoréLes clés inconnues du snapshot sont ignorées en silence. Un champ mal orthographié est simplement absent de la réponse.

#Indicateurs

La validation suit un ordre fixe — pas de temps, nombre de résultats, symbole, analyse des indicateurs, règle de plafond, lecture des bougies — et le premier échec l’emporte. Un corps corrigé peut donc révéler une seconde erreur.

CasCode
Pas de temps invalide, results inférieur à 1, symbole inconnu400
Liste indicators vide, ou entrée qui n’est pas un objet400
Clé id ou type manquante, id mal formé pour ce type400
Type non supporté400
Paramètre inconnu pour ce type — obv avec une période, par exemple400
Paramètre du mauvais type, ou sous son minimum400
macd ou adosc avec fast supérieur ou égal à slow400
sar avec acceleration supérieure à maximum400
Identifiant dupliqué400
Corps malformé, plus de 50 instances, champ trop long422
results plus amorçage dépasse 1000422
Données insuffisantes pour ce pas de temps — stablecoins compris422

#Flux WebSocket

Toute demande impossible reçoit un message op: error qui dit ce qui était attendu — la liste des symboles valides, celle des canaux, les bornes de depth. Trois situations produisent non pas une erreur mais une fermeture :

CodeMotif
4003 — plafondPlafond de connexions simultanées de l’offre atteint — le motif donne le plafond. Une déconnexion libère aussitôt son emplacement.
4003 — client trop lentLa file d’envoi a débordé dix fois. Consommez plus vite, ou réduisez le nombre de canaux. Le motif distingue les deux cas.
4001Trame auth explicite refusée : la clé qu’elle porte est invalide.
4002Session jamais authentifiée dans les cinq secondes — un cas résiduel, la clé étant vérifiée au handshake.

La clé est vérifiée au handshake, avant l’ouverture : une clé absente ou invalide, ou une offre sans flux (Free), reçoit un 403 à la poignée de main, avec X-Deny-Reason key ou websocket. Un 429 y signale un rythme d’ouverture trop élevé. Une fois connecté, un canal dont la famille n’est pas dans l’offre reçoit op: error — « canal … hors offre : la famille … n’est pas incluse dans votre abonnement » — et l’abonnement entier est refusé. Voir Limites d’usage.

#Serveur MCP

Les erreurs suivent un motif unique — Erreur (HTTP NNN) : message — pour qu’un agent n’ait qu’un seul cas à reconnaître. Chaque appel d’outil est jugé comme une requête REST avec la clé du client : un 403 de famille hors offre ou un 429 de quota remontent tels quels, avec leur detail. Deux familles lui sont propres :

  • Métrique inconnue — le message liste les quarante-six métriques valides.
  • Ciblage invalide — deux cibles à la fois, cible manquante, mauvaise cible, ou cible passée à une métrique marché entier. L’erreur nomme le paramètre attendu, et elle est levée avant tout appel réseau.

Un défaut serveur donne lieu à un réessai automatique avant d’être remonté. Un délai dépassé rend Erreur (HTTP 504) après trente secondes.

#Stratégie de reprise

Tout n’est pas rejouable. Rejouer une requête fautive produit exactement la même réponse, et consomme un quota pour rien.

Python
def doit_reessayer(code: int) -> bool:
    """Ce qui est transitoire, et ce qui ne le sera jamais."""
    # 429 et 503 passeront : le serveur dit quand.
    if code in (429, 503):
        return True
    # 500 : un defaut cote service, un reessai a du sens.
    if code == 500:
        return True
    # 400, 403, 422 : la requete est fautive. La rejouer telle quelle
    # produira exactement la meme reponse.
    return False
  • Respectez Retry-After plutôt que d’inventer un délai : le serveur sait quand il sera prêt.
  • Bornez le nombre de tentatives. Trois ou quatre suffisent : au-delà, le problème n’est pas transitoire.
  • Ne rejouez pas un 4xx — hors 429. Corrigez la requête.
  • Sur le flux, reconnectez avec un délai croissant, et traitez une fermeture 4003 comme un signal de surcharge côté client : reconnecter sans changer la consommation reproduira la coupure.