Limites d’usage
Les limites dépendent de votre offre et sont comptées par compte, toutes clés confondues. Elles sont annoncées à l’avance, chaque refus dit sa raison, et rien n’est jamais tronqué en silence. Les valeurs de cette page sont celles du catalogue des tarifs.
#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 |
| Limite de débit, par minute | 30 | 60 | 300 | 600 |
| Rafale tolérée | 10 | 20 | 50 | 100 |
| Familles de données | 4 / 12 | 7 / 12 | 12 / 12 | 12 / 12 |
| Endpoints REST ouverts | 41 | 77 | 119 | 119 |
| Connexions WebSocket simultanées | — | 3 | 10 | 20 |
Le catalogue documente 121 chemins, dont deux sondes hors quota (/v1/health et /v1/status) décomptées pour personne. Seule la première répond sans clé.
#Limite de débit et quota mensuel
Deux compteurs, tous deux par compte : pas par adresse, pas par clé. Renouveler une clé, ou répartir le trafic sur plusieurs adresses, ne change ni l’un ni l’autre.
- La limite de 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. Une fois épuisé, il renvoie un
429avecRetry-After: 3600jusqu’à son renouvellement, ou jusqu’à un changement d’offre, qui est 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 la raison de tout refus lié à l’offre (rate, quota, family, websocket ou key), et le corps la redit 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 renvoie 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 | 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 tarifs ; celle entre un chemin et sa famille est dans le catalogue des endpoints.
#Jusqu’où remonte l’historique
La profondeur d’historique dépend de l’offre et de l’unité 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.
| Unité de temps | Free | Traders | Financial | Startup |
|---|---|---|---|---|
1m | 1 h | 24 h | 3 jours | 1 semaine |
5m | 4 h | 3 jours | 1 semaine | 30 jours |
15m | 4 h | 3 jours | 1 semaine | 30 jours |
1h | 24 h | 1 semaine | 30 jours | 90 jours |
4h | 1 semaine | 30 jours | 72 jours | Complet |
1d | 30 jours | Complet | Complet | Complet |
ticks | — | — | 1 h | 24 h |
30msuit la fenêtre de1h,1wcelle de1d: « Complet » vaut donc aussi pour la semaine partout où il vaut pour le jour.- Les routes sans unité de temps (historiques
since_ms/until_ms, séries quotidiennes, funding) sont bornées par la fenêtre1hde l’offre : 24 h en Free, 1 semaine en Traders, 30 jours en Financial, 90 jours en Startup. - Les routes tick par tick (
/v1/raw/spot-ticks,/v1/raw/futures-ticks,/v1/raw/trades) ont leur propre fenêtre, la ligneticksci-dessus, et ne sont ouvertes que là où la famille l’est : 1 h en Financial, 24 h en Startup. - Le contrôle porte sur la borne la plus ancienne réellement atteinte :
limitmultiplié par la durée de l’unité de temps, ousince_ms, ou ununtil_msdéjà au-delà de la fenêtre.
Le dépassement renvoie un 403 explicite, jamais une réponse tronquée : le detail dit ce qui a été demandé, ce que l’offre autorise et la limit maximale 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 contient la donnée elle-même
Au-delà de la fenêtre de l’offre, la profondeur disponible dépend de la famille : Fear & Greed depuis 2018, valorisation on-chain et macro sur plusieurs années, é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 à la poignée de main : une offre sans le flux reçoit un 403 et la connexion n’est pas établie. Le plafond de connexions simultanées vaut pour tout le compte, toutes clés confondues ; la connexion de trop est fermée avec le code 4003 et le plafond dans la raison.
| Limite | En cas de dépassement |
|---|---|
| Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startup | fermeture 4003, le plafond dans la raison |
| Flux absent de l’offre (Free) | 403 à la poignée de main, 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 à la poignée de main |
| File d’envoi de 256 trames | les plus anciennes abandonnées, seq saute |
| 10 débordements tolérés | fermeture 4003, raison « client too slow » |
Une connexion qui reste abonnée coûte bien moins qu’une interrogation répétée : si vous appelez le même endpoint chaque seconde, le flux est la bonne réponse. Voir Flux WebSocket.
#Plafonds de profondeur
Indépendamment de l’offre, chaque route borne sa limit. Ces plafonds sont techniques ; la fenêtre de l’offre s’applique par-dessus, et c’est la plus stricte des deux qui compte.
| Surface | Type | Description |
|---|---|---|
REST endpoints | 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 la table des paramètres de chaque route. |
Snapshot | one ceiling per field | 1000 bougies, 1440 minutes pour les séries par minute, 3600 secondes pour les transactions agrégées, 10 000 pour les ticks ; 200 fenêtres pour le CVD, 50 pour les écarts entre places. Le dépassement renvoie un 400 ou un 422 ; aller au-delà de la fenêtre de l’offre renvoie un 403. |
Indicators | results + warm-up ≤ 1000 | Cinquante instances par appel au plus. Le refus indique la période maximale utilisable pour le nombre de résultats demandé. |
#Que faire
Respectez le délai annoncé, et ne rejouez pas 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 étant rejoué : lisez X-Deny-Reason et detail, puis corrigez la requête ou changez d’offre.
import time
import httpx
def get(client: httpx.Client, path: str, **params):
"""Retry on the delay the server announces, never on a 403."""
for attempt in range(4):
response = client.get(path, params=params)
if response.status_code in (429, 503):
# The server knows when it will be ready: do not invent a delay.
# On an exhausted monthly quota (X-Deny-Reason: quota), Retry-After
# is an hour: no point insisting, the counter restarts on the 1st.
wait = float(response.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
# 403: the request is outside the plan (family, depth, key). Replaying
# it as is will produce exactly the same response.
response.raise_for_status()
return response.json()
raise RuntimeError("the service is still unavailable after 4 attempts")Regroupez plutôt que de 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.
# Three calls where one is enough.
GET /v1/funding/rate?symbol=BTCUSDT
GET /v1/basis?symbol=BTCUSDT
GET /v1/oi/delta?symbol=BTCUSDT
# The same result, in one request (from Traders upwards).
GET /v1/snapshot?symbol=BTCUSDT&funding_rate_8h=true&basis=1&oi_delta=1Ne redemandez pas ce qui ne bouge pas
Fear & Greed publie un point par jour. Les fondamentaux des 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 ses données.