[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-tr-bybit-v5-market-api-dondurulen-proxy":3},{"success":4,"payload":5,"related":62,"errors":155},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":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":29,"noindex_google_only":29,"allow_follow":4,"published_at":30,"updated_at":30,"content_updated_at":31,"featured_image_url":32,"featured_image_alt":33,"card_image_url":34,"reading_time_minutes":35,"author":36,"categories":40,"tags":47,"alternates":48,"locale_paths":60,"views":61},195,"bybit-v5-market-api-dondurulen-proxy","Döndürülen Proxy'lerle Bybit V5 Market API Nasıl Scrape Edilir","Bybit V5 Market API'sini döndürülen residential proxy'lerle scrape etmek için tam rehber: orderbook, tickers, kline uç noktaları, rate limit yönetimi, geo-block aşımı ve ProxyHat entegrasyonu ile çalışan kod örnekleri.","\u003Ch2>Döndürülen Proxy'lerle Bybit V5 Market API Nasıl Scrape Edilir: Geliştirici Rehberi\u003C\u002Fh2>\n\u003Cp>Bybit V5 Market API'sini scrape etmek, crypto trading bot'ları ve piyasa verisi mühendisleri için günlük bir ihtiyaçtır — ancak Bybit'in IP bazlı rate limitleri ve coğrafi kısıtlamaları, sürekli veri çekmeyi zorlaştırır. Döndürülen proxy'lerle Bybit V5 Market API'sini scrape etmek, tek bir IP'nin banlanmadan yüksek hacimli orderbook, ticker ve kline verisi çekmenin en pratik yoludur. Bu rehberde \u003Ccode>api.bybit.com\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode> uç noktalarını, rate limit mimarisini, geo-block'ları ve ProxyHat ile nasıl güvenli bir scraping pipeline kuracağınızı adım adım göstereceğiz.\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cstrong>Yasal Uyarı:\u003C\u002Fstrong> Bybit'in API Kullanım Şartları, public market verisinin kişisel kullanım için serbest olabileceğini ancak ticari yeniden dağıtımın kısıtlandığını belirtir. Bu rehber yalnızca eğitim amaçlıdır; Bybit'in resmi V5 API dokümantasyonunu ve Kullanım Şartlarını inceleyin. Her zaman \u003Ccode>robots.txt\u003C\u002Fcode> ve platform ToS'una uyun.\u003C\u002Fblockquote>\n\n\u003Ch2>Bybit V5 Market API Uç Noktaları ve Yanıt Zarfı\u003C\u002Fh2>\n\u003Cp>Bybit'in V5 API'si, tüm public market verisini \u003Ccode>\u002Fv5\u002Fmarket\u002F\u003C\u002Fcode> altında birleştirir. Her uç nokta \u003Ccode>category\u003C\u002Fcode> parametresi alır: \u003Ccode>spot\u003C\u002Fcode> (spot), \u003Ccode>linear\u003C\u002Fcode> (USDT perpetual), \u003Ccode>inverse\u003C\u002Fcode> (inverse contracts) ve \u003Ccode>option\u003C\u002Fcode> (opsiyonlar). Tüm yanıtlar standart bir zarf içinde gelir:\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\u003C\u002Fcode> 0 ise istek başarılıdır; 0 dışındaki değerler hatayı gösterir ve \u003Ccode>retMsg\u003C\u002Fcode> açıklama içerir. Rate limit aşıldığında \u003Ccode>retCode\u003C\u002Fcode> 10001 dönebilir veya doğrudan HTTP 403 alabilirsiniz.\u003C\u002Fp>\n\n\u003Ch3>GET \u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fh3>\n\u003Cp>Order book snapshot'ı döndürür. \u003Ccode>category\u003C\u002Fcode> (spot|linear|inverse|option), \u003Ccode>symbol\u003C\u002Fcode> ve \u003Ccode>limit\u003C\u002Fcode> (1–200) parametreleri alır. Yanıt, \u003Ccode>bids\u003C\u002Fcode> ve \u003Ccode>asks\u003C\u002Fcode> array'leri içerir; her eleman \u003Ccode>[price, size]\u003C\u002Fcode> formatındadır. Bybit V5 dokümantasyonuna göre, limit=200 için maksimum 200 seviye döner.\u003C\u002Fp>\n\n\u003Ch3>GET \u002Fv5\u002Fmarket\u002Ftickers\u003C\u002Fh3>\n\u003Cp>Belirli bir kategorideki tüm veya tek bir sembolün ticker verisini döndürür. \u003Ccode>category\u003C\u002Fcode> zorunludur; \u003Ccode>symbol\u003C\u002Fcode> opsiyoneldir (verilmezse tüm semboller döner). Spot için \u003Ccode>lastPrice\u003C\u002Fcode>, \u003Ccode>volume24h\u003C\u002Fcode>, \u003Ccode>turnover24h\u003C\u002Fcode> alanlarını içerir.\u003C\u002Fp>\n\n\u003Ch3>GET \u002Fv5\u002Fmarket\u002Fkline\u003C\u002Fh3>\n\u003Cp>Mum (candlestick) verisi döndürür. \u003Ccode>category\u003C\u002Fcode>, \u003Ccode>symbol\u003C\u002Fcode>, \u003Ccode>interval\u003C\u002Fcode> (1, 5, 15, 30, 60, 240, D, W, M) ve \u003Ccode>limit\u003C\u002Fcode> (max 200) alır. \u003Ccode>cursor\u003C\u002Fcode> parametresi ile sayfalama yapılır; yanıttaki \u003Ccode>nextPageCursor\u003C\u002Fcode> sonraki sayfaya geçiş için kullanılır. Her mum \u003Ccode>[startTime, open, high, low, close, volume, turnover]\u003C\u002Fcode> formatındadır.\u003C\u002Fp>\n\n\u003Ch3>GET \u002Fv5\u002Fmarket\u002Frecent-trade\u003C\u002Fh3>\n\u003Cp>Son işlemleri döndürür. \u003Ccode>category\u003C\u002Fcode>, \u003Ccode>symbol\u003C\u002Fcode> ve \u003Ccode>limit\u003C\u002Fcode> (max 1000) alır. Her işlem \u003Ccode>[execId, price, size, time, side]\u003C\u002Fcode> formatındadır.\u003C\u002Fp>\n\n\u003Ch2>IP Bazlı Rate Limitler ve ~10 Dakikalık Ban Penceresi\u003C\u002Fh2>\n\u003Cp>Bybit, rate limitleri IP bazlı uygular. Bybit V5 rate limit dokümantasyonuna göre, public market uç noktaları genellikle saniyede 5–20 istek izni verir; ancak \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> gibi yoğun uç noktalarda bu sınır daha düşük olabilir. Limit aşıldığında:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>HTTP 403\u003C\u002Fstrong> veya \u003Ccode>retCode: 10001\u003C\u002Fcode> döner.\u003C\u002Fli>\n\u003Cli>IP yaklaşık \u003Cstrong>10 dakika\u003C\u002Fstrong> boyunca banlanır.\u003C\u002Fli>\n\u003Cli>Ban penceresi boyunca tüm market uç noktaları bu IP için engellenir.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Bu, tek bir sunucudan orderbook scrape eden bot'lar için kritik bir sorundur. 5 saniyede 50 istek gönderirseniz, IP'niz 10 dakika boyunca banlanır ve veri akışınız kesilir. Döndürülen proxy'ler, her isteği farklı bir IP'den yaparak bu sorunu çözer.\u003C\u002Fp>\n\n\u003Ch2>Coğrafi Kısıtlamalar ve CloudFront Blokları\u003C\u002Fh2>\n\u003Cp>Bybit, ABD, İngiltere ve bazı diğer bölgelerde coğrafi kısıtlamalar uygular. Kısıtlı bir bölgeden API'ye erişmeye çalıştığınızda, CloudFront tabanlı bir \u003Cstrong>403 Forbidden\u003C\u002Fstrong> yanıtı alırsınız — bu, API'nin \u003Ccode>retCode\u003C\u002Fcode> zarfına hiç ulaşmadan önce gerçekleşir. \u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FGuides\u002FProxy_servers_and_tunneling\" rel=\"noopener noreferrer\">HTTP proxy'ler\u003C\u002Fa>, isteği farklı bir coğrafyadan yönlendirerek bu engeli aşmanıza yardımcı olur.\u003C\u002Fp>\n\u003Cp>ProxyHat'ın residential proxy'leri ile \u003Ccode>-country-US\u003C\u002Fcode> gibi username flag'leri kullanarak izin verilen bir bölgeden bağlanabilirsiniz. Residential IP'ler, datacenter IP'lerinden daha az tespit edilir çünkü gerçek ISP IP'lerine benzer. ProxyHat \u003Ca href=\"\u002Ftr\u002Flocations\">100+ lokasyonda\u003C\u002Fa> residential IP sunar.\u003C\u002Fp>\n\n\u003Ch2>Ham Proxy vs ProxyHat ile Kod Örnekleri\u003C\u002Fh2>\n\u003Cp>Aşağıda her örnek iki varyasyon gösterir: \u003Cstrong>ham proxy\u003C\u002Fstrong> (generic proxy URL) ve ProxyHat entegrasyonu (gate.proxyhat.com ile geo-targeting ve session flag'leri).\u003C\u002Fp>\n\n\u003Ch3>1. curl ile Orderbook Sorgulama\u003C\u002Fh3>\n\u003Cp>Ham proxy ile:\u003C\u002Fp>\n\u003Cpre>\u003Ccode># Ham proxy ile Bybit orderbook\ncurl -x http:\u002F\u002Fproxyuser:proxypass@192.168.1.100:3128 \\\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>ProxyHat ile (US geo-targeting):\u003C\u002Fp>\n\u003Cpre>\u003Ccode># ProxyHat residential proxy ile US lokasyonundan\ncurl -x http:\u002F\u002Fuser-country-US: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\u003Ch3>2. Node.js (axios) ile Ticker Scrape — IP Rotasyonu\u003C\u002Fh3>\n\u003Cp>Ham proxy ile (sabit IP, rate limit riski):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst HttpsProxyAgent = require(&apos;https-proxy-agent&apos;);\n\nconst proxyUrl = &apos;http:\u002F\u002Fproxyuser:proxypass@192.168.1.100:3128&apos;;\nconst agent = new HttpsProxyAgent(proxyUrl);\n\nasync function fetchTickersRaw(symbols) {\n  const results = [];\n  for (const symbol of symbols) {\n    try {\n      const res = await axios.get(\n        &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Ftickers&apos;,\n        {\n          params: { category: &apos;spot&apos;, symbol },\n          httpsAgent: agent,\n          timeout: 5000\n        }\n      );\n      if (res.data.retCode === 0) {\n        results.push(...res.data.result.list);\n      } else {\n        console.error(`API hatası: ${res.data.retCode} - ${res.data.retMsg}`);\n      }\n    } catch (err) {\n      console.error(`İstek hatası for ${symbol}:`, err.message);\n    }\n  }\n  return results;\n}\n\nfetchTickersRaw([&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;]).then(console.log);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>ProxyHat ile (her sembol için yeni IP):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst HttpsProxyAgent = require(&apos;https-proxy-agent&apos;);\n\n\u002F\u002F ProxyHat proxy URL builder (SDK pattern)\nfunction proxyHatUrl(country, session) {\n  let username = &apos;user&apos;;\n  if (country) username += `-country-${country}`;\n  if (session) username += `-sid-${session}`;\n  return `http:\u002F\u002F${username}:pass@gate.proxyhat.com:8080`;\n}\n\nasync function fetchTickersProxyHat(symbols) {\n  const results = [];\n  for (const symbol of symbols) {\n    \u002F\u002F Her sembol için yeni residential IP (rotating)\n    const agent = new HttpsProxyAgent(proxyHatUrl(&apos;US&apos;));\n    try {\n      const res = await axios.get(\n        &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Ftickers&apos;,\n        {\n          params: { category: &apos;spot&apos;, symbol },\n          httpsAgent: agent,\n          timeout: 5000\n        }\n      );\n      if (res.data.retCode === 0) {\n        results.push(...res.data.result.list);\n      } else {\n        console.error(`API hatası: ${res.data.retCode} - ${res.data.retMsg}`);\n      }\n    } catch (err) {\n      console.error(`İstek hatası for ${symbol}:`, err.message);\n    }\n  }\n  return results;\n}\n\nfetchTickersProxyHat([&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;]).then(console.log);\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>3. Python ile Kline Verisi Çekme\u003C\u002Fh3>\n\u003Cp>Ham proxy ile:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import requests\n\nproxies = {\n    &apos;http&apos;: &apos;http:\u002F\u002Fproxyuser:proxypass@192.168.1.100:3128&apos;,\n    &apos;https&apos;: &apos;http:\u002F\u002Fproxyuser:proxypass@192.168.1.100:3128&apos;\n}\n\ndef fetch_kline_raw(symbol, interval=&apos;60&apos;, limit=200):\n    url = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Fkline&apos;\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    try:\n        resp = requests.get(url, params=params, proxies=proxies, timeout=10)\n        data = resp.json()\n        if data.get(&apos;retCode&apos;) == 0:\n            return data[&apos;result&apos;][&apos;list&apos;]\n        else:\n            print(f&quot;API hatası: {data.get(&apos;retCode&apos;)} - {data.get(&apos;retMsg&apos;)}&quot;)\n            return []\n    except Exception as e:\n        print(f&quot;İstek hatası: {e}&quot;)\n        return []\n\ncandles = fetch_kline_raw(&apos;BTCUSDT&apos;, &apos;60&apos;, 200)\nprint(f&quot;{len(candles)} mum verisi alındı&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>ProxyHat sticky session ile (kline pagination için aynı IP):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import requests\nimport time\n\ndef proxyhat_url(country=&apos;US&apos;, session=None):\n    username = f&apos;user-country-{country}&apos;\n    if session:\n        username += f&apos;-sid-{session}&apos;\n    return f&apos;http:\u002F\u002F{username}:pass@gate.proxyhat.com:8080&apos;\n\ndef fetch_kline_paginated(symbol, interval=&apos;60&apos;, total=1000):\n    &quot;&quot;&quot;Sticky session ile kline pagination — aynı IP&apos;de kalır.&quot;&quot;&quot;\n    session_id = f&apos;kline-{symbol}-{int(time.time())}&apos;\n    proxy_url = proxyhat_url(country=&apos;US&apos;, session=session_id)\n    proxies = {&apos;http&apos;: proxy_url, &apos;https&apos;: proxy_url}\n    \n    all_candles = []\n    cursor = None\n    \n    while len(all_candles) &lt; total:\n        url = &apos;https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002Fkline&apos;\n        params = {\n            &apos;category&apos;: &apos;linear&apos;,\n            &apos;symbol&apos;: symbol,\n            &apos;interval&apos;: interval,\n            &apos;limit&apos;: 200\n        }\n        if cursor:\n            params[&apos;cursor&apos;] = cursor\n        \n        try:\n            resp = requests.get(url, params=params, proxies=proxies, timeout=10)\n            data = resp.json()\n            if data.get(&apos;retCode&apos;) == 0:\n                candles = data[&apos;result&apos;][&apos;list&apos;]\n                all_candles.extend(candles)\n                cursor = data[&apos;result&apos;].get(&apos;nextPageCursor&apos;)\n                if not cursor or not candles:\n                    break\n                time.sleep(0.2)  # Rate budgeting: ~5 req\u002Fs\n            else:\n                print(f&quot;API hatası: {data.get(&apos;retCode&apos;)} - {data.get(&apos;retMsg&apos;)}&quot;)\n                break\n        except Exception as e:\n            print(f&quot;İstek hatası: {e}&quot;)\n            break\n    \n    return all_candles[:total]\n\ncandles = fetch_kline_paginated(&apos;BTCUSDT&apos;, &apos;60&apos;, 1000)\nprint(f&quot;Toplam {len(candles)} mum verisi alındı&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Rate Budgeting, Retry ve Backoff Stratejileri\u003C\u002Fh2>\n\u003Cp>Production'da yalnızca IP rotasyonu yeterli değildir; her uç nokta için ayrı bir rate budget belirlemeniz gerekir. Aşağıdaki Node.js örneği, per-endpoint rate limiting, exponential backoff ve circuit breaker pattern'ini birleştirir:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const axios = require(&apos;axios&apos;);\nconst HttpsProxyAgent = require(&apos;https-proxy-agent&apos;);\n\nclass BybitScraper {\n  constructor() {\n    this.requestTimestamps = [];\n    this.maxRequestsPerSecond = 5;\n    this.maxRetries = 3;\n    this.circuitOpen = false;\n    this.failureCount = 0;\n    this.failureThreshold = 5;\n  }\n\n  getProxyAgent(country = &apos;US&apos;, session = null) {\n    let username = `user-country-${country}`;\n    if (session) username += `-sid-${session}`;\n    return new HttpsProxyAgent(\n      `http:\u002F\u002F${username}:pass@gate.proxyhat.com:8080`\n    );\n  }\n\n  async rateLimit() {\n    const now = Date.now();\n    this.requestTimestamps = this.requestTimestamps.filter(\n      ts =&gt; now - ts &lt; 1000\n    );\n    if (this.requestTimestamps.length &gt;= this.maxRequestsPerSecond) {\n      const wait = 1000 - (now - this.requestTimestamps[0]);\n      await new Promise(r =&gt; setTimeout(r, wait));\n    }\n    this.requestTimestamps.push(Date.now());\n  }\n\n  async request(endpoint, params, retries = 0) {\n    if (this.circuitOpen) {\n      throw new Error(&apos;Circuit breaker açık — 30s sonra tekrar deneyin&apos;);\n    }\n    await this.rateLimit();\n    const agent = this.getProxyAgent(&apos;US&apos;);\n    \n    try {\n      const res = await axios.get(\n        `https:\u002F\u002Fapi.bybit.com\u002Fv5\u002Fmarket\u002F${endpoint}`,\n        { params, httpsAgent: agent, timeout: 10000 }\n      );\n      \n      if (res.data.retCode === 0) {\n        this.failureCount = 0;\n        return res.data.result;\n      }\n      \n      \u002F\u002F Rate limit hatası — backoff ile tekrar dene\n      if (res.data.retCode === 10001 &amp;&amp; retries &lt; this.maxRetries) {\n        const backoff = Math.pow(2, retries) * 1000;\n        console.log(`Rate limit hit, ${backoff}ms bekleniyor...`);\n        await new Promise(r =&gt; setTimeout(r, backoff));\n        return this.request(endpoint, params, retries + 1);\n      }\n      \n      throw new Error(`API: ${res.data.retCode} - ${res.data.retMsg}`);\n    } catch (err) {\n      this.failureCount++;\n      if (this.failureCount &gt;= this.failureThreshold) {\n        this.circuitOpen = true;\n        setTimeout(() =&gt; {\n          this.circuitOpen = false;\n          this.failureCount = 0;\n        }, 30000);\n      }\n      if (retries &lt; this.maxRetries) {\n        const backoff = Math.pow(2, retries) * 1000;\n        console.log(`Hata: ${err.message}, ${backoff}ms sonra tekrar...`);\n        await new Promise(r =&gt; setTimeout(r, backoff));\n        return this.request(endpoint, params, retries + 1);\n      }\n      throw err;\n    }\n  }\n\n  async scrapeOrderbook(symbols) {\n    const results = {};\n    for (const symbol of symbols) {\n      try {\n        const data = await this.request(&apos;orderbook&apos;, {\n          category: &apos;spot&apos;,\n          symbol,\n          limit: 50\n        });\n        results[symbol] = data;\n        console.log(`${symbol}: ${data.bids.length} bid, ${data.asks.length} ask`);\n      } catch (err) {\n        console.error(`${symbol} başarısız: ${err.message}`);\n      }\n    }\n    return results;\n  }\n}\n\nconst scraper = new BybitScraper();\nscraper.scrapeOrderbook([&apos;BTCUSDT&apos;, &apos;ETHUSDT&apos;, &apos;SOLUSDT&apos;, &apos;XRPUSDT&apos;])\n  .then(() =&gt; console.log(&apos;Tamamlandı&apos;));\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Sticky Session'lar ile Kline Pagination\u003C\u002Fh2>\n\u003Cp>Bybit kline endpoint'i \u003Ccode>cursor\u003C\u002Fcode> tabanlı sayfalama kullanır. Eğer her istekte IP döndürürseniz, cursor tutarsız olabilir veya Bybit şüpheli davranış olarak işaretleyebilir. ProxyHat'ın \u003Ccode>-sid-abc123\u003C\u002Fcode> flag'i ile belirli bir süre boyunca aynı IP'de kalabilirsiniz. Bu, pagination boyunca tutarlı bir bağlantı sağlar ve rate limit bütçenizi tek bir IP üzerinde yönetmenize olanak tanır.\u003C\u002Fp>\n\u003Cp>Yukarıdaki Python örneğinde \u003Ccode>session_id\u003C\u002Fcode> parametresi ile sticky session kullanılmıştır. Pagination tamamlandığında yeni bir \u003Ccode>session_id\u003C\u002Fcode> ile farklı bir IP'ye geçebilirsiniz.\u003C\u002Fp>\n\n\u003Ch2>REST Snapshot vs WebSocket Orderbook\u003C\u002Fh2>\n\u003Cp>REST ile orderbook çekmek her istekte ~200ms gecikme üretir ve rate limit tüketir. Sürekli depth takibi için WebSocket çok daha verimlidir:\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Özellik\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>Latens\u003C\u002Ftd>\u003Ctd>~200ms per istek\u003C\u002Ftd>\u003Ctd>~50ms push (artımlı)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Rate limit\u003C\u002Ftd>\u003Ctd>~5 req\u002Fs (IP bazlı)\u003C\u002Ftd>\u003Ctd>1 bağlantı, sınırsız push\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Veri tazeliği\u003C\u002Ftd>\u003Ctd>Snapshot (anlık)\u003C\u002Ftd>\u003Ctd>Artımlı güncelleme\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Kullanım\u003C\u002Ftd>\u003Ctd>Tek seferlik sorgu\u003C\u002Ftd>\u003Ctd>Sürekli monitoring\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Karmaşıklık\u003C\u002Ftd>\u003Ctd>Düşük\u003C\u002Ftd>\u003Ctd>Orta (reconnect\u002Freplay)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>WebSocket ile ProxyHat SOCKS5 proxy üzerinden orderbook.50 stream'ine abone olabilirsiniz:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const WebSocket = require(&apos;ws&apos;);\nconst { SocksProxyAgent } = require(&apos;socks-proxy-agent&apos;);\n\n\u002F\u002F ProxyHat SOCKS5 proxy ile US residential IP\nconst agent = new SocksProxyAgent(\n  &apos;socks5:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:1080&apos;\n);\n\nconst ws = new WebSocket(\n  &apos;wss:\u002F\u002Fstream.bybit.com\u002Fv5\u002Fpublic\u002Fspot&apos;,\n  { agent }\n);\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  console.log(&apos;orderbook.50.BTCUSDT aboneliği aktif&apos;);\n});\n\nws.on(&apos;message&apos;, (data) =&gt; {\n  const msg = JSON.parse(data.toString());\n  if (msg.topic &amp;&amp; msg.topic.startsWith(&apos;orderbook&apos;)) {\n    const { bids, asks } = msg.data;\n    console.log(`Depth: ${bids.length} bid, ${asks.length} ask`);\n  }\n});\n\nws.on(&apos;error&apos;, (err) =&gt; console.error(&apos;WS hata:&apos;, err.message));\nws.on(&apos;close&apos;, () =&gt; console.log(&apos;WS kapandı — reconnect gerekli&apos;));\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>WebSocket kullanırken dikkat edin: bağlantı kopması durumunda snapshot almanız gerekir (REST ile \u003Ccode>\u002Fv5\u002Fmarket\u002Forderbook\u003C\u002Fcode> çağırıp mevcut durumu senkronize edin). Bybit WebSocket protokolü, reconnect sonrası \u003Ccode>snapshot\u003C\u002Fcode> ve sonrasındaki \u003Ccode>delta\u003C\u002Fcode> mesajlarını gönderir.\u003C\u002Fp>\n\n\u003Ch2>Önemli Çıkarımlar\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>IP rotasyonu şart: Bybit'in IP bazlı rate limitleri ve ~10 dakikalık ban penceresi, tek IP'den yüksek hacimli scrape'i imkansız kılar. Her istekte yeni IP kullanın.\u003C\u002Fli>\n\u003Cli>Residential proxy tercih edin: Datacenter IP'leri CloudFront tarafından tespit edilip 403 dönebilir. ProxyHat residential IP'leri ile \u003Ccode>-country-US\u003C\u002Fcode> flag'i kullanın.\u003C\u002Fli>\n\u003Cli>Sticky session pagination için: Kline cursor pagination'da \u003Ccode>-sid-abc123\u003C\u002Fcode> ile aynı IP'de kalın; pagination bitince yeni session'a geçin.\u003C\u002Fli>\n\u003Cli>Rate budgeting uygulayın: Döndürülen proxy kullansanız bile saniyede maksimum 5 istek ile kendinizi sınırlayın.\u003C\u002Fli>\n\u003Cli>WebSocket tercih edin: Sürekli orderbook takibi için REST yerine WebSocket \u003Ccode>orderbook.50\u003C\u002Fcode> stream'ini kullanın; 10x daha düşük latens ve rate limit tasarrufu sağlar.\u003C\u002Fli>\n\u003Cli>retCode kontrolü yapın: Her yanıtta \u003Ccode>retCode === 0\u003C\u002Fcode> kontrolü yapın; 10001 rate limit, diğer kodlar farklı hatalar anlamına gelir.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>ProxyHat ile residential proxy'lere erişmek için \u003Ca href=\"\u002Ftr\u002Fpricing\">fiyatlandırma sayfasını\u003C\u002Fa> inceleyin. \u003Ca href=\"\u002Ftr\u002Fuse-cases\u002Fweb-scraping\">Web scraping use case\u003C\u002Fa> sayfamızda daha fazla örnek bulabilirsiniz. Detaylı proxy yapılandırması için \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">ProxyHat dokümantasyonuna\u003C\u002Fa> bakın.\u003C\u002Fp>","Döndürülen Proxy'lerle Bybit V5 Market API Scrape | ProxyHat","Bybit V5 Market API'sini döndürülen proxy'lerle scrape edin. Orderbook, ticker, kline uç noktaları, rate limitler ve geo-block aşımı için pratik rehber.","\u002Ftr\u002Fblog\u002Fbybit-v5-market-api-dondurulen-proxy",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-og.webp",[17,20,23,26],{"question":18,"answer":19},"Bybit V5 Market API scrape için hangi proxy tipi en iyidir?","Residential proxy'ler en iyi sonucu verir çünkü Bybit'in CloudFront tabanlı geo-filtrelemesi datacenter IP'lerini tespit edip 403 dönebilir. ProxyHat'ın gate.proxyhat.com:8080 uç noktası üzerinden -country-US formatında residential IP'ler kullanabilirsiniz. SOCKS5 için 1080 portunu kullanın.",{"question":21,"answer":22},"Bybit API'de ban penceresi ne kadar sürer?","Bybit, rate limit ihlallerinde IP'yi yaklaşık 10 dakika boyunca banlar. Bu süre zarfında uç nokta 403 veya retCode 10001 döndürür. Döndürülen proxy'ler ile her isteği farklı bir IP'den yaparak bu ban penceresinden etkilenmeden veri çekmeye devam edebilirsiniz.",{"question":24,"answer":25},"Bybit V5 Market API'de sticky session ne zaman kullanılmalı?","Kline pagination gibi cursor-tabanlı sayfalama işlemlerinde, aynı IP'de kalmak tutarlı veri akışı sağlar ve Bybit'in şüpheli davranış algılamasını azaltır. ProxyHat'ın -sid-abc123 flag'i ile belirli bir süre boyunca aynı IP'yi tutabilir, pagination tamamlandığında yeni session'a geçebilirsiniz.",{"question":27,"answer":28},"Bybit API scrape ederken 403 hatası alıyorum, ne yapmalıyım?","403 genellikle coğrafi kısıtlama veya rate limit ihlali anlamına gelir. Önce ProxyHat ile -country-US gibi bir geo-targeting flag'i kullanarak izin verilen bir bölgeden residential IP ile bağlanmayı deneyin. Ardından rate budgeting ile saniyede maksimum 5 istekle sınırlayın ve exponential backoff uygulayın.",false,"2026-08-03T16:09:16+00:00","2026-10-04T02:43:17+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-card.webp",12,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[41],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},4,"gelistirici-rehberleri","Geliştirici Rehberleri","Geliştirici Rehberleri | ProxyHat Blog","Proxy entegrasyonu için kod eğitimleri ve SDK rehberleri.",[],{"de":49,"fr":50,"it":51,"ko":52,"zh":53,"pl":54,"pt":55,"ru":56,"es":57,"en":58,"ja":59,"x-default":58},"\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","\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":49,"fr":50,"it":51,"ko":52,"zh":53,"pl":54,"pt":55,"ru":56,"es":57,"en":58,"ja":59,"tr":13},87,[63,96,123,139],{"id":64,"slug":65,"title":66,"excerpt":67,"featured_image_url":68,"featured_image_alt":69,"card_image_url":70,"og_image_url":71,"published_at":72,"updated_at":73,"content_updated_at":74,"reading_time_minutes":75,"is_featured":29,"indexable":4,"views":75,"author":76,"categories":77,"tags":79},210,"ai-ajanlari-icin-proxy-kurulumu","AI Ajanları için Proxy Kurulumu: browser-use, Crawl4AI ve MCP","Bulut VM'lerindeki ajanlar internete datacenter IP'lerinden çıkar. browser-use, Crawl4AI ve bir MCP sunucusu için güncel, çalışan proxy yapılandırmalarını; sticky ve rotasyon için bir karar tablosunu ve kaçınılması gereken maliyet tuzaklarını derledik.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-master.webp","Proxy Setup for AI Agents: browser-use, Crawl4AI and an MCP Server","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-og.webp","2026-10-24T09:00:00+00:00","2026-10-24T09:00:20+00:00","2026-10-03T09:41:40+00:00",14,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[78],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[80,84,88,92],{"id":81,"slug":82,"name":83},1,"web-scraping","Web Scraping",{"id":85,"slug":86,"name":87},2,"residential-proxy","Residential Proxy",{"id":89,"slug":90,"name":91},9,"python","Python",{"id":93,"slug":94,"name":95},22,"playwright","Playwright",{"id":97,"slug":98,"title":99,"excerpt":100,"featured_image_url":101,"featured_image_alt":102,"card_image_url":103,"og_image_url":104,"published_at":105,"updated_at":106,"content_updated_at":74,"reading_time_minutes":75,"is_featured":29,"indexable":4,"views":107,"author":108,"categories":109,"tags":111},206,"camoufox-residential-proxy-python-rehberi","Camoufox ve Residential Proxy: Kod Odaklı Python Rehberi","C++ düzeyinde yamalanmış Firefox olan Camoufox'u residential proxy arkasında çalıştırma: güncel Python API'si, geoip'in neden sabit oturum gerektirdiği, parmak izi tutarlılık listesi ve Patchright ya da nodriver'ın ne zaman daha uygun olduğu.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-master.webp","Camoufox with Residential Proxies: A Code-First Python Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-og.webp","2026-10-13T09:00:00+00:00","2026-10-13T09:00:22+00:00",29,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[110],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[112,113,114,118,119],{"id":81,"slug":82,"name":83},{"id":85,"slug":86,"name":87},{"id":115,"slug":116,"name":117},6,"anti-tespit","Anti-Tespit",{"id":89,"slug":90,"name":91},{"id":120,"slug":121,"name":122},21,"headless-tarayici","Headless Tarayıcı",{"id":124,"slug":125,"title":126,"excerpt":127,"featured_image_url":128,"featured_image_alt":129,"card_image_url":130,"og_image_url":131,"published_at":132,"updated_at":132,"content_updated_at":133,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":134,"author":135,"categories":136,"tags":138},176,"nodejs-got-scraping-proxy-rehberi","Node.js'de got-scraping ile Proxy Tabanlı Web Scraping Rehberi","Node.js'de got-scraping kütüphanesinin header-generator, HTTP\u002F2 ve proxy desteğini üretim ölçeğinde nasıl kullanacağınızı öğrenin. Residential proxy rotation, retry hooks ve Crawlee entegrasyonu dahil.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-og.webp","2026-08-04T16:05:06+00:00","2026-10-03T08:57:49+00:00",121,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[137],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":140,"slug":141,"title":142,"excerpt":143,"featured_image_url":144,"featured_image_alt":145,"card_image_url":146,"og_image_url":147,"published_at":148,"updated_at":148,"content_updated_at":149,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":150,"author":151,"categories":152,"tags":154},175,"colly-doner-proxy-rehberi","Colly'de Döner Proxy Kullanımı: Go ile Üretim Seviyesinde Web Scraping","Go'nun Colly çerçevesinde döner proxy'leri idiomatik şekilde nasıl entegre edeceğinizi öğrenin. Collector modeli, RoundRobinProxySwitcher, residential IP rotasyonu ve üretim desenlerini kapsayan geliştirici odaklı rehber.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T08:57:48+00:00",71,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[153],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],[]]