API

eBay API dla ebay.pl: oferty, ceny w PLN i koszty wysyłki w JSON

To API czyta ebay.pl tak, jak widzi go kupujący: tytuł, cena w złotych, stan przedmiotu, parametry oferty i koszt wysyłki wracają jako JSON — konta w eBay zakładać nie trzeba. Jeśli chcesz jako sprzedawca wystawiać oferty albo obsługiwać zamówienia, potrzebujesz oficjalnego API z eBay Developers Program. To API niczego nie wystawia ani nie zmienia, odczytuje wyłącznie oferty, które każdy widzi w serwisie. Polski serwis wybiera się parametrem `"domain": "pl"`; bez niego zapytanie trafia do ebay.com.

Endpointy

endpointCo zwracaWymagane
searchWyszukiwanie aktywnych ofert po słowach kluczowych: stan, kategoria, Kup teraz albo licytacja, przedział cen w złotych, darmowa wysyłka, zwroty, propozycja ceny i lokalizacja przedmiotu. Do 240 wyników na stronę.query
item_detailPełna oferta po numerze albo adresie: cena, stan, dostępność, parametry przedmiotu pod polskimi nazwami (np. „Numer zestawu”, „Liczba części”), zdjęcia, koszt wysyłki razem z krajem, dla którego eBay go policzył, pola licytacji oraz `listing_status`, który odróżnia ofertę aktywną od zakończonej.wszystkie opcjonalne
items_batchDo 40 ofert naraz, każda z tym samym pełnym rekordem co item_detail; numery, których eBay nie zna, wracają w `not_found`. eBay nie ma zbiorczego endpointu, więc każda oferta to osobne zapytanie i tak też jest liczona: zyskujesz czas, nie kredyty.item_ids
seller_itemsCały bieżący asortyment wskazanego sprzedawcy (po nazwie użytkownika na eBay), z tymi samymi filtrami i stronicowaniem co wyszukiwanie.seller
seller_profileReputacja sprzedawcy: liczba komentarzy i odsetek pozytywnych, także za ostatnie 12 miesięcy, sprzedane przedmioty, data dołączenia, konto firmowe i status Top Rated.seller
dealsOferty dnia (Daily Deals) z ceną sprzed obniżki; zapytanie nie jest potrzebne.wszystkie opcjonalne
categoriesDrzewo kategorii eBay i wyszukiwanie kategorii po nazwie, żeby zamienić nazwę na numer używany w parametrze `category`.wszystkie opcjonalne

Każde wywołanie jest rozliczane w kredytach. Nieudane i zablokowane wywołania są darmowe.

Działający przykład

Bez `location` pierwsza strona wyników dla „lego technic” na ebay.pl składała się w dużej części z ofert, które wyglądały na zagraniczne: sporo tytułów po włosku, niemiecku czy francusku i ceny najwyraźniej przeliczone na złote (924,50 zł, 441,54 zł) — żadna z 30 nie była okrągłą kwotą. Z `"location": "domestic"` wyniki przypominały już polski rynek: tytuły w rodzaju „Klocki LEGO Technic…” i 13 z 30 cen w pełnych złotych. Polem `location` nie da się tego potwierdzić, bo na ebay.pl engine jeszcze go nie wypełnia (zob. ograniczenia).

Żądanie
curl -X POST https://api.reefapi.com/ebay/v1/search \
  -H "x-api-key: TWOJ_KLUCZ" \
  -H "content-type: application/json" \
  -d '{"query": "lego technic", "domain": "pl", "max_results": 30, "location": "domestic"}'
Odpowiedź (skrócona)
{
  "ok": true,
  "data": {
    "query": "lego technic",
    "results": [
      {
        "item_id": "227481553758",
        "title": "LEGO Technic 42172 McLaren P1 Hypercar MISB NEW IN FACTORY BROWN SHIPPER BOX",
        "price": { "raw": "1 478,00 zł", "value": 1478.0, "currency": "PLN" },
        "condition": "Fabrycznie nowy",
        "shipping": "Bezpłatna wysyłka",
        "url": "https://www.ebay.pl/itm/227481553758",
        "in_stock": true
      },
      {
        "item_id": "237114934372",
        "title": "Klocki LEGO Technic 42234 Samochód sportowy Dodge Viper GTS-R",
        "price": { "raw": "300,09 zł", "value": 300.09, "currency": "PLN" },
        "condition": "Fabrycznie nowy",
        "url": "https://www.ebay.pl/itm/237114934372",
        "in_stock": true
      },
      {
        "item_id": "237064770110",
        "title": "Lego Technic 4x4 Extreme Off-Roader 42099",
        "price": { "raw": "599,00 zł", "value": 599.0, "currency": "PLN" },
        "condition": "Używany",
        "url": "https://www.ebay.pl/itm/237064770110",
        "in_stock": true
      },
      ...
    ]
  },
  "meta": { "record_count": 30, "domain": "pl", "pagination": { "page": 1, "has_more": true }, "cache_hit": false, "mode": "live" }
}

