Media Expert API: cena z półki, cena z kodem i stan magazynu z mediaexpert.pl
Media Expert nie udostępnia publicznego API do swojego katalogu. Dane pochodzą z mediaexpert.pl w takiej postaci, w jakiej widzi je klient bez logowania, a odpowiedź w JSON zawiera nazwę, markę, model, EAN, kategorię, ocenę, dostępność oraz każdą cenę, którą sklep pokazuje przy produkcie, w osobnym polu. Jest cena z półki (`price`), cena przekreślona, najniższa cena z 30 dni według dyrektywy Omnibus, cena z kodem razem z samym kodem i datami ważności, cena w aplikacji i cena klubowa. Kto zbiera ceny pralek albo telewizorów z Media Expert, widzi więc od razu, ile klient zapłaci z kodem, a nie tylko kwotę z etykiety. To nie jest integracja dla sprzedawców z marketplace Media Expert: API nie wystawia ofert i nie pobiera zamówień, czyta wyłącznie publiczną stronę sklepu.
Endpointy
| endpoint | Co zwraca | Wymagane |
|---|---|---|
| search | Wyszukiwanie po frazie z zakresem cen w zł, przełącznikiem „tylko promocje” (`only_discounted`) i sortowaniem: trafność, cena rosnąco i malejąco, najlepiej oceniane. Każdy wiersz ma id produktu, EAN, model, markę, wszystkie rodzaje ceny, sprzedawcę (Media Expert albo sklep z marketplace), dostępność online i w sklepach, ocenę i liczbę opinii. Gdy sklep odpowiada na frazę całą kategorią, jak przy „pralka”, widać to w `search_mode` i `redirected_to`. | query |
| category | Jedna kategoria (pralki, smartfony, telewizory…) po id albo adresie z mediaexpert.pl, z tymi samymi filtrami ceny, promocji i sortowania i z takimi samymi wierszami jak w `search`. Id, które nie jest kategorią, zostaje odrzucone. | wszystkie opcjonalne |
| product | Wszystko o jednym produkcie wskazanym przez id, adres URL albo numer erp: wszystkie ceny, EAN, model, sprzedawca, stan online i w sklepach, odbiór osobisty, raty, jeśli sklep je pokazuje (np. „Do 30 rat 0%”), specyfikacja w grupach, wszystkie zdjęcia, ścieżka kategorii, ocena i liczba opinii. | wszystkie opcjonalne |
| description | Długi opis z zakładki „Opis” jako zwykły tekst, bez HTML i bez osadzonych obrazków. Jest osobną akcją, bo źródło wysyła ten opis razem z obrazkami zakodowanymi w base64. | wszystkie opcjonalne |
Każde wywołanie jest rozliczane w kredytach. Nieudane i zablokowane wywołania są darmowe.
Działający przykład
Fraza „pralka”, 28 października 2026. Media Expert przekierował ją na kategorię Pralki z 618 produktami, dlatego odpowiedź ma `search_mode: "category_redirect"`, a pod spodem poszły 3 zapytania do sklepu. Pralka Hisense z półki kosztuje 2999,99 zł, z kodem RW2210-301126 2799,99 zł; kod obowiązuje do 30 listopada, a ta sama kwota widnieje w aplikacji. Cenę z kodem miały 4 z 5 pralek, bez niej była tylko Candy za 959 zł. Filtry ceny i sortowanie korzystają z `filter_price`, czyli z ceny z kodem, gdy produkt ją ma.
curl -X POST https://api.reefapi.com/mediaexpert/v1/search \
-H "x-api-key: TWOJ_KLUCZ" \
-H "content-type: application/json" \
-d '{"query": "pralka", "limit": 5}'{
"ok": true,
"data": {
"results": [
{
"product_id": 7975847,
"erp_id": "2087062",
"ean": "6901101832504",
"model": "WF5I1045BWQ",
"brand": "HISENSE",
"title": "Pralka HISENSE Seria 5i WF5I1045BWQ 10.5kg 55cm 1400obr Sterowanie smartfonem",
"currency": "PLN",
"price": 2999.99,
"price_net": 2439.02,
"was_price": null,
"omnibus_lowest_30d_price": 2999.0,
"code_price": 2799.99,
"promo_code": "RW2210-301126",
"promo_valid_from": "2026-10-22T00:00:00+02:00",
"promo_valid_to": "2026-11-30T21:59:00+01:00",
"promo_discount": [ { "type": "amount", "value": 199.01 }, { "type": "percent", "value": 7 } ],
"app_price": 2799.99,
"member_price": null,
"filter_price": 2799.99,
"seller": { "type": "retailer", "name": "Media Expert", ... },
"availability": {
"status": "available",
"label": "Dostępny",
"description": "Dostępny od ręki",
"available_in_store": true,
"stock_online": 20,
"stock_store": 20,
"stock_capped": true
},
"rating": 4.9,
"review_count": 509,
"category": { "id": 13720, "name": "Pralki", "url": "https://www.mediaexpert.pl/agd/pralki-i-suszarki/pralki" },
...
},
...
{
"product_id": 8181067,
"brand": "CANDY",
"title": "Pralka CANDY ProWash 100 EY 07SB7-S 7kg Slim 43.9cm 1000obr AI Silent Motion",
"price": 959.0,
"omnibus_lowest_30d_price": null,
"code_price": null,
"promo_code": null,
"filter_price": 959.0,
"rating": 4.8,
"review_count": 92,
...
},
...
],
"total": 618,
"total_reachable": 500,
"page": 1,
"limit": 5,
"has_more": true,
"search_mode": "category_redirect",
"redirected_to": { "url": "https://www.mediaexpert.pl/agd/pralki-i-suszarki/pralki", "category_id": 13720 }
},
"meta": { "record_count": 5, "upstream_requests": 3, "charged_credits": 2, "cache_hit": false, "mode": "live" }
}Scraper Media Expert w Pythonie: dane strukturalne strony podają cenę z półki
Najprostszy scraper bierze cenę z danych strukturalnych strony (ld+json). Przy budowie API, 15 października 2026, sprawdziliśmy w ten sposób trzy produkty z aktywnym kodem rabatowym. Za każdym razem dane strukturalne podawały cenę z półki (na przykład 6349,99 zł), a nie cenę z kodem (5999,00 zł). Dlatego `price` jest tu zawsze ceną z półki, a cena z kodem to osobne pole, obok samego kodu i jego dat.
Wyszukiwarka sklepu obsługuje tylko 5, 10, 15, 20, 30 albo 50 produktów na stronę. Każda inna liczba, na przykład 6 albo 100, kończy się bez żadnego komunikatu stroną z 30 wynikami. API odrzuca więc inne wartości `limit` jako INVALID_PARAM, zamiast udawać, że oddaje tyle, ile poproszono. Nieistniejący numer kategorii sklep traktuje tak, jakby filtra nie było, i zgłasza 2 239 649 produktów; taki numer API również odrzuca.
Długi opis produktu zawiera obrazki osadzone w base64. Dla produktu 8128287 odpowiedź miała 1,83 MB, z czego 1,49 MB zajmował opis z 27 obrazkami. `product` w ogóle go nie pobiera (typowa karta ma około 12,6 kB), a czysty tekst zwraca osobna akcja `description`.
Stan magazynowy ma sufit. W 290 sprawdzonych produktach `stock_online` przyjmował tylko wartości 0, 2, 9 i 20, z czego 269 razy 20, nigdy więcej. 20 znaczy więc „20 lub więcej” i API zaznacza to polem `stock_capped`.
Pozostała dokumentacja po polsku
- OLX API — dokumentacja
- Allegro API — dokumentacja
- Empik API — dokumentacja
- Ceneo API — dokumentacja
- Otomoto API — dokumentacja
- Vinted API — ogłoszenia z vinted.pl
- Otodom API — dokumentacja
- eBay API (ebay.pl) — dokumentacja
- IKEA API — ceny i dostępność
- AliExpress API — ceny w zł
- x-kom API: ceny i Gorący strzał
Ograniczenia i uczciwe uwagi
- Media Expert nie jest autorem tego API i go nie wspiera. Nie mamy ze sklepem ani umowy, ani współpracy.
- API czyta ceny ze sklepu internetowego mediaexpert.pl. Cen z etykiet w sklepach stacjonarnych nie zna; ze sklepów stacjonarnych podaje tylko dostępność i odbiór osobisty.
- Stan magazynowy jest ucięty na 20: `stock_online` i `stock_store` równe 20 oznaczają „co najmniej 20” (`stock_capped: true`). We wszystkich 5 pralkach z przykładu było 20.
- `price_min`, `price_max` i sortowanie po cenie działają na `filter_price`, czyli na cenie z kodem, jeśli produkt ją ma. Wiersz może mieć cenę z półki spoza zakresu i mimo to spełniać filtr.
- `limit` w `search` przyjmuje tylko 5, 10, 15, 20, 30 lub 50; inna wartość daje INVALID_PARAM. W `category` można podać do 50.
- Wyszukiwarka sklepu zwraca także akcesoria. Fraza „telewizor 55 cali” posortowana od najtańszych dała na pierwszych pięciu miejscach uchwyty ścienne za 18,45–34,85 zł (690 wyników). Do porównania cen samych telewizorów lepiej nadaje się `category`.
- Przy długich listach odpowiedź podaje `total_reachable`: dla „pralka” przy 5 produktach na stronę było to 500 z 618 (100 stron). Większy `limit` pozwala dojść dalej.
- Treści opinii, stanu w konkretnym sklepie i filtrów po marce czy parametrach technicznych API nie ma.
- Cena klubowa (`member_price`) pojawia się rzadko: przy budowie API miały ją 2 z 290 produktów, cenę z kodem 82, cenę Omnibus 95.
- Raty i opcje dostawy są w odpowiedzi tylko wtedy, gdy sklep je pokazuje. Dla pralki Hisense `product` zwrócił „Do 30 rat 0%” (30 × 93,33 zł), a `delivery_options` było null.
- Koszt w kredytach: `search` i `category` po 2, `product` 1, `description` 3. Nieudane wywołania są bezpłatne.