Premiers pas

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.

LimiteFreeTradersFinancialStartup
Requêtes par mois10 000200 0002 000 00020 000 000
Limite de débit, par minute3060300600
Rafale tolérée102050100
Familles de données4 / 127 / 1212 / 1212 / 12
Endpoints REST ouverts3585135135
Connexions WebSocket simultanées—31020

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 429 rate_limited dont le Retry-After donne les secondes avant la prochaine requête permise (la même valeur que error.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 429 dont le Retry-After donne 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.

FamilleFreeTradersFinancialStartup
Prix et volume price_volumeouiouiouioui
Dérivés derivativesouiouiouioui
Microstructure microstructure—ouiouioui
Ticks bruts trades——ouioui
Options options—ouiouioui
Snapshot snapshot—ouiouioui
Indicateurs indicatorsouiouiouioui
Macro macroouiouiouioui
On-chain onchain——ouioui
Sentiment sentiment——ouioui
ETF etf——ouioui
Tokenomics tokenomics——ouioui
403 · plan_family
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 tempsFreeTradersFinancialStartup
1m1 h24 h3 jours1 semaine
5m4 h3 jours1 semaine30 jours
15m4 h3 jours1 semaine30 jours
1h24 h1 semaine30 jours90 jours
4h1 semaine30 jours72 joursComplet
1d30 joursCompletCompletComplet
trades——1 h24 h
  • 30m suit la fenêtre de 1h, 1w celle de 1d : « 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être 1h de 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 ligne 1d — illimitées là où elle indique « Complet ».
  • Le funding (historiques du taux et du cumul, fenêtres de huit heures, since_ms / until_ms acceptés) suit la fenêtre 4h de 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 ligne ticks ci-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 : limit multiplié par la durée de l’unité de temps, ou since_ms, ou un until_ms dé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.

403 · history_depth
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ée1m – 30m1h4h1d · 1w
/v1/klines/history2026-05-282026-04-032025-09-302017-08-17
/v1/trades-kline/…/history
/v1/cvd/…/history

/v1/buy-sell-ratio/…/history

/v1/trades/avg-size/…/history
2026-06-052026-04-032025-09-302023-10-01
/v1/spread/interexchange/history2026-05-282026-04-032025-09-302023-10-01
/v1/orderbook/…/history1m 2026-09-26 · 5m, 30m 2026-09-18 · 15m 2026-09-022026-07-042025-10-072024-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:002025-10-072023-10-04
/v1/basis/history2026-05-28 19:10 · 2026-09-12 14:40 · 2026-10-19 09:31 · 2026-10-27 18:03 *2026-04-04 17:002025-10-072023-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/…/history2026-06-08
/v1/macro/history
/v1/macro/net-liquidity/history
2021-06-01
/v1/macro/intraday/history1m 2026-06-23 · 5m, 15m 2026-06-152024-08-242024-08-242016-01-03
/v1/btc/mvrv/history2022-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/history2026-02-04
/v1/tokenomics/history2017-08-17
/v1/fear-greed/history2018-02-01
/v1/global/history2026-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 (PAXGUSDT 2020-08-28). Options à partir de la granularité 5 m ; /v1/options/max-pain/history couvre 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.

LimiteEn cas de dépassement
Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startupfermeture 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 confondus503 à la poignée de main, réessayer plus tard
Canal d’une famille hors offreop: error, l’abonnement n’est pas appliqué
Ouvertures : 1 par seconde, rafale de 10429 à la poignée de main
File d’envoi de 512 tramesles plus anciennes abandonnées, seq saute
10 débordements tolérésfermeture 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.

SurfaceTypeDescription
REST endpointslimit1000 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.
Snapshotone ceiling per field1000 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.
Indicatorsresults + warm-up ≤ 1000Cinquante 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.

Python
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.

Comparaison
# 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=1

Ne 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.