ana sayfasalesdbscraping · docs

Genel Bakış

İsteğin bize gelir, biz Amazon'u tararız ve temiz sonucu sana döneriz — TLS parmak izi, bot engelleri, proxy rotasyonu bizde.

Anahtarın plus_live_… ile başlar; sunucu-taraflı kullan, istemcide açığa çıkarma.

4 veri türü: ürün detayı (JSON), tüm satıcılar (offer-listing), Amazon araması (search), ham HTML (raw-html).

İki mod: tekli (senkron — cevabı beklersin) ve toplu (batch — jobId alır, kuyruktan toplarsın). Eşzamanlılığı biz yönetiriz.

Kimlik: X-API-Key header (sunucu-taraflı; anahtarı istemcide açığa çıkarma). IP allowlist opsiyonel.

Ortak parametreler (JSON body — tekli ve batch'te aynı)
asin          10 haneli ASIN (pdp / offer-listing) — zorunlu
url           tam Amazon URL veya ASIN (raw-html) — zorunlu
keyword       arama kelimesi (search) — zorunlu
geocode       ülke/market kodu (us, gb, de, fr, it, es, ca, jp, in, tr, …) — vars: us
zipcode       teslimat ZIP (ZIP destekli marketlerde) → konuma özel fiyat/stok
countryName   ülke adı (ZIP olmayan marketler için)
language      ISO 639-1 (EN, DE, FR, …)
device        desktop | mobile
page          sayfa numarası (search) — vars: 1
include_html  true → JSON yanında ham HTML (pdp / offer / search)

Tekli istek cevaplarında (pdp / offer-listing / raw-html) X-Monthly-Limit / X-Daily-Limit / X-Quota-Room başlıkları döner (kuyruğa düşen 202 / done / failed'de ayrıca X-Job-Id). Batch (POST /batch · GET /batch/{jobId}) ve GET /plus/account cevaplarında bu başlıklar DÖNMEZ — kotayı gövdedeki limits / free'den oku. Kota aşımı 429 (kotadan düşmez). Tekli istek ~20 sn'de bitmezse kuyruğa düşer (202 + jobId) → poll'lersin.

Ürün detayı

Tek üründe TÜM ürün verisi: fiyat/liste fiyatı, buybox satıcı, stok, kupon, BSR, görsel/video, teknik özellikler, varyant, yorum… 200 → gövde direkt ürün JSON'u (aşağıda dönebilecek tüm alanlar).

İstek
curl -X POST https://salesdbscraping.io/api/v1/plus/amazon/pdp \
  -H "X-API-Key: plus_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"asin":"B08HR8KZ2V","geocode":"us","zipcode":"10001"}'
Cevap
{
  "asin": "B0C7BKZ883",
  "name": "Adjustable Laptop Stand for Desk, Foldable Aluminum Riser…",
  "brand": "Gogoonike",
  "url": "https://www.amazon.com/dp/B0C7BKZ883",
  "thumbnail": "https://m.media-amazon.com/images/I/71Jz2L1pV6L._AC_SX679_.jpg",
  "is_sponsored": false,
  "rating": 4.6,
  "total_ratings": 2712,
  "price": 14.99,
  "list_price": 39.99,
  "currency": "USD",
  "currency_symbol": "$",
  "is_prime": true,
  "has_buy_box": true,
  "sold_by": "Amazon.com",
  "max_quantity": 30,
  "sales_volume": "500+ bought in past month",
  "other_sellers_count": 3,
  "availability_text": "In Stock",
  "description": "Raise your laptop to a comfortable viewing angle…",
  "date_first_available": "2023-05-14",
  "climate_pledge_friendly": false,
  "shipping": { "is_prime": true, "location": "New York 10001", "options": ["FREE delivery Mon, Dec 16"] },
  "shipping_info": ["FREE delivery Monday, December 16", "Or fastest delivery Friday, December 13"],
  "more_buying_choices": { "heading": "More Buying Choices", "offer_text": "New from $14.99", "offer_link": "…/gp/offer-listing/B0C7BKZ883" },
  "coupon": { "type": "percent", "value": 5, "text": "Save 5% with coupon" },
  "images": [ { "url": "https://m.media-amazon.com/images/I/71Jz2L1pV6L._AC_SX679_.jpg", "width": 679, "height": 679 }, "…" ],
  "videos": [ { "title": "Product demo", "url": "…", "duration_seconds": 31, "width": 1280, "height": 720 }, "…" ],
  "best_seller_rankings": [ { "category": "Office Products", "rank": 249 }, { "category": "Laptop Stands", "rank": 2 } ],
  "technical_details": { "Brand": "Gogoonike", "Material": "Aluminum", "Item Weight": "1.1 Pounds", "Color": "Silver" },
  "product_details": { "Package Dimensions": "10 x 9 x 1 inches", "Country of Origin": "China" },
  "about_item": [ "Ergonomic viewing angle…", "Foldable & portable…", "Sturdy aluminum build…" ],
  "alternative_prices": [ { "label": "Used - Like New", "asin": "B0C7BKZ883", "is_selected": false, "available": true } ],
  "variants": [ { "asin": "B0C7BKZ884", "dimensions": { "Color": "Space Gray" }, "selected": true, "available": true } ],
  "reviews": [ { "title": "Great stand", "rating": 5, "text": "Sturdy and light…", "author": "J. Doe", "date": "2024-11-02" }, "…" ],
  "sustainability_features": [ "Carbon impact estimated" ],
  "status": "success",
  "errorMessage": null
}

Sayfada olmayan alanlar null döner veya atlanır (ör. coupon, sold_by; buybox yoksa price/list_price null + has_buy_box:false). status='success' + errorMessage=null → başarılı. Kesin FBA/FBM için offer-listing kullan (buybox'taki prime bilgisi tek başına güvenilmez).

Offer-Listing (tüm satıcılar)

Bir ürünün tüm satıcı teklifleri: kesin FBA/FBM, satıcı ID, stok, buybox kazananı, Prime.

İstek
curl -X POST https://salesdbscraping.io/api/v1/plus/amazon/offer-listing \
  -H "X-API-Key: plus_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"asin":"B08HR8KZ2V","geocode":"us"}'
Cevap
{ "asin":"B08HR8KZ2V", "status":"success", "totalOfferCount":2,
  "offers":[
    { "merchantName":"…", "sellerId":"A3VM…", "listingPrice":{"amount":49.99,"currencyCode":"USD"},
      "isFulfilledByAmazon":false, "isBuyBoxWinner":true, "quantity":30,
      "primeInformation":{"isPrime":true}, "condition":"New" }
  ] }

Prime/FBA'nın güvenilir kaynağı: her offer'ın isFulfilledByAmazon + primeInformation.isPrime alanları.

Raw HTML

Amazon sayfasının ham HTML'i (parse edilmemiş). Gövde text/html olarak birebir döner.

Anahtarında raw-html izni (allow_raw) gerekir. Girdi: tam URL veya 10 haneli ASIN.

İstek
curl -X POST https://salesdbscraping.io/api/v1/plus/amazon/raw-html \
  -H "X-API-Key: plus_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.amazon.com/dp/B08HR8KZ2V","geocode":"us"}'
Cevap
<!doctype html><html …> … </html>   (Content-Type: text/html)

PDP ile aynı fiyat (1 istek). Yapılandırılmış veri için pdp/offer daha verimli — raw yalnız kendi parse'ın için.

Toplu istek (batch)

Çok sayıda ASIN'i TEK çağrıda gönder — biz kuyruğa alır, eşzamanlılığı yöneterek işleriz. Tek tek istek atmana gerek yok.

endpoint alanı hangi veriyi istediğini söyler (pdp / offer-listing / raw-html). items dizisi girdilerdir — asins de kabul edilir (tek çağrıda en fazla 5000, tekrarlar elenir).

Anında jobId döner. Kotanı veya kuyruk tavanını aşan öğeler rejected'a düşer; kabul edilenler (accepted) işlenir. free = bir sonraki istekte ret yemeden gönderebileceğin adet.

Kuyruk tavanı (max_queue): bir key aynı anda en fazla bu kadar iş BEKLETEBİLİR (faturalama kotasından bağımsız yığın freni). İpucu: göndermeden önce GET /plus/account'taki free ile tam sığacak kadar yolla, hiç ret yeme.

Kuyruk tavanı doluysa (429)
HTTP 429
{ "ok":false, "error":"queue full — drain in-flight items then retry (see GET /plus/account free)",
  "accepted":0, "rejected":1000, "queued":1000, "queueMax":1000, "free":0 }
İstek
curl -X POST https://salesdbscraping.io/api/v1/plus/batch \
  -H "X-API-Key: plus_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"endpoint":"pdp","items":["B08HR8KZ2V","B07GJPG6HW","B000XJD33O"],"geocode":"us"}'
Cevap
{ "ok":true, "jobId":"job_a1b2c3d4e5f6a7b8c9",
  "endpoint":"pdp", "accepted":3, "rejected":0, "total":3,
  "queued":3, "queueMax":1000, "free":997,
  "poll":"/api/v1/plus/batch/job_a1b2c3d4e5f6a7b8c9" }

Sonuçları GET /api/v1/plus/batch/{jobId} ile toplarsın (bkz. Kuyruk). Batch poll kota HARCAMAZ.

Kuyruk: cevabı nasıl beklersin

Batch her zaman kuyrukludur (jobId). Tekli istek de kuyruğa düşebilir: ~20 sn içinde bitmezse 202 + jobId döner (aşağıdaki gövde).

Her iki durumda da aynı jobId'yi poll'lersin: GET /api/v1/plus/batch/{jobId}. complete:true olana kadar 2-5 sn arayla tekrar et.

counts alanı ilerlemeyi verir (pending / processing / done / failed). results[] her öğe için { input, status, httpStatus, ms } + biten öğede pdp/offer'da data, raw-html'de html içerir.

Sayfalama: ?offset= &limit= (varsayılan 200, max 1000). ?results=0 → sonuç gövdeleri (data/html) gelmez; results[] yine her öğe için input/status/httpStatus/ms ile döner (hafif, hızlı).

Tekli istek kuyruğa düşerse (202)
HTTP 202  ·  X-Job-Id: job_a1b2c3d4e5f6a7b8c9
{ "ok":false, "queued":true, "jobId":"job_a1b2c3d4e5f6a7b8c9",
  "status":"processing", "message":"still queued; poll GET /api/v1/plus/batch/job_a1b2c3d4e5f6a7b8c9" }
İstek
curl "https://salesdbscraping.io/api/v1/plus/batch/job_a1b2c3d4e5f6a7b8c9?limit=200&offset=0" \
  -H "X-API-Key: plus_live_xxx"
Cevap
{ "ok":true, "jobId":"job_a1b2c3d4e5f6a7b8c9", "total":3,
  "counts":{ "pending":0, "processing":1, "done":2, "failed":0 },
  "complete":false, "offset":0, "limit":200,
  "results":[
    { "input":"B08HR8KZ2V", "status":"done",       "httpStatus":200, "ms":4210, "data":{ …ürün… } },
    { "input":"B07GJPG6HW", "status":"done",       "httpStatus":200, "ms":3880, "data":{ …ürün… } },
    { "input":"B000XJD33O", "status":"processing", "httpStatus":null, "ms":null }
  ] }

poll kota HARCAMAZ — istediğin kadar sorabilirsin. jobId yalnız kendi anahtarınla açılır (başka anahtar 404 alır).

Hata kodları

İki tür hata var. BİZİM hatalarımız: isteğin bize ulaştı ama auth / doğrulama / kota / servis nedeniyle reddedildi. SCRAPER hatalarımız: isteği aldık ama sayfayı çekerken sorun oldu.

Hepsi JSON { ok:false, error:"…" } döner (raw-html'in başarı gövdesi hariç — o text/html'dir).

Tam hata listesi
── BİZİM hatalarımız (auth / doğrulama / kota / servis · JSON { ok:false, error })
400  invalid JSON body                 gövde geçerli JSON değil
400  valid 10-char asin required       pdp/offer-listing: asin 10 hane değil
400  url or asin required              raw-html: url veya asin verilmedi
400  endpoint must be pdp | offer-listing | raw-html   batch: endpoint hatalı
400  no valid items                    batch: geçerli öğe kalmadı (hepsi filtrelendi)
401  missing X-API-Key header          anahtar başlığı yok
401  invalid Plus API key              anahtar bulunamadı
403  Plus API key disabled             anahtarın kapalı
403  IP not allowed: <ip>              IP allowlist'te değil
403  raw-html not enabled for this key raw-html izni yok (allow_raw)
404  job not found                     batch poll: jobId yok veya senin anahtarın değil
429  quota exceeded (daily/monthly)    kota bitti — X-Quota-Room:0 (KOTADAN DÜŞMEZ)
429  queue full                        kuyruk tavanın (max_queue) dolu — bekleyenler işlenince tekrar dene (GET /plus/account "free")
503  plus service not configured       servis geçici yapılandırılmamış (nadir — bize bildir)

── SCRAPER hatalarımız (sayfa çekilirken · JSON { ok:false, error })
404  not_found            ASIN/sayfa Amazon'da yok (KALICI — tekrar deneme)
503  upstream_unavailable geçici çekim hatası (ağ/blok/timeout — tekrar denenebilir)

── Kuyruk (senkron istek ~20 sn'de bitmezse)
202  { queued:true, jobId }   iş kuyrukta — GET /api/v1/plus/batch/{jobId} ile bekle

429 kotadan DÜŞMEZ (X-Quota-Room:0). 404 not_found KALICI (tekrar deneme). 503 upstream_unavailable geçici (1-2 kez tekrar dene). Günlük kota gece yarısı, aylık ay başı sıfırlanır.

Hesap / Kullanım

Anahtarının durumu, izinleri, limitleri ve kullanımını döner. Kota HARCAMAZ — istediğin sıklıkta çağır.

resetsInMs: limitin ne kadar sonra sıfırlanacağı (ms) · maxConcurrent: aynı anda kaç paralel istek atabileceğin · maxQueue: kuyruk tavanın (0=sınırsız) · queued: şu an kuyrukta bekleyen isteğin · free: ret yemeden gönderebileceğin adet · usage.totalRequests: toplam sayılan istek.

İstek
curl https://salesdbscraping.io/api/v1/plus/account -H "X-API-Key: plus_live_xxx"
Cevap
{ "ok":true, "valid":true, "name":"…", "active":true, "ipLock":false,
  "permissions":{ "pdp":true, "offerListing":true, "search":true, "rawHtml":true },
  "limits":{
    "monthly":{ "limit":10000, "used":128, "remaining":9872, "resetsInMs":1512000000 },
    "daily":{   "limit":2000,  "used":128, "remaining":1872, "resetsInMs":43200000 },
    "maxConcurrent":10,
    "maxQueue":1000,
    "queued":0,
    "free":2000
  },
  "usage":{ "totalRequests":128, "lastRequestTs":1783641900858 } }

Kredi/maliyet bilgisi dönmez — yalnızca istek limitlerin görünür. Scrape öncesi limitini buradan doğrula (ücretsiz).

Entegrasyon promptu

Aşağıdaki bloğu kopyala, yapay zekâ asistanına (Claude, Cursor, ChatGPT…) yapıştır. <PLUS_KEY> yerine sana verdiğimiz plus_live_… anahtarını yaz — entegrasyonu senin yerine kursun.

Test akışı: (1) yerelden tek ASIN ile pdp iste, ok gelen gerçek veriyi doğrula. (2) sonra /batch ile 2-3 ASIN gönderip jobId'yi poll et. (Anahtar sunucu-taraflıdır, tarayıcıdan ÇAĞIRMA.)

Prompt — kopyala & yapay zekâna yapıştır
SalesDB Scraping "Plus" API'sini projeme entegre et. Amazon ürün/satıcı/ham-HTML verisini tekli veya toplu döner.

# Kimlik
Header: X-API-Key: <PLUS_KEY>   (plus_live_… ile başlar; SADECE sunucu-taraflı, tarayıcıdan ASLA çağırma)
Header: Content-Type: application/json

# Endpoint'ler (hepsi POST, JSON gövde)
POST https://salesdbscraping.io/api/v1/plus/amazon/pdp            body: { "asin":"B0XXXXXXXX", "geocode":"us", "zipcode":"10001" }   → JSON ürün detayı
POST https://salesdbscraping.io/api/v1/plus/amazon/offer-listing  body: { "asin":"B0XXXXXXXX", "geocode":"us" }                     → JSON tüm satıcılar (kesin FBA/FBM, Prime)
POST https://salesdbscraping.io/api/v1/plus/amazon/search         body: { "keyword":"laptop stand", "geocode":"us" }                → JSON arama sonuçları (ürün listesi: asin, fiyat, sıra, rozet…)
POST https://salesdbscraping.io/api/v1/plus/amazon/raw-html       body: { "url":"https://www.amazon.com/dp/B0XXXXXXXX" }             → text/html ham sayfa (anahtarda izin gerek)
POST https://salesdbscraping.io/api/v1/plus/batch                 body: { "endpoint":"pdp", "items":["B0...","B0..."] }              → { jobId } (toplu; en fazla 5000)
GET  https://salesdbscraping.io/api/v1/plus/batch/{jobId}                                                                            → kuyruk durumu + sonuçlar (kota HARCAMAZ)
GET  https://salesdbscraping.io/api/v1/plus/account                                                                                  → limit + kullanım (kota HARCAMAZ)

# Tekli istek (senkron)
200 → gövde direkt sonuç (pdp/offer JSON, raw-html HTML). ~20 sn içinde bitmezse 202 { queued:true, jobId } döner → aynı jobId'yi batch poll ile bekle.
Header (tekli istek 200/202/429): X-Monthly-Limit, X-Daily-Limit, X-Quota-Room (+ X-Job-Id yalnızca 202/done/failed). Batch ve /plus/account bu header'ları DÖNDÜRMEZ — kotayı gövdedeki limits/free'den oku.

# Toplu istek (async)
1) POST /batch → anında { jobId, accepted, rejected, queued, queueMax, free } döner. Kabul edilenler işlenir; sığmayan (kota/kuyruk tavanı) öğeler rejected'a düşer. "free" = bir sonraki istekte ret yemeden gönderebileceğin adet.
2) GET /batch/{jobId} ile poll et: counts{pending,processing,done,failed} + complete:true olana kadar 2-5 sn arayla tekrarla.
   results[]: her öğe { input, status, httpStatus, ms } + bitince pdp/offer'da "data", raw-html'de "html".
3) Büyük işlerde sayfalama: ?offset= &limit= (max 1000). Hafif poll için ?results=0 → gövdeler (data/html) gelmez; results[] yine her öğe için input/status/httpStatus/ms ile döner.
4) Kuyruk tavanı (max_queue): bir key aynı anda en fazla bu kadar iş BEKLETEBİLİR. Doluysa POST /batch → 429 "queue full". Bekleyenler işlenip yer açılınca yeni gönder.