Scraper eBay w Pythonie: gdzie się wykłada

Karta wyniku eBay wygląda inaczej w każdym kraju. We wrześniu 2026 nasz własny parser na ebay.de, ebay.fr i ebay.it nie zwrócił kosztu wysyłki ani lokalizacji w żadnym z 40 sprawdzonych wierszy na każdym z tych serwisów. Część kart po prostu tych danych nie zawiera, ale lokalizację i tryb zakupu parser rozpoznawał wyłącznie po angielskich sformułowaniach: niemieckiego „Sofort-Kaufen” nie wychwycił w żadnej z 72 kart. Rozpoznawanie trybu zakupu poprawiliśmy wtedy dla de, fr, it i es, a lokalizacji dla de, it i es. Polskich etykiet jeszcze nie — co z tego wynika, opisujemy w ograniczeniach.

Druga pułapka to zakończona oferta. eBay nadal pokazuje na niej ostatnią informację o liczbie dostępnych sztuk, więc skrypt, który ją czyta, bierze zakończoną aukcję za towar na stanie. item_detail zwraca dlatego `listing_status` (active/ended), a przy zakończonej ofercie nie podaje nieaktualnej liczby sztuk.

Trzecia jest mniej oczywista: zapytanie skopiowane z tytułu oferty albo z mediów społecznościowych bywa zapisane „ozdobnymi” znakami Unicode, np. pogrubionymi literami matematycznymi. eBay nic wtedy nie znajduje, ale nie wyświetla też komunikatu o braku wyników, więc parser dostaje pełnowymiarową stronę bez ani jednej oferty. Takie zapytania normalizujemy (NFKC) przed wysłaniem.

Kilkadziesiąt cen sprawdzanych od czasu do czasu obejdzie się bez nas. Jeśli jednak porównujesz ceny z ebay.pl co tydzień, prędzej czy później trafisz na któryś z tych przypadków — i lepiej, żeby skończył się kodem błędu niż cichą dziurą w danych.

Ograniczenia i uczciwe uwagi

  • To nieoficjalny dostęp: nie jesteśmy partnerem eBay, a to API nie jest częścią eBay Developers Program.
  • Domyślny serwis to ebay.com z cenami w USD; dla Polski podaj `"domain": "pl"`.
  • Na ebay.pl część pól w wynikach wyszukiwania jest pusta, bo engine nie odczytuje jeszcze polskich etykiet karty: w naszych dwóch zapytaniach (60 wierszy) `location`, `seller` i `buying_format` były puste w każdym wierszu, a `shipping` przyszło tylko jako tekst „Bezpłatna wysyłka” w 4 wierszach. Bez filtra lokalizacji `condition` brakowało w 10 z 30 wierszy.
  • Koszt wysyłki w item_detail eBay liczy dla kraju podanego w `shipping.country`, a to nie zawsze Polska: przy jednej z dwóch sprawdzonych ofert było to DEU (165 zł), choć karta w wynikach pokazywała „Bezpłatna wysyłka”. Zanim potraktujesz `rate` jako koszt dostawy do Polski, sprawdź to pole.
  • W item_detail z ebay.pl pola `seller`, `brand` i `category_path` wróciły puste w 2 z 2 ofert. Marka i numer zestawu, jeśli sprzedawca je podał, są w `item_specifics` („Marka”, „Numer zestawu”).
  • `condition` w wynikach wyszukiwania to polska etykieta z karty („Fabrycznie nowy”, „Używany”), a w item_detail wartość angielska („New”, „Used”). Przy łączeniu danych z obu endpointów trzeba je zmapować.
  • Nie ma pamięci podręcznej: każde wywołanie czyta ebay.pl na żywo (`cache_hit: false`), więc ceny są z chwili zapytania. Endpointów `seller_profile` i `deals` nie sprawdzaliśmy jeszcze na ebay.pl.