# Ozon.ru Product Pricing, Ratings & Seller Scraper (`vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-scraper`) Actor

Search, browse categories, or fetch full product details from Ozon.ru with pricing, discount, rating breakdown, seller profile, spec, and variant data via a required Russian residential proxy.

- **URL**: https://apify.com/vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-scraper.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.ru Product Pricing, Ratings & Seller Scraper

Scrape **Ozon** — one of Russia's largest marketplaces — for products, prices, sellers, reviews, and buyer questions. Five modes cover keyword search, category browsing, product lookup by URL or SKU, seller storefronts, and review/Q\&A collection. Prices follow the selected storefront (RUB, BYN, or KZT), and every record is ready for price monitoring, assortment analysis, seller vetting, and catalog enrichment.

### What this actor does

- **Five modes:** `search`, `byCategory`, `productDetails`, `seller`, `reviews`
- **Three storefronts:** Ozon Russia (RUB), Belarus (BYN), Kazakhstan (KZT)
- **Product depth:** description, full specification table, package contents, variants, gallery, videos, hashtags, rating distribution, and availability
- **Seller intelligence:** legal entity, registration number, address, years on Ozon, premium status, confirmed brands, catalog products, and competing buybox offers
- **Reviews and Q\&A:** review text, rating, author, date, photos, videos, helpful votes, verified-purchase flag, seller replies, plus buyer questions with answers
- **Filters and sorts:** price range, minimum rating, in-stock only, and six listing sort orders
- **Empty fields are omitted** — records contain only data that was actually found

### Services

- **Product search and category scraping** — collect listing rows with live price, discount, rating, review count, image, stock, and delivery estimate.
- **Full product cards** — enrich any product with specifications, description, variants, seller details, and the complete buybox.
- **Seller monitoring** — read a seller's public profile, legal identity, and catalog in one run.
- **Review and Q\&A collection** — build voice-of-customer datasets with review media and seller responses.
- **Cross-market pricing** — compare the same marketplace across Russia, Belarus, and Kazakhstan in local currency.

### How it works

Ozon publishes its storefront data as a public widget tree. The actor reads that public data through a translation mirror, so no Ozon account, cookie, login, API key, or proxy setup is required. Listings are followed with Ozon's own pagination tokens, not hand-built page numbers. Product details combine the main product page, the description/specification page, and the reviews page. Reviews are collected 30 rows per page and buyer questions 10 rows per page, following the site's own next-page tokens until `maxReviewsPerProduct` (reviews) or `maxItems` (questions) is reached. Duplicate products and duplicate review/question rows are removed by their natural identifiers.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `productDetails` / `seller` / `reviews` |
| `searchQueries` | array | `["iphone"]` | Keywords for search mode |
| `categoryUrls` | array | – | Category or brand URLs/slugs for byCategory mode |
| `productUrls` | array | – | Product URLs, short links, or numeric SKUs for productDetails/reviews |
| `sellerUrls` | array | – | Seller URLs, slugs, or IDs for seller mode |
| `sortBy` | string | `relevance` | `relevance` / `price_asc` / `price_desc` / `rating` / `new` / `discount` |
| `sortReviews` | string | `usefulness_desc` | `usefulness_desc` / `score_desc` / `score_asc` |
| `storefront` | string | `ru` | `ru` (RUB) / `by` (BYN) / `kz` (KZT) |
| `minPrice` | integer | 0 | Drop products below this local-currency price |
| `maxPrice` | integer | – | Drop products above this local-currency price |
| `minRating` | number | – | Drop products below this rating (0-5) |
| `inStockOnly` | boolean | `false` | Keep only available products |
| `maxItems` | integer | `50` | Hard cap on emitted records (1-1000) |
| `maxReviewsPerProduct` | integer | `30` | Review rows per product; `0` collects only questions |
| `includeProductDetails` | boolean | `false` | Enrich search/category rows with the full product card |
| `includeOtherSellers` | boolean | `false` | Add competing seller offers (buybox) |
| `includeSellerDetails` | boolean | `false` | Add seller legal details to product rows |
| `includeSellerProducts` | boolean | `true` | Emit the seller catalog in seller mode |
| `includeQuestions` | boolean | `false` | Add buyer questions and answers in reviews mode |

