# Hotline.ua API — Ukraine price comparison: search, categories, every shop's offer per city, specs, ratings and price history (UAH)

> Keyword search across hotline.ua's whole catalogue. Each row is a product with its lowest and highest current price in UAH, the number of shop offers (or the one shop when only one sells it), brand, category, review count and short specs. Also returns the exact result total and category / brand facets. Optional brand filter (brand_id from `brand_facets`).
> ReefAPI engine `hotline-ua` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/hotline-ua/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/hotline-ua/v1/search — 3 credits
Keyword search across hotline.ua's whole catalogue. Each row is a product with its lowest and highest current price in UAH, the number of shop offers (or the one shop when only one sells it), brand, category, review count and short specs. Also returns the exact result total and category / brand facets. Optional brand filter (brand_id from `brand_facets`).

**Parameters:**
- `query` (string, required) — Search words, Ukrainian, Russian or Latin (model names and brands work as typed).
- `brand_id` (integer, optional) — Only this brand: a `brand_id` from this action's `brand_facets` or from a row (242 = Apple). One value per call.
- `page` (integer, optional, default 1) — Result page, 48 rows per page. `last_page` in the answer is the source's own count; a page past it returns no rows.

**Returns:** {query, total, page, last_page, has_more, page_size, results[{product_id, row_type (product | single_offer), title, url, product_path, brand, brand_id, category_id, category_path, lowest_price, highest_price, currency, offer_count, shop_name, offer_id, outbound_url, review_count, question_count, image, short_specs, added_date}], category_facets[{category_id, name, path, count}], brand_facets[{brand_id, name, count}]}. Every row's product_id opens with product / offers / price_history.

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

### POST https://api.reefapi.com/hotline-ua/v1/category — 2 credits
One category's product listing (e.g. mobilnye-telefony-i-smartfony = smartphones) with the category's own product total, sort, price range and paging. Prices are the products' current lowest / highest offer in UAH.

**Parameters:**
- `category` (string, required) — Category: its slug (mobilnye-telefony-i-smartfony), its path or URL (/mobile/mobilnye-telefony-i-smartfony/), a row's `category_path`, or its numeric id (11, a row's `category_id`).
- `sort` (enum, optional, default "popular") — Result order. [one of: popular, price_asc, price_desc, newest, name, offers]
- `min_price` (integer, optional) — Lower end of the price window in UAH (whole hryvnias). The site keeps a product when its lowest-to-highest offer range touches the window, so a row's min_price can sit just below it.
- `max_price` (integer, optional) — Upper end of the price window in UAH (whole hryvnias); same range-overlap rule as min_price.
- `city` (enum, optional, default "kyiv") — Buyer's city. Hotline shows a different offer list per city (which shops deliver there, same-city flag, delivery lines, order); prices of the same shop do not change. Default Kyiv, the site's own default. The city id (187 = Kyiv) is accepted too. [one of: kyiv, lviv, kharkiv, odesa, dnipro, zaporizhzhia, vinnytsia, poltava, mykolaiv, kherson]
- `page` (integer, optional, default 1) — Result page, 48 rows per page. `last_page` in the answer is the source's own count; a page past it returns no rows.

**Returns:** {category_id, category_path, total, sort, min_price, max_price, city, page, last_page, has_more, results[...search row shape + is_promoted]}

**Example request body:**
```json
{
  "category": "mobilnye-telefony-i-smartfony"
}
```

### POST https://api.reefapi.com/hotline-ua/v1/product — 1 credit
One product card: title, brand, category, barcode, lowest / highest / average current price, the lowest price among NEW-condition offers, offer count, rating and review counts with per-aspect ratings, the full specification sheet, description, images, colour / size variants and the last price-history point.

**Parameters:**
- `product_id` (string, optional) — Hotline product id: the `product_id` of a search / category row (also in the site's own product data). Provide product_id OR url.
- `url` (string, optional) — A hotline.ua product URL, or a row's `product_path`; alternative to product_id.
- `city` (enum, optional, default "kyiv") — Buyer's city. Hotline shows a different offer list per city (which shops deliver there, same-city flag, delivery lines, order); prices of the same shop do not change. Default Kyiv, the site's own default. The city id (187 = Kyiv) is accepted too. [one of: kyiv, lviv, kharkiv, odesa, dnipro, zaporizhzhia, vinnytsia, poltava, mykolaiv, kherson]

**Returns:** {product_id, title, url, product_path, brand, category_id, category_path, barcode, lowest_price, cheapest_new_offer, highest_price, avg_price, currency, offer_count, rating, review_count, specs[{group, specs[{name, value}]}], variants[], images[], last_history_price, city}

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

### POST https://api.reefapi.com/hotline-ua/v1/offers — 2 credits
Every shop offer for one product in one city, in the site's own order (paid placements first) or by price / warranty: shop (name, id, website, rating, review counts, official / new), price, condition (new / discounted), dispatch time, where it ships from, same-city flag, each delivery method with its stated cost, free-delivery flag, warranty, payment methods, instalment plans, whether the row is a paid placement, and the click-through link.

**Parameters:**
- `product_id` (string, optional) — Hotline product id: the `product_id` of a search / category row (also in the site's own product data). Provide product_id OR url.
- `url` (string, optional) — A hotline.ua product URL, or a row's `product_path`; alternative to product_id.
- `city` (enum, optional, default "kyiv") — Buyer's city. Hotline shows a different offer list per city (which shops deliver there, same-city flag, delivery lines, order); prices of the same shop do not change. Default Kyiv, the site's own default. The city id (187 = Kyiv) is accepted too. [one of: kyiv, lviv, kharkiv, odesa, dnipro, zaporizhzhia, vinnytsia, poltava, mykolaiv, kherson]
- `sort` (enum, optional, default "default") — Offer order, using the site's own rank for each order. [one of: default, price_asc, price_desc, warranty]

**Returns:** {product_id, title, url, city, currency, lowest_price, highest_price, cheapest_offer_price, cheapest_new_offer, offer_count, sponsored_count, offers[{position, offer_id, shop_id, shop_name, shop_rating_percent, price, condition (new | discounted | used), condition_text, is_new_condition, delivery_time, ships_from, same_city, free_shipping, lowest_stated_delivery_cost, delivery_methods[{code, name, cost, cost_text}], warranty_months, installments, has_bid, listing_type, click_url}]}

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

### POST https://api.reefapi.com/hotline-ua/v1/price_history — 3 credits
The product's price chart as the site draws it: average, lowest and highest shop price over time in UAH and USD, and the number of offers, twice a month and then daily for recent weeks; plus the site's own % price change over 14 / 30 days, 3 / 6 months, a year and all time.

**Parameters:**
- `product_id` (string, optional) — Hotline product id: the `product_id` of a search / category row (also in the site's own product data). Provide product_id OR url.
- `url` (string, optional) — A hotline.ua product URL, or a row's `product_path`; alternative to product_id.
- `city` (enum, optional, default "kyiv") — Buyer's city. Hotline shows a different offer list per city (which shops deliver there, same-city flag, delivery lines, order); prices of the same shop do not change. Default Kyiv, the site's own default. The city id (187 = Kyiv) is accepted too. [one of: kyiv, lviv, kharkiv, odesa, dnipro, zaporizhzhia, vinnytsia, poltava, mykolaiv, kherson]

**Returns:** {product_id, product_path, city, currency, points, first_date, last_date, series{avg_price_uah, min_price_uah, max_price_uah, avg_price_usd, min_price_usd, max_price_usd, offer_count: [{date, value}]}, current_min_price_uah, price_change_percent{days_14, days_30, months_3, months_6, year, all_time}}

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

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