# Hatalar (JSON { ok:false, error })
400 geçersiz gövde/asin/endpoint · 401 anahtar yok/yanlış · 403 anahtar kapalı / IP izinsiz / raw izni yok
404 not_found (ASIN yok, KALICI) · 503 upstream_unavailable (geçici — tekrar dene) · 429 quota exceeded (kota bitti, KOTADAN DÜŞMEZ)

# Kurallar
1. <PLUS_KEY>'i environment variable'da tut, koda/frontend'e gömme; endpoint'i yalnız kendi backend'inden çağır.
2. Eşzamanlılık: aynı anda maxConcurrent'ten (GET /plus/account'tan öğren) fazla tekli istek atma; fazlası kuyruğa (202) düşer.
3. 429 → X-Quota-Room:0, kotan bitti (günlük gece yarısı, aylık ay başı reset). Reddedilen istek kotadan düşmez.
4. 404 not_found → tekrar DENEME (kalıcı). 503 upstream_unavailable → 1-2 kez tekrar dene.
5. Çok ASIN'in varsa TEKLİ yerine /batch kullan — tek çağrıda gönder, jobId ile topla (paralelliği biz yönetiriz).
6. Scrape öncesi (opsiyonel) GET /plus/account ile limitini/kalanını doğrula (ücretsiz).

