[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-de-bybit-v5-market-api-mit-rotating-proxies-scrapen":3},{"success":4,"payload":5,"related":63,"errors":156},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":30,"allow_follow":4,"published_at":31,"updated_at":31,"content_updated_at":32,"featured_image_url":33,"featured_image_alt":34,"card_image_url":35,"reading_time_minutes":36,"author":37,"categories":41,"tags":48,"alternates":49,"locale_paths":60,"views":62},195,"bybit-v5-market-api-mit-rotating-proxies-scrapen","Krypto-Marktdaten über einheitliche Börsen-APIs mit rotierenden Proxies abrufen: Entwickler-Leitfaden (Beispiel Bybit V5)","Praktischer Entwickler-Leitfaden für das Scrapen der Bybit V5 Market API mit rotierenden Proxies – inklusive Code-Beispielen für Node.js und Python, Rate-Limit-Strategien und ProxyHat-Setup.","\u003Cp>Das Scrapen der Bybit V5 Market API ist eine der zuverlässigsten Möglichkeiten, an öffentliche Marktdaten wie Orderbücher, Ticker, Kline-Daten und letzte Trades für Krypto-Handelspaare zu gelangen. Sobald Sie jedoch Hunderte oder Tausende von Anfragen pro Minute an \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> oder \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fcode> senden, stoßen Sie schnell auf Bybits IP-basierte Rate-Limits und Geo-Blockaden. Genau hier hilft das Scrapen der Bybit V5 Market API mit rotierenden Proxies – es verteilt Anfragen über viele IP-Adressen und umgeht regionale Sperren, ohne gegen die öffentlichen Endpunkte zu verstoßen.\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cstrong>Wichtiger Hinweis:\u003C\u002Fstrong> Dieser Leitfaden behandelt ausschließlich \u003Cem>öffentliche\u003C\u002Fem> Marktdaten-Endpunkte der Bybit V5 API. Das Scrapen von authentifizierten Konto- oder Handelsendpunkten kann gegen die Bybit-Nutzungsbedingungen verstoßen. Prüfen Sie stets die \u003Ca href=\"https:\u002F\u002Fwww.bybit.com\u002Fen\u002Fhelp-center\u002Farticle\u002FIntroduction-to-Bybit-API\" rel=\"noopener noreferrer\">offizielle Bybit-API-Dokumentation\u003C\u002Fa> und die Nutzungsbedingungen, bevor Sie automatisierte Datensammlung betreiben.\u003C\u002Fp>\u003C\u002Fblockquote>\n\n\u003Ch2>Bybit V5 Market API scrapen: Endpunkte und Antwort-Struktur verstehen\u003C\u002Fh2>\n\n\u003Cp>Die Bybit V5 API konsolidiert frühere v2\u002Fv3-Endpunkte unter einem einzigen \u003Ccode>\u002Fv5\u003C\u002Fcode>-Präfix. Für öffentliche Marktdaten sind vier Endpunkte relevant:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>GET \u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode>\u003C\u002Fstrong> – Liefert das aktuelle Orderbuch für ein Symbol. Der Parameter \u003Ccode>category\u003C\u002Fcode> akzeptiert \u003Ccode>spot\u003C\u002Fcode>, \u003Ccode>linear\u003C\u002Fcode> oder \u003Ccode>option\u003C\u002Fcode>. Mit \u003Ccode>limit\u003C\u002Fcode> steuern Sie die Tiefe (z. B. 1, 25, 50, 100, 500).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>GET \u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fcode>\u003C\u002Fstrong> – Gibt Ticker-Statistiken (Letzter Preis, 24h-Volumen, Funding-Rate) für alle Symbole oder ein einzelnes Symbol zurück, ebenfalls gesteuert durch \u003Ccode>category\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>GET \u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode>\u003C\u002Fstrong> – Historische Kerzendaten (OHLCV) mit wählbarem Intervall (1, 3, 5, 15, 30, 60, 240, D, W, M) und \u003Ccode>limit\u003C\u002Fcode> bis 1000.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>GET \u002Fv5\u002Fmarket\u002Frecent-trade\u003C\u002Fcode>\u003C\u002Fstrong> – Letzte auszuführende Trades, nützlich für Tick-Level-Analysen.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Alle Antworten folgen einer einheitlichen Hülle:\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>\u003Ccode>retCode == 0\u003C\u002Fcode> bedeutet Erfolg. Jeder andere Wert (z. B. \u003Ccode>10001\u003C\u002Fcode>, \u003Ccode>10014\u003C\u002Fcode>) signalisiert einen Fehler – \u003Ccode>retMsg\u003C\u002Fcode> liefert die Details. Bei Rate-Limit-Verstößen erhalten Sie typischerweise HTTP \u003Ccode>403\u003C\u002Fcode> oder \u003Ccode>429\u003C\u002Fcode> mit einer entsprechenden \u003Ccode>retMsg\u003C\u002Fcode>. Eine vollständige Fehlercode-Liste finden Sie in der \u003Ca href=\"https:\u002F\u002Fbybit-exchange.github.io\u002Fdocs\u002Fv5\u002Ferror\" rel=\"noopener noreferrer\">offiziellen Fehlercode-Referenz\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Warum IP-Rate-Limits und Geo-Blockaden das Scrapen erschweren\u003C\u002Fh2>\n\n\u003Ch3>IP-basierte Rate-Limits und 10-Minuten-Sperre\u003C\u002Fh3>\n\n\u003Cp>Bybit wendet pro-IP-Rate-Limits auf öffentliche Endpunkte an. Der Endpunkt \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> ist besonders restriktiv: Laut Bybit-Dokumentation liegt die Obergrenze bei 100 Anfragen pro Sekunde pro IP für die meisten öffentlichen Endpunkte, aber Burst-Verhalten über mehrere Sekunden hinweg kann trotzdem zu \u003Ccode>403\u003C\u002Fcode>-Antworten führen. Sobald eine IP gesperrt wird, dauert die Blockade typischerweise ca. 10 Minuten, bevor die IP wieder Anfragen senden darf.\u003C\u002Fp>\n\n\u003Cp>Wenn Sie beispielsweise 200 Symbole in einer Schleife mit \u003Ccode>limit=500\u003C\u002Fcode> abfragen und dabei 1500 Anfragen pro Sekunde abfeuern, wird Ihre IP innerhalb weniger Sekunden gebannt. Ohne Rotationsstrategie sind Sie dann für 10 Minuten vollständig blockiert.\u003C\u002Fp>\n\n\u003Ch3>Geo-Beschränkungen: 403 und CloudFront-Blockaden\u003C\u002Fh3>\n\n\u003Cp>Bybit ist in mehreren Jurisdiktionen reguliert restriktiert, darunter den USA, UK und weiteren eingeschränkten Regionen. Anfragen aus diesen Regionen werden oft durch AWS CloudFront mit HTTP \u003Ccode>403\u003C\u002Fcode> abgelehnt, noch bevor sie die Bybit-Origin erreichen. Die Antwort enthält dann typischerweise keinen \u003Ccode>retCode\u003C\u002Fcode>, sondern eine generische CloudFront-Fehlerseite.\u003C\u002Fp>\n\n\u003Cp>Hier kommen \u003Ca href=\"\u002Fde\u002Fproxy\u002Fresidential\">residential Proxies\u003C\u002Fa> ins Spiel: Sie leiten Anfragen über IPs aus erlaubten Ländern (z. B. Deutschland, Singapur, Japan) und umgehen so die CloudFront-Geo-Prüfung. Mit ProxyHat können Sie das Zielland über den Benutzernamen steuern, z. B. \u003Ccode>user-country-DE\u003C\u002Fcode> für eine deutsche Exit-IP.\u003C\u002Fp>\n\n\u003Ch2>Proxy-Typen im Vergleich: Residential vs. Datacenter vs. Mobile\u003C\u002Fh2>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Proxy-Typ\u003C\u002Fth>\u003Cth>Tarif\u003C\u002Fth>\u003Cth>Erfolgsrate bei Bybit\u003C\u002Fth>\u003Cth>Empfohlen für\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Residential\u003C\u002Ftd>\u003Ctd>Mittel\u003C\u002Ftd>\u003Ctd>Hoch (90–98%)\u003C\u002Ftd>\u003Ctd>Geo-Blockaden umgehen, langfristiges Scraping\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Datacenter\u003C\u002Ftd>\u003Ctd>Niedrig\u003C\u002Ftd>\u003Ctd>Mittel (70–85%)\u003C\u002Ftd>\u003Ctd>Kostenoptimierte Bulk-Anfragen aus nicht blockierten Regionen\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Mobile\u003C\u002Ftd>\u003Ctd>Hoch\u003C\u002Ftd>\u003Ctd>Sehr hoch (95–99%)\u003C\u002Ftd>\u003Ctd>Höchste Zuverlässigkeit, teure Workloads\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Für Bybit empfehlen wir residential Proxies als Standard, da sie die beste Balance aus Kosten und Erfolgsrate bieten und Geo-Blockaden zuverlässig umgehen. Details zu verfügbaren Standorten finden Sie auf der \u003Ca href=\"\u002Fde\u002Flocations\">ProxyHat-Locations-Seite\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>ProxyHat-Setup: HTTP und SOCKS5 verbinden\u003C\u002Fh2>\n\n\u003Cp>ProxyHat verwendet einen zentralen Gateway unter \u003Ccode>gate.proxyhat.com\u003C\u002Fcode>. Die Proxy-Authentifizierung erfolgt über Benutzername und Passwort im URL-Format. Geo-Targeting und Session-Stickiness werden über den Benutzernamen gesteuert.\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Protokoll\u003C\u002Fth>\u003Cth>Host\u003C\u002Fth>\u003Cth>Port\u003C\u002Fth>\u003Cth>URL-Format\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>HTTP\u003C\u002Ftd>\u003Ctd>gate.proxyhat.com\u003C\u002Ftd>\u003Ctd>8080\u003C\u002Ftd>\u003Ctd>\u003Ccode>http:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>SOCKS5\u003C\u002Ftd>\u003Ctd>gate.proxyhat.com\u003C\u002Ftd>\u003Ctd>1080\u003C\u002Ftd>\u003Ctd>\u003Ccode>socks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Beispiele für erweiterte Benutzernamen:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode># Deutschland als Exit-Land\nhttp:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080\n\n# Stadtgenaue Zielung (Berlin)\nhttp:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin:pass@gate.proxyhat.com:8080\n\n# Sticky Session für konsistente Pagination\nhttp:\u002F\u002Fuser-sid-abc123:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Weitere Konfigurationsdetails finden Sie in der \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">ProxyHat-Dokumentation\u003C\u002Fa>. Preisinformationen finden Sie auf der \u003Ca href=\"\u002Fde\u002Fpricing\">ProxyHat-Pricing-Seite\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Code-Beispiel 1: Bybit Orderbook mit curl und rotierendem Proxy\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode># Orderbook für BTCUSDT (linear) über deutschen Residential Proxy\ncurl -x &quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot; \\\n  &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Forderbook?category=linear&amp;symbol=BTCUSDT&amp;limit=50&quot;\n\n# Ticker für Spot-Kategorie\ncurl -x &quot;http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080&quot; \\\n  &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Ftickers?category=spot&quot;\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Dieser einfuelle Aufruf zeigt das Grundprinzip: Jede Anfrage verlässt Ihr System über eine deutsche Residential-IP und erreicht Bybit ohne CloudFront-Blockade.\u003C\u002Fp>\n\n\u003Ch2>Code-Beispiel 2: Node.js mit axios – IP-Rotation über eine Symbolliste\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\nconst PROXYHAT_USER = &apos;user&apos;;\nconst PROXYHAT_PASS = &apos;pass&apos;;\nconst BASE = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&apos;;\n\n\u002F\u002F Symbole, die wir abfragen wollen\nconst symbols = [&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;, &apos;XRPUSDT&apos;, &apos;DOGEUSDT&apos;];\n\n\u002F\u002F Erzeugt bei jedem Aufruf eine neue Proxy-URL mit Rotation\nfunction buildProxyAgent() {\n  const proxyUrl = `http:\u002F\u002F${PROXYHAT_USER}:${PROXYHAT_PASS}@gate.proxyhat.com:8080`;\n  return new HttpsProxyAgent(proxyUrl);\n}\n\nasync function fetchOrderbook(symbol) {\n  const url = `${BASE}\u002Forderbook?category=linear&amp;symbol=${symbol}&amp;limit=50`;\n  const maxRetries = 4;\n  let attempt = 0;\n\n  while (attempt &lt; maxRetries) {\n    try {\n      const res = await axios.get(url, {\n        httpsAgent: buildProxyAgent(),\n        timeout: 10000,\n      });\n      if (res.data.retCode !== 0) {\n        throw new Error(`Bybit retCode ${res.data.retCode}: ${res.data.retMsg}`);\n      }\n      return res.data.result;\n    } catch (err) {\n      attempt++;\n      const backoff = Math.min(1000 * Math.pow(2, attempt), 8000);\n      console.warn(`[${symbol}] Versuch ${attempt} fehlgeschlagen: ${err.message}. Warte ${backoff}ms`);\n      await new Promise(r =&gt; setTimeout(r, backoff));\n    }\n  }\n  throw new Error(`Orderbook für ${symbol} nach ${maxRetries} Versuchen nicht abrufbar`);\n}\n\nasync function main() {\n  const results = await Promise.allSettled(\n    symbols.map(sym =&gt; fetchOrderbook(sym))\n  );\n  results.forEach((r, i) =&gt; {\n    if (r.status === &apos;fulfilled&apos;) {\n      console.log(`${symbols[i]}: ${r.value.b.length} Bids, ${r.value.a.length} Asks`);\n    } else {\n      console.error(`${symbols[i]}: FEHLER ${r.reason}`);\n    }\n  });\n}\n\nmain();\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>In dieser Implementierung wird für jede Anfrage ein neuer \u003Ccode>HttpsProxyAgent\u003C\u002Fcode> erstellt, wodurch ProxyHat automatisch eine neue Exit-IP zuweist. Der exponentielle Backoff (1s, 2s, 4s, 8s) fängt temporäre 403\u002F429-Antworten ab, ohne die IP endgültig zu blockieren.\u003C\u002Fp>\n\n\u003Ch2>Code-Beispiel 3: Python mit requests und Proxy-Session-Rotation\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>import requests\nimport time\nimport logging\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\nlogging.basicConfig(level=logging.INFO, format=&apos;%(asctime)s %(levelname)s %(message)s&apos;)\n\nPROXYHAT_USER = &apos;user&apos;\nPROXYHAT_PASS = &apos;pass&apos;\nBASE = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&apos;\n\n# Per-Endpoint Rate-Budget: max 80 req\u002Fs, um unter Bybits Limit zu bleiben\nMIN_INTERVAL = 1.0 \u002F 80\n_last_call = 0.0\n\ndef rate_budget():\n    global _last_call\n    now = time.monotonic()\n    elapsed = now - _last_call\n    if elapsed &lt; MIN_INTERVAL:\n        time.sleep(MIN_INTERVAL - elapsed)\n    _last_call = time.monotonic()\n\ndef build_proxy_url(country=&apos;DE&apos;):\n    return f&apos;http:\u002F\u002F{PROXYHAT_USER}-country-{country}:{PROXYHAT_PASS}@gate.proxyhat.com:8080&apos;\n\ndef fetch_tickers(category=&apos;linear&apos;):\n    session = requests.Session()\n    retry = Retry(total=4, backoff_factor=1.5,\n                  status_forcelist=[429, 502, 503, 504],\n                  allowed_methods=[&apos;GET&apos;])\n    session.mount(&apos;https:\u002F\u002F&apos;, HTTPAdapter(max_retries=retry))\n    session.proxies = {\n        &apos;http&apos;: build_proxy_url(&apos;DE&apos;),\n        &apos;https&apos;: build_proxy_url(&apos;DE&apos;),\n    }\n    url = f&apos;{BASE}\u002Ftickers?category={category}&apos;\n    rate_budget()\n    resp = session.get(url, timeout=10)\n    resp.raise_for_status()\n    data = resp.json()\n    if data.get(&apos;retCode&apos;) != 0:\n        raise RuntimeError(f&quot;Bybit retCode {data.get(&apos;retCode&apos;)}: {data.get(&apos;retMsg&apos;)}&quot;)\n    return data[&apos;result&apos;][&apos;list&apos;]\n\nif __name__ == &apos;__main__&apos;:\n    tickers = fetch_tickers(&apos;linear&apos;)\n    print(f&apos;{len(tickers)} Ticker empfangen&apos;)\n    for t in tickers[:5]:\n        print(t[&apos;symbol&apos;], t[&apos;lastPrice&apos;])\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Das Rate-Budget von 80 Anfragen pro Sekunde lässt bewusst 20% Puffer unter Bybits dokumentiertem Limit, um Burst-bedingte 403-Sperren zu vermeiden. Die \u003Ccode>Retry\u003C\u002Fcode>-Strategie von urllib3 behandelt transiente HTTP-Fehler automatisch.\u003C\u002Fp>\n\n\u003Ch2>Code-Beispiel 4: Sticky Sessions für konsistente Kline-Pagination\u003C\u002Fh2>\n\n\u003Cp>Beim Paginieren von \u003Ccode>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fcode> ist es wichtig, dass aufeinanderfolgende Anfragen dieselbe Exit-IP verwenden – Bybit kann sonst Inkonsistenzen oder temporäre Sperren auslösen. ProxyHat unterstützt sticky Sessions über den \u003Ccode>-sid-*\u003C\u002Fcode>-Parameter im Benutzernamen.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import requests\nimport time\n\nPROXYHAT_USER = &apos;user&apos;\nPROXYHAT_PASS = &apos;pass&apos;\nBASE = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&apos;\n\ndef fetch_klines(symbol, interval=&apos;60&apos;, total=5000):\n    &quot;&quot;&quot;Paginiert Kline-Daten mit Sticky Session über ProxyHat.&quot;&quot;&quot;\n    session_id = f&apos;kline-{symbol}-{int(time.time())}&apos;\n    proxy_url = f&apos;http:\u002F\u002F{PROXYHAT_USER}-sid-{session_id}-country-DE:{PROXYHAT_PASS}@gate.proxyhat.com:8080&apos;\n\n    session = requests.Session()\n    session.proxies = {&apos;http&apos;: proxy_url, &apos;https&apos;: proxy_url}\n\n    collected = []\n    end_cursor = None\n    limit = 1000  # Max pro Anfrage\n\n    while len(collected) &lt; total:\n        params = {\n            &apos;category&apos;: &apos;linear&apos;,\n            &apos;symbol&apos;: symbol,\n            &apos;interval&apos;: interval,\n            &apos;limit&apos;: limit,\n        }\n        if end_cursor:\n            params[&apos;start&apos;] = end_cursor\n\n        resp = session.get(f&apos;{BASE}\u002Fkline&apos;, params=params, timeout=15)\n        data = resp.json()\n        if data.get(&apos;retCode&apos;) != 0:\n            raise RuntimeError(f&quot;retCode {data.get(&apos;retCode&apos;)}: {data.get(&apos;retMsg&apos;)}&quot;)\n\n        rows = data[&apos;result&apos;][&apos;list&apos;]\n        if not rows:\n            break\n\n        collected.extend(rows)\n        # Bybit gibt Klines absteigend zurück; ältester Timestamp als nächster Start\n        end_cursor = str(int(rows[-1][0]) - 1)\n        time.sleep(0.15)  # Höflichkeitspause\n        print(f&apos;  {len(collected)}\u002F{total} Klines gesammelt&apos;)\n\n    return collected\n\nif __name__ == &apos;__main__&apos;:\n    klines = fetch_klines(&apos;BTCUSDT&apos;, interval=&apos;60&apos;, total=5000)\n    print(f&apos;{len(klines)} Klines insgesamt&apos;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Die Sticky Session garantiert, dass alle Paginierungs-Anfragen von derselben IP kommen. Das ist kritisch, weil Bybit bei IP-Wechseln mitten in einer Pagination-Sequenz manchmal \u003Ccode>retCode 10001\u003C\u002Fcode> zurückgibt.\u003C\u002Fp>\n\n\u003Ch2>Code-Beispiel 5: Node.js mit ProxyHat-SDK-Muster und asynchroner Verarbeitung\u003C\u002Fh2>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst { HttpsProxyAgent } = require(&apos;https-proxy-agent&apos;);\n\nconst PROXYHAT_USER = &apos;user&apos;;\nconst PROXYHAT_PASS = &apos;pass&apos;;\nconst BASE = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket&apos;;\n\n\u002F\u002F ProxyHat SDK-ähnlicher Wrapper\nclass ProxyHatClient {\n  constructor(user, pass, opts = {}) {\n    this.user = user;\n    this.pass = pass;\n    this.country = opts.country || &apos;DE&apos;;\n    this.sessionId = opts.sessionId || null;\n  }\n\n  buildUsername() {\n    let u = this.user;\n    if (this.sessionId) u += `-sid-${this.sessionId}`;\n    u += `-country-${this.country}`;\n    return u;\n  }\n\n  agent() {\n    const url = `http:\u002F\u002F${this.buildUsername()}:${this.pass}@gate.proxyhat.com:8080`;\n    return new HttpsProxyAgent(url);\n  }\n\n  async get(path, params = {}) {\n    const qs = new URLSearchParams(params).toString();\n    const url = `${BASE}${path}?${qs}`;\n    let attempt = 0;\n    while (attempt &lt; 5) {\n      try {\n        const res = await axios.get(url, { httpsAgent: this.agent(), timeout: 10000 });\n        if (res.data.retCode !== 0) {\n          throw new Error(`retCode ${res.data.retCode}: ${res.data.retMsg}`);\n        }\n        return res.data.result;\n      } catch (err) {\n        attempt++;\n        const wait = Math.min(500 * Math.pow(2, attempt), 16000);\n        console.warn(`Retry ${attempt} nach ${wait}ms: ${err.message}`);\n        await new Promise(r =&gt; setTimeout(r, wait));\n      }\n    }\n    throw new Error(`Fehler bei ${path} nach 5 Versuchen`);\n  }\n}\n\nasync function scrapeRecentTrades(symbols) {\n  const client = new ProxyHatClient(PROXYHAT_USER, PROXYHAT_PASS, { country: &apos;DE&apos; });\n  const results = [];\n\n  for (const sym of symbols) {\n    try {\n      const data = await client.get(&apos;\u002Frecent-trade&apos;, { category: &apos;spot&apos;, symbol: sym, limit: 50 });\n      results.push({ symbol: sym, trades: data.list });\n      console.log(`${sym}: ${data.list.length} Trades empfangen`);\n    } catch (err) {\n      console.error(`${sym}: ${err.message}`);\n    }\n    await new Promise(r =&gt; setTimeout(r, 100)); \u002F\u002F Rate-Budget\n  }\n  return results;\n}\n\n(async () =&gt; {\n  const symbols = [&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;];\n  const all = await scrapeRecentTrades(symbols);\n  console.log(`Fertig: ${all.length} Symbole verarbeitet`);\n})();\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Dieses Muster kapselt die Proxy-Erzeugung in einer wiederverwendbaren Klasse, die den Wechsel zwischen rotierenden IPs und sticky Sessions über einen einfachen Konstruktor-Parameter steuert. Für größere Workloads können Sie mehrere \u003Ccode>ProxyHatClient\u003C\u002Fcode>-Instanzen mit unterschiedlichen Session-IDs parallel betreiben.\u003C\u002Fp>\n\n\u003Ch2>REST-Snapshots vs. WebSocket orderbook.50\u003C\u002Fh2>\n\n\u003Cp>Bybit bietet für Live-Daten zusätzlich eine öffentliche WebSocket-API. Der Stream \u003Ccode>orderbook.50.{symbol}\u003C\u002Fcode> liefert inkrementelle Orderbuch-Updates mit 50 Ebenen pro Seite und reduziert den REST-Overhead drastisch.\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Eigenschaft\u003C\u002Fth>\u003Cth>REST \u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fth>\u003Cth>WebSocket orderbook.50\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Aktualisierungsrate\u003C\u002Ftd>\u003Ctd>Bei jedem Poll\u003C\u002Ftd>\u003Ctd>Push bei Änderung (≈20ms)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Rate-Limit-Belastung\u003C\u002Ftd>\u003Ctd>Hoch (pro Anfrage)\u003C\u002Ftd>\u003Ctd>Niedrig (1 Verbindung)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Proxy-Komplexität\u003C\u002Ftd>\u003Ctd>HTTP-Proxy ausreichend\u003C\u002Ftd>\u003Ctd>WebSocket-fähiger Proxy nötig\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Ideal für\u003C\u002Ftd>\u003Ctd>Snapshots, Batch-Jobs\u003C\u002Ftd>\u003Ctd>Live-Trading-Bots, HFT\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>Für reine historische Analysen oder gelegentliche Snapshots ist REST einfacher. Für kontinuierliches Orderbook-Monitoring ist WebSocket deutlich effizienter – erfordert aber einen Proxy, der WebSocket-Verbindungen unterstützt. ProxyHat unterstützt WebSocket über SOCKS5 auf Port \u003Ccode>1080\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode># WebSocket über SOCKS5-Proxy (Node.js mit ws + socks-proxy-agent)\nconst WebSocket = require(&apos;ws&apos;);\nconst { SocksProxyAgent } = require(&apos;socks-proxy-agent&apos;);\n\nconst agent = new SocksProxyAgent(&apos;socks5:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:1080&apos;);\nconst ws = new WebSocket(&apos;wss:\u002F\u002Fstream.bybit.com\u002Fv5\u002Fpublic\u002Flinear&apos;, { agent });\n\nws.on(&apos;open&apos;, () =&gt; {\n  ws.send(JSON.stringify({ op: &apos;subscribe&apos;, args: [&apos;orderbook.50.BTCUSDT&apos;] }));\n});\n\nws.on(&apos;message&apos;, (raw) =&gt; {\n  const msg = JSON.parse(raw.toString());\n  if (msg.topic &amp;&amp; msg.topic.startsWith(&apos;orderbook.50&apos;)) {\n    console.log(&apos;Update:&apos;, msg.data.b?.length, &apos;Bids&apos;);\n  }\n});\n\nws.on(&apos;error&apos;, (err) =&gt; console.error(&apos;WS-Fehler:&apos;, err.message));\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Häufige Fehler und Edge Cases\u003C\u002Fh2>\n\n\u003Cul>\n\u003Cli>403 ohne retCode: CloudFront-Blockade aus eingeschränkter Region. Lösung: Residential Proxy mit \u003Ccode>-country-DE\u003C\u002Fcode> oder \u003Ccode>-country-SG\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>retCode 10014: Anfragerate überschritten. Lösung: Rate-Budget reduzieren, Backoff erhöhen, mehr IPs rotieren.\u003C\u002Fli>\n\u003Cli>Leere Orderbücher bei Option-Kategorie: Nicht alle Symbole haben aktive Optionsmärkte. Prüfen Sie \u003Ccode>\u002Fv5\u002Fmarket\u002Finstruments-info\u003C\u002Fcode> zuerst.\u003C\u002Fli>\n\u003Cli>Veraltete Sticky Session: Sessions können nach ca. 10–30 Minuten ablaufen. Generieren Sie bei langen Jobs regelmäßig neue Session-IDs.\u003C\u002Fli>\n\u003Cli>Zeitstempel-Durcheinander bei Klines: Bybit liefert Klines absteigend. Sortieren Sie explizit vor der Speicherung.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\n\u003Cul>\n\u003Cli>Die Bybit V5 Market API nutzt eine einheitliche \u003Ccode>retCode\u002FretMsg\u003C\u002Fcode>-Hülle; \u003Ccode>retCode == 0\u003C\u002Fcode> bedeutet Erfolg.\u003C\u002Fli>\n\u003Cli>IP-Rate-Limits liegen bei ca. 100 req\u002Fs pro Endpunkt; bei Verstößen folgt eine ca. 10-minütige IP-Sperre.\u003C\u002Fli>\n\u003Cli>Geo-Blockaden (US\u002FUK) werden durch CloudFront mit HTTP 403 durchgesetzt – residential Proxies mit \u003Ccode>-country-DE\u003C\u002Fcode> umgehen dies.\u003C\u002Fli>\n\u003Cli>Verwenden Sie sticky Sessions (\u003Ccode>-sid-*\u003C\u002Fcode>) für konsistente Pagination und rotierende IPs für Bulk-Abfragen.\u003C\u002Fli>\n\u003Cli>Für Live-Daten ist der WebSocket \u003Ccode>orderbook.50\u003C\u002Fcode> effizienter als REST-Polling.\u003C\u002Fli>\n\u003Cli>Prüfen Sie stets die Bybit-Nutzungsbedingungen; scrapen Sie nur öffentliche Daten.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Weitere Anwendungsfälle für Proxy-basiertes Scraping finden Sie in unseren Leitfäden zu \u003Ca href=\"\u002Fde\u002Fuse-cases\u002Fweb-scraping\">Web-Scraping\u003C\u002Fa> und \u003Ca href=\"\u002Fde\u002Fuse-cases\u002Fserp-tracking\">SERP-Tracking\u003C\u002Fa>.\u003C\u002Fp>","Krypto-Marktdaten mit rotierenden Proxies (Bybit V5) | ProxyHat","Entwickler-Leitfaden zum Scrapen der Bybit V5 Market API mit rotierenden Proxies – Code-Beispiele, Rate-Limits und Geo-Blockaden mit ProxyHat.","\u002Fde\u002Fblog\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen",null,"Krypto-Marktdaten mit rotierenden Proxies | ProxyHat","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen-og.webp",[18,21,24,27],{"question":19,"answer":20},"Warum sind rotierende Proxies für das Bybit-API-Scraping wichtig?","Bybit wendet strikte IP-Rate-Limits an und sperrt IPs bei Verstößen für ca. 10 Minuten. Zudem blockiert CloudFront Anfragen aus eingeschränkten Regionen wie den USA mit HTTP 403. Rotierende residential Proxies verteilen Last über viele IPs und erlauben Geo-Targeting auf erlaubte Länder.",{"question":22,"answer":23},"Welcher Proxy-Typ eignet sich am besten für Bybit-API-Scraping?","Residential Proxies bieten die beste Balance aus Erfolgsrate (90–98%) und Kosten. Sie umgehen CloudFront-Geo-Blockaden zuverlässig. Mobile Proxies sind noch zuverlässiger, aber teurer. Datacenter-Proxies sind günstiger, aber anfälliger für Erkennung und Blockade.",{"question":25,"answer":26},"Wie vermeide ich Blocks beim Scrapen der Bybit V5 Market API?","Halten Sie sich unter den dokumentierten Rate-Limits (ca. 80 req\u002Fs mit Sicherheitspuffer), verwenden Sie exponentiellen Backoff bei 429\u002F503-Antworten, rotieren Sie IPs pro Anfrage über ProxyHat und nutzen Sie sticky Sessions für Pagination. Bei Geo-Blockaden wählen Sie Exit-Länder wie DE oder SG über -country-* im Benutzernamen.",{"question":28,"answer":29},"Sollte ich REST oder WebSocket für Bybit-Marktdaten verwenden?","REST eignet sich für Snapshots und Batch-Jobs. Für kontinuierliches Orderbook-Monitoring ist der WebSocket-Stream orderbook.50 effizienter, da er Push-Updates bei jeder Änderung liefert und die Rate-Limit-Belastung minimiert. ProxyHat unterstützt WebSocket über SOCKS5 auf Port 1080.",false,"2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen-card.webp",12,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[42],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},4,"entwickler-anleitungen","Entwickler-Anleitungen","Entwickler-Anleitungen | ProxyHat Blog","Code-Tutorials und SDK-Anleitungen zur Proxy-Integration in Ihre Anwendungen.",[],{"de":13,"fr":50,"it":51,"ko":52,"zh":53,"pl":54,"pt":55,"ru":56,"es":57,"en":58,"ja":59,"x-default":58},"\u002Ffr\u002Fblog\u002Fscraper-api-bybit-v5-proxys-rotatifs","\u002Fit\u002Fblog\u002Fscrape-bybit-v5-market-api-proxy","\u002Fko\u002Fblog\u002Fbybit-v5-market-api-proxy-scraping","\u002Fcn\u002Fblog\u002Fscrape-bybit-v5-market-api-proxy","\u002Fpl\u002Fblog\u002Fjak-scrapowac-bybit-v5-api-proxy","\u002Fpt\u002Fblog\u002Fcomo-raspar-bybit-v5-market-api-proxies","\u002Fru\u002Fblog\u002Fkak-skrejpit-bybit-v5-market-api","\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":13,"fr":50,"it":51,"ko":52,"zh":53,"pl":54,"pt":55,"ru":56,"es":57,"en":58,"ja":59,"tr":61},"\u002Ftr\u002Fblog\u002Fbybit-v5-market-api-dondurulen-proxy",87,[64,97,124,140],{"id":65,"slug":66,"title":67,"excerpt":68,"featured_image_url":69,"featured_image_alt":70,"card_image_url":71,"og_image_url":72,"published_at":73,"updated_at":74,"content_updated_at":75,"reading_time_minutes":76,"is_featured":30,"indexable":4,"views":76,"author":77,"categories":78,"tags":80},210,"proxy-einrichtung-fuer-ki-agenten","Proxy für KI-Agenten einrichten: browser-use, Crawl4AI und MCP","Agenten auf Cloud-VMs treten mit Datacenter-IPs ins Netz. Hier finden Sie aktuelle, funktionierende Proxy-Konfigurationen für browser-use, Crawl4AI und einen MCP-Server, eine Entscheidungstabelle für Sticky vs. Rotation und die Kostenfallen, die Sie vermeiden sollten.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fproxy-einrichtung-fuer-ki-agenten-master.webp","Proxy Setup for AI Agents: browser-use, Crawl4AI and an MCP Server","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fproxy-einrichtung-fuer-ki-agenten-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fproxy-einrichtung-fuer-ki-agenten-og.webp","2026-10-24T09:00:00+00:00","2026-10-24T09:00:20+00:00","2026-10-03T09:41:41+00:00",14,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[79],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[81,85,89,93],{"id":82,"slug":83,"name":84},1,"web-scraping","Web Scraping",{"id":86,"slug":87,"name":88},2,"residential-proxies","Residential Proxies",{"id":90,"slug":91,"name":92},9,"python","Python",{"id":94,"slug":95,"name":96},22,"playwright","Playwright",{"id":98,"slug":99,"title":100,"excerpt":101,"featured_image_url":102,"featured_image_alt":103,"card_image_url":104,"og_image_url":105,"published_at":106,"updated_at":107,"content_updated_at":75,"reading_time_minutes":76,"is_featured":30,"indexable":4,"views":108,"author":109,"categories":110,"tags":112},206,"camoufox-residential-proxies-python-anleitung","Camoufox mit Residential Proxies: Python-Anleitung mit Code","So betreiben Sie Camoufox, den in C++ gepatchten Firefox, hinter Residential Proxies: aktuelle Python-API, warum geoip eine Sticky Session braucht, eine Checkliste zur Fingerprint-Kohärenz und wann Patchright oder nodriver besser passt.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fcamoufox-residential-proxies-python-anleitung-master.webp","Camoufox with Residential Proxies: A Code-First Python Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fcamoufox-residential-proxies-python-anleitung-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fcamoufox-residential-proxies-python-anleitung-og.webp","2026-10-13T09:00:00+00:00","2026-10-13T09:00:22+00:00",29,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[111],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[113,114,115,119,120],{"id":82,"slug":83,"name":84},{"id":86,"slug":87,"name":88},{"id":116,"slug":117,"name":118},6,"anti-erkennung","Anti-Erkennung",{"id":90,"slug":91,"name":92},{"id":121,"slug":122,"name":123},21,"headless-browser","Headless Browser",{"id":125,"slug":126,"title":127,"excerpt":128,"featured_image_url":129,"featured_image_alt":130,"card_image_url":131,"og_image_url":132,"published_at":133,"updated_at":133,"content_updated_at":134,"reading_time_minutes":36,"is_featured":30,"indexable":30,"views":135,"author":136,"categories":137,"tags":139},176,"got-scraping-nodejs-proxy-guide","got-scraping in Node.js: Residential Proxies & Header Generator Praxisleitfaden","Ein entwicklerorientierter Leitfaden zu got-scraping in Node.js mit Residential Proxies: Header-Generierung, Proxy-Rotation, Retry-Hooks und Produktionsmuster für skalierendes Scraping.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fgot-scraping-nodejs-proxy-guide-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fgot-scraping-nodejs-proxy-guide-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Fgot-scraping-nodejs-proxy-guide-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00",121,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[138],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[],{"id":141,"slug":142,"title":143,"excerpt":144,"featured_image_url":145,"featured_image_alt":146,"card_image_url":147,"og_image_url":148,"published_at":149,"updated_at":149,"content_updated_at":150,"reading_time_minutes":36,"is_featured":30,"indexable":30,"views":151,"author":152,"categories":153,"tags":155},175,"rotierende-proxies-in-colly","Rotierende Proxies in Colly: Ein Go-Entwickler-Leitfaden für Proxy-Rotation","Praktischer Leitfaden zur Integration rotierender Proxys in Colly mit ProxyHat: RoundRobinProxySwitcher, benutzerdefinierte Proxy-Funktionen, Residential IPs, Retries und Produktionsmuster für verteiltes Scraping.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Frotierende-proxies-in-colly-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Frotierende-proxies-in-colly-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fde\u002Frotierende-proxies-in-colly-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00",71,{"name":38,"slug":39,"bio":40,"avatar_url":14,"website_url":14,"social_links":14},[154],{"id":43,"slug":44,"name":45,"description":14,"meta_title":46,"meta_description":47,"parent_id":14},[],[]]