#### Example: search with filters

```json
{
  "mode": "search",
  "searchQueries": ["робот-пылесос", "кофемашина"],
  "sortBy": "price_asc",
  "minRating": 4.2,
  "maxItems": 40,
  "storefront": "ru"
}
```

#### Example: product details with seller and buybox

```json
{
  "mode": "productDetails",
  "productUrls": [
    "https://www.ozon.ru/product/apple-smartfon-iphone-15-5728498907/",
    "1681720398"
  ],
  "includeSellerDetails": true,
  "includeOtherSellers": true
}
```

#### Example: seller profile and catalog

```json
{
  "mode": "seller",
  "sellerUrls": ["https://www.ozon.ru/seller/dubaidutyfree/"],
  "sortBy": "price_desc",
  "maxItems": 25,
  "includeSellerProducts": true
}
```

#### Example: reviews and buyer questions

```json
{
  "mode": "reviews",
  "productUrls": ["5728498907"],
  "maxReviewsPerProduct": 60,
  "sortReviews": "score_desc",
  "includeQuestions": true,
  "maxItems": 100
}
```

### Output

One dataset holds four record types, distinguished by `recordType`. Actor views provide product, seller, review, and question table layouts; filter on `recordType` to isolate one type.

#### Product rows (`recordType: "product"`)

- `sku`, `name`, `productUrl`, `imageUrl`, `images[]`, `videos[]`
- `brand` — only when Ozon publishes an explicit brand value
- `price`, `originalPrice`, `discountPercent`, `cardPrice`, `currency`, `storefront`
- `rating`, `reviewCount`, `ratingBreakdown[]` — star buckets with count and percentage
- `sellerName`, `sellerUrl`, `sellerRating`, `sellerOrdersCount`
- `sellerId`, `sellerLegalName`, `sellerRegistrationNumber`, `sellerAddress`, `sellerYearsOnOzon`, `sellerIsPremium`, `sellerConfirmedBrands[]` (when seller details are enabled)
- `otherSellers[]`, `otherSellersCount`, `otherSellersMinPrice` (when buybox is enabled)
- `category`, `breadcrumbs[]`
- `characteristics` — full specification table when available, otherwise the short product panel
- `characteristicsCount`, `description`, `packageContents`, `hashtags[]`
- `variants[]` — other colors/configurations with their own SKU, price, URL, and availability
- `questionCount`, `similarProducts[]`, `marketingLabels[]`
- `availability`, `availabilityText`, `unitsLeft`, `stockQuantity`, `deliveryText`, `deliveryInfo`
- `recordType`, `scrapedAt`

#### Seller rows (`recordType: "seller"`)

- `sellerId`, `name`, `url`, `logoUrl`, `storefront`
- `rating`, `reviewsCount`, `ordersCount`, `yearsOnOzon`, `isPremium`
- `legalName`, `registrationNumber`, `address`, `operatingHours`, `confirmedBrands[]`
- `catalogProducts`, `scrapedAt`

#### Review rows (`recordType: "review"`)

- `reviewId`, `sku`, `productUrl`
- `rating`, `authorName`, `publishedAt`
- `comment`, `pros`, `cons` (pros/cons are usually absent in current Ozon reviews)
- `photos[]`, `videos[]`
- `usefulCount`, `notUsefulCount`, `isPurchaseVerified`
- `commentsCount`, `sellerResponse`, `badgeDelivery`
- `recordType`, `scrapedAt`

#### Question rows (`recordType: "question"`)

- `questionId`, `sku`, `productUrl`
- `text`, `authorName`, `createdAt`, `likes`, `dislikes`
- `answers[]` — each with `authorName`, `createdAt`, `text`, `likes`, `dislikes`, and `isBestAnswer`
- `recordType`, `scrapedAt`

### Use cases

- **Price monitoring** — track product, card, and original prices across three Ozon storefronts.
- **Market and assortment research** — compare categories, brands, ratings, and discount depth.
- **Seller vetting** — collect legal identity, order history, and confirmed brands before partnering.
- **Competitive intelligence** — see which sellers hold the buybox and at what delivered price.
- **Voice of customer** — export review text, media, and buyer questions for product teams.
- **Catalog enrichment** — fill your own listings with structured specifications and variants.

