# Ozon Scraper (`theshark/ozon-scraper`) Actor

Ozon products from search, links and category trees on ozon.ru, ozon.by and ozon.kz at once, with price history and changes between runs.

- **URL**: https://apify.com/theshark/ozon-scraper.md
- **Developed by:** [TheShark](https://apify.com/theshark) (community)
- **Categories:** E-commerce, Travel, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Ozon Scraper — products, prices and changes on ozon.ru, ozon.by and ozon.kz

Scrape public Ozon data — search results, any Ozon link, whole category trees — on **ozon.ru, ozon.by and ozon.kz in
one run**, in any of **91 delivery cities**, and get **what changed since your last run**: price, stock, place in
search, sellers, rating, bad reviews, promos. No Ozon account needed.

### Why this Actor

- **Changes, not just snapshots.** Every run is compared with the previous one: cheaper / pricier, sold out, new in
  search, new cheapest seller, new 1–2 star reviews, a **fake discount** (the crossed-out price above the real one).
  Schedule it — and you have a market monitor.
- **Three storefronts and 91 cities at once.** One row per product per city; Excel compares prices between Russia,
  Belarus, Kazakhstan and between cities.
- **The whole product page or just the search card.** ~60 fields from the page (stock, seller, characteristics,
  delivery dates, unit price…) or cheap rows straight from search results.
- **Proxies included.** Ozon opens ozon.by and ozon.kz only from their own countries — the right proxies are built in.
- **Ready-to-read Excel** with charts (price, stock, places in search, market median), in English or Russian.
- **Ozon Travel too:** hotels with rooms and rates, flights, train tickets — in the same Actor.

### What you can use it for

- **Price monitoring** — a daily run on your searches or product links; get the changes in a webhook or Slack.
- **Market research** — a category tree slice: min / median / max price, brands, ratings for every subcategory.
- **Stock and sales** — stock in every run and a sales estimate from how it goes down («Stock» sheet).
- **Search positions** — where products stand in search and how they move.
- **Price comparison** — the same product on three storefronts and in different cities.
- **Reviews, sellers, buy box** — see «Modes» below.

### How to use

1. Enter **search words**, any **Ozon links** (products, categories, sellers, brands) or **category links** for a
   tree slice — or all of them.
2. Choose **storefronts** and **cities**, and what to collect: the full product page (default) or **Search results
   only**, plus optional reviews, questions, other sellers, seller profiles.
3. Run it. Rows go to the dataset; `OUTPUT` (with all changes) and the Excel workbook — to the key-value store.
4. Schedule it (Apify Schedules): every next run reports what changed since the previous one.

### Input example

```json
{
  "queries": ["носки", "iphone 17"],
  "storefronts": ["ru", "kz"],
  "cities": ["Москва", "Казань"],
  "max_results": 20,
  "include_other_sellers": true
}
```

Search words are typed as on Ozon (Russian works best); a city outside a storefront is skipped (ozon.kz here uses
its capital, Astana).

### Output example

One product from a real run (mode `products`, trimmed — a full row has ~80 fields):

```json
{
  "storefront": "ru",
  "city": "Москва",
  "source": "носки",
  "position": 1,
  "sku": 1158582629,
  "url": "https://www.ozon.ru/product/noski-muzhskie-10-par-1158582629/",
  "name": "Носки мужские, 10 пар",
  "price": 566,
  "price_without_card": 628,
  "old_price": 2800,
  "discount": 79,
  "currency": "RUB",
  "rating": 4.9,
  "reviews_count": 162867,
  "stock": 800,
  "unit": "пара",
  "unit_price": 56.6,
  "seller": {"name": "ILEN SHOP", "url": "https://www.ozon.ru/seller/ilen-shop/"},
  "categories": ["Одежда", "Мужская одежда", "Носки и гетры"],
  "delivery": [{"method": "Курьером Ozon", "date": "Завтра, 6 ноября", "cost": 149}],
  "promo": "Распродажа",
  "other_sellers_count": 2,
  "other_sellers_min_price": 362,
  "status": "ok"
}
```

`price` is the price with Ozon Card (as on the search page), `price_without_card` — without it, `old_price` — the
crossed-out one; `unit_price` — per pair, kg or litre, worked out from the name.

### What you get

- **Search queries** with Ozon's own filters and sorting (price range, delivery speed, brand, seller, rating, discount,
  Ozon fresh, any other Ozon filter by its key).
