[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-pl-jak-scrapowac-bybit-v5-api-proxy":3},{"success":4,"payload":5,"related":61,"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":16,"og_image_url":17,"faq_json":18,"key_takeaways":14,"allow_index":4,"noindex_google_only":28,"allow_follow":4,"published_at":29,"updated_at":29,"content_updated_at":30,"featured_image_url":31,"featured_image_alt":32,"card_image_url":33,"reading_time_minutes":34,"author":35,"categories":39,"tags":46,"alternates":47,"locale_paths":58,"views":60},195,"jak-scrapowac-bybit-v5-api-proxy","Pobieranie danych rynkowych krypto z rotującymi proxy (przykład: API rynku Bybit V5)","Przewodnik dla programistów: pobieraj dane orderbook, tickers i kline z Bybit V5 Market API z rotującymi proxy ProxyHat. Gotowe przykłady w Python i Node.js, obsługa limitów, geo-blokad i sesji sticky.","\u003Cp>\u003Cstrong>Zastrzeżenie prawne:\u003C\u002Fstrong> Publiczne endpointy \u002Fv5\u002Fmarket\u002F są dostępne bez uwierzytelnienia, ale musisz przestrzegać \u003Ca href=\"https:\u002F\u002Fbybit-exchange.github.io\u002Fdocs\u002Fv5\u002Fintro\" rel=\"noopener noreferrer\">warunków korzystania z API Bybit\u003C\u002Fa> oraz lokalnych przepisów. Ten przewodnik dotyczy wyłącznie publicznych danych rynkowych i nie zachęca do naruszania ToS.\u003C\u002Fp>\n\u003Cp>Jeśli tworzysz bota handlowego lub potok danych rynkowych, prawdopodobnie spotkałeś się z błędem 403 z \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> po kilku minutach intensywnego scrapowania. Bybit V5 Market API jest szybkie i dobrze udokumentowane, ale ma limity IP, geo-blokady i CDN CloudFront, które mogą zablokować Twoje żądania. W tym przewodniku pokazujemy, jak scrapować API rynku Bybit V5 z rotującymi proxy — z gotowymi przykładami w Node.js i Python, obsługą limitów, geo-blokad i sesji sticky.\u003C\u002Fp>\n\n\u003Ch2>Dlaczego scrapowanie API rynku Bybit V5 z rotującymi proxy wymaga proxy\u003C\u002Fh2>\n\u003Cp>Bybit V5 Market API udostępnia publiczne dane rynkowe pod \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode>. Wszystkie odpowiedzi mają spójną kopertę:\u003C\u002Fp>\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\u003Cp>Gdy \u003Ccode>retCode\u003C\u002Fcode> wynosi \u003Ccode>0\u003C\u002Fcode>, żądanie się powiodło. Każda inna wartość — np. \u003Ccode>10001\u003C\u002Fcode> (parametr wymagany) lub \u003Ccode>10010\u003C\u002Fcode> (przekroczony limit) — oznacza błąd, a \u003Ccode>retMsg\u003C\u002Fcode> zawiera opis. Musisz sprawdzać \u003Ccode>retCode\u003C\u002Fcode> przy każdym żądaniu, inaczej Twoja aplikacja cicho przetwarza puste dane.\u003C\u002Fp>\n\u003Cp>Główne endpointy, które scrapujemy:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fstrong> — książka zleceń; parametr \u003Ccode>category\u003C\u002Fcode> przyjmuje \u003Ccode>spot\u003C\u002Fcode> lub \u003Ccode>linear\u003C\u002Fcode>, a \u003Ccode>limit\u003C\u002Fcode> (głębokość) od 1 do 200.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fstrong> — bieżące tickery dla kategorii; zwraca listę z lastPrice, high24h, volume24h.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fstrong> — świece OHLCV; parametr \u003Ccode>interval\u003C\u002Fcode> od 1 do D, \u003Ccode>limit\u003C\u002Fcode> do 1000, paginacja przez \u003Ccode>cursor\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u002Fv5\u002Fmarket\u002Frecent-trade\u003C\u002Fstrong> — ostatnie transakcje; \u003Ccode>category\u003C\u002Fcode> + \u003Ccode>symbol\u003C\u002Fcode> + opcjonalny \u003Ccode>limit\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Parametr \u003Ccode>category\u003C\u002Fcode> jest kluczowy: \u003Ccode>spot\u003C\u002Fcode> to rynek spot, \u003Ccode>linear\u003C\u002Fcode> to perp\u002Ffutures USDT, a \u003Ccode>inverse\u003C\u002Fcode> to kontrakty odwrotne. Mieszanie kategorii to częsty błąd.\u003C\u002Fp>\n\n\u003Ch2>Limity IP w Bybit V5 i dlaczego orderbook jest wrażliwy\u003C\u002Fh2>\n\u003Cp>Bybit stosuje limity per-endpoint i per-IP. Według dokumentacji limitów Bybit V5, endpoint \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> ma osobny budżet, a \u003Ccode>\u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fcode> inny. Kiedy przekroczysz limit, otrzymujesz HTTP 403 z \u003Ccode>retCode\u003C\u002Fcode> wskazującym rate limit, a Twoje IP może trafić na listę banów na około 10 minut.\u003C\u002Fp>\n\u003Cp>Orderbook jest szczególnie wrażliwy, ponieważ typowo odpytujesz go z wysoką częstotliwością (np. co 100–200 ms na symbol). Przy 10 symbolach to 50–100 żądań\u002Fs z jednego IP — wystarczy, by szybko wyczerpać budżet. Rotujące proxy rozpraszają te żądania na wiele adresów IP, więc każdy IP utrzymuje się poniżej progu.\u003C\u002Fp>\n\u003Cp>Typowe objawy wyczerpania limitu:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>HTTP 403 z \u003Ccode>retMsg\u003C\u002Fcode> zawierającym \"rate limit\" lub \"too many requests\".\u003C\u002Fli>\n\u003Cli>Nagły spadek sukcesu z 99% do 0% na wszystkich żądaniach.\u003C\u002Fli>\n\u003Cli>Ban trwający ~10 minut, po którym ruch wraca bez interwencji.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Geo-blokady Bybit i CloudFront\u003C\u002Fh2>\n\u003Cp>Bybit ogranicza dostęp z niektórych regionów (m.in. USA, UK, części UE) ze względów regulacyjnych. Żądania z zablokowanych IP otrzymują HTTP 403 lub są odrzucane przez \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContent_delivery_network\" rel=\"noopener noreferrer\">CDN CloudFront\u003C\u002Fa> przed dotarciem do API. Jeśli Twój serwer datacenter znajduje się w zablokowanym regionie, nie dostaniesz się do \u003Ccode>\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode> bez proxy z dozwolonego kraju.\u003C\u002Fp>\n\u003Cp>Rozwiązaniem są proxy residential z geo-targetingiem. ProxyHat pozwala wskazać kraj w nazwie użytkownika, np. \u003Ccode>user-country-DE\u003C\u002Fcode> kieruje ruch przez niemiecki adres IP ISP. To wystarczy, aby Bybit widział żądanie z dozwolonego regionu.\u003C\u002Fp>\n\n\u003Ch2>Konfiguracja ProxyHat: HTTP 8080 i SOCKS5 1080\u003C\u002Fh2>\n\u003Cp>ProxyHat używa jednej bramy dla wszystkich typów proxy. Parametry geo i sesji przekazujesz w nazwie użytkownika.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\u003Ctr>\u003Cth>Typ\u003C\u002Fth>\u003Cth>URL proxy\u003C\u002Fth>\u003Cth>Użycie\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>HTTP\u003C\u002Ftd>\u003Ctd>\u003Ccode>http:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Domyślny, rotacja per-żądanie\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>SOCKS5\u003C\u002Ftd>\u003Ctd>\u003Ccode>socks5:\u002F\u002Fuser-country-DE:pass@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Niskolatencyjny, dobre dla WebSocket\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Sticky HTTP\u003C\u002Ftd>\u003Ctd>\u003Ccode>http:\u002F\u002Fuser-sid-abc123-country-DE:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Paginacja kline, spójny IP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Sprawdź dostępne lokalizacje na stronie \u003Ca href=\"\u002Fpl\u002Flocations\">\u002Fpl\u002Flocations\u003C\u002Fa> i cennik na \u003Ca href=\"\u002Fpl\u002Fpricing\">\u002Fpl\u002Fpricing\u003C\u002Fa>. Więcej o zastosowaniach scrapowania znajdziesz w \u003Ca href=\"\u002Fpl\u002Fuse-cases\u002Fweb-scraping\">przypadku użycia web scraping\u003C\u002Fa> i \u003Ca href=\"\u002Fpl\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Przykład 1: curl z surowym proxy\u003C\u002Fh2>\n\u003Cp>Najprostszy test — orderbook spot BTCUSDT przez niemiecki IP:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -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=200&quot;\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Odpowiedź zawiera \u003Ccode>result.b\u003C\u002Fcode> (bids) i \u003Ccode>result.a\u003C\u002Fcode> (asks) jako listę par [cena, wielkość]. Jeśli \u003Ccode>retCode\u003C\u002Fcode> ≠ 0, sprawdź \u003Ccode>retMsg\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Przykład 2: Node.js (axios) z ProxyHat SDK — rotacja IP po liście symboli\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst pLimit = require(&apos;p-limit&apos;);\n\nconst PROXYHAT = {\n  host: &apos;gate.proxyhat.com&apos;,\n  port: 8080,\n  auth: { username: &apos;user-country-DE&apos;, password: &apos;pass&apos; }\n};\n\nconst limit = pLimit(5); \u002F\u002F max 5 współbieżnych\n\nasync function scrapeOrderbooks(symbols) {\n  const results = [];\n  await Promise.all(symbols.map(sym =&gt;\n    limit(async () =&gt; {\n      for (let attempt = 0; attempt &lt; 3; attempt++) {\n        try {\n          const { data } = await axios.get(\n            &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Forderbook&apos;,\n            {\n              params: { category: &apos;spot&apos;, symbol: sym, limit: 50 },\n              proxy: PROXYHAT,\n              timeout: 8000\n            }\n          );\n          if (data.retCode !== 0) throw new Error(data.retMsg);\n          results.push({ symbol: sym, bids: data.result.b.slice(0, 5) });\n          return;\n        } catch (err) {\n          if (attempt === 2) {\n            results.push({ symbol: sym, error: err.message });\n            return;\n          }\n          await new Promise(r =&gt; setTimeout(r, 1000 * Math.pow(2, attempt)));\n        }\n      }\n    })\n  ));\n  return results;\n}\n\nscrapeOrderbooks([&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;]).then(console.log);\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Każde żądanie przechodzi przez bramę ProxyHat. Parametr \u003Ccode>country-DE\u003C\u002Fcode> w nazwie użytkownika utrzymuje stałą lokalizację, ale IP rotuje między żądaniami (chyba że dodasz \u003Ccode>session-...\u003C\u002Fcode>). Limit współbieżności 5 zapobiega burstom.\u003C\u002Fp>\n\n\u003Ch2>Przykład 3: Python (requests) z surowym proxy i retry\u003C\u002Fh2>\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;\n\nsession = requests.Session()\nsession.proxies = {&quot;http&quot;: PROXY, &quot;https&quot;: PROXY}\nretry = Retry(\n    total=3,\n    backoff_factor=1.5,\n    status_forcelist=[429, 500, 502, 503],\n    allowed_methods=[&quot;GET&quot;]\n)\nsession.mount(&quot;https:\u002F\u002F&quot;, HTTPAdapter(max_retries=retry))\n\ndef fetch_tickers(category=&quot;linear&quot;):\n    resp = session.get(\n        &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Ftickers&quot;,\n        params={&quot;category&quot;: category},\n        timeout=10\n    )\n    resp.raise_for_status()\n    payload = resp.json()\n    if payload[&quot;retCode&quot;] != 0:\n        raise RuntimeError(f&quot;Bybit error {payload[&apos;retCode&apos;]}: {payload[&apos;retMsg&apos;]}&quot;)\n    return payload[&quot;result&quot;][&quot;tickerList&quot;]\n\ntickers = fetch_tickers(&quot;linear&quot;)\nprint(f&quot;Pobrano {len(tickers)} tickerów&quot;)\nprint(tickers[0][&quot;symbol&quot;], tickers[0][&quot;lastPrice&quot;])\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Retry z \u003Ccode>backoff_factor=1.5\u003C\u002Fcode> odczekuje 1.5s, 3s, 4.5s przed kolejnymi próbami. To wystarczy, aby przeczekać chwilowe 429 bez banu.\u003C\u002Fp>\n\n\u003Ch2>Przykład 4: Python (aiohttp) — sticky session dla paginacji kline\u003C\u002Fh2>\n\u003Cp>Paginacja kline wymaga spójnego IP, aby uniknąć resetu kursora. Sticky session utrzymuje ten sam adres IP przez cały ciąg żądań.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import asyncio\nimport aiohttp\n\nasync def fetch_klines(symbol, category=&quot;linear&quot;, interval=&quot;60&quot;, max_pages=10):\n    session_id = &quot;kline-btc-001&quot;\n    proxy = (\n        f&quot;http:\u002F\u002Fuser-sid-{session_id}-country-DE:pass&quot;\n        &quot;@gate.proxyhat.com:8080&quot;\n    )\n    all_candles = []\n    connector = aiohttp.TCPConnector(limit=20)\n    async with aiohttp.ClientSession(connector=connector) as http:\n        cursor = &quot;&quot;\n        for page in range(max_pages):\n            params = {\n                &quot;category&quot;: category,\n                &quot;symbol&quot;: symbol,\n                &quot;interval&quot;: interval,\n                &quot;limit&quot;: &quot;1000&quot;\n            }\n            if cursor:\n                params[&quot;cursor&quot;] = cursor\n            async with http.get(\n                &quot;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Fkline&quot;,\n                params=params,\n                proxy=proxy,\n                timeout=aiohttp.ClientTimeout(total=15)\n            ) as r:\n                data = await r.json()\n            if data[&quot;retCode&quot;] != 0:\n                raise RuntimeError(f&quot;{data[&apos;retCode&apos;]}: {data[&apos;retMsg&apos;]}&quot;)\n            all_candles.extend(data[&quot;result&quot;][&quot;list&quot;])\n            cursor = data[&quot;result&quot;].get(&quot;nextPageCursor&quot;, &quot;&quot;)\n            if not cursor:\n                break\n            await asyncio.sleep(0.25)  # szanuj limit per-endpoint\n    return all_candles\n\ncandles = asyncio.run(fetch_klines(&quot;BTCUSDT&quot;))\nprint(f&quot;Pobrano {len(candles)} świec&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Flaga \u003Ccode>sid-kline-btc-001\u003C\u002Fcode> przywiązuje wszystkie żądania w funkcji do jednego IP. Bez niej każde żądanie dostałoby nowy IP, a kursor paginacji mógłby się nie zachować prawidłowo po stronie Bybit.\u003C\u002Fp>\n\n\u003Ch2>Przykład 5: Node.js — budget per-endpoint z backoffem\u003C\u002Fh2>\n\u003Cp>Gdy scrapujesz wiele endpointów jednocześnie, każdy potrzebuje własnego budżetu. Poniższy przykład używa token bucket per-endpoint.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\n\nclass RateBudget {\n  constructor(maxPerSec) {\n    this.maxPerSec = maxPerSec;\n    this.tokens = maxPerSec;\n    this.lastRefill = Date.now();\n  }\n  async take() {\n    const now = Date.now();\n    const elapsed = (now - this.lastRefill) \u002F 1000;\n    this.tokens = Math.min(this.maxPerSec, this.tokens + elapsed * this.maxPerSec);\n    this.lastRefill = now;\n    if (this.tokens &lt; 1) {\n      await new Promise(r =&gt; setTimeout(r, (1 - this.tokens) \u002F this.maxPerSec * 1000));\n      this.tokens = 0;\n    } else {\n      this.tokens -= 1;\n    }\n  }\n}\n\nconst budgets = {\n  orderbook: new RateBudget(8),   \u002F\u002F ~8 req\u002Fs na IP\n  tickers: new RateBudget(5),\n  kline: new RateBudget(3)\n};\n\nasync function callBybit(endpoint, params, budgetKey) {\n  const budget = budgets[budgetKey];\n  for (let attempt = 0; attempt &lt; 4; attempt++) {\n    await budget.take();\n    try {\n      const { data } = await axios.get(`https:\u002F\u002Fapi.bybit.com${endpoint}`, {\n        params,\n        proxy: {\n          host: &apos;gate.proxyhat.com&apos;,\n          port: 8080,\n          auth: { username: &apos;user-country-DE&apos;, password: &apos;pass&apos; }\n        },\n        timeout: 8000\n      });\n      if (data.retCode !== 0) throw new Error(data.retMsg);\n      return data.result;\n    } catch (err) {\n      if (attempt === 3) throw err;\n      await new Promise(r =&gt; setTimeout(r, 500 * Math.pow(2, attempt)));\n    }\n  }\n}\n\n\u002F\u002F użycie\nconst ob = await callBybit(&apos;\u002Fv5\u002Fmarket\u002Forderbook&apos;,\n  { category: &apos;spot&apos;, symbol: &apos;BTCUSDT&apos;, limit: 50 }, &apos;orderbook&apos;);\nconsole.log(&apos;top bid:&apos;, ob.b[0]);\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Budżet 8 req\u002Fs dla orderbook zostawia margines pod limit Bybit. Backoff wykładniczy (0.5s, 1s, 2s) chroni przed kaskadowymi 403.\u003C\u002Fp>\n\n\u003Ch2>Przykład 6: WebSocket orderbook.50 vs REST snapshot\u003C\u002Fh2>\n\u003Cp>REST \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> zwraca snapshot — idealny do punktowego odczytu. Do live depth lepiej użyć publicznego WebSocket \u003Ccode>wss:\u002F\u002Fstream.bybit.com\u002Fv5\u002Fpublic\u002Fspot\u003C\u002Fcode> i strumienia \u003Ccode>orderbook.50.{symbol}\u003C\u002Fcode>.\u003C\u002Fp>\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 { b, a, u } = msg.data;\n    console.log(`update seq=${u} bids=${b.length} asks=${a.length}`);\n  }\n});\n\nws.on(&apos;error&apos;, (err) =&gt; console.error(&apos;WS error:&apos;, err.message));\n\n\u002F\u002F reconnect z backoffem w produkcji\nsetInterval(() =&gt; {\n  if (ws.readyState === WebSocket.CLOSED) {\n    ws.close();\n    \u002F\u002F ponowne połączenie...\n  }\n}, 5000);\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>WebSocket nie wymaga proxy dla samych limitów IP (połączenie jest długotrwałe), ale jeśli jesteś w zablokowanym regionie, kieruj WebSocket przez SOCKS5 ProxyHat na porcie 1080. Większość bibliotek WS wspiera agenta SOCKS5 przez \u003Ccode>socks-proxy-agent\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Najczęstsze błędy i przypadki brzegowe\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Ignorowanie retCode. HTTP 200 z \u003Ccode>retCode=10010\u003C\u002Fcode> to nadal błąd limitu. Zawsze sprawdzaj kopertę.\u003C\u002Fli>\n\u003Cli>Mieszanie kategorii. \u003Ccode>category=spot\u003C\u002Fcode> dla symbolu linear zwróci błąd lub puste dane.\u003C\u002Fli>\n\u003Cli>Zbyt wysoka współbieżność. 50 współbieżnych żądań orderbook z jednego IP = gwarantowany ban. Utrzymuj ≤10.\u003C\u002Fli>\n\u003Cli>Brak sticky session przy paginacji. Kursor kline może się zachowywać niestabilnie przy zmianie IP między stronami.\u003C\u002Fli>\n\u003Cli>Geo-blokada datacenter. \u003Ca href=\"\u002Fpl\u002Fproxy\u002Fdatacenter\">Proxy datacenter\u003C\u002Fa> w zablokowanym kraju nie pomogą — użyj residential z \u003Ccode>country-DE\u003C\u002Fcode> lub innym dozwolonym.\u003C\u002Fli>\n\u003Cli>Brak timeoutów. Zawieszone żądania blokują pulę połączeń. Ustaw timeout 8–15s.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Najlepsze praktyki produkcyjne\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Rejestruj retCode. Loguj każdy niezerowy retCode z timestampem i symbolem — to ujawnia wzorce limitów.\u003C\u002Fli>\n\u003Cli>Circuit breaker. Jeśli >20% żądań zwraca 403 w oknie 60s, wstrzymaj scrap na 5 minut zamiast nakręcać ban.\u003C\u002Fli>\n\u003Cli>Rotacja per-żądanie vs sticky. Rotacja dla tickers\u002Forderbook; sticky dla kline paginacji i długich ciągów.\u003C\u002Fli>\n\u003Cli>Monitoruj sukces. Celuj w >95% success rate. Spadek poniżej 80% oznacza zbliżający się ban lub geo-blokadę.\u003C\u002Fli>\n\u003Cli>Szanuj ToS. Publiczne dane rynkowe są dozwolone, ale respektuj robots.txt i dokumentację API. Nie próbuj omijać limitów autoryzowanych endpointów prywatnych.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Pełną dokumentację ProxyHat znajdziesz na \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">docs.proxyhat.com\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Najważniejsze wnioski\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>Sprawdzaj \u003Ccode>retCode\u003C\u002Fcode> przy każdym żądaniu — HTTP 200 nie oznacza sukcesu.\u003C\u002Fli>\n\u003Cli>Orderbook ma najsurowsze limity IP; utrzymuj ≤8 req\u002Fs na IP.\u003C\u002Fli>\n\u003Cli>Geo-blokady (US\u002FUK) wymagają proxy residential z \u003Ccode>country-XX\u003C\u002Fcode> w nazwie użytkownika.\u003C\u002Fli>\n\u003Cli>Sticky session (\u003Ccode>sid-abc123\u003C\u002Fcode>) jest kluczowa dla paginacji kline.\u003C\u002Fli>\n\u003Cli>WebSocket \u003Ccode>orderbook.50\u003C\u002Fcode> jest lepszy do live depth; REST do snapshotów.\u003C\u002Fli>\n\u003Cli>Backoff wykładniczy + circuit breaker zapobiegają kaskadowym banom.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\u003Cp>Scrapowanie API rynku Bybit V5 z rotującymi proxy to kwestia szacowania limitów, geo-targetingu i spójności sesji. ProxyHat daje Ci jedną bramę (\u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode>) z elastyczną konfiguracją w nazwie użytkownika — wystarczy, by utrzymać stabilny potok danych rynkowych. Zacznij od \u003Ca href=\"\u002Fpl\u002Fpricing\">cennika\u003C\u002Fa> i wybierz pakiet residential pasujący do Twojego throughput.\u003C\u002Fp>","Dane rynkowe krypto z rotującymi proxy (Bybit V5) | ProxyHat","Dowiedz się, jak scrapować API rynku Bybit V5 z rotującymi proxy: orderbook, tickers, kline. Gotowe przykłady Node.js i Python z ProxyHat gate.proxyhat.com:8080.","\u002Fpl\u002Fblog\u002Fjak-scrapowac-bybit-v5-api-proxy",null,"Dane rynkowe krypto z rotującymi proxy | ProxyHat","Pobierz dane orderbook, tickers i kline z Bybit V5 Market API z rotującymi proxy. Gotowe przykłady Node.js i Python z ProxyHat.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-og.webp",[19,22,25],{"question":20,"answer":21},"Dlaczego rotujące proxy mają znaczenie dla scrapowania Bybit API?","Bybit nakłada limity IP na endpointy \u002Fv5\u002Fmarket\u002Forderbook i inne, a nadmiarowe żądania mogą skutkować błędem 403 i banem na około 10 minut. Rotujące proxy rozpraszają ruch na wiele adresów IP, co zmniejsza ryzyko wyczerpania limitu i utrzymuje wyższy throughput dla botów handlowych.",{"question":23,"answer":24},"Który typ proxy najlepiej sprawdza się przy scrapowaniu Bybit V5 API?","Proxy residential są najlepsze, ponieważ pochodzą z prawdziwych adresów ISP i rzadziej są wykrywane przez CDN Bybit (CloudFront). Proxy datacenter mogą być szybsze, ale są łatwiej blokowane. Proxy mobile są alternatywą, ale zazwyczaj droższe i wolniejsze.",{"question":26,"answer":27},"Jak unikać blokad przy scrapowaniu Bybit V5 Market API?","Używaj rotujących proxy residential z geo-targetingiem na dozwolone kraje, zachowuj limity per-endpoint, wdrażaj wycofywanie (backoff) przy błędach 429\u002F403 i utrzymuj niską współbieżność. Sticky sessions pomagają przy paginacji kline, zachowując ten sam IP w ramach jednego ciągu żądań.",false,"2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-bybit-v5-api-proxy-card.webp",12,{"name":36,"slug":37,"bio":38,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[40],{"id":41,"slug":42,"name":43,"description":14,"meta_title":44,"meta_description":45,"parent_id":14},4,"developer-guides","Przewodniki dla programistów","Przewodniki dla programistów 124; ProxyHat Blog","Poradniki kodowe i przewodniki SDK do integracji proxy z aplikacjami.",[],{"de":48,"fr":49,"it":50,"ko":51,"zh":52,"pl":13,"pt":53,"ru":54,"es":55,"en":56,"ja":57,"x-default":56},"\u002Fde\u002Fblog\u002Fbybit-v5-market-api-mit-rotating-proxies-scrapen","\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","\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":48,"fr":49,"it":50,"ko":51,"zh":52,"pl":13,"pt":53,"ru":54,"es":55,"en":56,"ja":57,"tr":59},"\u002Ftr\u002Fblog\u002Fbybit-v5-market-api-dondurulen-proxy",87,[62,78,94,110],{"id":63,"slug":64,"title":65,"excerpt":66,"featured_image_url":67,"featured_image_alt":68,"card_image_url":69,"og_image_url":70,"published_at":71,"updated_at":71,"content_updated_at":72,"reading_time_minutes":34,"is_featured":28,"indexable":4,"views":73,"author":74,"categories":75,"tags":77},176,"got-scraping-nodejs-proxy","got-scraping w Node.js: kompletny przewodnik po proxy i header generator","got-scraping to biblioteka HTTP dla Node.js oparta na got, zaprojektowana do scrapingu. Dowiedz się, jak łączyć ją z residential proxy ProxyHat, konfigurować header generator i unikać blokad na dużą skalę.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fgot-scraping-nodejs-proxy-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fgot-scraping-nodejs-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fgot-scraping-nodejs-proxy-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:57:48+00:00",121,{"name":36,"slug":37,"bio":38,"avatar_url":14,"website_url":14,"social_links":14},[76],{"id":41,"slug":42,"name":43,"description":14,"meta_title":44,"meta_description":45,"parent_id":14},[],{"id":79,"slug":80,"title":81,"excerpt":82,"featured_image_url":83,"featured_image_alt":84,"card_image_url":85,"og_image_url":86,"published_at":87,"updated_at":87,"content_updated_at":88,"reading_time_minutes":34,"is_featured":28,"indexable":28,"views":89,"author":90,"categories":91,"tags":93},175,"rotacja-proxy-w-colly-1","Rotacja Proxy w Colly: Kompletny Przewodnik dla Programistów Go","Praktyczny przewodnik po rotacji proxy w frameworku Colly dla Go. Dowiedz się, jak skonfigurować RoundRobinProxySwitcher, geo-targeting i wzorce produkcyjne z residential proxy.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Frotacja-proxy-w-colly-1-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T08:29:56+00:00",71,{"name":36,"slug":37,"bio":38,"avatar_url":14,"website_url":14,"social_links":14},[92],{"id":41,"slug":42,"name":43,"description":14,"meta_title":44,"meta_description":45,"parent_id":14},[],{"id":95,"slug":96,"title":97,"excerpt":98,"featured_image_url":99,"featured_image_alt":100,"card_image_url":101,"og_image_url":102,"published_at":103,"updated_at":103,"content_updated_at":104,"reading_time_minutes":34,"is_featured":28,"indexable":28,"views":105,"author":106,"categories":107,"tags":109},194,"jak-scrapowac-rest-api-binance-proxy","Jak scrapować REST API Binance z proxy — przewodnik dla programistów","Kompletny przewodnik po pobieraniu publicznych danych rynkowych z REST API Binance z wykorzystaniem rotacyjnych proxy. Przykłady kodu w Python i Node.js, limit wag, sesje sticky i strategie omijania blokad IP.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fjak-scrapowac-rest-api-binance-proxy-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:29:51+00:00",82,{"name":36,"slug":37,"bio":38,"avatar_url":14,"website_url":14,"social_links":14},[108],{"id":41,"slug":42,"name":43,"description":14,"meta_title":44,"meta_description":45,"parent_id":14},[],{"id":111,"slug":112,"title":113,"excerpt":114,"featured_image_url":115,"featured_image_alt":116,"card_image_url":117,"og_image_url":118,"published_at":119,"updated_at":119,"content_updated_at":72,"reading_time_minutes":34,"is_featured":28,"indexable":4,"views":120,"author":121,"categories":122,"tags":124},172,"uzywanie-proxy-w-swift-urlsession","Używanie proxy w Swift z URLSession — przewodnik dla programistów iOS i macOS","Kompletny przewodnik po konfiguracji proxy w Swift z URLSession: HTTP\u002FHTTPS, SOCKS5, autoryzacja, geo-targeting, async\u002Fawait i wskazówki produkcyjne.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fuzywanie-proxy-w-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\u002Fpl\u002Fuzywanie-proxy-w-swift-urlsession-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpl\u002Fuzywanie-proxy-w-swift-urlsession-og.webp","2026-07-26T16:03:44+00:00",230,{"name":36,"slug":37,"bio":38,"avatar_url":14,"website_url":14,"social_links":14},[123],{"id":41,"slug":42,"name":43,"description":14,"meta_title":44,"meta_description":45,"parent_id":14},[],[]]