# Rohlik API — online grocery prices from rohlik.cz, knuspr.de, gurkerl.at, kifli.hu and sezamo.ro: price, regular price, unit price, Xtra member price kept apart, multi-buy deals, clearance offers, stock, brand, origin, EAN, ingredients, allergens and nutrition

> Search one shop of the Rohlik group (CZ / DE / AT / HU / RO) like its search box: price a non-member pays, regular price, unit price, the Xtra member price kept apart, multi-buy and mix-and-match deals, same-day-delivery discount, clearance offer, stock, brand and origin per product.
> ReefAPI engine `rohlik` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/rohlik/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/rohlik/v1/search — 3 credits
Search one shop of the Rohlik group (CZ / DE / AT / HU / RO) like its search box: price a non-member pays, regular price, unit price, the Xtra member price kept apart, multi-buy and mix-and-match deals, same-day-delivery discount, clearance offer, stock, brand and origin per product.

**Parameters:**
- `query` (string, required) — What to search for, as typed in the shop's search box, in the shop's language (mléko, Milch, tej, lapte).
- `country` (enum, optional, default "cz") — Which shop of the group. Product and category ids belong to one shop. [one of: cz, de, at, hu, ro]
- `page` (integer, optional, default 1) — Page number, from 1. Past the last page the answer is an empty page.
- `page_size` (integer, optional, default 24) — Products per page, 1-60 (default 24).
- `sort` (enum, optional, default "relevance") — Order of the results (the shop's four sorts; they order by the price the shop displays, which can be a member price). [one of: relevance, price_asc, price_desc, unit_price_asc]
- `brand` (string, optional) — Only this brand, as the brand_slug of a row gives it (e.g. miil, meggle, olma). An unknown brand answers NOT_FOUND.
- `on_sale` (boolean, optional, default false) — Only products the shop lists under its 'Akce' (on sale) filter.

**Returns:** query, country, shop, total, page, page_size, returned, has_more, products[]{rank, product_id, title, brand, brand_slug, amount_text, package_amount, package_unit, unit, sold_by ('unit' | 'weight'), price_is_estimate, price, original_price, discount_pct, price_valid_till, unit_price (per `unit`), currency, display_price, display_price_is_member_price, member_price (Xtra / Premium), member_price_program, member_price_welcome_offer, same_day_delivery_price, multi_buy[]{kind ('multi_buy' | 'mix_and_match'), min_quantity, price_each, unit_price, label, bundle_id, valid_till, promotion_id}, clearance{price, reason, pieces_left, promotion_id}, promotions[]{promotion_id, type, kind, min_quantity, price, unit_price, original_price, valid_till, active, welcome_price, bundle_id, label, description, reason}, in_stock, availability, unavailability_reason, max_order_quantity, expected_replenishment, shelf_life{average_days, minimal_days, best_before}, warehouse_id, premium_only, country_of_origin[], country_of_origin_codes[], main_category_id, badges[], archived, image, url}

**Example request body:**
```json
{
  "query": "mléko",
  "country": "cz"
}
```

### POST https://api.reefapi.com/rohlik/v1/category — 3 credits
Every product of one category (department or aisle) of one shop, paged, with the same rows, sorts and filters as search.

**Parameters:**
- `category_id` (string, required) — Category id from the `categories` action or a row's main_category_id / a product's breadcrumbs (e.g. 300105001 Mléko a mléčné nápoje), or a /c300105001-… URL.
- `country` (enum, optional, default "cz") — Which shop of the group. Product and category ids belong to one shop. [one of: cz, de, at, hu, ro]
- `page` (integer, optional, default 1) — Page number, from 1. Past the last page the answer is an empty page.
- `page_size` (integer, optional, default 24) — Products per page, 1-60 (default 24).
- `sort` (enum, optional, default "relevance") — Order of the results (the shop's four sorts; they order by the price the shop displays, which can be a member price). [one of: relevance, price_asc, price_desc, unit_price_asc]
- `brand` (string, optional) — Only this brand, as the brand_slug of a row gives it (e.g. miil, meggle, olma). An unknown brand answers NOT_FOUND.
- `on_sale` (boolean, optional, default false) — Only products the shop lists under its 'Akce' (on sale) filter.

**Returns:** category_id, country, shop, total, page, page_size, returned, has_more, products[]{rank, product_id, title, brand, brand_slug, amount_text, package_amount, package_unit, unit, sold_by ('unit' | 'weight'), price_is_estimate, price, original_price, discount_pct, price_valid_till, unit_price (per `unit`), currency, display_price, display_price_is_member_price, member_price (Xtra / Premium), member_price_program, member_price_welcome_offer, same_day_delivery_price, multi_buy[]{kind ('multi_buy' | 'mix_and_match'), min_quantity, price_each, unit_price, label, bundle_id, valid_till, promotion_id}, clearance{price, reason, pieces_left, promotion_id}, promotions[]{promotion_id, type, kind, min_quantity, price, unit_price, original_price, valid_till, active, welcome_price, bundle_id, label, description, reason}, in_stock, availability, unavailability_reason, max_order_quantity, expected_replenishment, shelf_life{average_days, minimal_days, best_before}, warehouse_id, premium_only, country_of_origin[], country_of_origin_codes[], main_category_id, badges[], archived, image, url}

**Example request body:**
```json
{
  "category_id": "300105001",
  "country": "cz"
}
```

### POST https://api.reefapi.com/rohlik/v1/promotions — 3 credits
The shop's promotion shelves: `sales` = every product with a current price cut or deal (the shop's 'Cenové trháky'), `last_minute` = the near-expiry / damaged-pack clearance shelf ('Zachraň a ušetři'); optionally inside one category, for one brand.

**Parameters:**
- `country` (enum, optional, default "cz") — Which shop of the group. Product and category ids belong to one shop. [one of: cz, de, at, hu, ro]
- `kind` (enum, optional, default "sales") — Which promotion shelf. [one of: sales, last_minute]
- `category_id` (string, optional) — Category id from the `categories` action or a row's main_category_id / a product's breadcrumbs (e.g. 300105001 Mléko a mléčné nápoje), or a /c300105001-… URL.
- `page` (integer, optional, default 1) — Page number, from 1. Past the last page the answer is an empty page.
- `page_size` (integer, optional, default 24) — Products per page, 1-60 (default 24).
- `sort` (enum, optional, default "relevance") — Order of the results (the shop's four sorts; they order by the price the shop displays, which can be a member price). [one of: relevance, price_asc, price_desc, unit_price_asc]
- `brand` (string, optional) — Only this brand, as the brand_slug of a row gives it (e.g. miil, meggle, olma). An unknown brand answers NOT_FOUND.

**Returns:** kind, category_id, country, shop, total, page, page_size, returned, has_more, products[]{rank, product_id, title, brand, brand_slug, amount_text, package_amount, package_unit, unit, sold_by ('unit' | 'weight'), price_is_estimate, price, original_price, discount_pct, price_valid_till, unit_price (per `unit`), currency, display_price, display_price_is_member_price, member_price (Xtra / Premium), member_price_program, member_price_welcome_offer, same_day_delivery_price, multi_buy[]{kind ('multi_buy' | 'mix_and_match'), min_quantity, price_each, unit_price, label, bundle_id, valid_till, promotion_id}, clearance{price, reason, pieces_left, promotion_id}, promotions[]{promotion_id, type, kind, min_quantity, price, unit_price, original_price, valid_till, active, welcome_price, bundle_id, label, description, reason}, in_stock, availability, unavailability_reason, max_order_quantity, expected_replenishment, shelf_life{average_days, minimal_days, best_before}, warehouse_id, premium_only, country_of_origin[], country_of_origin_codes[], main_category_id, badges[], archived, image, url}

**Example request body:**
```json
{
  "country": "cz",
  "kind": "sales"
}
```

### POST https://api.reefapi.com/rohlik/v1/product — 2 credits
One product by the `product_id` a row returns: every price and deal (as search) plus EAN, description, ingredients, allergens, nutrition table per portion, shelf life, country of origin, breadcrumbs and images.

**Parameters:**
- `product_id` (string, required) — The `product_id` exactly as a row returns it (e.g. 1319937), or the product's URL on the shop.
- `country` (enum, optional, default "cz") — Which shop of the group. Product and category ids belong to one shop. [one of: cz, de, at, hu, ro]

**Returns:** country, shop, product{product_id, title, brand, brand_slug, ean, amount_text, package_amount, package_unit, unit, sold_by, price_is_estimate, price, original_price, discount_pct, price_valid_till, unit_price (per `unit`), currency, display_price, display_price_is_member_price, member_price (Xtra / Premium), member_price_program, member_price_welcome_offer, same_day_delivery_price, multi_buy[]{kind ('multi_buy' | 'mix_and_match'), min_quantity, price_each, unit_price, label, bundle_id, valid_till, promotion_id}, clearance{price, reason, pieces_left, promotion_id}, promotions[]{promotion_id, type, kind, min_quantity, price, unit_price, original_price, valid_till, active, welcome_price, bundle_id, label, description, reason}, in_stock, availability, unavailability_reason, max_order_quantity, shelf_life{…}, warehouse_id, premium_only, country_of_origin[], countries[], description, ingredients[]{title, type, ingredients[]}, ingredients_text, allergens[], allergens_may_contain[], nutrition[]{portion, values{energyKJ, energyKCal, fats, saturatedFats, carbohydrates, sugars, protein, salt, fiber: {amount, unit}}}, advice_for_safe_use, information[], breadcrumbs[]{category_id, name, level}, social_proof[], seller_id, main_category_id, badges[], images[], url}

**Example request body:**
```json
{
  "product_id": "1319937",
  "country": "cz"
}
```

### POST https://api.reefapi.com/rohlik/v1/categories — 1 credit
The shop's category tree: without `category_id` the top-level departments with their sub-category ids; with it, that category's sub-categories with names.

**Parameters:**
- `country` (enum, optional, default "cz") — Which shop of the group. Product and category ids belong to one shop. [one of: cz, de, at, hu, ro]
- `category_id` (string, optional) — Category id from the `categories` action or a row's main_category_id / a product's breadcrumbs (e.g. 300105001 Mléko a mléčné nápoje), or a /c300105001-… URL.

**Returns:** country, shop, category_id, returned, categories[]{category_id, name, slug, url, subcategory_ids[]}

**Example request body:**
```json
{
  "country": "cz"
}
```

## 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=rohlik
- Human docs page: https://reefapi.com/docs/rohlik
- Overview page: https://reefapi.com/rohlik-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