- **Any Ozon link**: product, search, category, seller, brand, collection, short `ozon.ru/t/…` links.
- **Category tree slice**: walk subcategories and take the first products of each — prices of a whole market.
- **Full product page** (~60 fields): prices with and without Ozon Card, crossed-out price, stock, variants, seller,
  brand, characteristics, description, delivery options and dates, return policy, promo, installment, unit price
  (per piece, kg, l — from the name).
- Optional: Ozon's own **average price for last month**, **other sellers** of the product (price, place by price and
  by delivery speed), **reviews** with the whole reply thread, **questions** with answers, the **whole customer
  photo/video gallery**, **seller profile** (legal name, OGRN, brands, orders, years on Ozon).
- **Several storefronts and cities at once** — one row per product per city; Excel compares prices between
  storefronts and cities.

### Modes

**Mode** (`mode`) chooses what goes into the dataset. Collection is the same in all of them.

- **`products`** (default) — a row per product per city, as described above. Reviews and questions (if asked) are
  inside the product row — up to 1000 reviews and 500 questions per product; for more use `reviews`.
  Charged: `product` (or `search-result` with **Search results only**) per product, plus `review` per review or
  question inside it.
- **`reviews`** — give queries, links or categories; get a row per **review** and per **question** of the products
  found (as many as Ozon shows by default — up to ~3,000 per product: 990 per sort order, all three merged; **Reviews
  per product** limits it; pages go in parallel on several sessions), with the product's SKU, name and link in every
  row, plus a free `product_reviews` summary row per product: rating, reviews in total and collected, stars, aspect
  ratings, questions, customer media. Reviews are the same on ozon.ru and ozon.by — one row per review per run.
  **Only new reviews and questions** (`new_only`) returns only those your previous runs didn't (remembered in the
  history store; a row not delivered because of the spending limit is returned next time). Ozon has no «newest
  first» order for reviews, so `new_only` looks through **Reviews per product** reviews and returns the unseen ones.
  Charged: `review` per review or question row; summary rows and deleted products are free.
- **`offers`** (buy box) — give products; get a row per **seller** of each product: the card's own seller first
  (`is_current_seller`), then every other seller from «cheaper or faster»: their SKU, price, crossed-out price,
  delivery, place by price and by delivery, rating at the seller, «brand's verified seller», legal name, OGRN or
  foreign registration number. Per city, if you give several. Charged: one `product` per product (the first row);
  the other sellers' rows are free.
- **`sellers`** — give links (`urls` only): a shop page, a product page (its seller) or a short link; get a row per
  link with the **seller profile**: name, rating, orders, years on Ozon, legal name, address, OGRN, working hours,
  badges, verified brands; for a product link with **Other sellers** — its `competitors` too. Charged: `seller` per
  profile found; links that are not Ozon links, deleted products and pages that did not open are free rows with a
  `status`.
- **`hotels`** — Ozon Travel (ozon.ru): give links to a hotel search (`/travel/hotels/category/oteli-v-moskve/`) or a
  hotel, and **check-in / check-out** dates with **adults** (without dates — Ozon's «from» price per night). A row per
  hotel: name, stars, rating, reviews, address and distances, coordinates, amenities by group, check-in/out times,
  important info, price calendar, **rooms and rates for your dates** (meal, cancellation, payment, price for the
  stay). **Search results only** — cards without rooms (cheaper). **Nights from run day** — dates relative to the
  run day (check-in **Days ahead** days later) for scheduled runs. Charged: `hotel` per hotel with its page,
  `search-result` per card only, plus `review` per review inside.
- **`hotel_reviews`** — a row per hotel review (all by default; **Hotel review order** — newest first is available
  for hotels) and a free summary row per hotel with Ozon's own **aspect ratings** (location, service, cleanliness,
  value, food — with shares per score). **Only new reviews and questions** works here too: newest first, up to the
  first review your previous runs already returned. Charged: `review` per review row.
- **`flights`** — Ozon Travel flights (ozon.ru): routes in **Flights — routes** (`MOW-LED`, «Москва — Сочи» or a
  flight search link), **Departure date** (and **Return date** for a round trip, or **Departure days from run
  day** for scheduled runs), **Adults**, **Children with a seat**, **Children without a seat**, **Class**, **Only these airlines**. A row per
  flight: departure and arrival (local time), transfers, airlines, flight numbers, aircraft, price for all
  passengers, baggage options, tickets left, badges («The cheapest»); with **Fare options of each flight** — its
  fares. And a free summary row per search: flights found, the cheapest one, a 3-month price calendar.
  Charged: `flight` per flight row.
