Czech and Slovak price comparison as JSON, one row per merchant
Heureka API returns live Heureka data as clean JSON for heureka The primary endpoint, search, returns matching records including row type, the only kind with a usable product address shop offer a single merchants listing with no product page, so product and offer count are null promoted a promoted product whose link is a signed clickthrough, so it has a price and a score and an offer count but no address heureka publishes.
3 active endpoints, on 1 and 2 credit tiers.
- POST/heureka/v1/search
- POST/heureka/v1/product/detail
- POST/heureka/v1/product/offers
What Heureka endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Heureka API
3 of 3 endpoints, ready to run
Search Heureka by keyword and get the matching products: Heureka product id and address, title, image, the PRICE BAND across all shops (both ends when Heureka prints both — see `price_kind`), how many shops sell it, the customer score and review count, the category, and how many colour/size variants the card lists. Feed the returned `product` or `url` straight into `product/offers` or `product/detail` to get every shop's price for that product. Check `row_type` first: only rows with row_type 'product' carry an address, and the other three kinds return `product` as null rather than a handle that would not work.
{ "ok": true, "data": { "results": [ { "row_type": "product", "product_id": "1187320213", "product_uuid": "b12174f4-79b4-576a-8106-bb8d8d82af0a", "product": "mobilni-telefony/apple-iphone-15-128gb-black", "title": "Apple iPhone 15", "url": "https://mobilni-telefony.heureka.cz/apple-iphone-15-128gb-black/", "image": "https://img-cdn.heureka.group/v1/aeca7bf1-7b23-4b99-aee3-213bdf1a3ffa.jpg?width=400&height=400", "offer_count": 33, "offer_count_display": "v 33 obchodech", "rating_percent": 93, "rating": 4.65, "rating_scale": "0-100 (Heureka's own scale); `rating` is the same score as 0-5 stars", "review_count": 363, "category": "Mobilní telefony", "category_url": "https://mobilni-telefony.heureka.cz/", "variant_count_listed": 4, "badges": [ "Top 12" ], "price_min": 14499, "price_max": 32849, "price_min_display": "14 499 Kč", "price_max_display": "32 849 Kč", "price_display": "14 499 – 32 849 Kč", "price_kind": "band", "price_is_single_offer": false, "currency": "CZK" }, { "row_type": "product", "product_id": "1302850615", "product_uuid": "9e1f8508-0a86-585a-b689-68df03dc3d46", "product": "mobilni-telefony/apple-iphone-16-128gb-black", "title": "Apple iPhone 16", "url": "https://mobilni-telefony.heureka.cz/apple-iphone-16-128gb-black/", "image": "https://img-cdn.heureka.group/v1/983998ab-5cdb-4393-9397-e018c58c804e.jpg?width=400&height=400", "offer_count": 42, "offer_count_display": "v 42 obchodech", "rating_percent": 96, "rating": 4.8, "rating_scale": "0-100 (Heureka's own scale); `rating` is the same score as 0-5 stars", "review_count": 242, "category": "Mobilní telefony", "category_url": "https://mobilni-telefony.heureka.cz/", "variant_count_listed": 5, "badges": [ "Top 22" ], "price_min": 17931, "price_max": 28331, "price_min_display": "17 931 Kč", "price_max_display": "28 331 Kč", "price_display": "17 931 – 28 331 Kč", "price_kind": "band", "price_is_single_offer": false, "currency": "CZK" }, { "row_type": "product", "product_id": "1439669667", "product_uuid": "d802b814-ede0-51e1-831d-e4ae6451760b", "product": "mobilni-telefony/apple-iphone-17e-256gb-black", "title": "Apple iPhone 17e", "url": "https://mobilni-telefony.heureka.cz/apple-iphone-17e-256gb-black/", "image": "https://img-cdn.heureka.group/v1/a9032e04-5893-42bf-b93e-831d02c979b8.jpg?width=400&height=400", "offer_count": 34, "offer_count_display": "v 34 obchodech", "rating_percent": 92, "rating": 4.6, "rating_scale": "0-100 (Heureka's own scale); `rating` is the same score as 0-5 stars", "review_count": 73, "category": "Mobilní telefony", "category_url": "https://mobilni-telefony.heureka.cz/", "variant_count_listed": 3, "badges": [ "Top 36" ], "price_min": 16768, "price_max": 32390, "price_min_display": "16 768 Kč", "price_max_display": "32 390 Kč", "price_display": "16 768 – 32 390 Kč", "price_kind": "band", "price_is_single_offer": false, "currency": "CZK" } ], "count": 24, "query_heading": "Výsledky na dotaz: iphone 15", "product_count": 23, "shop_offer_count": 1, "unreadable_tiles": 0, "last_page": 834, "total_results": null, "market": "cz", "currency": "CZK", "page": 1, "sort": "relevance", "query": "iphone 15" } }
How the Heureka API works
Heureka is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 321 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Search, then pull the offers, because the offer list is the comparison
A price comparison site is only worth reading at the offer level. The search grid gives you a band across shops; the offers call gives you the shops themselves, in Heureka's own order, with the score each one carries.
{"query": "kavovar"}1 credit for twenty-four tiles. Each product row carries the price band across all shops, how many shops sell it, the customer score and the review count. Check row_type first: only a product row carries a handle you can feed onward.
{"product": "<slug from related_categories>"}1 credit. The product record: specs, images, the category breadcrumb, the aggregate score, and Heureka's own published count of how many shops list it.
{"product": "<same handle>"}2 credits, and this is the comparison itself. One row per merchant with the shop name, its Heureka score and how many ratings that rests on, the price, the stock line, the delivery line and whether delivery is free, plus the merchant's own listing title and a working click-through.
{"query": "kavovar", "market": "sk"}1 credit. The same call against the Slovak site, which is a different catalogue at different prices in euros rather than a translation of the Czech one.
A shortlist with a real price band, then every shop's offer for the one you picked, ordered the way Heureka orders it.
curl -X POST https://api.reefapi.com/heureka/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"iphone 15"}'{
"ok": true,
"data": { … },
"meta": {
"api": "heureka",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Two countries, two currencies, and a grid that mixes four different kinds of tile
Measured 2026-09-30 against the live gateway across five keyword searches on both markets, 120 grid rows and a full offer list. Three of these lines go against us.
The market parameter picks between heureka.cz and heureka.sk. These are not translations of each other: the product sets differ, the shops differ, and prices are quoted in the local currency, CZK on the Czech side and EUR on the Slovak one. Czech prices are written with a space for thousands and no decimals; Slovak ones carry a comma decimal. Both are parsed against the source's own printed figure rather than assumed.
Heureka mixes four kinds of tile into one grid and only one of them has an address you can use. A product row is a real product page with a shop comparison behind it and carries a usable handle. A promoted row is a real product whose link is a signed click-through, so it has a price, a score and an offer count but no address Heureka publishes. A shop_offer is one merchant's listing with no product page at all. An article is an editorial buying guide and not an offer. row_type says which, and the three addressless kinds return a null handle rather than one that would fail on the next call.
price_kind says which: band when both ends are real, from when Heureka published only a floor and the maximum is genuinely null, and exact when a single offer makes the two the same number. Across 120 rows there was not one minimum published without a maximum outside the from case, and not one band whose maximum fell below its minimum. A comparison that copies the minimum into both ends reports a false certainty; this one does not.
Heureka repeats its promoted offers above the list, so the same merchant can appear twice on the page. Offers are keyed on the merchant's own exit-click id, which on a measured product turned fourteen page rows into ten offers, exactly the ten Heureka's own published offer count claims, with the ten prices matching one for one.
Five of twenty-one merchants on a measured offer list carried a review count but no Heureka rating, because Heureka has not scored them. Those come back with the rating null and the review count intact, rather than a zero that would sort them below every scored shop as if they were bad.
On a cheapest-first sort, twenty-three of twenty-four tiles were single-shop offers rather than product pages. They are returned labelled rather than dropped, because dropping them would answer cheapest-first with one row and silently change the question that was asked.
heureka.cz refuses every content path from every vantage point tried, including robots.txt, and it refuses identically across sixteen different client profiles and three network classes. A blanket refusal like that says nothing about any single axis, so the identity pool was not re-tuned and the wall was answered instead. The practical cost to you is a cold first call of roughly twenty seconds per market, after which calls run in one to three seconds for the next hour.
Negative cases were checked rather than assumed. A missing query, a nonsense product handle, an unsupported market and an unknown action each return their own code, and a search with no matches returns zero rows honestly instead of an error.
Search and product detail are 1 credit each. The offer list is 2, because it is one upstream request but it is the whole comparison, and it is the reason to use this source at all.
What people build with Heureka
The jobs this data is most often used for.
endpoints
credits per call
Pricing and assortment teams use Heureka to search Heureka by keyword and get the matching products.
Brand-protection teams use Heureka to get the full Heureka product record for one product address.
Retail analysts use Heureka to get every shop offer Heureka lists for one product.
What Heureka data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 321 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/heureka/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"iphone 15"}'import requests
r = requests.post(
"https://api.reefapi.com/heureka/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "iphone 15"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Heureka.
Get a free key →What is the Heureka API?▾
Heureka API is a ReefAPI endpoint group for heureka It returns live JSON through POST requests under /heureka/v1.
Is the Heureka API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Heureka calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Heureka login or account?▾
No login to Heureka 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 Heureka 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 Heureka API use?▾
Heureka actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Heureka from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call heureka actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Heureka API a Heureka scraper?▾
It is the managed alternative to a DIY Heureka scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same heureka back as clean JSON.
Why does my Heureka scraper keep getting blocked?▾
Most Heureka scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.
26 More APIs APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Heureka, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 320 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-30.