# Skroutz API scraper — Greek price comparison: search products, read the full product record, and get EVERY Greek merchant's offer (price, shipping, shop rating, delivery date, stock) for one product on skroutz.gr. Prices in EUR. No account, no browser.

> Search skroutz.gr by keyword and get the matching products: Skroutz product id, title, image, the price skroutz prints on the card (the offer it FEATURES, which is not always the cheapest one — measured 120,00 € on a card whose cheapest merchant offer was 108,99 €; null when the card shows a variant range instead, with the endpoints in price_from/price_to), the customer rating and review count, the category and skroutz's own key-spec summary. Use the returned `product_id` with `product/offers` to get every Greek shop's price for that product.
> ReefAPI engine `skroutz` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/skroutz/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 or blocked calls are free.
- **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, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /skroutz/v1/search — 1 credit
Search skroutz.gr by keyword and get the matching products: Skroutz product id, title, image, the price skroutz prints on the card (the offer it FEATURES, which is not always the cheapest one — measured 120,00 € on a card whose cheapest merchant offer was 108,99 €; null when the card shows a variant range instead, with the endpoints in price_from/price_to), the customer rating and review count, the category and skroutz's own key-spec summary. Use the returned `product_id` with `product/offers` to get every Greek shop's price for that product.

**Parameters:**
- `query` (string, required) — What to look for on skroutz.gr. Greek keywords match best, but brand and model names ('teka gfh 73', 'iphone 15 128gb') work directly. Skroutz often answers a broad keyword with one of its own category or brand pages — `search_mode` and `resolved_url` tell you when that happened.
- `page` (integer, optional, default 1) — Result page, 1-BASED. Skroutz returns 56-60 products per page and the exact number varies, so read `count` rather than assuming a page size; `total_results` tells you how many products exist.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** results[]{product_id, title, url, image, price (number — the price skroutz shows on the card, i.e. the offer it features; NOT guaranteed to be the cheapest merchant, and null when the card shows a variant range instead), price_display (exactly what the card printed), price_from, price_to (the endpoints when skroutz printed a variant range), variant_family (true when this card covers a family of sibling products), price_before_discount, currency=EUR, rating (number), review_count, rating_scale (null — skroutz publishes no rating maximum anywhere), category, category_url, key_specs, delivery, promoted}, count, total_results, duplicate_cards_dropped (sponsored cards repeated inside the organic grid), search_mode ('keyword' | 'resolved' when skroutz answered the keyword with one of its own category/brand pages), resolved_title, resolved_url, query (meta.pagination for paging)

**Example request body:**
```json
{
  "query": "teka gfh 73"
}
```

### POST /skroutz/v1/product/detail — 1 credit
The full Skroutz product record by `product_id` (or product URL): title, brand, description, image gallery, manufacturer part number, model and colour, the price skroutz features on the page, the customer rating with its review count and per-star breakdown, the category, and the complete technical specification grouped exactly as skroutz groups it.

**Parameters:**
- `product_id` (string, required) — Skroutz product (SKU) id — the number in the product URL (https://www.skroutz.gr/s/809/…html → 809). A full product URL is also accepted. Every `search` row returns it as `product_id`.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** product{product_id, title, brand, url, description (skroutz's own product text, null when it has none), images[], mpn, model, color, price (number — the offer skroutz FEATURES on the product page; it is one of the real merchant prices but not necessarily the cheapest), price_display, price_min (null — the product page publishes no band, call product/offers), price_max (null — same reason), offer_count (null — same reason), currency=EUR, availability, condition, rating (number), review_count, rating_scale (null — skroutz publishes no maximum), rating_breakdown{'1'..'5': count}, category, category_url, specs[]{group, attributes{name: value}}}

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

### POST /skroutz/v1/product/offers — 1 credit
Every Greek merchant offer for one product — the price comparison itself, in a single request. For the given `product_id` you get one row per shop: the shop with its Skroutz id, name, storefront link, star rating and how many reviews it rests on, its town, the price (numeric and formatted), the price before a running coupon and the discount, the shipping fee and the total, the promised delivery date, declared stock, and the merchant's own listing title. Rows are ordered cheapest first.

**Parameters:**
- `product_id` (string, required) — Skroutz product (SKU) id — the number in the product URL (https://www.skroutz.gr/s/809/…html → 809). A full product URL is also accepted. Every `search` row returns it as `product_id`.
- `sort` (enum, optional, default "price") — Order of the merchant rows. Only the orderings skroutz.gr actually honours are accepted; anything else is rejected rather than silently ignored. (The site's third ordering, 'nearest shop', needs a shopper location and is not offered here.) The response is additionally sorted cheapest-first by `price`. [one of: price, final_price]
- `include_product` (boolean, optional, default false) — false (default) keeps this a single 105 KB request and returns the product block skroutz publishes on the merchant table itself (id, brand, category, price band, offer count) with `title` null. true fetches the product page as well so `product.title`, images, rating and specs are filled in — one extra request, ~200 KB.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** product{product_id, title (null unless include_product=true), brand, category, url, price_min, price_max (the REAL band, computed from the merchant rows below), price_min_display, price_max_display, currency=EUR, offer_count, offer_count_published (skroutz's own '14 Καταστήματα' figure), rating, review_count, rating_scale (null)} + offers[]{position, offer_id, seller{id, name, url, rating (null for a shop skroutz has not rated), rating_count, location, store_pickup, official_reseller}, price (number — the price AFTER any running coupon), price_display, price_before_discount, discount, currency=EUR, shipping_cost, shipping_display, free_shipping, total_price, delivery_estimate, stock, stock_quantity (null when the shop declares a band like '5+'), offer_url, offer_title, brand, promoted, product_id} + count, cheapest, most_expensive

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

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