# Alza API scraper — search products, browse categories and read full product records (price with and without VAT, discounts, stock, rating, reviews, spec table) from Alza, Central Europe's largest electronics retailer, across 5 storefronts: Czechia, Slovakia, Hungary, Austria and Germany. No account, no browser.

> Search one national Alza storefront by keyword and get 24 products per page with the price a shopper pays now (VAT included), the struck-through price and the discount, the financing offer, stock wording, customer rating on a 5-star scale, energy class and the number of colour/capacity variants. Sort by price, rating, bestseller or newest, and narrow by brand, price range, in-stock, on-sale, newly-added or well-rated. Every filter is applied by the storefront's own listing service and the response reports the exact resulting total.
> ReefAPI engine `alza` · 4 endpoints · clean JSON, no scraping or browsers to manage.

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

## Endpoints

### POST /alza/v1/search — 2 credits
Search one national Alza storefront by keyword and get 24 products per page with the price a shopper pays now (VAT included), the struck-through price and the discount, the financing offer, stock wording, customer rating on a 5-star scale, energy class and the number of colour/capacity variants. Sort by price, rating, bestseller or newest, and narrow by brand, price range, in-stock, on-sale, newly-added or well-rated. Every filter is applied by the storefront's own listing service and the response reports the exact resulting total.

