Limites d’usage
Les limites dépendent de votre offre et se comptent par compte, toutes clés confondues. Elles sont annoncées à l’avance, chaque refus dit son motif, et rien n’est jamais tronqué en silence. Les valeurs de cette page sont celles du catalogue des offres.
#Les limites par offre
Quatre offres, quatre jeux de limites. L’offre Entreprise se négocie ; elle n’a pas de valeur par défaut.
| Limite | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Requêtes par mois | 10 000 | 200 000 | 2 000 000 | 20 000 000 |
| Débit, par minute | 30 | 60 | 300 | 600 |
| Rafale tolérée | 10 | 20 | 50 | 100 |
| Familles de données | 4 / 12 | 7 / 12 | 11 / 12 | 12 / 12 |
| Endpoints REST ouverts | 41 | 77 | 115 | 119 |
| Connexions WebSocket simultanées | — | 3 | 10 | 20 |
Le catalogue documente 121 chemins, dont deux sondes hors quota — /v1/health et /v1/status — qui ne sont comptées pour personne. Seule la première répond sans clé.
#Débit et quota mensuel
Deux compteurs, tous deux par compte — pas par adresse, pas par clé. Faire tourner une clé, ou répartir le trafic sur plusieurs adresses, ne change rien à l’un ni à l’autre.
- Le débit se mesure par minute, avec une rafale tolérée : quelques requêtes d’un coup passent, au-delà les suivantes sont lissées puis refusées. Le refus est un
429avecRetry-After: 1. - Le quota mensuel compte chaque requête soumise à quota, sur le mois calendaire en UTC, et repart de zéro le premier jour du mois. Épuisé, il rend un
429avecRetry-After: 3600jusqu’au renouvellement — ou jusqu’à un changement d’offre, immédiat.
HTTP/1.1 429 Too Many Requests
Retry-After: 1
X-Deny-Reason: rate
{"status":"error","timestamp":1775648290510,"detail":"Debit depasse : votre offre autorise un nombre limite de requetes par minute.","retry_after":1}L’en-tête X-Deny-Reason porte le motif de tout refus lié à l’offre — rate, quota, family, websocket ou key — et le corps le répète en clair dans detail. Il n’y a pas d’en-tête de compteur sur les réponses normales : l’état du quota se lit dans la console, qui prévient à 80 % puis à la première requête refusée.
#Les familles de données
Chaque endpoint appartient à exactement une famille de quota, et chaque offre ouvre un ensemble de familles. Une famille absente de votre offre l’est sur tous les canaux : la route REST rend un 403, le snapshot retire ses champs et les liste dans out_of_plan_fields, le flux WebSocket refuse le canal.
| Famille | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Prix et volume prix-volume | oui | oui | oui | oui |
| Dérivés derives | oui | oui | oui | oui |
| Microstructure microstructure | — | oui | oui | oui |
| Ticks bruts ticks | — | — | — | oui |
| Options options | — | oui | oui | oui |
| Snapshot snapshot | — | oui | oui | oui |
| Indicateurs indicateurs | oui | oui | oui | oui |
| Macro macro | oui | oui | oui | oui |
| On-chain onchain | — | — | oui | oui |
| Sentiment sentiment | — | — | oui | oui |
| ETF etf | — | — | oui | oui |
| Tokenomics tokenomics | — | — | oui | oui |
HTTP/1.1 403 Forbidden
X-Deny-Reason: family
{"status":"error","timestamp":1775648290510,"detail":"Cette famille de donnees n est pas incluse dans votre offre."}La correspondance entre les treize familles du catalogue et ces douze familles de quota est donnée sur la page des offres ; celle entre un chemin et sa famille se lit dans le catalogue des endpoints.
#Jusqu’où remonte l’historique
La profondeur d’historique dépend de l’offre et du pas de temps. C’est une fenêtre glissante depuis maintenant, pas un plafond par requête : hier est hors offre en bougies 1 min sur Free, quelle que soit la pagination.
| Pas de temps | Free | Traders | Financial | Startup |
|---|---|---|---|---|
1m | 1 h | 24 h | 3 jours | 7 jours |
5m | 4 h | 3 jours | 7 jours | 30 jours |
15m | 4 h | 3 jours | 7 jours | 30 jours |
1h | 24 h | 7 jours | 30 jours | 90 jours |
4h | 7 jours | 30 jours | 72 jours | Complet |
1d | 30 jours | Complet | Complet | Complet |
30msuit la fenêtre de1h,1wcelle de1d: « Complet » vaut donc aussi pour la semaine là où le jour l’est.- Les routes sans pas de temps — historiques
since_ms/until_ms, séries quotidiennes, funding — sont bornées par la fenêtre1hde l’offre : 24 h en Free, 7 jours en Traders, 30 jours en Financial, 90 jours en Startup. - Le contrôle porte sur la borne la plus ancienne réellement atteinte —
limitmultiplié par la durée du pas, ousince_ms, ou ununtil_msdéjà au-delà de la fenêtre.
Un dépassement rend un 403 explicite, jamais une réponse tronquée : le detail dit ce qui a été demandé, ce que l’offre autorise et le limit maximal utilisable.
HTTP/1.1 403 Forbidden
{"detail":"Profondeur d'historique hors offre : 30 jour(s) demandes en 1m, votre offre en autorise 1 heure(s) (soit limit=60 au maximum sur ce timeframe, et aucune borne since_ms/until_ms au-dela de cette fenetre)."}Ce que la donnée elle-même contient
Au-delà de la fenêtre de l’offre, la profondeur disponible dépend de la famille : le Fear & Greed depuis 2018, la valorisation on-chain et la macro sur plusieurs années, les écarts entre places sur deux jours seulement. Le catalogue /v1/macro/intraday/series donne la valeur exacte pour chaque instrument macro.
#Connexions au flux
Le flux WebSocket est ouvert à partir de Traders. La clé est vérifiée au handshake : une offre sans flux reçoit un 403 et la connexion ne s’établit pas. Le plafond de connexions simultanées vaut pour le compte entier, toutes clés confondues ; la connexion de trop est fermée avec le code 4003 et le plafond dans le motif.
| Limite | Au dépassement |
|---|---|
| Connexions simultanées par compte : 3 en Traders, 10 en Financial, 20 en Startup | fermeture 4003, le plafond dans le motif |
| Flux absent de l’offre (Free) | 403 au handshake, X-Deny-Reason: websocket |
| Canal d’une famille hors offre | op: error, l’abonnement n’est pas appliqué |
| Ouvertures : 1 par seconde, rafale de 10 | 429 au handshake |
| File d’envoi de 256 trames | les plus anciennes écartées, seq saute |
| 10 débordements tolérés | fermeture 4003, motif « client trop lent » |
Une connexion qui reste abonnée est bien moins coûteuse que du sondage répété : si vous appelez le même endpoint toutes les secondes, le flux est la bonne réponse. Voir Flux WebSocket.
#Plafonds de profondeur
Indépendamment de l’offre, chaque route borne son limit. Ces plafonds sont techniques ; la fenêtre de l’offre s’applique en plus, et c’est la plus stricte des deux qui compte.
| Surface | Type | Description |
|---|---|---|
Endpoints REST | limit | Le plus souvent 1000 ; 500 sur le ratio long/short et les écarts entre places ; 10 000 sur les ticks individuels. Le plafond exact figure dans le tableau de paramètres de chaque route. |
Snapshot | un plafond par champ | 1000 bougies, 1440 minutes pour les séries à la minute, 3600 secondes pour les trades agrégés, 10 000 pour les ticks ; 200 fenêtres pour le CVD, 50 pour les écarts entre places. Dépasser rend un 400 ou un 422 ; dépasser la fenêtre de l’offre rend un 403. |
Indicateurs | results + amorçage ≤ 1000 | Cinquante instances par appel au maximum. Le refus indique la période maximale utilisable pour le nombre de résultats demandé. |
#Conduite à tenir
Respecter le délai annoncé, et ne pas rejouer un 403
Sur un 429 comme sur un 503, l’en-tête Retry-After donne le délai. Un 403 lié à l’offre — famille, profondeur, flux — ne changera pas en le rejouant : lisez X-Deny-Reason et detail, puis corrigez la requête ou changez d’offre.
import time
import httpx
def get(client: httpx.Client, chemin: str, **params):
"""Reessaie sur le delai que le serveur annonce, jamais sur un 403."""
for tentative in range(4):
reponse = client.get(chemin, params=params)
if reponse.status_code in (429, 503):
# Le serveur sait quand il sera pret : ne pas inventer de delai.
# Sur un quota mensuel epuise (X-Deny-Reason: quota), Retry-After
# vaut une heure : inutile d'insister, le compteur repart le 1er.
attente = float(reponse.headers.get("Retry-After", 2 ** tentative))
time.sleep(attente)
continue
# 403 : la requete est hors offre (famille, profondeur, cle). La
# rejouer telle quelle produira exactement la meme reponse.
reponse.raise_for_status()
return reponse.json()
raise RuntimeError("le service reste indisponible apres 4 tentatives")Grouper plutôt que répéter
Le snapshot ramène jusqu’à soixante et un champs en une requête, comptée une fois. Pour un tableau de bord, c’est un appel par cycle au lieu de dix — et dix fois moins de quota.
# Trois appels la ou un seul suffit.
GET /v1/funding/rate?symbol=BTCUSDT
GET /v1/basis?symbol=BTCUSDT
GET /v1/oi/delta?symbol=BTCUSDT
# Le meme resultat, en une requete (a partir de Traders).
GET /v1/snapshot?symbol=BTCUSDT&funding_rate_8h=true&basis=1&oi_delta=1Ne pas redemander ce qui ne bouge pas
Le Fear & Greed publie un point par jour. Les fondamentaux ETF sont trimestriels. Les séries macro quotidiennes bougent une fois par jour. Les interroger à la minute consomme du quota sans rien apprendre : cadencez chaque famille sur le rythme de sa donnée.