Örnek — kuyruğu boşaldıkça doldur

Binlerce ASIN'i en hızlı taramanın yolu: kuyruğu hep dolu tut, boşaldıkça doldur. Sır free'de — her turda hesabına sor, ret yemeden kaç istek sığacağını öğren, yalnız o kadar gönder. Böylece queue_full (429) hiç almazsın; hız da hesabının kapasitesine kadar çıkar.

Döngü 3 adım: (1) GET /account → free oku (ücretsiz, kota harcamaz). (2) free kadar ASIN'i /batch ile gönder, jobId'yi sakla. (3) Aktif jobId'leri GET /batch/{jobId} ile NON-BLOCKING yokla; biten item'ı hemen işle, tüm batch'in bitmesini bekleme. İşler tamamlandıkça free büyür → sonraki tur kuyruğu tekrar doldurur.

Ayarlar: anahtarındaki max_queue (kuyruk) = boru hattı derinliğin; worker'ının tur başına gönderimini buna EŞİT tut ki tek turda dolsun. max_concurrent (paralel) aynı anda kaç işin çekildiğini belirler — asıl hız buradan ölçeklenir.

Örnek worker döngüsü (JS)
// Kuyruğu boşaldıkça doldur — 'free' backpressure sinyali (hiç ret yeme)
const KEY = "plus_live_xxx", BASE = "https://salesdbscraping.io";
const H = { "X-API-Key": KEY, "Content-Type": "application/json" };
const get = (path) => fetch(BASE + path, { headers: H }).then((r) => r.json());