### Usage cost

This actor uses standard Apify platform usage and does not add per-event charges. A typical search run reads one listing page per batch of results; enabling product details, buybox, seller details, or reviews adds one or more page reads per product. Keep `maxItems` and `maxReviewsPerProduct` close to what you need.

### FAQ

**Do I need an Ozon account, cookies, or a proxy?** No. The actor reads Ozon's public storefront data without credentials, and you do not configure any proxy.

**What is the difference between `price` and `cardPrice`?** `price` is the regular selling price and `cardPrice` is the lower Ozon Card price when the product page shows one.

**Why is `brand` sometimes missing?** Ozon often shows a trust badge such as "Оригинал" instead of a real brand name. The actor only emits `brand` when Ozon publishes an explicit brand value and never guesses it from the title.

**Why is `deliveryInfo` often missing while `deliveryText` appears?** Product pages frequently carry an empty delivery widget. `deliveryText` comes from a visible listing or buybox estimate; `deliveryInfo` only appears when the product page itself publishes delivery text.

**Why are `pros` and `cons` usually absent?** Current Ozon reviews usually expose a single comment body and leave the separate positive/negative fields empty. The actor includes them when they exist but does not split comments itself.

**What does `maxItems` count in seller mode?** It counts every emitted record, including the seller profile row. With `maxItems: 20`, you get the seller row plus up to 19 catalog products.

**Can I collect every review and question for a product?** Reviews are capped by `maxReviewsPerProduct` and read 30 per page. Questions are read 10 per page and capped by `maxItems`, not by `maxReviewsPerProduct`. Both follow Ozon's next-page token, so large histories are limited by your input rather than a fixed page count.

**Are the three storefronts the same catalog?** They share many listings but not all. Prices and availability differ, and the currency follows the storefront you choose.

**Why do deep results under a non-default sort sometimes look less relevant?** Ozon itself appends recommendation filler after a narrow sorted feed runs out. The actor returns what the site returns; for strict topical relevance, use the default relevance sort.

**Is this affiliated with Ozon?** No. This is an independent third-party actor that reads public storefront data and is not operated or endorsed by Ozon.

### Notes

- Empty values are omitted at every depth; there are no `null` fields.
- Product, review, and question rows are deduplicated by their natural identifiers.
- `publishedAt` on reviews is an ISO 8601 UTC timestamp; question `createdAt` keeps Ozon's displayed date text.
- Partial failures do not stop the run: valid rows are still returned, and the run status message reports how many targets failed.
- Legacy task inputs (`searchQuery`, `categoryUrl`, `-price`, and `proxyConfiguration`) are accepted in code; `proxyConfiguration` is ignored.

### Limitations

- **Public data only.** Private account data, cart contents, orders, and checkout pricing are not available.
- **Mirror dependency.** Ozon's public pages are read through a translation mirror. If the mirror rate-limits or is unavailable, the run returns partial data and reports it in the status message.
- **Brand, delivery, and similar-product shelves** are published inconsistently by Ozon. They are included only when the page carries them.
- **Search relevance filler.** Ozon may append recommendations on deep sorted pages; the actor does not claim stricter relevance than the source.
- **Question dates** are kept exactly as Ozon displays them, which may be a localized date rather than an ISO timestamp.
- **Seller catalogs** reflect the public storefront at run time; hidden or regional-only listings may not appear.

# Actor input Schema

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

What to collect.

## `searchQueries` (type: `array`):

One or more keywords, e.g. `iphone`, `телевизор`, `кофемашина`. Each query is collected in order.

## `categoryUrls` (type: `array`):

Full Ozon category/brand URLs or bare slugs, e.g. `https://www.ozon.ru/category/smartfony-15502/` or `smartfony-15502`.

## `productUrls` (type: `array`):

Full Ozon product URLs, short `ozon.ru/t/...` links, or bare numeric SKU/product IDs.

## `sellerUrls` (type: `array`):

Ozon seller storefront URLs, slugs, or numeric seller IDs, e.g. `https://www.ozon.ru/seller/dubaidutyfree/`.

