# Media Expert API — search Poland's largest electronics retailer and read products with PLN shelf, Omnibus, promo-code, app and club prices, stock, seller, EAN and specs

> Search mediaexpert.pl by keyword with the site's own price range (PLN), discounted-only switch and sort. Each row: product id, EAN, erp id, model, brand, title, URL, image, the shelf price, crossed-out price, EU Omnibus lowest-30-day price, promo-code price with its code and dates, app-only price, club price, seller (Media Expert or a marketplace seller), availability with online and store stock, store pickup, rating and review count, category. When Media Expert answers a keyword with a category page (e.g. 'pralka' → washing machines) the engine lists that category and says so in `redirected_to`.
> ReefAPI engine `mediaexpert` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/mediaexpert/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/mediaexpert/v1/search — 2 credits
Search mediaexpert.pl by keyword with the site's own price range (PLN), discounted-only switch and sort. Each row: product id, EAN, erp id, model, brand, title, URL, image, the shelf price, crossed-out price, EU Omnibus lowest-30-day price, promo-code price with its code and dates, app-only price, club price, seller (Media Expert or a marketplace seller), availability with online and store stock, store pickup, rating and review count, category. When Media Expert answers a keyword with a category page (e.g. 'pralka' → washing machines) the engine lists that category and says so in `redirected_to`.