const pending = [...asinsToScrape];   // taranacak ASIN havuzu
const jobs = new Set();               // aktif jobId'ler

while (pending.length || jobs.size) {
  // 1) Ne kadar sığar? (ücretsiz, kota harcamaz)
  const acc = await get("/api/v1/plus/account");
  const free = acc.limits.free;

  // 2) Sığdığı kadar gönder — fazlasını GÖNDERME (queue_full olmaz)
  if (free > 0 && pending.length) {
    const items = pending.splice(0, free);
    const res = await fetch(BASE + "/api/v1/plus/batch", {
      method: "POST", headers: H,
      body: JSON.stringify({ endpoint: "pdp", items }),
    }).then((r) => r.json());
    if (res.jobId) jobs.add(res.jobId);
    // Yarış sonucu reddedilen olursa havuza geri koy (kabul edilenler sırada başta)
    if (res.rejected > 0) pending.push(...items.slice(res.accepted));
  }

  // 3) Aktif job'ları NON-BLOCKING yokla — biten item'ı hemen işle
  for (const id of [...jobs]) {
    const j = await get("/api/v1/plus/batch/" + id + "?limit=1000");
    for (const it of j.results) save(it);   // { input, status, data | html }
    if (j.complete) jobs.delete(id);
  }
  await new Promise((r) => setTimeout(r, 2000));   // 2 sn bekle, döngüyü tekrarla
}

