Empik API & Scraper
The Empik API returns Poland's largest books and media retailer as clean JSON, in six actions: search, product/detail, product/offers, products/batch, product/reviews and product/variants.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
product/offers is why the engine exists - one call returns every seller Empik lists for one product, each row carrying the shop name, its Empik seller id, its shop page, its star rating and how many ratings it rests on, the super-seller flag, the price in PLN, the list price where one exists, the item condition and the declared dispatch window. Empik is both a retailer and a marketplace, so its own first-party offer comes back in the same list as the independent shops, marked is_empik. Verification on 2026-09-23 covered 12 products across 6 Empik categories and 408 offers: a named seller was present on 408 of 408, and the search-row price matched the product page's own price on 12 of 12. Offer depth ranged from 2 to 83 sellers on one product. Books additionally return author, publisher, series, page count, cover type and ISBN-13. Prices are PLN. No Empik account and no browser - one ReefAPI key and the standard envelope.
Two prices, two meanings - and second-hand sits in the same list
An Empik offer can carry a list price and a selling price, and they are different numbers. On the 12 products measured on 2026-09-23 the two differed on 5, by up to 45%. They are returned as two named fields rather than reconciled into one, and the same list mixes new and used stock, so condition is on every row.
| What you read | What it means | Measured |
|---|---|---|
| price_pln | what a shopper actually pays for that offer today | Matched the price on Empik's own product page on 12 of 12 measured products |
| list_price_pln | the higher pre-discount figure, and null when there is no discount | Present on 5 of 12. On one Sapkowski title it was 74.90 PLN against a 40.99 PLN selling price |
| discount_pct | computed here from those two numbers, because Empik's own percentage field is empty | Empik returned no percentage of its own on any of the 408 offers measured |
| membership_price | true when that particular discount needs an Empik membership rather than being open to everyone | False on all 408 offers measured - the flag exists so a membership price can never be mistaken for an open one |
| condition | NEW, or one of Empik's used and refurbished grades, or damaged packaging | 20 of the 408 offers were second-hand. On one iPhone the cheapest offer was a used unit at 2485 PLN against 3459 PLN new |
| seller.is_empik | whether the row is Empik's own stock or an independent shop | Empik pins its own offer first in its list regardless of price, so the cheapest seller is named separately |
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/empik/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "wiedźmin"
}
}{
"ok": true,
"meta": {
"api": "empik",
"endpoint": "search",
"mode": "live",
"latency_ms": 1756.9,
"record_count": 60,
"bytes": 782873,
"cache_hit": false,
"pagination": {
"page": 1,
"page_size": 60,
"has_more": true,
"total": 1804,
"last_page": 31
},
"promoted_count": 0,
"charged_credits": 3,
"version": "0.1.0"
},
"data": {
"results": [
{
"product_id": "p1102239921",
"title": "Ostatnie życzenie. Wiedźmin. Tom 1",
"url": "https://www.empik.com/ostatnie-zyczenie-wiedzmin-tom-1-sapkowski-andrzej,p1102239921,ksiazka-p",
"image": "https://ecsmedia.pl/c/ostatnie-zyczenie-wiedzmin-tom-1-p-iext231426489.jpg",
"brand": null,
"price_pln": 40.99,
"list_price_pln": null,
"discount_pct": null,
"currency": "PLN",
"seller": {
"id": "0",
"name": "Empik",
"is_empik": true
},
"category": "Książki/Fantastyka, horror/Fantasy",
"category_path": [
"Książki",
"Fantastyka, horror",
"Fantasy"
],
"delivery": "Przewidywana wysyłka w 1 dzień rob.",
"rating": 4.9,
"promoted": false
},
{
"product_id": "p1102239806",
"title": "Miecz przeznaczenia. Wiedźmin. Tom 2",
"url": "https://www.empik.com/miecz-przeznaczenia-wiedzmin-tom-2-sapkowski-andrzej,p1102239806,ksiazka-p",
"image": "https://ecsmedia.pl/c/miecz-przeznaczenia-wiedzmin-tom-2-p-iext231379373.jpg",
"brand": null,
"price_pln": 40.99,
"list_price_pln": null,
"discount_pct": null,
"currency": "PLN",
"seller": {
"id": "0",
"name": "Empik",
"is_empik": true
},
"category": "Książki/Fantastyka, horror/Fantasy",
"category_path": [
"Książki",
"Fantastyka, horror",
"Fantasy"
],
"delivery": "Przewidywana wysyłka w 1 dzień rob.",
"rating": 4.9,
"promoted": false
},
{
"product_id": "p1103074330",
"title": "Czas pogardy. Wiedźmin. Tom 4",
"url": "https://www.empik.com/czas-pogardy-wiedzmin-tom-4-sapkowski-andrzej,p1103074330,ksiazka-p",
"image": "https://ecsmedia.pl/c/czas-pogardy-wiedzmin-tom-4-p-iext202438809.jpg",
"brand": null,
"price_pln": 40.99,
"list_price_pln": null,
"discount_pct": null,
"currency": "PLN",
"seller": {
"id": "0",
"name": "Empik",
"is_empik": true
},
"category": "Książki/Fantastyka, horror/Fantasy",
"category_path": [
"Książki",
"Fantastyka, horror",
"Fantasy"
],
"delivery": "Przewidywana wysyłka w 1 dzień rob.",
"rating": 4.9,
"promoted": false
}
],
"count": 60,
"promoted_count": 0,
"total_results": 1804,
"page": 1,
"sort": "relevance",
"query": "wiedźmin"
}
}What the Empik API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search empik.com by keyword and get the matching products: Empik product id, title, brand, image, the price actually charged, the list price and discount, the marketplace seller holding the buybox, category path, rating and delivery line. Filter by brand, seller, price band, condition, free delivery or (for books) author. Use the returned `product_id` with `product/offers` to get every seller's price for that product. | Pricing teams call search to search empik.com by keyword and get the matching products. | query, page, sort, brand, seller_id, ... |
| product/detail | The full Empik product record by `product_id` (or product URL): title, category breadcrumb, description, image gallery, rating, format/variant, the complete attribute table exactly as Empik groups it, and the creator block — author and publisher for books, performer and label for music, brand and producer for goods. For books it also returns ISBN-13 and EAN. | Marketplace operators call product/detail to get the full Empik product record by `product_id` (or product URL). | product_id, max_rotations |
| product/offers | Every seller offer for one product — the price comparison itself. One row per merchant: seller name, Empik shop id, shop page, super-seller flag, seller rating and how many ratings it rests on, the price actually charged and the list price, whether the discount needs an Empik membership, the item condition (new, used as-new/good/acceptable, damaged packaging), declared dispatch window and the delivery line. Rows keep Empik's own ordering; `cheapest` is computed separately because that ordering is NOT purely by price. | Catalog enrichment teams call product/offers to get every seller offer for one product. | product_id, max_rotations |
| products/batch | Up to 30 products in ONE request — id, title, url, category, rating, cover, creators and the current buybox offer (price, list price, seller) for each. This is the cheap way to refresh a watchlist: 30 products for the price of one call instead of 30 separate `product/detail` calls. | Retail analysts call products/batch to get up to 30 products in ONE request. | product_ids, max_rotations |
| product/reviews | Customer reviews for one product, 30 per page: author name, date, the 1-5 score, title and body, how many readers found it useful, whether Empik marks the purchase as verified. Also returns the full star histogram (how many votes at each score) and Empik's own AI summary of the reviews with its keyword list. | Pricing teams call product/reviews to get customer reviews for one product, 30 per page. | product_id, page, sort, max_rotations |
| product/variants | The other editions of the same title — for a book: paperback, hardcover, ebook EPUB/MOBI, audiobook, foreign-language printing; for music: the other formats. Each variant returns its own resolvable Empik product id and URL, so you can feed it straight back into `product/offers`. | Marketplace operators call product/variants to get the other editions of the same title. | product_id, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/empik/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"wiedźmin"}'import requests
r = requests.post(
"https://api.reefapi.com/empik/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "wiedźmin"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/empik/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "wiedźmin"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.empik.search with {"query":"wiedźmin"}.Who uses this API and why
- Price-intelligence teams call product/offers to watch every Polish seller's price on one product, new and second-hand, in a single request.
- Book and media retailers use product/detail to pull author, publisher and ISBN-13 for catalogue matching against Poland's largest bookseller.
- Repricing tools use products/batch to refresh up to 30 watched products in one call instead of 30 separate lookups.
- Marketplace sellers use the seller_id filter on search to see a competitor's full Empik range and how it is priced.
- Review and product teams use product/reviews for the full star histogram and Empik's own AI summary of what buyers say.
Questions developers ask before integrating
How many sellers does one Empik product actually return?
Between 2 and 83 across the 12 products measured on 2026-09-23, totalling 408 offers. A Sapkowski paperback returned 21 sellers, an iPhone 16 returned 17, and a LEGO set returned 83. Every one of the 408 carried a seller name and a seller id - there are no anonymous rows to filter out.
Does this cover second-hand stock, or only new?
Both, in the same call. Empik's marketplace carries a real used tier and it comes back on the same offer list with a condition field: new, used as-new, used good, used acceptable, refurbished grades, or damaged packaging. 20 of the 408 measured offers were not new. You can also filter a search down to used stock - a search for iphone narrowed from 212,021 products to 265 on used-good.
Do I get ISBN and author for books?
Yes for books, and the engine is honest that it is books only. product/detail returns author, publisher, series, page count, cover type, language, edition year and an ISBN-13 derived from Empik's own EAN. Across six categories tested, that barcode was published on books and on none of the other five - so for a toy, a perfume or a vinyl record the ISBN and EAN fields come back null rather than guessed. Every category does return Empik's own internal index code.
Is the seller information included, or stripped out?
Included in full. Each offer carries the shop's display name, its numeric Empik seller id, its Empik shop page, its logo, its star rating and rating count, a super-seller flag and a foreign-seller flag. The seller id is the same value you can pass back into search to pull every product one shop lists - a search for iphone filtered to seller 3531 returned 40 products, all from that one shop.
How deep can I page through Empik search results?
60 products per page, up to page 80 - 4,800 products - however large the reported match count is. Past that Empik re-serves its first page, so this endpoint refuses the call and names the real last page instead of handing back duplicates you would not notice. meta.pagination.last_page tells you where your query actually stops, and narrowing with brand, a price band or condition reaches the rest of the catalogue.
Why does a search for a phone return hundreds of thousands of products?
Because Empik matches loosely and its marketplace is full of accessories. A search for iphone reports 212,021 matches, of which 163,200 are under 50 PLN - cases, cables and screen protectors. That is the source's own count, reported as-is rather than trimmed. Use price_min, brand or condition to get to the actual phones: the same query with a 2000-5000 PLN band leaves 293.
Are sponsored listings mixed into the results?
Empik injects sponsored tiles into its own result grid, so they are returned rather than silently dropped - but every row carries a promoted flag and each response reports promoted_count. This matters if you are averaging prices: the same sponsored ids reappear on every page of a deep crawl, so filtering on promoted is how you avoid counting them repeatedly.
What does Empik not publish?
Per-offer stock counts were empty on all 408 offers measured, so stock_level is null rather than a made-up zero. There is no price history, no barcode outside books, and no link into the seller's own website - only their Empik shop page. Delivery comes back as Empik's own wording rather than a parsed number. Search rows also carry no list price: the grid prints only a rounded discount percentage, and that percentage was missing on 8 of 18 products whose product page showed a genuine discount, so product/detail is the authority on pricing.
What is the Empik API?
Empik API is a ReefAPI endpoint group for poland's biggest books and media retailer, plus every marketplace seller's price. It returns live JSON through POST requests under /empik/v1.
Is the Empik API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Empik calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Empik login or account?
No login to Empik is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Empik data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Empik API use?
Empik actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Empik from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call empik actions with the same key, credit pool and JSON envelope used by normal REST requests.