Limites d’usage des apps et agents IA
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.
Vos agents IA partagent ces limites : chaque requête que le serveur MCP fait pour eux compte comme une requête REST de la même clé, sur le même débit et le même quota mensuel, et un refus arrive à l’agent IA sous la forme Error (HTTP 429). L’appel à /mcp lui-même n’est pas compté.
#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 | 35 | 85 | 135 | 135 |
| Connexions WebSocket simultanées | — | 3 | 10 | 20 |
Le catalogue documente 138 chemins. Trois ne sont jamais décomptés du quota, seule la limite de débit s’applique : /v1/health, le seul qui répond sans clé, /v1/limits, les limites de votre clé, et POST /v1/ws/token, le jeton WebSocket éphémère (il suit le droit au flux). /v1/status compte comme une requête prix et volume. Le contrat nomme la famille de chaque route dans x-family.
#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. En amont, la passerelle applique un anti-flood par adresse IP : 20 requêtes par seconde, rafales de 40, refusées en 429 edge_rate_limited avec Retry-After: 1. Il n’arrête que les déferlements : dimensionnez-y une adresse de sortie partagée (NAT, serverless).
- 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
429rate_limiteddont leRetry-Afterdonne les secondes avant la prochaine requête permise (la même valeur queerror.details.retry_after_s). - 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
429dont leRetry-Afterdonne les secondes jusqu’à son renouvellement, ou jusqu’à un changement d’offre, qui est immédiat.
HTTP/1.1 429 Too Many Requests
Retry-After: 2
X-Deny-Reason: rate_limited
{
"status": "error",
"server_time": "2026-09-30T16:07:27.808Z",
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded: your plan allows a limited number of requests per minute. Retry after the Retry-After delay.",
"details": {
"retry_after_s": 2
}
}
}L’en-tête X-Deny-Reason porte la raison de tout refus lié à l’offre (rate_limited, quota_exceeded, plan_family, plan_websocket, missing_api_key, invalid_api_key ou history_depth), et le corps la nomme dans error.code (rate_limited, quota_exceeded, plan_family, plan_websocket, invalid_api_key, history_depth) avec un error.message en anglais. Toute réponse faite avec une clé comptée (toute clé créée dans la console) porte les en-têtes standard de l’IETF, en deux politiques : RateLimit-Policy: "rate";q=…;w=…, "quota";q=…;w=… et RateLimit: "rate";r=…;t=…, "quota";r=…;t=…. Le r de quota_exceeded est le quota mensuel restant. La console montre le même état, et prévient à 80 % puis à la première requête refusée.
#Les familles de données de marché
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 price_volume | oui | oui | oui | oui |
| Dérivés derivatives | oui | oui | oui | oui |
| Microstructure microstructure | — | oui | oui | oui |
| Ticks bruts trades | — | — | oui | oui |
| Options options | — | oui | oui | oui |
| Snapshot snapshot | — | oui | oui | oui |
| Indicateurs indicators | 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: plan_family
{
"status": "error",
"server_time": "2026-09-30T16:07:27.808Z",
"error": {
"code": "plan_family",
"message": "The 'options' data family is not included in your plan. GET /v1/limits lists the families of your key; https://bytnode.com/pricing lists the plans that open it."
}
}La correspondance entre les dix catégories du catalogue et ces douze familles de données de marché est donnée sur la page des tarifs ; la famille de chaque route est dans le catalogue des endpoints et dans le contrat (x-family, les identifiants que rend GET /v1/limits).
#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 |
trades | — | — | 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) 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 séries quotidiennes (un point par jour ou moins : Fear & Greed, on-chain, ETF, macro) suivent la ligne1d— illimitées là où elle indique « Complet ». - Le funding (historiques du taux et du cumul, fenêtres de huit heures,
since_ms/until_msacceptés) suit la fenêtre4hde l’offre : 1 semaine en Free, 30 jours en Traders, 72 jours en Financial, complet en Startup. - Les routes transaction par transaction (
/v1/trades/spot,/v1/trades/futures,/v1/trades/large,/v1/trades-kline/futures/seconds) 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. Les champs correspondants du snapshot (trades_spot,trades_futures,trades_kline_futures_seconds) sont bornés dans le temps par la même fenêtre. - 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 : l’error.message dit ce qui a été demandé, ce que l’offre autorise et la limit maximale utilisable. Les bornes que vous écrivez vous-même (since_ms, until_ms) bénéficient d’une tolérance de deux minutes pour l’écart d’horloge ; une limit seule, non. Sans limit ni since_ms, rien n’est refusé : la page s’arrête simplement au bord de la fenêtre, et next y vaut null.
HTTP/1.1 403 Forbidden
X-Deny-Reason: history_depth
{
"status": "error",
"server_time": "2026-09-30T16:07:27.808Z",
"error": {
"code": "history_depth",
"message": "History depth beyond your plan: 30 day(s) requested on 1h, your plan allows 1 day(s) (i.e. at most limit=24 on this timeframe, and no since_ms/until_ms bound beyond that window).",
"param": "limit",
"details": {
"window_s": 86400,
"earliest_ms": 1791763200000,
"max_limit": 24,
"timeframe": "1h"
}
}
}Ce que contient la donnée elle-même
Au-delà de la fenêtre de votre offre, la profondeur de la donnée elle-même dépend de la donnée et, pour les bougies et les flux, de la granularité. Plus ancienne donnée servie, mesurée le 2026-10-15 sur BTCUSDT (BTC pour les options et l’ETF) ; un symbole listé plus tard commence à sa propre cotation. C’est la date de départ de chaque série : de là à aujourd’hui, l’historique est continu.
| Donnée | 1m – 30m | 1h | 4h | 1d · 1w |
|---|---|---|---|---|
/v1/klines/history | 2026-05-28 | 2026-04-03 | 2025-09-30 | 2017-08-17 |
/v1/trades-kline/…/history/v1/cvd/…/history/v1/buy-sell-ratio/…/history/v1/trades/avg-size/…/history | 2026-06-05 | 2026-04-03 | 2025-09-30 | 2023-10-01 |
/v1/spread/interexchange/history | 2026-05-28 | 2026-04-03 | 2025-09-30 | 2023-10-01 |
/v1/orderbook/…/history | 1m 2026-09-26 · 5m, 30m 2026-09-18 · 15m 2026-09-02 | 2026-07-04 | 2025-10-07 | 2024-09-06 |
/v1/oi/history/v1/oi/change/history | 2026-05-28 19:10 · 2026-09-12 14:40 · 2026-10-19 09:31 · 2026-10-27 18:03 * | 2026-04-04 17:00 | 2025-10-07 | 2023-10-04 |
/v1/basis/history | 2026-05-28 19:10 · 2026-09-12 14:40 · 2026-10-19 09:31 · 2026-10-27 18:03 * | 2026-04-04 17:00 | 2025-10-07 | 2023-10-03 |
/v1/funding/rate/history/v1/funding/cumulative/history | 2025-09-30 | |||
/v1/liquidations/cumulative/history/v1/liquidations/big-small-ratio/history | 2026-05-28 | |||
/v1/options/…/history | 2026-06-08 | |||
/v1/macro/history/v1/macro/net-liquidity/history | 2021-06-01 | |||
/v1/macro/intraday/history | 1m 2026-06-23 · 5m, 15m 2026-06-15 | 2024-08-24 | 2024-08-24 | 2016-01-03 |
/v1/btc/mvrv/history | 2022-06-08 | |||
/v1/btc/nvt/history/v1/btc/active-addresses/history/v1/btc/revenue-per-difficulty/history | 2024-06-08 | |||
/v1/btc/{fees,mempool,mining,network}/history/v1/eth/…/history | 2026-06-08 | |||
/v1/etf/fundamentals/history | 2026-02-04 | |||
/v1/tokenomics/history | 2017-08-17 | |||
/v1/fear-greed/history | 2018-02-01 | |||
/v1/global/history | 2026-06-06 | |||
- Trades individuels (
/v1/trades/spot,/v1/trades/futures,/v1/trades/large) et trades par seconde (/v1/trades-kline/futures/seconds) : une fenêtre glissante de 72 heures, pas une date de départ. - Les bougies journalières et hebdomadaires remontent à 2017, sans volume avant le 2023-10-01 (
null). Macro : par série, depuis 2021-06 (l’or depuis le 2025-06-09) ; les séries intraday journalières démarrent entre 2016 et 2020 (PAXGUSDT2020-08-28). Options à partir de la granularité 5 m ;/v1/options/max-pain/historycouvre chaque échéance depuis sa cotation. Les événements de liquidation (/v1/liquidations/events) sont les plus récents, sans bornes de date. * Open interest et basis : heures en UTC ; la première date de la colonne 1m–30m est celle des douze paires d’origine, la seconde celle d’AVAX, HBAR, LINK, NEAR, TAO, UNI, XMR, ADA, GRAM et LTC, dont les lectures antérieures sont horaires, la troisième celle des 55 paires ajoutées le 2026-10-19. Pour ces 55 paires, les bougies et les indicateurs remontent comme les autres, sans volumes (null) avant le 2026-10-19 ; le funding remonte au 2026-09-16 ; toutes les autres séries commencent le 2026-10-19. La quatrième date est celle des 27 paires ajoutées le 2026-10-27 : leurs bougies et leurs indicateurs remontent aussi (MUSDT: bougies 1m depuis le 2026-10-21, 5m depuis le 2026-09-23, 15m depuis le 2026-07-16 — son marché de référence garde moins de points), sans volumes (null) avant le 2026-10-27 ; leur funding remonte aussi loin que chaque place le publie ; toutes les autres séries commencent le 2026-10-27.
#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 (un client trop lent est fermé avec 4005). Un 503 à la poignée de main n’est pas lié à votre offre : il dit que le service de flux a atteint sa capacité, tous comptes confondus.
| 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: plan_websocket |
| Capacité du service de flux, tous comptes confondus | 503 à la poignée de main, réessayer plus tard |
| 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 512 trames | les plus anciennes abandonnées, seq saute |
| 10 débordements tolérés | fermeture 4005, 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 | 1000 sur toutes les routes ; 10 000 sur les événements individuels (ticks, gros trades, liquidations). Le plafond exact figure dans le tableau des paramètres de chaque route. |
Snapshot | one ceiling per field | 1000 bougies ou buckets par champ @tf (klines, OI, carnet, ratio achat/vente, taille des trades, grosses/petites liquidations), 1440 pour les bougies de trades, 200 pour le CVD, 50 pour les spreads entre places ; 10 000 trades individuels et événements de liquidation. Un champ sans unité de temps (basis, variation d’OI, liquidations cumulées…) ne sert que sa dernière valeur : profondeur 1. Au-delà, 422 ; au-delà de la fenêtre de l’offre, 403. |
Indicators | results + warm-up ≤ 1000 | Cinquante instances par appel au plus. Le refus indique la période maximale utilisable pour la limit demandée. |
#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 quand il est présent. Un 403 lié à l’offre (X-Deny-Reason plan_family, history_depth ou plan_websocket) ne changera pas en étant rejoué : lisez X-Deny-Reason et error.code, puis corrigez la requête ou changez d’offre.
import time
import httpx # pip install 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 == 429 and response.headers.get("X-Deny-Reason") == "quota_exceeded":
# The monthly quota is spent: Retry-After counts the seconds until the 1st
# of the month. Do not sleep for days: stop, or change plan.
raise RuntimeError(response.json()["error"]["message"])
if response.status_code in (429, 503):
# The server knows when it will be ready: do not invent a delay.
wait = float(response.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
body = response.json()
if body["status"] == "error":
# 401 / 403 / 422: the request itself is refused (key, plan, value).
# Replaying it as is produces exactly the same response: keep the
# stable code, it says what to change.
raise RuntimeError(f'{body["error"]["code"]}: {body["error"]["message"]}')
return body
raise RuntimeError("the service is still unavailable after 4 attempts")Regroupez plutôt que de répéter
Le snapshot ramène jusqu’à quarante-huit 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/change?symbol=BTCUSDT
# The same result, in one request (from Traders upwards).
GET /v1/snapshot?symbol=BTCUSDT&funding_rate=1&basis=1&oi_change=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.