# Altex API — search Romania's largest electronics retailer (and Media Galaxy) and read products with RON prices, PRP, resealed units, per-store stock, sellers, specs and reviews

> Search altex.ro (or mediagalaxy.ro) by keyword with the site's own brand, price (RON), in-stock, seller, store and rating filters and sorts. Each row: SKU, EAN, brand, title, URL, image, selling price, crossed-out price, PRP, cheapest resealed price, monthly instalment, stock status, stores holding stock, seller (Altex or marketplace) and average rating. The source stops search totals at 720.
> ReefAPI engine `altex` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/altex/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/altex/v1/search — 2 credits
Search altex.ro (or mediagalaxy.ro) by keyword with the site's own brand, price (RON), in-stock, seller, store and rating filters and sorts. Each row: SKU, EAN, brand, title, URL, image, selling price, crossed-out price, PRP, cheapest resealed price, monthly instalment, stock status, stores holding stock, seller (Altex or marketplace) and average rating. The source stops search totals at 720.

**Parameters:**
- `query` (string, required) — Search words, 3-50 characters (the site refuses shorter terms).
- `brand` (string, optional) — Brand slug as the site writes it in its filter links (lower case: lenovo, samsung, hp, apple). Checked against the source's own filter echo — an unknown slug is refused (the source itself would silently return the whole listing).
- `price_min` (integer, optional) — Lowest price in whole lei (RON), applied to the selling price.
- `price_max` (integer, optional) — Highest price in whole lei (RON), applied to the selling price.
- `in_stock` (boolean, optional, default false) — Only products in stock now (the site's own 'In stoc' switch). Without it, out-of-stock products are listed too, with their price.
- `seller_id` (integer, optional) — Only products on which this seller has an in-stock offer (a row's `seller.id` / `seller_ids`; 1 = Altex, 2 = Media Galaxy, other ids = marketplace sellers). The buy-box row can still be another seller's.
- `store_id` (integer, optional) — Only products in stock at this store (the `store_id` from the stores action or a row's `store_ids_with_stock`).
- `min_rating` (integer, optional) — Only products whose average rating is at least this many stars (1-5).
- `sort` (enum, optional, default "relevance") — Result order. Only orders that measurably change the result are offered. [one of: relevance, best_selling, price_asc, price_desc, name_asc, discount_desc, review_count_desc]
- `page` (integer, optional, default 1) — Results page, 1-based. A page past the end returns no rows with page_beyond_end true.
- `limit` (integer, optional, default 48) — Products per page, 1-96 (the site shows 24/36/48; it serves at most 96).
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** results[]{product_id, sku, title, brand, brand_id, url, url_key, image, ean, ean_codes[], short_description, currency (RON), price, was_price (crossed-out before price), discount_amount, discount_percent, discount_type (none|fixed|percentage|repositioning), recommended_retail_price (PRP), resealed_from_price (cheapest resealed unit — NOT an Omnibus price), resealed_count, installment_monthly_from, in_stock, availability (in_stock|supplier_stock|in_store_only|out_of_stock), display_unit, store_pickup_available, stores_with_stock, store_ids_with_stock[], preorder, end_of_life, has_gift, seller{id, name, type: retailer|marketplace}, seller_ids[], rating (average, 0-5), review_count} + total, total_capped, pages, page, limit, has_more, page_beyond_end, facets{brands[], categories[]}, search_term

**Example request body:**
```json
{
  "query": "laptop",
  "limit": 24
}
```

### POST https://api.reefapi.com/altex/v1/category — 2 credits
List one altex.ro category (by its URL slug or page URL) with the same filters and sorts as search. Totals are exact (not capped). Default order: best selling.

**Parameters:**
- `category` (string, optional) — Category slug from the site's URL (altex.ro/<slug>/cpl/), a product's `category_path[].url_key`, or a `url_key` from the categories action. One of category or url.
- `url` (string, optional) — An altex.ro / mediagalaxy.ro category page URL (…/<slug>/cpl/).
- `brand` (string, optional) — Brand slug as the site writes it in its filter links (lower case: lenovo, samsung, hp, apple). Checked against the source's own filter echo — an unknown slug is refused (the source itself would silently return the whole listing).
- `price_min` (integer, optional) — Lowest price in whole lei (RON), applied to the selling price.
- `price_max` (integer, optional) — Highest price in whole lei (RON), applied to the selling price.
- `in_stock` (boolean, optional, default false) — Only products in stock now (the site's own 'In stoc' switch). Without it, out-of-stock products are listed too, with their price.
- `seller_id` (integer, optional) — Only products on which this seller has an in-stock offer (a row's `seller.id` / `seller_ids`; 1 = Altex, 2 = Media Galaxy, other ids = marketplace sellers). The buy-box row can still be another seller's.
- `store_id` (integer, optional) — Only products in stock at this store (the `store_id` from the stores action or a row's `store_ids_with_stock`).
- `min_rating` (integer, optional) — Only products whose average rating is at least this many stars (1-5).
- `sort` (enum, optional, default "relevance") — Result order. Only orders that measurably change the result are offered. [one of: relevance, best_selling, price_asc, price_desc, name_asc, discount_desc, review_count_desc]
- `page` (integer, optional, default 1) — Results page, 1-based. A page past the end returns no rows with page_beyond_end true.
- `limit` (integer, optional, default 48) — Products per page, 1-96 (the site shows 24/36/48; it serves at most 96).
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** results[]{product_id, sku, title, brand, brand_id, url, url_key, image, ean, ean_codes[], short_description, currency (RON), price, was_price (crossed-out before price), discount_amount, discount_percent, discount_type (none|fixed|percentage|repositioning), recommended_retail_price (PRP), resealed_from_price (cheapest resealed unit — NOT an Omnibus price), resealed_count, installment_monthly_from, in_stock, availability (in_stock|supplier_stock|in_store_only|out_of_stock), display_unit, store_pickup_available, stores_with_stock, store_ids_with_stock[], preorder, end_of_life, has_gift, seller{id, name, type: retailer|marketplace}, seller_ids[], rating (average, 0-5), review_count} + total, total_capped, pages, page, limit, has_more, page_beyond_end, facets{brands[], categories[]}, category{id, name, url_key, path}

**Example request body:**
```json
{
  "category": "laptop-home",
  "sort": "price_asc",
  "limit": 24
}
```

### POST https://api.reefapi.com/altex/v1/product — 2 credits
Full product record: every seller's offer with RON price, crossed-out price, PRP, green tax and stock; resealed units with their store; average rating and the star distribution; specifications; images; category path; extra services (warranty) with prices.

**Parameters:**
- `sku` (string, optional) — Altex product code exactly as a search row's `sku` returns it (the page's 'Cod produs', e.g. SMTIP151BL), or pass `url`.
- `url` (string, optional) — An altex.ro or mediagalaxy.ro product page URL (…/cpd/<SKU>/).
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** product{… all search-row fields, offers[]{seller, price, was_price, discount_*, recommended_retail_price, green_tax, package_price, in_stock, availability, available_in_store, display_unit}, offer_count, other_offers_count, question_count, rating_distribution{1..5}, description, specifications[]{group, name, value, code}, images[], category, category_path[], resealed_offers[]{sku, resealed_code, price, new_price, discount_percent, reasons[], store{name, city, region, address}}, services[]{type, sku, name, price}, brand_logo}

**Example request body:**
```json
{
  "sku": "SMTIP151BL"
}
```

### POST https://api.reefapi.com/altex/v1/availability — 2 credits
Per-store stock for one product: every store the source lists as holding it, with the quantity (the source caps it at 6 — qty_capped means 6 or more), city, region, address and phone.

**Parameters:**
- `sku` (string, optional) — Altex product code exactly as a search row's `sku` returns it (the page's 'Cod produs', e.g. SMTIP151BL), or pass `url`.
- `url` (string, optional) — An altex.ro or mediagalaxy.ro product page URL (…/cpd/<SKU>/).
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** product{product_id, sku, title, brand, url, price, currency, in_stock, availability}, stores[]{store_id, name, network (altex|media_galaxy|brico), city, region, address, qty, qty_capped, phone}, stores_listed, store_ids_with_stock_count, qty_cap

**Example request body:**
```json
{
  "sku": "SMTIP151BL"
}
```

### POST https://api.reefapi.com/altex/v1/reviews — 1 credit
Written customer reviews of one product, newest or most helpful first, optionally only one star rating. Altex and Media Galaxy share the same reviews.

**Parameters:**
- `sku` (string, optional) — Altex product code exactly as a search row's `sku` returns it (the page's 'Cod produs', e.g. SMTIP151BL), or pass `url`.
- `url` (string, optional) — An altex.ro or mediagalaxy.ro product page URL (…/cpd/<SKU>/).
- `rating` (integer, optional) — Only reviews with exactly this many stars (1-5).
- `sort` (enum, optional, default "recent") — Review order. [one of: recent, most_helpful]
- `page` (integer, optional, default 1) — Reviews page, 1-based.
- `limit` (integer, optional, default 20) — Reviews per page, 1-50.
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** reviews[]{review_id, rating, title, body, author (display alias), date, verified_buyer, upvotes, downvotes, images[], replies[]{author, body, date, from_merchant}, from_merchant} + total_written_reviews, pages, page, limit, has_more

**Example request body:**
```json
{
  "sku": "SMTIP151BL",
  "limit": 10
}
```

### POST https://api.reefapi.com/altex/v1/stores — 2 credits
The chain's store directory (Altex, Media Galaxy and Brico stores): store id, network, city, region, address, coordinates, phone, manager, weekly opening hours. Optional city / region / network narrowing is applied to the full list.

**Parameters:**
- `city` (string, optional) — Keep stores whose city contains this text (accent- and case-insensitive).
- `region` (string, optional) — Keep stores whose region (county) contains this text.
- `network` (enum, optional) — Keep one store network. [one of: altex, media_galaxy, brico]
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** stores[]{store_id, internal_id, name, network, city, region, address, latitude, longitude, phone, manager, schedule[]{day, opens, closes}, ship_to_store, url, image} + total, total_unfiltered

**Example request body:**
```json
{
  "city": "Bucuresti"
}
```

### POST https://api.reefapi.com/altex/v1/categories — 3 credits
The full category tree, flattened: id, name, URL slug (feed it to the category action), parent, level and the readable path. Optional text match on name/path.

**Parameters:**
- `match` (string, optional) — Keep categories whose name or path contains this text.
- `site` (enum, optional, default "altex") — Which shop front to read. altex (default) or mediagalaxy — the same group's second chain on the same catalogue. Measured on the same SKUs: identical prices and stock; the own-shop seller is Altex (id 1) on one and Media Galaxy (id 2) on the other, and the instalment figure can differ. [one of: altex, mediagalaxy]

**Returns:** categories[]{category_id, name, url_key, parent_id, level, path, resealed_count} + total

**Example request body:**
```json
{
  "match": "laptop"
}
```

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