**Parameters:**
- `query` (string, required) — Search keyword, exactly as a shopper would type it on the storefront. Alza often answers a keyword with its matching category or brand page; the response says which under `resolved_url` and `search_mode`.
- `country` (enum, optional, default "cz") — Which national Alza storefront to read. Currency, language, catalogue AND price follow the country — the same product really is priced differently on alza.at and alza.de, so pick the market you mean. alza.co.uk is not available: Alza stopped selling there on 27/5/2022 and publishes no catalogue. [one of: cz, sk, hu, at, de]
- `page` (integer, optional, default 1) — Result page, 1-based. 24 products per page. `page_count` in the response is the real last page for this result set.
- `sort` (enum, optional, default "relevance") — Result order. Only orderings the storefront itself offers, passed to its own listing service. [one of: relevance, bestseller, price_asc, price_desc, rating, newest]
- `brand` (string, optional) — Keep only one brand, spelled as the storefront spells it (matched case-insensitively against the brand facet the listing returns). The response always lists the available brands with their exact product counts in `brands[]`, so an unknown name is rejected with the list.
- `min_price` (number, optional) — Lowest price to include, in the storefront's currency, VAT included (CZK for cz, HUF for hu, EUR for sk/at/de).
- `max_price` (number, optional) — Highest price to include, in the storefront's currency, VAT included.
- `in_stock_only` (boolean, optional, default false) — Keep only products the storefront can deliver now.
- `discounted_only` (boolean, optional, default false) — Keep only products currently on a reduced price — Alza's own 'sale and good prices' filter (price bombs, super prices, markdowns).
- `new_arrivals_only` (boolean, optional, default false) — Keep only recently added products (the storefront's own 'news' filter).
- `well_rated_only` (boolean, optional, default false) — Keep only products above the storefront's own customer-rating threshold. Alza exposes this as a single switch, not a star number, so this engine does not pretend to take one.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5, default 3).

**Returns:** results[]{product_id, product_code, title, url, image, currency, price (VAT included — what a logged-out shopper pays now), was_price (the struck-through price when the product is reduced), discount_percent (computed from those two prices), discount_percent_site + discount_label (the storefront's own badge, which can disagree — e.g. it prints '-4 %' for 43 990 → 41 990), is_discounted, monthly_instalment (financing, never a price), rating, rating_count, rating_scale (5), availability_text (the storefront's own wording, e.g. 'Skladem > 5 ks'), availability_code, energy_class (EU label where the product has one), variant_count, summary, badges[], open_box}, count, total_results (exact, from the storefront's own listing service), page, page_count, per_page (24), search_mode ('resolved' when Alza answered the keyword with one of its own category or brand pages — 11 of 16 sampled keywords do — or 'keyword' when it stayed on its free-text search page), filters_supported (false in 'keyword' mode, where the storefront itself offers no sorting or filtering; asking for one there is rejected rather than silently ignored), resolved_url, category_id, brands[]{id, name, product_count}, country, currency, filters_applied. In 'keyword' mode total_results reflects the storefront's own free-text result set, which was observed to plateau near 300 on broad queries; 'resolved' mode reports the category's exact total.

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

### POST /alza/v1/category — 2 credits
List the products of one Alza category page — from the site navigation, a product breadcrumb or a `search` response — 24 per page, with the same product fields as search and the same sorting and filters. Producer-filtered category URLs keep their brand restriction.

**Parameters:**
- `category` (string, required) — An Alza category page URL (…/<name>/<categoryId>.htm) or the bare numeric category id. A URL's host sets the country. Category URLs appear in the site navigation, in every product breadcrumb and in `resolved_url` from `search`. A producer-filtered URL (…/<categoryId>-v<producerId>.htm) keeps its brand restriction.
- `country` (enum, optional, default "cz") — Which national Alza storefront to read. Currency, language, catalogue AND price follow the country — the same product really is priced differently on alza.at and alza.de, so pick the market you mean. alza.co.uk is not available: Alza stopped selling there on 27/5/2022 and publishes no catalogue. [one of: cz, sk, hu, at, de]
- `page` (integer, optional, default 1) — Result page, 1-based. 24 products per page. `page_count` in the response is the real last page for this result set.
- `sort` (enum, optional, default "relevance") — Result order. Only orderings the storefront itself offers, passed to its own listing service. [one of: relevance, bestseller, price_asc, price_desc, rating, newest]
- `brand` (string, optional) — Keep only one brand, spelled as the storefront spells it (matched case-insensitively against the brand facet the listing returns). The response always lists the available brands with their exact product counts in `brands[]`, so an unknown name is rejected with the list.
- `min_price` (number, optional) — Lowest price to include, in the storefront's currency, VAT included (CZK for cz, HUF for hu, EUR for sk/at/de).
- `max_price` (number, optional) — Highest price to include, in the storefront's currency, VAT included.
- `in_stock_only` (boolean, optional, default false) — Keep only products the storefront can deliver now.
- `discounted_only` (boolean, optional, default false) — Keep only products currently on a reduced price — Alza's own 'sale and good prices' filter (price bombs, super prices, markdowns).
- `new_arrivals_only` (boolean, optional, default false) — Keep only recently added products (the storefront's own 'news' filter).
- `well_rated_only` (boolean, optional, default false) — Keep only products above the storefront's own customer-rating threshold. Alza exposes this as a single switch, not a star number, so this engine does not pretend to take one.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5, default 3).

**Returns:** results[]{product_id, product_code, title, url, image, currency, price (VAT included — what a logged-out shopper pays now), was_price (the struck-through price when the product is reduced), discount_percent (computed from those two prices), discount_percent_site + discount_label (the storefront's own badge, which can disagree — e.g. it prints '-4 %' for 43 990 → 41 990), is_discounted, monthly_instalment (financing, never a price), rating, rating_count, rating_scale (5), availability_text (the storefront's own wording, e.g. 'Skladem > 5 ks'), availability_code, energy_class (EU label where the product has one), variant_count, summary, badges[], open_box}, count, total_results (exact), page, page_count, per_page (24), category_id (authoritative — the slug in an Alza category URL is decorative and the storefront rewrites it to whatever the id names), category_url (as you passed it), producer_id, brands[]{id, name, product_count}, country, currency, filters_applied

### POST /alza/v1/product/detail — 2 credits
The full Alza product record by id or URL: title, brand, manufacturer part number (and the EAN when the storefront's part number really is one), the price both including and excluding VAT, the struck-through price and discount, financing, stock wording and the schema.org availability, condition, the complete image gallery, the complete technical specification grouped exactly as the site groups it, the description, colour/capacity variants with their price difference and stock, the energy class, the breadcrumb, and the rating with both counts Alza publishes.

**Parameters:**
- `product_id` (string, required) — Alza product id — the number after the -d in a product URL (…/iphone-17-pro-256gb-stribrna-d13078788.htm → 13078788). A full product URL is also accepted and its host sets the country. Every search/category row returns `product_id`.
- `country` (enum, optional, default "cz") — Which national Alza storefront to read. Currency, language, catalogue AND price follow the country — the same product really is priced differently on alza.at and alza.de, so pick the market you mean. alza.co.uk is not available: Alza stopped selling there on 27/5/2022 and publishes no catalogue. [one of: cz, sk, hu, at, de]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5, default 3).

**Returns:** product{product_id, product_code, title, url, brand, mpn, ean (only when the published part number is a valid EAN-13 — Alza publishes no gtin of its own), country, currency, price (VAT included), price_ex_vat (the storefront's own 'without VAT' figure), price_includes_vat, was_price, discount_percent, discount_percent_site, discount_label, is_discounted, monthly_instalment, availability_text, availability_schema, in_stock, condition, rating, rating_count (people who rated), review_count (people who wrote a review), rating_scale, description, images[], image_count, specs[]{group, attributes{name: value}}, spec_count, breadcrumb[], category_id, variants[]{name, options[]{product_id, value, url, price_difference, availability, selected}}, energy_class, delivery{stock_note, stock_detail, promise, exact_date_requires_address}}, country, currency

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

### POST /alza/v1/product/reviews — 1 credit
Customer reviews for one Alza product, newest first, straight from the storefront's own review feed: star rating, the reviewer's public nickname as the site prints it, what they liked and disliked as separate lists, the free text, the date, whether Alza verified the purchase, which variant was reviewed, any photos, and the shop's reply where there is one.

**Parameters:**
- `product_id` (string, required) — Alza product id — the number after the -d in a product URL (…/iphone-17-pro-256gb-stribrna-d13078788.htm → 13078788). A full product URL is also accepted and its host sets the country. Every search/category row returns `product_id`.
- `country` (enum, optional, default "cz") — Which national Alza storefront to read. Currency, language, catalogue AND price follow the country — the same product really is priced differently on alza.at and alza.de, so pick the market you mean. alza.co.uk is not available: Alza stopped selling there on 27/5/2022 and publishes no catalogue. [one of: cz, sk, hu, at, de]
- `limit` (integer, optional, default 10) — How many reviews to return (1-50). The feed pages 10 at a time upstream; ask for more and the engine pages for you.
- `offset` (integer, optional, default 0) — How many reviews to skip, for paging through a long review list.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5, default 3).

**Returns:** reviews[]{rating, rating_scale, author (the public nickname the site prints), text, positives[], negatives[], date, verified_purchase, reviewed_variant, detail_note (the storefront's own 'reviewed on …, variant …' line, verbatim), reviewed_product, helpful_votes, images[], shop_reply, country_flag, translated}, count, total_reviews (what the feed will page through), offset, limit, product_id, country. Alza's review form has no headline field, so reviews carry no title.

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

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