Örnek: max_queue = 500 + worker tur başına 500 → kuyruk boşaldıkça anında dolar, boru hattı hep dolu = maksimum hız. free, günlük/aylık kotanı da içine katar; ona uyduğun sürece ne queue_full ne kota reddi görürsün. Reddedilenleri (nadir yarış) havuza geri koy — kredi düşmez.

eBay — Ham HTML

Bir eBay sayfası URL'i gönder; biz çekip sayfanın TAM ham HTML'ini döneriz (parse etmeden — JSON değil, text/html). Kendi parse'ını sen yaparsın.

SADECE eBay hostları kabul edilir (ebay.com, ebay.co.uk, ebay.de, ebay.fr, …). eBay dışı URL → 400. Genel proxy DEĞİL; yalnız eBay içindir.

İstediğin eBay sayfası olur: satıcı mağazası (/str/…), satılanlar (sold-search), about, feedback…

Parametreler aşağıda — url dışında hepsi opsiyonel. Herhangi ülke (geocode) + cihaz (device: desktop/mobile/tablet) desteklenir; sadece us/desktop DEĞİL. Ham HTML zorunlu (parse edilmez). Sayfa başına 1 kredi · çok URL için /batch.

Parametreler (JSON body)
url       tam eBay sayfa URL'i (https, YALNIZ eBay hostları) — ZORUNLU
          örn:  https://www.ebay.com/str/{satıcı}
                https://www.ebay.com/sch/i.html?_ssn={satıcı}&LH_Sold=1&LH_Complete=1&_ipg=240&_pgn=1
                https://www.ebay.com/str/{satıcı}?_tab=about     (veya ?_tab=feedback)
