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.
{
"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
| Code | Cause | Correction |
|---|---|---|
400Requê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. |
403Refusé 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. |
422Paramè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. |
429Dé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. |
503Indisponibilité 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. |
500Erreur 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ôme | Cause réelle |
|---|---|
| 403 alors que la clé est bonne | Lisez 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 faible | Le 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 snapshot | Un champ multi-timeframe demandé sans son suffixe @tf, ou l’inverse sur un champ à forme unique. |
| 400 sur une profondeur qui semble raisonnable | Chaque 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 ailleurs | Le 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 erreur | Un 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.
| Cas | Code |
|---|---|
| Pas de temps invalide, results inférieur à 1, symbole inconnu | 400 |
| Liste indicators vide, ou entrée qui n’est pas un objet | 400 |
| Clé id ou type manquante, id mal formé pour ce type | 400 |
| Type non supporté | 400 |
| Paramètre inconnu pour ce type — obv avec une période, par exemple | 400 |
| Paramètre du mauvais type, ou sous son minimum | 400 |
| macd ou adosc avec fast supérieur ou égal à slow | 400 |
| sar avec acceleration supérieure à maximum | 400 |
| Identifiant dupliqué | 400 |
| Corps malformé, plus de 50 instances, champ trop long | 422 |
| results plus amorçage dépasse 1000 | 422 |
| Données insuffisantes pour ce pas de temps — stablecoins compris | 422 |
#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 :
| Code | Motif |
|---|---|
| 4003 — plafond | Plafond 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 lent | La file d’envoi a débordé dix fois. Consommez plus vite, ou réduisez le nombre de canaux. Le motif distingue les deux cas. |
| 4001 | Trame auth explicite refusée : la clé qu’elle porte est invalide. |
| 4002 | Session 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.
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-Afterplutô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
4003comme un signal de surcharge côté client : reconnecter sans changer la consommation reproduira la coupure.