# Shopflix.gr API — Greek marketplace data scraper: product search, category browsing, full product detail with specs, every merchant's price and stock for one product, customer reviews and the category tree from shopflix.gr — no API key, no login

> Search Shopflix by keyword. Returns the product grid with the Shopflix price, the cheapest and dearest merchant price for that product, how many merchants carry it, the category path, rating and the sku you feed to `product` and `offers`. 🔴 Shopflix cannot be searched by barcode: its search index covers product name, sku, merchant name and spec values only — an EAN returns 0 rows. Rows do carry a `gtin13` when one can be recovered from the product's own images (about 30% of rows, far higher in toys and TVs), so you can join results onto an EAN catalogue.
> ReefAPI engine `shopflix` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/shopflix/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/shopflix/v1/search — 2 credits
Search Shopflix by keyword. Returns the product grid with the Shopflix price, the cheapest and dearest merchant price for that product, how many merchants carry it, the category path, rating and the sku you feed to `product` and `offers`. 🔴 Shopflix cannot be searched by barcode: its search index covers product name, sku, merchant name and spec values only — an EAN returns 0 rows. Rows do carry a `gtin13` when one can be recovered from the product's own images (about 30% of rows, far higher in toys and TVs), so you can join results onto an EAN catalogue.

**Parameters:**
- `query` (string, required) — Words to search for, Greek or English. Greek terms match far more of this catalogue than English ones. A barcode/EAN is NOT a valid query here — the source does not index it.
- `category_id` (string, optional) — Narrow to one category. Numeric id (24 = Smartphones) or a shopflix.gr /c/<id>/<slug> URL. Get ids from `categories`.
- `brand` (string, optional) — Exact manufacturer name as Shopflix spells it (e.g. Apple, Samsung, LEGO).
- `merchant` (string, optional) — Exact merchant/shop name as Shopflix spells it (e.g. Techaway, Frogs.gr). This matches the products that merchant is the recommended seller for — use `offers` to see every seller of one product.
- `min_price` (number, optional) — Keep only products whose Shopflix price is at least this many euros.
- `max_price` (number, optional) — Keep only products whose Shopflix price is at most this many euros.
- `sort` (enum, optional, default "relevance") — Result order. Each value maps to one of Shopflix's own sort indexes. [one of: relevance, price_asc, price_desc, popularity, rating, discount]
- `page` (integer, optional, default 1) — 1-based result page. Shopflix's index stops paging past roughly 1 000 rows per query, so `page` × `limit` above that returns empty.
- `limit` (integer, optional, default 24) — Rows per page, 1-50 (default 24).

**Returns:** products[]{sku, abstract_sku, product_id, title, url, price_eur, list_price_eur, discount_pct, price_min_eur, price_max_eur, merchant_count, merchant_name, shipping_lead_time, rating, review_count, category_path[], gtin13, images[], price_band_stale}, total, page, limit, pages, query. `price_eur` is Shopflix's own headline price; `price_min_eur`/`price_max_eur`/`merchant_count` come from the index's per-merchant price map, which can lag the headline — `price_band_stale` is true on the rows where the two disagree (4 of 240 rows measured 2026-10-06).

**Example request body:**
```json
{
  "query": "iphone"
}
```

### POST https://api.reefapi.com/shopflix/v1/category — 2 credits
Browse one Shopflix category without a keyword — same rows as `search`. Take the id from `categories`, from a search row's URL, or from any shopflix.gr /c/<id>/ link.

**Parameters:**
- `category_id` (string, required) — Numeric category id (24 = Smartphones) or a shopflix.gr /c/<id>/<slug> URL.
- `query` (string, optional) — Optional keyword to narrow the category.
- `brand` (string, optional) — Exact manufacturer name as Shopflix spells it (e.g. Apple, Samsung, LEGO).
- `merchant` (string, optional) — Exact merchant/shop name as Shopflix spells it (e.g. Techaway, Frogs.gr). This matches the products that merchant is the recommended seller for — use `offers` to see every seller of one product.
- `min_price` (number, optional) — Keep only products whose Shopflix price is at least this many euros.
- `max_price` (number, optional) — Keep only products whose Shopflix price is at most this many euros.
- `sort` (enum, optional, default "relevance") — Result order. Each value maps to one of Shopflix's own sort indexes. [one of: relevance, price_asc, price_desc, popularity, rating, discount]
- `page` (integer, optional, default 1) — 1-based result page. Shopflix's index stops paging past roughly 1 000 rows per query, so `page` × `limit` above that returns empty.
- `limit` (integer, optional, default 24) — Rows per page, 1-50 (default 24).

**Returns:** products[] (same shape as search), total, page, limit, pages, category_id

