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

Every seller of an Ozon product — the buy box: price, crossed-out price, delivery, place by price and by delivery, rating at the seller, legal info; in any of 91 cities.

- **URL**: https://apify.com/theshark/ozon-buybox-scraper.md
- **Developed by:** [TheShark](https://apify.com/theshark) (community)
- **Categories:** E-commerce, 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 product checks

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 Buy Box Scraper — every seller of a product, price and delivery

See **who sells an Ozon product and for how much**: the card's own seller and every other seller from «cheaper or
faster» — price with Ozon Card, crossed-out price, delivery date, **place by price and by delivery**, rating of the
product at that seller, «brand's verified seller», legal name and OGRN. In any of **91 delivery cities** and on
ozon.ru, ozon.by and ozon.kz. No Ozon account needed.

### Why this Actor

- **Every seller, not the first five.** Ozon's «cheaper or faster» window is read whole — 45 sellers for a pair of
  socks, 189 for a pack of coffee.
- **Two rankings** — place by price and place by delivery speed, as Ozon sorts them.
- **Changes between runs.** Who joined, who left, the new cheapest seller, whether the card's seller changed.
- **Cities matter** — delivery dates and prices are per city; give several and compare.
- **Pay per product**, not per seller row.

### What you can use it for

- **Buy box monitoring** — who is the cheapest seller of your products today, and since when.
- **Price policy control for brands** — sellers below the recommended price, and who they are legally.
- **Delivery competitiveness** — whose delivery is the fastest in Moscow, Kazan or Novosibirsk.

### How to use

1. Paste **product links** (or search words, a category — its first products).
2. Choose **Storefronts** and **Cities**.
3. Run it — a row per seller per product appears in the dataset; Excel («Other sellers», «Changes») is in the
   key-value store.
4. Schedule it to see who joined, left or became the cheapest.

### Input example

```json
{
  "urls": ["https://www.ozon.ru/product/4831504259/"],
  "storefronts": ["ru"],
  "cities": ["Москва", "Санкт-Петербург"]
}
```

### Output example

The cheapest of 45 sellers of a product, from a real run (trimmed):

```json
{
  "type": "offer",
  "city": "Москва",
  "product_sku": 4831504259,
  "product_name": "Носки женские, 5 пар",
  "sellers_total": 45,
  "is_current_seller": false,
  "position": 1,
  "delivery_position": 21,
  "sku": 5517880430,
  "price": 158,
  "old_price": null,
  "currency": "RUB",
  "delivery": "Доставим 22 ноября",
  "seller_name": "DEMURE",
  "seller_url": "https://www.ozon.ru/seller/4445925/",
  "legal_name": "Wuhanshijianganqushanshuiwandianzishangwuyouxiangongsi",
  "address": "XIAMENSHIRUIFENGLI, CN, Xiamen"
}
```

### What you get

A row per seller per product (`type = offer`): `product_sku`, `product_name`, `product_url`, `product_image`,
`storefront`, `city`, `sellers_total`, `is_current_seller` (the card's seller — first row), `position` (place by price
among all sellers), `delivery_position`, `sku` (each seller has its own), `url`, `price`, `old_price`, `currency`,
`delivery`, `rating`, `reviews_count`, `brand_seller`, `seller_name`, `seller_id`, `seller_url`, `legal_name`,
`ogrn`, `registration_number`, `address`, `working_hours`.

**Seller history and changes** (on by default): the Actor remembers sellers between runs and reports in `OUTPUT` and
Excel who joined, who left, the new cheapest seller and whether the card's seller changed — schedule it and you get a
buy box monitor.

### Pricing

| Event | Price | What it is |
|---|---|---|
| `product` | $3.99 / 1,000 | a product with all its sellers (the first row; the other sellers' rows are free) |
| Actor start | $0.0016 | once per run, per GB of memory |

For example, 100 products in one city cost $0.40, however many sellers they have. Every city counts as a separate
product. The **Pricing** tab always has the up-to-date prices.

### Good to know

- `rating` and `reviews_count` in a seller row are the product's rating **at that seller**, as Ozon shows it.
- Some sellers have no Ozon Card price — then `price` is their regular price and `old_price` the crossed-out one.
- The history lives in a named key-value store (**History store**) in your account; one store serves one run at a
  time.

***

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

Все продавцы товара Озона (байбокс): продавец карточки и все из «Есть дешевле или быстрее» — цена с картой,
зачёркнутая, срок, место по цене и по сроку, рейтинг товара у продавца, юрлицо и ОГРН. В любом из 91 города, на
ozon.ru, ozon.by и ozon.kz. История продавцов между запусками: кто пришёл, кто ушёл, кто стал дешевле всех.
Цена — $3,99 за 1000 товаров (один `product` за товар со всеми продавцами).

# Actor input Schema

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

Products whose sellers to collect. Search, category, seller and brand links work too — their first products (Products per query or link).

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

Words to search on Ozon: sellers of the products found.

## `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.

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

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

## `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.

## `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.

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

Remember sellers between runs: who joined, who left, new cheapest seller, card seller changed — in OUTPUT and Excel.

## `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.

## `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).

## `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
{
  "urls": [
    "https://www.ozon.ru/product/4831504259/"
  ],
  "queries": [],
  "filters": {
    "sorting": "score"
  },
  "categories": [],
  "category_depth": 1,
  "category_products": 10,
  "max_results": 5,
  "storefronts": [
    "ru"
  ],
  "cities": [
    "Москва"
  ],
  "currency": "RUB",
  "track_prices": true,
  "save_results": true,
  "output_language": "en",
  "sessions": 8,
  "browsers": 3,
  "history_store": "ozon-buybox-history"
}
```

# Actor output Schema

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

Dataset rows.

## `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.

# 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 = {
    "urls": [
        "https://www.ozon.ru/product/4831504259/"
    ],
    "filters": {
        "sorting": "score"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("theshark/ozon-buybox-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 = {
    "urls": ["https://www.ozon.ru/product/4831504259/"],
    "filters": { "sorting": "score" },
}

# Run the Actor and wait for it to finish
run = client.actor("theshark/ozon-buybox-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 '{
  "urls": [
    "https://www.ozon.ru/product/4831504259/"
  ],
  "filters": {
    "sorting": "score"
  }
}' |
apify call theshark/ozon-buybox-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,theshark/ozon-buybox-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/bPeTLV2yC5kMGHtjO/builds/zsXETghJZhl66SV8J/openapi.json