- **`trains`** — Ozon Travel train tickets (ozon.ru): routes in **Trains — routes** («Москва — Санкт-Петербург»,
  station codes `2000000-2004000` or a train search link), the same **Departure date** / **Return date** (a round
  trip is two searches — there and back) or **Departure days from run day**, passengers (up to 4 with a seat),
  **Only these car types**. A row per train: departure and arrival (local time), stations, travel time, car types
  with free seats and the price per seat (with and without Ozon Bank), badges; with **Cars and seats** — every
  car with class, lower and upper berths and price; with **Train route** — stops. And a free summary row per
  search: trains found, the cheapest seat (also by car type), a price calendar a week before and after the date.
  Charged: `train` per train row.

Single-purpose versions of this Actor (same engine, simpler input): **Ozon Reviews Scraper**, **Ozon Seller
Scraper**, **Ozon Buy Box Scraper**, **Ozon Travel Hotels Scraper**, **Ozon Travel Hotel Reviews Scraper**, **Ozon
Travel Flights Scraper**, **Ozon Travel Train Tickets Scraper**.

### History and changes between runs

With **Price history and changes** on (default), the actor keeps history in a named key-value store in your account
(**History store**, `ozon-history` by default) and reports in `OUTPUT` and in Excel what changed since the previous
run: cheaper / pricier, sold out / back in stock, new in search / dropped out, moved up / down in search, low stock,
cheaper at another seller, sellers joined / left, new cheapest seller, seller changed, rating down, new 1–2 star
reviews (with texts), promo started / ended, «good price» badge, name or photo changed, lowest price in a period,
**fake discount** (crossed-out price above the real one), price target reached.

Schedule the actor (Apify Schedules) and connect a webhook or integration — you get a market monitor.

### Output

- **Dataset** — in mode `products` products, one item per product per city (`storefront`, `city`, `source` — the query
  or link, `position` — place in it, `sku`, `name`, prices, `stock`, `seller`, …); in other modes — see «Modes»
  (every row has `type`). Views: «Overview», «Reviews and questions», «Offers of all sellers», «Seller profiles».
- **Key-value store**: `OUTPUT` — `mode`, `rows` (dataset rows put), `products` (in `products` — products put, in other
  modes — products or links processed), `changes` (all changes since the last run), `categories`
  (category slice) and `excel` — link to `results.xlsx`: «Summary», «Products», «Changes», «Price history» (price in
  every run), «Stock» (with a sales estimate), «Positions» (places in search), «Market» (min / median / max of every
  search; «search got cheaper / pricier» and «fewer in stock» when the median or the in-stock share moves by
  `alert_market_percent`), «Storefronts» and «Cities» (price comparison), «Categories» and more — with charts.
- **Output language** (`output_language`, English by default, or Russian): Excel and CSV sheets and columns, change
  details, run status and log. Ozon's own data — product names, characteristics, reviews — comes in the site
  language (**Language**: `en` asks Ozon to translate product names).

### Proxy

Ozon lets in ozon.by only from Belarus and ozon.kz only from Kazakhstan. Proxies of the storefront's country are
built in and included in the price — you don't need your own. You can still give your own proxy for any storefront
(`user:pass@host:port`, one per line). Every user gets the same proxy lines from run to run, so Ozon sessions saved
in the history store keep working: a repeat run starts without opening a browser.

### Speed

**Sessions per storefront** (default 8, up to 32): several anonymous Ozon buyers collect at the same time, each with
its own proxy, city, language and currency. Product pages open as soon as search results arrive. Sessions are kept
in the history store between runs, so a browser opens for a new one only once (a repeat run of 16 products takes
\~17 s); if Ozon starts refusing, the actor slows down by itself. **Browsers at once** (default 3) — capped by run
memory: 1 GB — 1, 2 GB — 3, 4 GB — 7.

### Pricing

Pay per result — current prices (the **Pricing** tab always has the up-to-date ones):