geocode   proxy ülkesi: us · gb · de · fr · it · es · ca · au · nl · pl · tr · …  — vars: us
          → taradığın eBay sitesinin ülkesiyle EŞLEŞTİR:  ebay.com→us · ebay.co.uk→gb · ebay.de→de
device    desktop · mobile · tablet  — vars: desktop
timeout   istek zaman aşımı (ms)  — vars: 60000

Başka parametre gerekmez — eBay sayfası doğrudan ham HTML olarak döner.
İstek
curl -X POST https://salesdbscraping.io/api/v1/plus/ebay \
  -H "X-API-Key: plus_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.ebay.co.uk/str/SATICI","geocode":"gb","device":"mobile"}'
Cevap
<!doctype html>
<html lang="en">
<head> … </head>
<body>
  … eBay sayfasının TAM ham HTML'i (parse edilmemiş) …
</body>
</html>

(Content-Type: text/html — JSON DEĞİL)

Cevap text/html (JSON değil). eBay dışı URL → 400 "url must be a valid https ebay URL". geocode = PROXY ülkesi (taradığın eBay sitesiyle eşleştir, ör. ebay.co.uk için gb); device = desktop/mobile/tablet. Fiyat: 1 kredi/sayfa. Kota + kuyruk + batch Amazon endpoint'leriyle aynı.