[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-fr-scraper-api-bybit-v5-proxys-rotatifs":3},{"success":4,"payload":5,"related":60,"errors":125},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":15,"og_description":12,"og_image_url":16,"faq_json":17,"key_takeaways":14,"allow_index":4,"noindex_google_only":27,"allow_follow":4,"published_at":28,"updated_at":28,"content_updated_at":29,"featured_image_url":30,"featured_image_alt":31,"card_image_url":32,"reading_time_minutes":33,"author":34,"categories":38,"tags":45,"alternates":46,"locale_paths":57,"views":59},195,"scraper-api-bybit-v5-proxys-rotatifs","Collecter des données de marché crypto avec des proxys rotatifs : rate limits, géoblocages et pagination (exemple Bybit V5)","Guide développeur pour scraper les endpoints \u002Fv5\u002Fmarket\u002F de Bybit avec proxys rotatifs : orderbook, tickers, kline. Code Node.js et Python, gestion des rate limits et sessions sticky.","\u003Cp>L'API Market V5 de Bybit expose des données publiques essentielles — carnets d'ordres, tickers, bougies OHLCV et transactions récentes — via \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode>. Mais les développeurs de bots de trading et de pipelines de données se heurtent rapidement aux limites de taux par IP et aux blocages géographiques. Dans ce guide, nous expliquons comment scraper l'API Market Bybit V5 avec des proxys rotatifs, avec du code runnable en Node.js et Python, une gestion rigoureuse des \u003Cem>rate limits\u003C\u002Fem> et des sessions sticky pour la pagination.\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cp>\u003Cstrong>Avertissement :\u003C\u002Fstrong> les endpoints \u003Ccode>\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode> diffusent des données de marché publiques. Vérifiez toujours les conditions d'utilisation de Bybit avant toute collecte automatisée. Ce guide couvre uniquement les données publiques, non authentifiées, et ne traite pas des endpoints de trading privés.\u003C\u002Fp>\u003C\u002Fblockquote>\n\n\u003Ch2>Comment scraper l'API Market Bybit V5 avec des proxys rotatifs : vue d'ensemble\u003C\u002Fh2>\n\n\u003Cp>L'API V5 unifiée de Bybit regroupe les anciennes API spot, dérivés et options sous un même domaine. Les endpoints de marché publics se trouvent sous \u003Ccode>\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode> et ne nécessitent \u003Cstrong>aucune authentification\u003C\u002Fstrong>. Chaque réponse suit une enveloppe standard :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>{\n  &quot;retCode&quot;: 0,\n  &quot;retMsg&quot;: &quot;OK&quot;,\n  &quot;result&quot;: { ... },\n  &quot;time&quot;: 1700000000000\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Un \u003Ccode>retCode\u003C\u002Fcode> différent de 0 indique une erreur — par exemple \u003Ccode>10001\u003C\u002Fcode> pour un paramètre invalide ou un code spécifique pour un throttling. Voici les quatre endpoints principaux pour le \u003Cem>bybit api scraping\u003C\u002Fem> :\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Endpoint\u003C\u002Fth>\u003Cth>Paramètres requis\u003C\u002Fth>\u003Cth>Limite indicative\u003C\u002Fth>\u003Cth>Cas d'usage\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>category, symbol, limit\u003C\u002Ftd>\u003Ctd>120 req\u002Fmin\u003C\u002Ftd>\u003Ctd>Snapshot de profondeur\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>\u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>category\u003C\u002Ftd>\u003Ctd>100 req\u002Fmin\u003C\u002Ftd>\u003Ctd>Prix et stats en temps réel\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>category, symbol, interval, limit\u003C\u002Ftd>\u003Ctd>60 req\u002Fmin\u003C\u002Ftd>\u003Ctd>Bougies OHLCV historiques\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>\u002Fv5\u002Fmarket\u002Frecent-trade\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>category, symbol\u003C\u002Ftd>\u003Ctd>80 req\u002Fmin\u003C\u002Ftd>\u003Ctd>Transactions récentes\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Le paramètre \u003Ccode>category\u003C\u002Fcode> est central : il accepte \u003Ccode>spot\u003C\u002Fcode>, \u003Ccode>linear\u003C\u002Fcode> (contrats perpétuels\u002Ffutures USDT), \u003Ccode>inverse\u003C\u002Fcode> ou \u003Ccode>option\u003C\u002Fcode>. Pour \u003Cem>scrape bybit order book\u003C\u002Fem> en spot, utilisez \u003Ccode>category=spot\u003C\u002Fcode>. Pour les perpétuels USDT, utilisez \u003Ccode>category=linear\u003C\u002Fcode>. Le paramètre \u003Ccode>limit\u003C\u002Fcode> de l'orderbook accepte les valeurs 1, 25, 50, 100 et 200, contrôlant la profondeur retournée. Consultez la documentation officielle de l'API V5 pour le détail complet des paramètres.\u003C\u002Fp>\n\n\u003Ch2>Rate limits et bannissements IP chez Bybit\u003C\u002Fh2>\n\n\u003Cp>Bybit applique des limites de taux \u003Cstrong>par adresse IP\u003C\u002Fstrong> sur chaque endpoint. Dépasser la limite déclenche d'abord des \u003Ccode>429 Too Many Requests\u003C\u002Fcode>, puis un \u003Ccode>403 Forbidden\u003C\u002Fcode> si le comportement persiste. Le bannissement IP dure environ \u003Cstrong>10 minutes\u003C\u002Fstrong> selon les retours de la communauté, mais peut s'étendre en cas d'abus répétés. L'endpoint \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> est particulièrement sensible car les développeurs ont tendance à le poller en rafale pour suivre la profondeur.\u003C\u002Fp>\n\n\u003Cp>Les limites varient par endpoint et par catégorie. D'après la documentation de rate limit de Bybit, les endpoints de marché public partagent un budget global par IP. Une stratégie de \u003Cem>burst\u003C\u002Fem> sur \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> peut épuiser ce budget et bloquer tous les autres endpoints de marché pour la même IP.\u003C\u002Fp>\n\n\u003Cp>Les symptômes typiques :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>retCode\u003C\u002Fcode> différent de 0 avec \u003Ccode>retMsg\u003C\u002Fcode> indiquant un dépassement de taux\u003C\u002Fli>\n\u003Cli>HTTP 403 avec un body CloudFront (blocage géo ou IP)\u003C\u002Fli>\n\u003Cli>Timeouts intermittents indiquant un throttling côté serveur\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>La solution : distribuer vos requêtes sur plusieurs IPs via un proxy rotatif et respecter un budget par endpoint. Un délai de \u003Cstrong>200ms\u003C\u002Fstrong> entre requêtes sur la même IP suffit généralement à rester sous la limite pour \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Geo-restrictions : pourquoi Bybit bloque certaines IPs\u003C\u002Fh2>\n\n\u003Cp>Bybit restreint l'accès depuis plusieurs juridictions, notamment les États-Unis, le Royaume-Uni, Singapour et le Canada. Les requêtes depuis ces régions reçoivent un \u003Ccode>403\u003C\u002Fcode> via CloudFront, le CDN d'AWS, avant même d'atteindre l'API. Cela affecte aussi l'API publique de marché — pas seulement le trading.\u003C\u002Fp>\n\n\u003Cp>Les \u003Ca href=\"\u002Ffr\u002Fproxy\u002Fresidential\">proxys résidentiels\u003C\u002Fa> résolvent ce problème en faisant transiter vos requêtes via une IP d'un pays autorisé (Allemagne, Japon, etc.). Avec ProxyHat, le géo-ciblage se fait directement dans le nom d'utilisateur :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode># Proxy HTTP avec géo-ciblage Allemagne\ncurl -x http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080 \\\n  &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Forderbook?category=spot&amp;symbol=BTCUSDT&amp;limit=50&quot;\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Le format \u003Ccode>user-country-DE\u003C\u002Fcode> indique à ProxyHat d'utiliser une IP résidentielle allemande. Consultez la liste complète des pays disponibles sur notre \u003Ca href=\"\u002Ffr\u002Flocations\">page des localisations\u003C\u002Fa>. Pour le \u003Cem>bybit v5 market api proxy\u003C\u002Fem>, l'Allemagne, les Pays-Bas ou le Japon sont d'excellents choix car ils ne sont pas sur la liste restreinte et offrent une faible latence vers les serveurs de Bybit.\u003C\u002Fp>\n\n\u003Ch2>Implémentation Node.js : rotation d'IP avec axios\u003C\u002Fh2>\n\n\u003Cp>Commençons par un exemple brut avec un proxy statique, puis passons à un manager de rotation ProxyHat qui change d'IP à chaque requête.\u003C\u002Fp>\n\n\u003Ch3>Proxy statique — récupération des tickers\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\n\u002F\u002F Proxy brut ProxyHat — IP résidentielle allemande\nconst agent = new HttpsProxyAgent(\n  &apos;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&apos;\n);\n\nasync function fetchTickers(category = &apos;spot&apos;) {\n  const url = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Ftickers?category=&apos; + category;\n  try {\n    const { data } = await axios.get(url, {\n      httpsAgent: agent,\n      timeout: 10000\n    });\n    if (data.retCode !== 0) {\n      throw new Error(&apos;Bybit &apos; + data.retCode + &apos;: &apos; + data.retMsg);\n    }\n    console.log(&apos;Tickers reçus:&apos;, data.result.list.length);\n    return data.result;\n  } catch (err) {\n    console.error(&apos;Échec:&apos;, err.message);\n    throw err;\n  }\n}\n\nfetchTickers(&apos;spot&apos;);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>ProxyHat rotation manager — orderbook multi-symboles\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\nclass ProxyHatManager {\n  constructor(user, pass, host = &apos;gate.proxyhat.com&apos;, port = 8080) {\n    this.user = user;\n    this.pass = pass;\n    this.host = host;\n    this.port = port;\n    this.counter = 0;\n  }\n\n  \u002F\u002F Rotation : nouvelle session = nouvelle IP\n  nextAgent(country = &apos;DE&apos;) {\n    const sid = &apos;sess&apos; + Date.now() + &apos;_&apos; + this.counter++;\n    const url = &apos;http:\u002F\u002F&apos; + this.user + &apos;-country-&apos; + country\n      + &apos;-sid-&apos; + sid + &apos;:&apos; + this.pass\n      + &apos;@&apos; + this.host + &apos;:&apos; + this.port;\n    return new HttpsProxyAgent(url);\n  }\n}\n\nconst manager = new ProxyHatManager(&apos;user&apos;, &apos;pass&apos;);\nconst symbols = [&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;, &apos;XRPUSDT&apos;, &apos;DOGEUSDT&apos;];\n\nasync function fetchOrderbook(symbol, category = &apos;spot&apos;) {\n  const agent = manager.nextAgent(&apos;DE&apos;);\n  const url = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Forderbook&apos;\n    + &apos;?category=&apos; + category + &apos;&amp;symbol=&apos; + symbol + &apos;&amp;limit=50&apos;;\n  const { data } = await axios.get(url, {\n    httpsAgent: agent,\n    timeout: 10000\n  });\n  if (data.retCode !== 0) {\n    throw new Error(&apos;Bybit &apos; + data.retCode + &apos;: &apos; + data.retMsg);\n  }\n  return data.result;\n}\n\nasync function scrapeAll() {\n  for (const sym of symbols) {\n    try {\n      const ob = await fetchOrderbook(sym);\n      const bestBid = ob.b[0][0];\n      const bestAsk = ob.a[0][0];\n      console.log(sym + &apos;: bid=&apos; + bestBid + &apos; ask=&apos; + bestAsk);\n      await new Promise(r =&gt; setTimeout(r, 200));\n    } catch (err) {\n      console.error(sym + &apos; échec:&apos;, err.message);\n      await new Promise(r =&gt; setTimeout(r, 1000));\n    }\n  }\n}\n\nscrapeAll();\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Ce pattern garantit que chaque symbole est fetché depuis une IP différente. Le délai de 200ms entre requêtes est conservé pour respecter le budget de rate limit par IP. Pour des volumes plus élevés, consultez notre \u003Ca href=\"\u002Ffr\u002Fpricing\">tarification\u003C\u002Fa> et augmentez la concurrence.\u003C\u002Fp>\n\n\u003Ch2>Implémentation Python : sessions sticky et pagination kline\u003C\u002Fh2>\n\n\u003Cp>Pour \u003Ccode>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode>, la pagination via \u003Ccode>cursor\u003C\u002Fcode> nécessite une session sticky — la même IP doit être utilisée pour toute la séquence de pages, sinon Bybit peut rejeter le curseur. ProxyHat supporte les sessions sticky via le flag \u003Ccode>-sid-\u003C\u002Fcode> dans le nom d'utilisateur.\u003C\u002Fp>\n\n\u003Ch3>Proxy brut — récupération kline simple\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>import requests\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\nPROXY = &quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot;\nBASE = &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&quot;\n\nsession = requests.Session()\nsession.proxies = {&quot;http&quot;: PROXY, &quot;https&quot;: PROXY}\n\nretry = Retry(total=3, backoff_factor=0.5,\n              status_forcelist=[429, 503])\nadapter = HTTPAdapter(max_retries=retry)\nsession.mount(&quot;https:\u002F\u002F&quot;, adapter)\n\ndef fetch_kline(symbol, interval=&quot;60&quot;, limit=&quot;200&quot;):\n    params = {&quot;category&quot;: &quot;spot&quot;, &quot;symbol&quot;: symbol,\n              &quot;interval&quot;: interval, &quot;limit&quot;: limit}\n    resp = session.get(f&quot;{BASE}\u002Fkline&quot;, params=params, timeout=10)\n    resp.raise_for_status()\n    body = resp.json()\n    if body[&quot;retCode&quot;] != 0:\n        raise Exception(f&quot;retCode {body[&apos;retCode&apos;]}: {body[&apos;retMsg&apos;]}&quot;)\n    return body[&quot;result&quot;][&quot;list&quot;]\n\ncandles = fetch_kline(&quot;BTCUSDT&quot;)\nprint(f&quot;Récupéré {len(candles)} bougies&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Session sticky — pagination kline avec backoff exponentiel\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>import requests\nimport time\nimport random\n\nBASE = &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&quot;\n\nclass ProxyHatClient:\n    def __init__(self, user, pass_, country=&quot;DE&quot;):\n        self.user = user\n        self.pass_ = pass_\n        self.country = country\n\n    def proxy_url(self, session_id=None):\n        u = f&quot;{self.user}-country-{self.country}&quot;\n        if session_id:\n            u += f&quot;-sid-{session_id}&quot;\n        return f&quot;http:\u002F\u002F{u}:{self.pass_}@gate.proxyhat.com:8080&quot;\n\n    def fetch(self, path, params, session_id=None,\n              max_retries=3):\n        proxy = self.proxy_url(session_id)\n        for attempt in range(max_retries):\n            try:\n                resp = requests.get(\n                    f&quot;{BASE}\u002F{path}&quot;,\n                    params=params,\n                    proxies={&quot;http&quot;: proxy, &quot;https&quot;: proxy},\n                    timeout=10\n                )\n                if resp.status_code == 403:\n                    raise Exception(&quot;403 — IP bloquée&quot;)\n                resp.raise_for_status()\n                body = resp.json()\n                if body[&quot;retCode&quot;] != 0:\n                    raise Exception(\n                        f&quot;retCode {body[&apos;retCode&apos;]}: {body[&apos;retMsg&apos;]}&quot;\n                    )\n                return body[&quot;result&quot;]\n            except Exception as e:\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f&quot;Tentative {attempt+1}: {e}, &quot;\n                      f&quot;attente {wait:.1f}s&quot;)\n                time.sleep(wait)\n        raise Exception(f&quot;Échec après {max_retries} essais&quot;)\n\nclient = ProxyHatClient(&quot;user&quot;, &quot;pass&quot;, country=&quot;DE&quot;)\nsid = &quot;kline_btc_001&quot;\n\nall_candles = []\ncursor = None\nfor page in range(5):\n    params = {&quot;category&quot;: &quot;spot&quot;, &quot;symbol&quot;: &quot;BTCUSDT&quot;,\n              &quot;interval&quot;: &quot;60&quot;, &quot;limit&quot;: &quot;200&quot;}\n    if cursor:\n        params[&quot;cursor&quot;] = cursor\n    result = client.fetch(&quot;kline&quot;, params,\n                          session_id=sid)\n    candles = result[&quot;list&quot;]\n    all_candles.extend(candles)\n    cursor = result.get(&quot;nextPageCursor&quot;)\n    if not cursor:\n        break\n    time.sleep(0.25)\n\nprint(f&quot;Total: {len(all_candles)} bougies&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>La session \u003Ccode>kline_btc_001\u003C\u002Fcode> maintient la même IP résidentielle pendant toute la pagination. Si vous scrapez plusieurs symboles en parallèle, utilisez un \u003Ccode>session_id\u003C\u002Fcode> différent par symbole pour répartir la charge sur plusieurs IPs tout en gardant la cohérence du curseur par symbole.\u003C\u002Fp>\n\n\u003Ch2>REST snapshots vs WebSocket orderbook.50\u003C\u002Fh2>\n\n\u003Cp>L'API REST \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> retourne un snapshot à un instant T. Pour suivre la profondeur en temps réel, Bybit propose un flux WebSocket public sur \u003Ccode>wss:\u002F\u002Fstream.bybit.com\u002Fv5\u002Fpublic\u002Fspot\u003C\u002Fcode> avec le topic \u003Ccode>orderbook.50.{symbol}\u003C\u002Fcode>, qui pousse des mises à jour différentielles à haute fréquence.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const WebSocket = require(&apos;ws&apos;);\n\nconst ws = new WebSocket(&apos;wss:\u002F\u002Fstream.bybit.com\u002Fv5\u002Fpublic\u002Fspot&apos;);\n\nws.on(&apos;open&apos;, () =&gt; {\n  ws.send(JSON.stringify({\n    op: &apos;subscribe&apos;,\n    args: [&apos;orderbook.50.BTCUSDT&apos;]\n  }));\n});\n\nws.on(&apos;message&apos;, (raw) =&gt; {\n  const msg = JSON.parse(raw);\n  if (msg.topic &amp;&amp; msg.topic.startsWith(&apos;orderbook.50&apos;)) {\n    const d = msg.data;\n    console.log(&apos;Update:&apos;, d.b?.length, &apos;bids,&apos;,\n                d.a?.length, &apos;asks, type:&apos;, d.type);\n  }\n});\n\nws.on(&apos;error&apos;, (err) =&gt; console.error(&apos;WS:&apos;, err.message));\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Le WebSocket ne nécessite généralement pas de proxy pour les données publiques (le flux est accessible globalement), mais si vous êtes dans une région restreinte, un proxy SOCKS5 peut être nécessaire. Dans ce cas, utilisez le port \u003Ccode>1080\u003C\u002Fcode> :\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode># SOCKS5 ProxyHat pour WebSocket\nsocks5:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Pour la plupart des cas d'usage de \u003Cem>bybit api scraping\u003C\u002Fem>, alternez entre REST (snapshots périodiques avec rotation d'IP) et WebSocket (streaming temps réel) selon vos besoins de latence. Le REST est plus simple à mettre en œuvre et à déboguer ; le WebSocket est indispensable pour le trading haute fréquence où une latence inférieure à 100ms est critique.\u003C\u002Fp>\n\n\u003Ch2>Erreurs courantes et bonnes pratiques\u003C\u002Fh2>\n\n\u003Cul>\n\u003Cli>Ignorer \u003Ccode>retCode\u003C\u002Fcode> : un HTTP 200 ne signifie pas succès. Vérifiez toujours \u003Ccode>retCode === 0\u003C\u002Fcode> avant de traiter \u003Ccode>result\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Bourrer \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> : cet endpoint est le plus sensible aux rate limits. Espacez vos requêtes d'au moins 200ms par IP.\u003C\u002Fli>\n\u003Cli>Changer d'IP en pleine pagination : Bybit lie le \u003Ccode>cursor\u003C\u002Fcode> à l'IP. Utilisez une session sticky pour \u003Ccode>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Oublier le backoff exponentiel : sur un 429 ou 403, attendez 1s, 2s, 4s avant de réessayer sur une nouvelle IP.\u003C\u002Fli>\n\u003Cli>Utiliser un datacenter proxy : Bybit peut détecter et filtrer les plages d'IPs de datacenters. Les proxys résidentiels offrent un taux de succès supérieur. En savoir plus sur le \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fweb-scraping\">scraping web\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Points clés à retenir\u003C\u002Fh2>\n\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>L'API V5 Market de Bybit est publique mais limitée par IP — la rotation de proxys est essentielle pour dépasser 120 req\u002Fmin par endpoint.\u003C\u002Fli>\n\u003Cli>Les sessions sticky (\u003Ccode>-sid-xxx\u003C\u002Fcode>) sont obligatoires pour paginer \u003Ccode>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode> sans rupture de curseur.\u003C\u002Fli>\n\u003Cli>Le géo-ciblage (\u003Ccode>-country-DE\u003C\u002Fcode>) via \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> contourne les blocages CloudFront des régions restreintes.\u003C\u002Fli>\n\u003Cli>Toujours valider \u003Ccode>retCode\u003C\u002Fcode> dans l'enveloppe de réponse, pas seulement le statut HTTP.\u003C\u002Fli>\n\u003Cli>Alterner REST (snapshots) et WebSocket (\u003Ccode>orderbook.50\u003C\u002Fcode>) selon le besoin de latence.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Cp>Pour aller plus loin, consultez la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentation ProxyHat\u003C\u002Fa> et explorez nos \u003Ca href=\"\u002Ffr\u002Fuse-cases\u002Fserp-tracking\">cas d'usage de tracking SERP\u003C\u002Fa> qui appliquent les mêmes patterns de rotation. Pour des stratégies avancées de scraping de données de marché, notre \u003Ca href=\"\u002Ffr\u002Fpricing\">page tarifs\u003C\u002Fa> détaille les plans adaptés au volume de votre pipeline.\u003C\u002Fp>","Données de marché crypto avec proxys rotatifs (Bybit V5) | ProxyHat","Guide développeur pour scraper l'API Market Bybit V5 avec proxys rotatifs. Code Node.js et Python, gestion des rate limits, geo-restrictions et sessions.","\u002Ffr\u002Fblog\u002Fscraper-api-bybit-v5-proxys-rotatifs",null,"Données de marché crypto avec proxys rotatifs | ProxyHat","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-og.webp",[18,21,24],{"question":19,"answer":20},"Pourquoi utiliser des proxys rotatifs pour scraper l'API Bybit V5 ?","Bybit applique des limites de taux strictes par adresse IP — environ 120 requêtes par minute sur \u002Fv5\u002Fmarket\u002Forderbook — et bloque les IPs qui dépassent ces limites pendant environ 10 minutes. Les proxys rotatifs distribuent vos requêtes sur de multiples IPs résidentielles, ce qui multiplie votre débit effectif et évite les bannissements. Ils permettent aussi de contourner les blocages géographiques.",{"question":22,"answer":23},"Quel type de proxy fonctionne le mieux pour scraper l'API Bybit ?","Les proxys résidentiels sont recommandés pour l'API Bybit car ils utilisent des IPs d'appareils réels, difficiles à distinguer du trafic organique. Les proxys datacenter peuvent être filtrés par Bybit. Avec ProxyHat, le géo-ciblage se fait via le nom d'utilisateur (user-country-DE) et les sessions sticky (user-sid-abc123) garantissent une IP constante pour la pagination.",{"question":25,"answer":26},"Comment éviter les blocages lors du scraping de l'API Bybit V5 ?","Respectez un délai minimum de 200ms entre les requêtes sur la même IP, utilisez des sessions sticky pour la pagination kline, implémentez un backoff exponentiel sur les erreurs 429 et 403, et vérifiez systématiquement retCode dans la réponse JSON. Distribuez vos requêtes sur plusieurs IPs via gate.proxyhat.com:8080 et ciblez un pays autorisé comme l'Allemagne ou le Japon.",false,"2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fscraper-api-bybit-v5-proxys-rotatifs-card.webp",12,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[39],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},4,"guides-developpeurs","Guides Développeurs","Guides Développeurs | Blog ProxyHat","Tutoriels de code et guides SDK pour intégrer des proxies dans vos applications.",[],{"de":47,"fr":13,"pt":48,"ru":49,"zh":50,"pl":51,"ko":52,"it":53,"es":54,"en":55,"ja":56,"x-default":55},"\u002Fde\u002Fblog\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen","\u002Fpt\u002Fblog\u002Fcomo-raspar-bybit-v5-market-api-proxies","\u002Fru\u002Fblog\u002Fkak-skrejpit-bybit-v5-market-api","\u002Fcn\u002Fblog\u002Fscrape-bybit-v5-market-api-proxy","\u002Fpl\u002Fblog\u002Fjak-scrapowac-bybit-v5-api-proxy","\u002Fko\u002Fblog\u002Fbybit-v5-market-api-proxy-scraping","\u002Fit\u002Fblog\u002Fscrape-bybit-v5-market-api-proxy","\u002Fes\u002Fblog\u002Fscrapear-api-mercado-bybit-v5-proxies","\u002Fblog\u002Fscrape-bybit-v5-market-api-rotating-proxies","\u002Fja\u002Fblog\u002Fbybit-v5-market-api-proxy-scraping",{"de":47,"fr":13,"pt":48,"ru":49,"zh":50,"pl":51,"ko":52,"it":53,"es":54,"en":55,"ja":56,"tr":58},"\u002Ftr\u002Fblog\u002Fbybit-v5-market-api-dondurulen-proxy",87,[61,77,93,109],{"id":62,"slug":63,"title":64,"excerpt":65,"featured_image_url":66,"featured_image_alt":67,"card_image_url":68,"og_image_url":69,"published_at":70,"updated_at":70,"content_updated_at":71,"reading_time_minutes":33,"is_featured":27,"indexable":4,"views":72,"author":73,"categories":74,"tags":76},176,"got-scraping-nodejs-proxy-residentiel-1","Guide got-scraping avec Node.js : proxies résidentiels et header generator","Apprenez à utiliser got-scraping avec Node.js pour des requêtes HTTP qui ressemblent à un vrai navigateur, avec rotation de proxies résidentiels ProxyHat, hooks de retry et patterns de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fgot-scraping-nodejs-proxy-residentiel-1-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00",121,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[75],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":78,"slug":79,"title":80,"excerpt":81,"featured_image_url":82,"featured_image_alt":83,"card_image_url":84,"og_image_url":85,"published_at":86,"updated_at":86,"content_updated_at":87,"reading_time_minutes":33,"is_featured":27,"indexable":27,"views":88,"author":89,"categories":90,"tags":92},175,"rotation-proxies-colly-golang-1","Rotation de proxies dans Colly : guide complet pour le web scraping en Go","Apprenez à implémenter une rotation de proxies dans Colly avec des proxies résidentiels ProxyHat. Couvre proxy.RoundRobinProxySwitcher, SetProxyFunc, sessions collantes, et patterns de production pour le scraping à grande échelle.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Frotation-proxies-colly-golang-1-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00",71,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[91],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":94,"slug":95,"title":96,"excerpt":97,"featured_image_url":98,"featured_image_alt":99,"card_image_url":100,"og_image_url":101,"published_at":102,"updated_at":102,"content_updated_at":103,"reading_time_minutes":33,"is_featured":27,"indexable":4,"views":104,"author":105,"categories":106,"tags":108},194,"comment-scraper-api-rest-binance-proxies","Limites de poids des API d'exchanges crypto : collecter les données de marché avec des proxies (exemple Binance)","Guide pratique pour collecter les données de marché publiques de Binance via son API REST à grande échelle en utilisant des proxies rotatifs. Endpoints, poids, rate limiting, code Python et Node.js inclus.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Fcomment-scraper-api-rest-binance-proxies-og.webp","2026-08-03T10:04:04+00:00","2026-10-04T01:29:50+00:00",82,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[107],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],{"id":110,"slug":111,"title":112,"excerpt":113,"featured_image_url":114,"featured_image_alt":115,"card_image_url":116,"og_image_url":117,"published_at":118,"updated_at":118,"content_updated_at":119,"reading_time_minutes":33,"is_featured":27,"indexable":27,"views":120,"author":121,"categories":122,"tags":124},172,"utiliser-proxy-swift-urlsession","Utiliser un proxy en Swift avec URLSession : guide développeur iOS et macOS","Guide pratique pour configurer des proxies résidentiels, datacenter et SOCKS5 dans URLSession sur iOS et macOS, avec authentification, géo-ciblage, async\u002Fawait et bonnes pratiques de production.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ffr\u002Futiliser-proxy-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00","2026-10-03T08:57:48+00:00",230,{"name":35,"slug":36,"bio":37,"avatar_url":14,"website_url":14,"social_links":14},[123],{"id":40,"slug":41,"name":42,"description":14,"meta_title":43,"meta_description":44,"parent_id":14},[],[]]