| Event | Price | What it is |
|---|---|---|
| `product` | $3.99 / 1,000 | a product with its page (mode `products`; in mode `offers` — a product with all its sellers) |
| `search-result` | $1.59 / 1,000 | a row from search results only (**Search results only**) |
| `review` | $1.99 / 1,000 | a review or a question (inside a product row or a row of its own) |
| `seller` | $3.99 / 1,000 | a seller profile (mode `sellers`) |
| `hotel` | $3.19 / 1,000 | a hotel with its page: rooms and rates (mode `hotels`) |
| `flight` | $1.99 / 1,000 | a flight row (mode `flights`) |
| `train` | $1.99 / 1,000 | a train row (mode `trains`) |
| Actor start | $0.0072 | once per run; Apify counts one start per GB of memory — $0.0144 at the default 2 GB |

For example, 500 products with full pages in one city cost about $2.00 + $0.0144 for the start; the same 500 as
search rows — about $0.80.

Every city counts as a separate product. Rows for deleted products and pages that did not open (**Report unavailable
product links**), summary rows of modes `reviews`, `hotel_reviews`, `flights`, `trains` and the other sellers' rows of
mode `offers` are free. You are never charged above the max total charge of the run: a row that costs more than what
is left is not put, and the actor stops collecting early so as not to scrape what it could not deliver.

### Good to know

- Prices are public guest prices (no Ozon account), in the **Currency** you choose: RUB by default on all
  storefronts (Ozon converts — handy for comparing), or BYN / KZT for local prices of ozon.by / ozon.kz.
- City names and Ozon's own texts (categories, characteristics, reviews) stay as Ozon gives them; dataset field
  names are in English.
- Ozon Travel (hotels, flights, trains) is on ozon.ru only.
- One history store serves one run at a time: a run started while another one uses the same **History store** waits
  up to 10 minutes and then fails. For parallel runs (different tasks, different queries) give each its own store.
- The first run takes longer: new Ozon sessions are opened by a real browser (~10–30 s each). Next runs reuse them.
- Run memory — 2 GB by default (three browsers at once for new Ozon sessions); 1 GB works too, but the first run
  is slower. Up to 4 GB.

***

### По-русски

Публичные данные Озона: поиск с фильтрами Озона, любые ссылки, срез по дереву категорий — на ozon.ru, ozon.by и
ozon.kz за один запуск, в 91 городе. Главное — история между запусками: что изменилось с прошлой проверки (цена,
остаток, место в выдаче, продавцы, рейтинг, плохие отзывы, акции, завышенная скидка, цель по цене). Результат — датасет
товаров, `OUTPUT` с изменениями и Excel с графиками. Прокси страны витрины — встроены (входят в цену), можно и свои.
Excel, лог и статус — по-английски или по-русски (**Output language** = `ru`).

Как запустить: впишите слова поиска, ссылки Озона или ссылки на категории, выберите витрины и города, запустите;
поставьте в расписание Apify — каждый следующий запуск покажет, что изменилось.

Режимы (`mode`):

- `products` (по умолчанию) — строка на товар и город; отзывы и вопросы — внутри строки (до 1000 и 500 на товар).
  Списание — `product` (или `search-result` в режиме выдачи) и `review` за каждый отзыв и вопрос.
- `reviews` — строка на каждый отзыв и вопрос найденных товаров (по умолчанию — все) и бесплатная сводка по товару
  (`product_reviews`). `new_only` — только те, что прошлые запуски не отдавали (помнит хранилище истории). Сортировки
  «сначала новые» у Озона нет — `new_only` просматривает **Reviews per product** отзывов и отдаёт невиденные.
  Списание — `review` за строку.
- `offers` (байбокс) — строка на каждого продавца товара: продавец карточки первым, дальше — все из «Есть дешевле или
  быстрее» (цена, срок, места по цене и по сроку, юрлицо, ОГРН). Списание — один `product` на товар.
- `sellers` — только ссылки: магазин, товар (его продавец) или короткая; строка — профиль продавца (рейтинг, заказы,
  юрлицо, адрес, ОГРН, бренды), у товара с **Other sellers** — ещё `competitors`. Списание — `seller` за найденный
  профиль; не ссылка на Озон, удалённый товар, не открылось — бесплатно, со `status`.
- `hotels` — отели Ozon Travel (ozon.ru) по ссылке на выдачу или отель, с датами и гостями: номера и тарифы на даты,
  удобства, заезд и выезд. Списание — `hotel` за отель со страницей (`search-result` — только карточка).