**Example request body:**
```json
{
  "category_id": "24"
}
```

### POST https://api.reefapi.com/shopflix/v1/product — 1 credit
One product in full: title, description, every technical specification row, images, manufacturer part number, shipping weight and box dimensions, rating and review count, category. `gtin13` is the barcode recovered from the product's own images when one is recoverable; `ean_published` is the source's own barcode field, which Shopflix leaves empty on the products measured.

**Parameters:**
- `sku` (string, required) — The Shopflix sku (SF-202747804) or a shopflix.gr /p/<sku>/<slug> product URL. Take it from `search`.

**Returns:** product{sku, abstract_sku, product_id, title, subtitle, url, brand, description, gtin13, ean_published, mpn, isbn, rating, review_count, is_discontinued, shipping_weight_kg, shipping_dimensions_cm{height,width,depth}, category_id, category_name, images[], specs[]{group, name, value}, video_id}

**Example request body:**
```json
{
  "sku": "SF-202747804"
}
```

### POST https://api.reefapi.com/shopflix/v1/offers — 2 credits
Every merchant selling one product. Returns TWO lists on purpose: `offers[]` is the named merchant offers Shopflix publishes (shop name, shop rating, price, shipping fee, stock quantity, instalments) and is capped at 5 by the source; `merchant_prices[]` is EVERY merchant's price for that product, which the search index knows but without shop names. `merchant_count` is the real number of sellers.

**Parameters:**
- `sku` (string, required) — The Shopflix sku or a product URL.

**Returns:** sku, merchant_count, offers_named, price_min_eur, price_max_eur, offers[]{merchant, merchant_reference, merchant_rating, merchant_rating_count, merchant_url, price_eur, list_price_eur, discount_pct, shipping_fee_eur, shipping_lead_time_days, in_stock, stock_quantity, max_instalments}, merchant_prices[]{merchant_reference, price_eur, list_price_eur, shipping_lead_time, offer_reference}, index_prices_stale. `offers[]` is live; `merchant_prices[]` is the search index's snapshot and can lag it, which `index_prices_stale` reports.

**Example request body:**
```json
{
  "sku": "SF-202747804"
}
```

### POST https://api.reefapi.com/shopflix/v1/reviews — 1 credit
Customer reviews for one product, with the rating breakdown Shopflix publishes. Reviews are keyed on the ABSTRACT sku (SFA-…); a concrete sku (SF-…) is accepted and resolved for you.

**Parameters:**
- `sku` (string, required) — Shopflix sku, abstract (SFA-…) or concrete (SF-…), or a product URL.
- `sort` (enum, optional, default "created_desc") — Review order. [one of: created_desc, created_asc, rating_desc, rating_asc]
- `min_rating` (integer, optional) — Keep only reviews with at least this star rating (1-5).
- `verified_only` (boolean, optional, default false) — Keep only reviews from a verified Shopflix purchase.
- `with_media` (boolean, optional, default false) — Keep only reviews that carry customer photos.
- `page` (integer, optional, default 1) — 1-based result page. Shopflix's index stops paging past roughly 1 000 rows per query, so `page` × `limit` above that returns empty.
- `limit` (integer, optional, default 20) — Reviews per page, 1-50 (default 20).

**Returns:** reviews[]{review_id, rating, title, text, author, created_at, verified_purchase, recommended, product_sku, product_title, media_count}, total, average_rating, page, limit, sku

**Example request body:**
```json
{
  "sku": "SFA-104712587"
}
```

### POST https://api.reefapi.com/shopflix/v1/categories — 1 credit
Shopflix's category tree — the ids `search` and `category` take. Called without a query it returns the full published navigation (every department and its children, with parent and depth). Called with a query it searches the category index by name.

**Parameters:**
- `query` (string, optional) — Optional category name to look up, Greek or English. Omit it for the whole published tree.
- `limit` (integer, optional, default 200) — Maximum categories to return (1-1000).

**Returns:** categories[]{category_id, name, url, level, parent} (tree) or {category_id, name, url, child_count} (search), total, query

**Example request body:**
```json
{
  "query": "smartphone"
}
```

### POST https://api.reefapi.com/shopflix/v1/suggest — 1 credit
Shopflix's own search autocomplete: the real queries its shoppers type, with how many products each one matches. A cheap way to find the Greek wording that actually has a catalogue behind it before spending a `search` call.

**Parameters:**
- `query` (string, required) — A prefix or partial word, Greek or English.
- `limit` (integer, optional, default 10) — Maximum suggestions to return (1-50).

**Returns:** suggestions[]{query, product_count, popularity}, total, query

**Example request body:**
```json
{
  "query": "iph"
}
```

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