**Parameters:**
- `query` (string, required) — Search words as typed into Media Expert's search box (Polish or brand/model names, e.g. 'iphone 17', 'odkurzacz dyson').
- `price_min` (integer, optional) — Lowest price in whole PLN (złoty, not grosze). Media Expert applies the price range to the price after an active promo code (the `filter_price` of each row), so a product shelf-priced above the range can appear when its code price is inside it.
- `price_max` (integer, optional) — Highest price in whole PLN, applied like price_min (to the price after an active promo code).
- `only_discounted` (boolean, optional, default false) — Only products currently on promotion (the site's own 'Promocje' switch).
- `sort` (enum, optional, default "relevance") — Result order. Only the orders that measurably change the result are offered. [one of: relevance, price_asc, price_desc, rating_desc]
- `page` (integer, optional, default 1) — Results page, 1-based. The source pages at most 100 pages deep; a page past the end returns no rows with page_clamped true.
- `limit` (integer, optional, default 30) — Products per page: 5, 10, 15, 20, 30 or 50 — the page sizes Media Expert's search accepts (any other value is silently answered with 30, so it is refused here).

**Returns:** results[]{product_id, offer_id, parent_id, erp_id, ean, model, brand, title, url, image, currency (PLN), price (shelf price), price_net, was_price (crossed-out), discount_amount, discount_percent, omnibus_lowest_30d_price (EU Omnibus: lowest price of the last 30 days), code_price, promo_code, promo_valid_from, promo_valid_to, promo_active, promo_discount[]{type, value}, hot_deal, app_price, app_promo_code, app_promo_valid_to, app_promo_active, member_price (club), filter_price, seller{type: retailer|marketplace, id, name, url, min_shipping_price, delivery_info, rating_count, recommended_percent}, availability{status, label, description, available_in_store, stock_online, stock_store, stock_capped}, rating, review_count, rating_scale, category{id, name, url}, category_ids[], outlet, refurbished} + total, total_reachable, pages, page, limit, has_more, page_clamped, search_mode (keyword | category_redirect | product_redirect), redirected_to{url, category_id | product_id}, query

**Example request body:**
```json
{
  "query": "iphone 17",
  "limit": 10
}
```

### POST https://api.reefapi.com/mediaexpert/v1/category — 2 credits
List one Media Expert category (e.g. washing machines, smartphones) with the same price, discount and sort options and the same rows as search. Give the category id or the category URL from mediaexpert.pl. An id that is not a real category is refused (Media Expert itself would answer it with the whole 2.2-million-product catalogue).

**Parameters:**
- `category_id` (integer, optional) — Media Expert category id (e.g. 13720 = Pralki, washing machines). Either category_id or url is required.
- `url` (string, optional) — A mediaexpert.pl category URL; resolved to its category id. Filter segments in the URL are not applied — use the parameters. Either category_id or url is required.
- `price_min` (integer, optional) — Lowest price in whole PLN (złoty, not grosze). Media Expert applies the price range to the price after an active promo code (the `filter_price` of each row), so a product shelf-priced above the range can appear when its code price is inside it.
- `price_max` (integer, optional) — Highest price in whole PLN, applied like price_min (to the price after an active promo code).
- `only_discounted` (boolean, optional, default false) — Only products currently on promotion (the site's own 'Promocje' switch).
- `sort` (enum, optional, default "relevance") — Result order. Only the orders that measurably change the result are offered. [one of: relevance, price_asc, price_desc, rating_desc]
- `page` (integer, optional, default 1) — Results page, 1-based. The source pages at most 100 pages deep; a page past the end returns no rows with page_clamped true.
- `limit` (integer, optional, default 30) — Products per page, 1-50 (the site itself shows 30).

**Returns:** results[]{product_id, offer_id, parent_id, erp_id, ean, model, brand, title, url, image, currency (PLN), price (shelf price), price_net, was_price (crossed-out), discount_amount, discount_percent, omnibus_lowest_30d_price (EU Omnibus: lowest price of the last 30 days), code_price, promo_code, promo_valid_from, promo_valid_to, promo_active, promo_discount[]{type, value}, hot_deal, app_price, app_promo_code, app_promo_valid_to, app_promo_active, member_price (club), filter_price, seller{type: retailer|marketplace, id, name, url, min_shipping_price, delivery_info, rating_count, recommended_percent}, availability{status, label, description, available_in_store, stock_online, stock_store, stock_capped}, rating, review_count, rating_scale, category{id, name, url}, category_ids[], outlet, refurbished} + total, total_reachable, pages, page, limit, has_more, page_clamped, category{id, url}

**Example request body:**
```json
{
  "category_id": 13720,
  "sort": "price_asc",
  "limit": 10
}
```

### POST https://api.reefapi.com/mediaexpert/v1/product — 1 credit
The full Media Expert product record by product id, URL or erp id: every price type (shelf, crossed-out, Omnibus lowest-30-day, promo code with dates, app, club), EAN, model, brand, seller, online and store stock, store pickup, delivery options, instalment offer when published, grouped specifications, all images, breadcrumb, rating and review count. The long marketing description is a separate action (`description`) because Media Expert ships it with embedded images (up to 1.8 MB).

**Parameters:**
- `product_id` (string, optional) — Media Expert product id exactly as a search row's `product_id` returns it (e.g. 7872945), or a mediaexpert.pl product URL. Use erp_id instead for the shop's item number (the 'Kod produktu' / ld+json productID). One of product_id, url, erp_id.
- `url` (string, optional) — A mediaexpert.pl product page URL.
- `erp_id` (string, optional) — Media Expert item number ('Kod produktu', the productID/sku in the page's structured data, e.g. 2083775).

**Returns:** product{product_id, offer_id, parent_id, erp_id, ean, model, brand, title, url, image, currency (PLN), price (shelf price), price_net, was_price (crossed-out), discount_amount, discount_percent, omnibus_lowest_30d_price (EU Omnibus: lowest price of the last 30 days), code_price, promo_code, promo_valid_from, promo_valid_to, promo_active, promo_discount[]{type, value}, hot_deal, app_price, app_promo_code, app_promo_valid_to, app_promo_active, member_price (club), filter_price, seller{type: retailer|marketplace, id, name, url, min_shipping_price, delivery_info, rating_count, recommended_percent}, availability{status, label, description, available_in_store, stock_online, stock_store, stock_capped}, rating, review_count, rating_scale, category{id, name, url}, category_ids[], outlet, refurbished, images[], specs[]{group, attributes{name: value}}, breadcrumb[]{id, name, url}, installment, bank_installment_offer, delivery_options[]{name, price}, flags[]}

**Example request body:**
```json
{
  "product_id": 7872945
}
```

### POST https://api.reefapi.com/mediaexpert/v1/description — 3 credits
The long product description Media Expert shows under 'Opis', as plain text (HTML and the embedded images removed), by product id, URL or erp id. Separate from `product` because the source sends it with base64 images inside (measured up to 1.8 MB per product).

**Parameters:**
- `product_id` (string, optional) — Media Expert product id exactly as a search row's `product_id` returns it (e.g. 7872945), or a mediaexpert.pl product URL. Use erp_id instead for the shop's item number (the 'Kod produktu' / ld+json productID). One of product_id, url, erp_id.
- `url` (string, optional) — A mediaexpert.pl product page URL.
- `erp_id` (string, optional) — Media Expert item number ('Kod produktu', the productID/sku in the page's structured data, e.g. 2083775).

**Returns:** product_id, offer_id, title, url, description (plain text), description_chars, embedded_images (count of images inlined in the source HTML)

**Example request body:**
```json
{
  "product_id": 7872945
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=mediaexpert
- Human docs page: https://reefapi.com/docs/mediaexpert
- Overview page: https://reefapi.com/mediaexpert-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