- `hotel_reviews` — строка на отзыв отеля (есть «сначала новые») и бесплатная сводка с оценками по пунктам от Озона.
  Списание — `review`.
- `flights` — авиабилеты Ozon Travel: маршруты (`MOW-LED`, «Москва — Сочи», ссылка на поиск), даты (или от дня
  запуска), пассажиры и класс; строка на рейс (вылет, прилёт, пересадки, авиакомпании, цена за всех, багаж) и
  бесплатная сводка по поиску (сколько рейсов, самый дешёвый, календарь цен). Списание — `flight` за рейс.
- `trains` — ж/д билеты Ozon Travel: маршруты («Москва — Санкт-Петербург», коды станций, ссылка на поиск), те же
  даты (туда-обратно — два поиска) и пассажиры, типы вагонов; строка на поезд (отправление, прибытие, вокзалы,
  типы вагонов со свободными местами и ценой за место; с «Вагоны и места» — нижние и верхние в каждом вагоне) и
  бесплатная сводка по поиску (сколько поездов, самое дешёвое место, по типам вагонов, календарь цен). Списание —
  `train` за поезд.

Цены (на вкладке **Pricing** — всегда актуальные): товар — $3,99 за 1000, строка выдачи — $1,59, отзыв — $1,99,
продавец — $3,99, отель — $3,19, рейс и поезд — $1,99; запуск — $0,0072 за каждый ГБ памяти.

# Actor input Schema

## `mode` (type: `string`):

What goes into the dataset.
• products — a row per product (price, stock, seller, ~60 fields); reviews and questions inside it, up to 1000 / 500.
• reviews — a row per review and per question of the products found (by default as many as Ozon shows — up to ~3,000 per product; «Reviews per product» limits it; questions — with «Questions per product»), plus a free summary row per product.
• sellers — a seller profile per link (urls only): a shop link or a product link (its seller): legal name, OGRN, rating, orders, brands; with «Other sellers» — the product's competitors too.
• offers — a row per seller of each product (buy box): price, delivery, position by price and by delivery, seller's legal info; one charge per product.
• hotels — Ozon Travel hotels (ozon.ru): give links (urls) to a hotel search (/travel/hotels/category/oteli-v-moskve/) or a hotel; a row per hotel: stars, rating, address, coordinates, amenities, check-in/out times, rooms and rates for your dates (meal, cancellation, payment, price for the stay), price calendar. «Search results only» — cards without rooms (cheaper).
• hotel_reviews — a row per hotel review (all by default) and a free summary row per hotel with Ozon's aspect ratings (location, cleanliness…).
• flights — Ozon Travel flights (ozon.ru): routes in «Flights» (MOW-LED, «Москва — Сочи» or a flight search link from the site), your dates and passengers; a row per flight: departure and arrival (local time), transfers, airlines, flight numbers, aircraft, price for all passengers, baggage options, tickets left — plus a free summary row per search: how many flights Ozon found, the cheapest one, a 3-month price calendar.
• trains — Ozon Travel train tickets (ozon.ru): routes in «Trains» («Москва — Санкт-Петербург», station codes 2000000-2004000 or a train search link from the site), your dates and passengers; a row per train: departure and arrival (local time), stations, travel time, car types with free seats and the price «from» (per seat, with and without Ozon Bank), badges (fast, branded, cheapest); with «Cars and seats» — every car: class, free lower and upper berths, price; with «Train route» — stops. Plus a free summary row per search: how many trains, the cheapest seat, cheapest by car type, a price calendar (a week before and after). Round trip — two searches.

## `queries` (type: `array`):

Words to search on Ozon, one per line: «носки», «iphone 17». Filters below apply to them.

## `urls` (type: `array`):

Any Ozon page: a product, search, category, seller, brand, collection or short ozon.ru/t/… link. Links from ozon.ru open on ozon.by and ozon.kz too.

## `filters` (type: `object`):

Filters for search queries, as on the Ozon search page: sorting (score, new, price, price_desc, rating, discount), price_min, price_max, delivery (today, tomorrow, 3_days, 7_days), weight_min, weight_max, category ("supermarket-25000" — Ozon fresh), brands, sellers (ids), high_rating, discounted, new, bestsellers, brand_certified, official_store, premium_sellers, made_in_russia, installment, sale, and any other Ozon filter by its key in "other".

