How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
наушникиin Search terms. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
This Actor reads public Ozon.ru and Ozon.by search results, category pages, seller pages and product cards, and saves prices, ratings, sellers and images as table rows.
Good for
- You compare prices in a category or for a search term.
- You check what one seller or brand has on Ozon.
- You watch your own or a rival's prices on a schedule and want only the changes.
- You read reviews and questions to learn what buyers say about a product.
Who uses it
Ozon sellers
Check what a rival or a brand sells on Ozon.
Price analysts
Compare prices in a category or for a search term.
Product researchers
Read reviews and questions to learn what buyers say.
Price
Prices will be shown after release.
Questions
Do I need an Ozon account or my own proxy?
No. The tool reads public pages without a login. Proxy use is included.
Why do runs sometimes fail?
Ozon fails many requests at random, in waves. If a wave lasts, the run stops early. Start it again later.
Does it find every product in a category?
No. It reads the listing as Ozon serves it, up to maxItems. Ozon decides the order and depth.
Why are full cards so much more expensive than listing rows?
A card needs its own page, and each page can take several tries. A listing page gives about 8 rows at once. Keep scrapeDetails off when price and rating are enough.
Are the prices exact and current?
They are what Ozon showed a visitor at fetchedAt. Prices can differ by account, delivery area and time. Ozon calls Ozon.by prices in BYN approximate.
What happens on a tracking run when nothing changed?
You get rows with monitorStatus: unchanged, and each row costs the listing price. A product that does not appear in a run keeps its history.
Details
Step by step on Apify
- Open the Input tab. In Search terms, keep
наушникиor type your own term (box 1 in the picture). - In Maximum products, keep
8for a first run (box 2). - Click Start at the bottom of the page, below the form shown in the picture.
- When the run ends, open the Output tab (box 4).
- Check
price,cardPrice,oldPrice,ratingandreviewsCount(box 5).
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Compare prices for a search term | queries, sortBy, minPrice, maxPrice | Listing row | price, oldPrice, rating, reviewsCount | CSV or Excel export |
| Check one seller's or brand's range | listingUrls | Listing row | sku, name, price, url | Dataset API |
| Get full product details | productUrls or scrapeDetails | Full card | seller, stock, lowestOtherPrice, brand, characteristics, variants | Dataset API |
| Watch prices on a schedule | monitor, monitorKey, minPriceChangePct | Row with change marks | monitorStatus, changes, price | Apify schedule, Slack or Notion summary |
| Read what buyers say | productUrls, maxReviews, reviewSort, maxQuestions | Full card with add-ons | reviews, questions, rating | JSON export |
Tips for better results
- Keep full cards off when price and rating are enough. Listing rows are faster and cheaper.
- Do not start many runs at the same time. In a test with 10 at once, only 3 succeeded.
- Use tracking mode on a schedule to get only new and changed products.
Limits and good to know
- Maximum products: 700 per run. One-hour runs saved 601, 719 and 874 listing rows, so a 700-row run can stop at the default timeout of 3,600 seconds with fewer rows
- Time: Ozon's failure waves set the speed, so times vary a lot
- Failure waves: on one-at-a-time test runs, about 1 in 4 runs failed, nearly always before the first row. One wave failed three runs in a row over about 12 minutes. A run gives up after 5 failed requests in a row before the first answer from Ozon. After that the limit grows by 3 with each answered page, up to 25 in a row. Saved rows stay, and you pay only for them and the start fee
- Many runs at once: do not start many runs at the same time. In a test with 10 at once, only 3 succeeded
- Timeout: the run saves what it has 10 seconds before the timeout and ends with
DEADLINE. With at least one row it counts asSUCCEEDED - Low yield: a run stops with
LOW_YIELDwhen it reads many pages and few products pass your filters. A strict filter can return fewer rows thanmaxItems. For example,minRating4.9 stopped at 15 rows - Listing limits: a listing page holds few rows, and Ozon decides how deep a listing goes
- Reviews: up to 300 per product, shared across the product's variants. Ozon offers only the three orders in
reviewSort
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "complete",
"sku": "4404449496",
"name": "CONFIRM Наушники беспроводные с микрофоном, Bluetooth, USB Type-C, слоновая кость, бордовый",
"price": 1956,
"cardPrice": 1956,
"oldPrice": 10000,
"rating": 4.6,
"reviewsCount": 20809,
"seller": null,
"url": "https://www.ozon.ru/product/confirm-naushniki-besprovodnye-s-mikrofonom-bluetooth-usb-type-c-slonovaya-kost-bordovyy-4404449496/",
"images": ["https://ir-20.ozone.ru/s3/multimedia-1-c/11643725928.jpg"],
"dataLevel": "listing",
"currency": "RUB",
"query": "наушники",
"source": "ozon.ru",
"fetchedAt": "2026-11-07T09:05:44.650Z",
"isAvailable": true
}Data fields (39)
| Field | Type | Meaning |
|---|---|---|
status | string | complete for a product. not_found for a missing product or an empty search. |
sku | string | Ozon product article number. |
name | string | Product title as shown by Ozon. |
price | number | Price in the storefront currency. On a full card, this is the price without the Ozon Card. On a listing row, this is the single price Ozon shows on the tile, which is the Ozon Card price. |
cardPrice | number | Price with the Ozon Card, in the storefront currency. |
oldPrice | number | Crossed-out original price in the storefront currency, if present. |
rating | number | Average rating out of five. |
reviewsCount | integer | Review count shown on the storefront. |
seller | string | Public store name from the product card. |
url | string | Public product or listing URL. |
images | array | Product image URLs. |
dataLevel | string | listing for search tiles or product for full cards. |
currency | string | RUB on Ozon.ru, BYN on Ozon.by. |
query | string | Search phrase that led to the product. |
source | string | ozon.ru or ozon.by. |
fetchedAt | string | UTC date and time when the product was read. |
isAvailable | boolean | Availability shown by Ozon for this visitor. |
description | string | Short description from the product page. |
brand | string | Brand from the product page. |
categoryPath | array | Category labels from broadest to narrowest. |
variants | array | Public product variants such as colors and sizes. |
characteristics | array | Product attributes as name and value pairs. About 5 on a full card, all of them with the add-on on. |
fullDescription | string | The seller's full description, with the add-on on. Null when the page could not be read or the product has none. |
sellerDetails | object | Public seller page link. With Seller profile on, also the public business details Ozon shows. |
reviews | array | Reviews without author data: id, publishedAt, rating, text, positive, negative, photos, videoCount, useful, notUseful. Null means the page could not be read. |
questions | array | Questions with answers, without author data. Null means the page could not be read. |
otherOffers | array | Other sellers of this product with sellerId, seller, sellerUrl, price, cardPrice, url and delivery. Null means the page could not be read. |
monitorStatus | string | With tracking on: new, changed or unchanged. Null means the history could not be opened. |
changes | array | With tracking on: each change as field, from and to. |
ageRestricted | boolean | True for an 18+ product. Ozon hides its pictures and, on the card, its price and details from guests. |
stock | integer | Units Ozon shows as available to order. Full card only. |
questionsCount | integer | Number of buyer questions. Full card only. |
otherSellersCount | integer | Number of other sellers Ozon shows for this product. Full card only. |
lowestOtherPrice | number | Lowest price Ozon shows among other sellers. Full card only. |
priceDropped | boolean | True when Ozon marks the product as recently cheaper. Full card only. |
installment | string | Installment text Ozon shows on the card. |
promoLabel | string | Name of the current sale on the card. |
promoEndsIn | string | Time left in the current sale, as Ozon shows it. |
labels | array | Marketing labels Ozon shows on the card. |
Input settings (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Search terms | queries | array | ["наушники"] |
| Product URLs or IDs | productUrls | array | |
| Listing URLs | listingUrls | array | |
| Maximum products | maxItems | integer | 8 |
| Storefront for search terms | storefront | string | "ru" |
| Open full product cards | scrapeDetails | boolean | false |
| Sort listings | sortBy | string | |
| Minimum price | minPrice | number | |
| Maximum price | maxPrice | number | |
| Minimum rating | minRating | number | |
| Minimum discount, % | minDiscount | number | |
| On sale only | onSale | boolean | false |
| Discounted only | hasDiscount | boolean | false |
| Verified brands only | brandCertified | boolean | false |
| Installments available | isInstallment | boolean | false |
| Delivery time | delivery | string | |
| Seller profile | includeSellerDetails | boolean | false |
| Other sellers | includeOtherOffers | boolean | false |
| All characteristics and full description | includeFullDetails | boolean | false |
| Reviews per product | maxReviews | integer | 0 |
| Review order | reviewSort | string | |
| Questions per product | maxQuestions | integer | 0 |
| Track changes between runs | monitor | boolean | false |
| Fields to track | monitorFields | array | |
| Minimum price change, % | minPriceChangePct | number | 0 |