## `sortBy` (type: `string`):

Result ordering for search, category, and seller catalog listings.

## `sortReviews` (type: `string`):

How product reviews are ordered.

## `storefront` (type: `string`):

Which Ozon market to read. Prices use the local currency: RUB for Russia, BYN for Belarus, KZT for Kazakhstan.

## `minPrice` (type: `integer`):

Drop products cheaper than this amount in the selected storefront currency.

## `maxPrice` (type: `integer`):

Drop products pricier than this amount in the selected storefront currency.

## `minRating` (type: `number`):

Drop products rated below this value on the 0-5 scale.

## `inStockOnly` (type: `boolean`):

Only keep products that are currently available.

## `maxItems` (type: `integer`):

Hard cap on emitted records. In seller mode this includes the seller profile row.

## `maxReviewsPerProduct` (type: `integer`):

How many review rows to collect for each product. Set 0 to collect only question rows.

## `includeProductDetails` (type: `boolean`):

For search and category rows, also fetch the product page for description, full specifications, gallery, and variants.

## `includeOtherSellers` (type: `boolean`):

Add the buybox list of other sellers for each product.

## `includeSellerDetails` (type: `boolean`):

Add the seller's legal name, registration number, address, and confirmed brands to product rows.

## `includeSellerProducts` (type: `boolean`):

Emit the seller's catalog products as product rows in addition to the seller profile.

## `includeQuestions` (type: `boolean`):

Also emit buyer questions and their answers for each product.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "iphone"
  ],
  "categoryUrls": [],
  "productUrls": [],
  "sellerUrls": [],
  "sortBy": "relevance",
  "sortReviews": "usefulness_desc",
  "storefront": "ru",
  "minPrice": 0,
  "inStockOnly": false,
  "maxItems": 3,
  "maxReviewsPerProduct": 1,
  "includeProductDetails": false,
  "includeOtherSellers": false,
  "includeSellerDetails": false,
  "includeSellerProducts": true,
  "includeQuestions": false
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset view of product rows.

## `sellers` (type: `string`):

Dataset view of seller profile rows.

## `reviews` (type: `string`):

Dataset view of product review rows.

## `questions` (type: `string`):

Dataset view of buyer question and answer rows.

# 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 = {
    "mode": "search",
    "searchQueries": [
        "iphone"
    ],
    "categoryUrls": [],
    "productUrls": [],
    "sellerUrls": [],
    "sortBy": "relevance",
    "sortReviews": "usefulness_desc",
    "storefront": "ru",
    "minPrice": 0,
    "inStockOnly": false,
    "maxItems": 3,
    "maxReviewsPerProduct": 1,
    "includeProductDetails": false,
    "includeOtherSellers": false,
    "includeSellerDetails": false,
    "includeSellerProducts": true,
    "includeQuestions": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-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 = {
    "mode": "search",
    "searchQueries": ["iphone"],
    "categoryUrls": [],
    "productUrls": [],
    "sellerUrls": [],
    "sortBy": "relevance",
    "sortReviews": "usefulness_desc",
    "storefront": "ru",
    "minPrice": 0,
    "inStockOnly": False,
    "maxItems": 3,
    "maxReviewsPerProduct": 1,
    "includeProductDetails": False,
    "includeOtherSellers": False,
    "includeSellerDetails": False,
    "includeSellerProducts": True,
    "includeQuestions": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-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 '{
  "mode": "search",
  "searchQueries": [
    "iphone"
  ],
  "categoryUrls": [],
  "productUrls": [],
  "sellerUrls": [],
  "sortBy": "relevance",
  "sortReviews": "usefulness_desc",
  "storefront": "ru",
  "minPrice": 0,
  "inStockOnly": false,
  "maxItems": 3,
  "maxReviewsPerProduct": 1,
  "includeProductDetails": false,
  "includeOtherSellers": false,
  "includeSellerDetails": false,
  "includeSellerProducts": true,
  "includeQuestions": false
}' |
apify call vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/ozon-ru-product-pricing-ratings-and-seller-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/lTbX9EgwclAhay8Rq/builds/7kQKbzMdW6uXxbhTN/openapi.json