## `categories` (type: `array`):

Category links: the actor walks the subcategory tree and takes the first products of every lowest category — a price slice of a whole market.

## `category_depth` (type: `integer`):

How many subcategory levels to walk down.

## `category_products` (type: `integer`):

How many first products (as Ozon sorts them) to take from every lowest category.

## `storefronts` (type: `array`):

ozon.ru, ozon.by, ozon.kz — all in one run, side by side (sheet «Storefronts» compares prices).

## `cities` (type: `array`):

Prices and delivery depend on the city. One list for all storefronts: 76 Russian cities («Москва», «Санкт-Петербург», «Казань»…), 6 in Belarus («Минск», «Гомель»…), 9 in Kazakhstan («Астана», «Алматы»…) — names in Russian, as on Ozon. A storefront without its own city here uses its capital. One row per product per city.

## `language` (type: `string`):

Product names and texts are translated by Ozon; reviews stay as written.

## `output_language` (type: `string`):

Language of the Excel workbook, CSV, change details, run status and log. Ozon's own data (product names, characteristics, reviews) comes in the site language (the Language field).

## `currency` (type: `string`):

One for all storefronts. Use one currency (e.g. RUB) to compare storefronts; BYN / KZT — local prices of ozon.by / ozon.kz.

## `max_results` (type: `integer`):

0 — all. Also limited by your max total charge for the run.

## `new_only` (type: `boolean`):

Modes reviews and hotel_reviews: rows only for reviews (and questions) not returned by your previous runs (they are remembered in the history store). Products: «Reviews per product» is how many to look through; hotels: newest first, up to the first review already returned.

## `skip_details` (type: `boolean`):

Only cards from search results: price, rating, reviews, badges, delivery date. Without it every product page is opened: ~60 fields — stock, seller, variants, characteristics, description, delivery options, return policy…

## `light_details` (type: `boolean`):

Full mode, but from the product page only its main part: price, stock, seller, rating, promo, variants — without characteristics, description and delivery. 1 request per product instead of 3.

## `page_every_hours` (type: `integer`):

Repeated checks: a product page is reopened only if its search card changed (price, availability, rating, reviews, stock) or the last open was N+ hours ago; otherwise the page from the last check is used (0 — always open).

## `price_split` (type: `boolean`):

Every search is collected in parts by price (the ranges Ozon suggests for it, each halved), all at once — much faster and deeper for big searches. Source is «query · from–to», places and max results are per part.

## `report_unavailable` (type: `boolean`):

For product links: a row even if the product is sold out, deleted or its page did not open (status). Deleted and failed rows are free.

## `include_other_sellers` (type: `boolean`):

All other sellers of the product with prices, place by price and by delivery speed, rating of the product at each seller. +2 requests per product.

## `include_month_average` (type: `boolean`):

From the «Price dropped» window — and with it «fake discount» detection.

## `reviews_count` (type: `integer`):

0 — none. 30 per page, pages in parallel on several sessions; Ozon shows up to ~3,000 per product. From 1 — also star distribution and «new bad reviews» with texts.

## `reviews_sort` (type: `string`):

Which reviews come first.

## `reviews_replies` (type: `boolean`):

The whole reply thread under each review: the shop and buyers. +1 request per review with replies.

## `questions_count` (type: `integer`):

0 — none. Questions with all answers, 10 per request.

## `media_count` (type: `integer`):

0 — none. The whole review gallery, 100 per request.

## `include_seller_details` (type: `boolean`):

Legal name, address, OGRN, working hours, brands, orders, rating, years on Ozon. +2 requests per new seller.

## `my_skus` (type: `array`):

Products whose place in every search and list you want to know — looked for beyond «Products per query», up to «Pages to look for them». Example: \[211356510].

## `my_skus_pages` (type: `integer`):

How many search pages to look through for tracked products.

## `track_prices` (type: `boolean`):

Keep history between runs (in your named key-value store, see «History store») and report what changed since the last run: price, stock, place in search, new and dropped products, sellers, rating, bad reviews, promo, name, photo, lowest price in a period, fake discount, price target reached. Schedule the actor to monitor.

## `dynamics_checks` (type: `integer`):

Excel sheets «Dynamics», «Stock», «Positions», «Market» show the last N runs (0 — no sheets).

## `alert_positions` (type: `integer`):

Report a move in search results of at least this many places (0 — off).

## `alert_stock` (type: `integer`):

Report when stock falls below this many items (0 — off).

## `alert_other_sellers` (type: `number`):

Report when another seller is cheaper by at least this many % (0 — off).

## `price_period_days` (type: `integer`):

«Lowest price in the period» and the real price for «fake discount» look this many days back (0 — off).

## `alert_fake_discount` (type: `number`):

The crossed-out price is above the real one (the highest of the period, or Ozon's average for last month) by at least this many % (0 — off).

## `alert_market_percent` (type: `number`):

«Listing got cheaper / pricier» — the median price of a search, list or category moved, «fewer in stock in the listing» — at least this many % since the last check (listings with 5+ products in stock; 0 — off).

## `price_targets` (type: `object`):

SKU -> price (with Ozon Card, in the run currency). Reported once when the price falls to it. Example: {"211356510": 180}.

## `save_results` (type: `boolean`):

results.xlsx in the run's key-value store: products, changes, dynamics, stock and sales estimate, positions, market, storefronts, cities, categories — with charts.

## `check_in` (type: `string`):

Mode hotels and hotel_reviews: YYYY-MM-DD. With check-in and check-out — rates and prices for the whole stay; without — Ozon's «from» price per night.

## `check_out` (type: `string`):

YYYY-MM-DD, after check-in.

## `hotel_nights` (type: `integer`):

Instead of fixed dates — for scheduled runs: check-in «Days ahead» days after the run day, for this many nights (each run looks at «a week ahead, 2 nights»). 0 — dates from check-in / check-out.

## `hotel_days_ahead` (type: `integer`):

With «Nights from run day»: check-in this many days after the run day.

## `adults` (type: `integer`):

Guests for hotel prices and rates.

## `hotel_reviews_sort` (type: `string`):

Hotels have «newest first» (created_at_desc), unlike products.

## `flights` (type: `array`):

Mode flights: one route per line — IATA codes of cities or airports (MOW-LED, LED-AER) or city names («Москва — Санкт-Петербург»: the site finds the code), or a flight search link from ozon.ru/travel (it keeps its own dates, passengers and class). Flights per search — «Products per query or link».

## `departure_date` (type: `string`):

YYYY-MM-DD. Needed for routes of flights and trains (links have their own dates).

## `return_date` (type: `string`):

YYYY-MM-DD, a round trip (trains: a second search back); empty — one way.

## `departure_days_ahead` (type: `integer`):

Instead of fixed dates — for scheduled runs: departure this many days after the run day (each run looks at «a week ahead»). 0 — the departure date above; if the departure date is set, it wins.

## `return_after_days` (type: `integer`):

With «Departure days from run day»: return this many days after departure (0 — one way).

## `passengers` (type: `integer`):

Passengers 12 and older (trains: 10 and older). Flight prices are for all passengers, train prices are per seat. Trains: up to 4 with a seat.

## `children` (type: `integer`):

Flights: 2–12 years, adults and children — up to 9. Trains: under 10, adults and children — up to 4.

## `infants` (type: `integer`):

Flights: under 2, trains: under 5. Not more than adults.

## `service_class` (type: `string`):

Cabin class of the search: economy and comfort, business or first.

## `flight_airlines` (type: `array`):

IATA airline codes: SU, S7, DP. Empty — all airlines.

## `flight_sorting` (type: `string`):

Which flights come first (and are taken when «Products per query or link» limits them). The cheapest price of a search is taken among all flights received: with «Best first» and «Cheapest first» the cheapest one is always among the first 100; with other orders set «0 — all» to be sure.

## `flight_tariffs` (type: `boolean`):

Opens the «Choose a fare» window of every flight: fares with price, baggage, exchange, refund, seat choice, miles. +1 request per flight, so up to 20 flights per route.

## `trains` (type: `array`):

Mode trains: one route per line — city or station names in Russian («Москва — Санкт-Петербург»: the site finds the station codes), «Express» station codes (2000000-2004000) or a train search link from ozon.ru/travel/railway (it keeps its own date, passengers and car types). Dates and passengers — the same fields as for flights; a return date — one more search back. Trains per search — «Products per query or link».

## `train_car_types` (type: `array`):

Only trains with these cars, and the cheapest seat — among them. Empty — any cars.

## `train_sorting` (type: `string`):

Which trains come first (and are taken when «Products per query or link» limits them). All trains come at once — the cheapest seat of a search is always among all of them.

## `train_routes` (type: `boolean`):

Opens the «Train route» window of every train: stops with arrival and departure times, stop duration, carrier, e-registration. +1 request per train, so up to 20 trains per search.

## `train_cars` (type: `boolean`):

Opens the «Choose a car and seats» window of every train: each car with its number, class («3Б», «2К»…), free seats, lower and upper berths, price with and without Ozon Bank, services. +2 requests per train, so up to 20 trains per search; not for trips with a transfer.

## `sessions` (type: `integer`):

Anonymous Ozon buyers working at the same time on each storefront, each with its own proxy session: 2 — about twice as fast as 1. Sessions are kept in the history store, so a browser opens for a new one only once.

## `browsers` (type: `integer`):

A browser (~320 MB) opens only to get a new Ozon session (they are kept in the history store, so mostly on the first run). Several at once — the first run starts faster. Capped by run memory: 1 GB — 1, 2 GB — 3, 4 GB — 7.

## `history_store` (type: `string`):

Name of the key-value store in your account that keeps price history between runs. Different names — separate histories. Runs with the same store don't overlap: a second one waits up to 10 minutes for the first to finish.

## `proxy_ru` (type: `string`):

user:pass@host:port, residential, Russia — one per line: every Ozon session gets its own (one line — all sessions share it). Empty — the actor's built-in proxies of this country (included in the price).

## `proxy_by` (type: `string`):

Belarus, one per line. ozon.by lets in only Belarusian IPs. Empty — the actor's built-in proxies of this country (included in the price).

## `proxy_kz` (type: `string`):

Kazakhstan, one per line. Empty — the actor's built-in proxies of this country (included in the price).

## Actor input object example

```json
{
  "mode": "products",
  "queries": [
    "носки"
  ],
  "urls": [],
  "filters": {
    "sorting": "score"
  },
  "categories": [],
  "category_depth": 1,
  "category_products": 10,
  "storefronts": [
    "ru"
  ],
  "cities": [
    "Москва"
  ],
  "language": "ru",
  "output_language": "en",
  "currency": "RUB",
  "max_results": 5,
  "new_only": false,
  "skip_details": false,
  "light_details": false,
  "page_every_hours": 0,
  "price_split": false,
  "report_unavailable": false,
  "include_other_sellers": false,
  "include_month_average": false,
  "reviews_count": 0,
  "reviews_sort": "usefulness_desc",
  "reviews_replies": false,
  "questions_count": 0,
  "media_count": 0,
  "include_seller_details": false,
  "my_skus": [],
  "my_skus_pages": 10,
  "track_prices": true,
  "dynamics_checks": 30,
  "alert_positions": 5,
  "alert_stock": 10,
  "alert_other_sellers": 5,
  "price_period_days": 30,
  "alert_fake_discount": 10,
  "alert_market_percent": 10,
  "price_targets": {},
  "save_results": true,
  "hotel_nights": 0,
  "hotel_days_ahead": 1,
  "adults": 2,
  "hotel_reviews_sort": "usefulness_desc",
  "flights": [],
  "departure_days_ahead": 0,
  "return_after_days": 0,
  "passengers": 1,
  "children": 0,
  "infants": 0,
  "service_class": "economy",
  "flight_airlines": [],
  "flight_sorting": "best",
  "flight_tariffs": false,
  "trains": [],
  "train_car_types": [],
  "train_sorting": "departure",
  "train_routes": false,
  "train_cars": false,
  "sessions": 8,
  "browsers": 3,
  "history_store": "ozon-history"
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset rows: products, reviews, sellers, offers, hotels, flights or trains — depending on the mode.

## `summary` (type: `string`):

OUTPUT record: how many rows were delivered and every change since the previous run.

## `excel` (type: `string`):

results.xlsx with sheets and charts (modes products, reviews and offers).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "носки"
    ],
    "filters": {
        "sorting": "score"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("theshark/ozon-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["носки"],
    "filters": { "sorting": "score" },
}

# Run the Actor and wait for it to finish
run = client.actor("theshark/ozon-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "носки"
  ],
  "filters": {
    "sorting": "score"
  }
}' |
apify call theshark/ozon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,theshark/ozon-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/98cAGE9ELOqKJLCKO/builds/acNMo8SVTD5i0Cy2p/openapi.json
