Yandex Market Scraper
Scrape Yandex Market products: name, price, old price, discount, rating, stock, specs and images. No API key, no browser. $1.70 per 1,000 products.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchQueries,startUrls,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0017 per product = $1.7 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Product returned | Charged once per unique Yandex Market product returned. Duplicates across pages, products dropped by your own price or rating filters, diagnostic rows for blocked requests and the empty-input sample row are never charged. | $0.0017 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-22, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchQueries | What to look for on Yandex Market, one per line. Russian terms return the fullest catalogue ("фен", "ноутбук", "кроссовки"), but Latin brand and model names work too ("iphone 15", "dyson"). Each term is paginated until it runs out of products or hits your item cap. | array |
startUrls | Optional. Paste Yandex Market search pages (https://market.yandex.ru/search?text=ноутбук) or catalogue listings (https://market.yandex.ru/catalog--noutbuki/54544/list). Filters already in the URL are kept. A few catalogue nodes only list products when the URL carries ?hid={categoryId}; if one comes back empty you get an uncharged row telling you so. | array |
maxItems | Hard cap on unique products returned across every search (1-5000). Yandex Market repeats products between pages; duplicates are dropped before the cap is applied, so you get the number you asked for. You are charged per product returned. | integer |
sortBy | Sorting applied to search terms. Ignored for pasted URLs that already carry their own sort. | string |
minPrice | Only return products at or above this price, in roubles. Leave empty for no floor. | integer |
maxPrice | Only return products at or below this price, in roubles. Yandex Market ignores this server-side (it returned 12 of 16 rows above the requested cap in testing), so the scraper also filters it locally and does not charge for the rows it drops. | integer |
minRating | Only return products rated at or above this value out of 5. Products with no rating yet are excluded when this is set. Applied locally; dropped products are not charged. | integer |
What you get
A structured dataset — each result includes fields like:
namepriceoldPricediscountPercentcurrencysellerNameratingratingCountinStockbrandurlimageUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Yandex Market Scraper: products, prices and discounts from Yandex Market
Type a search term the way you would into Yandex Market, or paste a search or catalogue URL, and get one row per product: name, card price, price without the Yandex Pay card, crossed-out old price, discount, rating, shop id, stock, category, the short spec line, images and a clean product link.
Three things worth knowing before the first run. Prices are Moscow prices, because that is the region Yandex Market serves this catalogue from and it does not take a region hint. The headline price is the one on the result card, which assumes payment with a Yandex Pay card, so priceWithoutCard is the number you want for most comparisons. And since September 2026 the search pages no longer carry the seller's name, the brand, the "bought" count, the delivery line or the card's badges, so those fields come back empty.
| Input | Search terms, or Yandex Market search and catalogue URLs |
| Output | One row per product |
| Ceiling | 5,000 products per run; a broad term usually runs dry well before that |
| Account needed | None, and no API key |
| Price | $1.70 per 1,000 products, flat on every plan |
🛒 What Yandex Market Scraper does
Two ways in, and they work together in one run.
Search. A term like фен or iphone 15, and it pages through the results until it hits your cap or the search stops producing anything new. Russian terms reach more of the catalogue; Latin brand and model names work fine.
URLs. Paste a Yandex Market search page or a catalogue listing and it reads that. Filters already sitting in the URL are kept, so you can build the exact view you want in a browser and hand it over.
The three price fields, because mixing them up is how a price monitor goes wrong
| Field | What it is |
|---|---|
price | The big number on the result card. It assumes payment with a Yandex Pay card. |
priceWithoutCard | The same offer without that card discount. null when there is no difference. |
oldPrice | The crossed-out list price. discountPercent is worked out from oldPrice against price. |
📥 What you give it
{
"searchQueries": ["фен", "ноутбук"],
"maxItems": 200,
"sortBy": "priceAsc",
"maxPrice": 5000
}
| Field | Default | What it is |
|---|---|---|
searchQueries | box holds фен | One search per line. Each term is paged until it runs out or your cap is reached. |
startUrls | empty | Yandex Market search pages or catalogue listings. Works alongside the search terms. |
maxItems | 50 | Hard cap on products across every search, 1 to 5,000. You are charged per product returned, so this is your spend cap. |
sortBy | relevance | relevance, priceAsc, priceDesc or rating. Ignored on a pasted URL that already carries its own sort. |
minPrice, maxPrice | empty | Bounds in roubles. Yandex treats an upper bound as a hint, so the cap is applied here as well. Products dropped that way are not charged. |
minRating | empty | Keep products rated at or above this, out of 5. Products with no rating yet are dropped when you set it. |
proxyConfiguration | leave it alone | Optional. Only change this if you want the run to go out through your own servers. |
Run it with everything empty and you get one labelled sample row.
📤 What you get back
A real product row from a run for фен. The images and specs lists are trimmed here.
{
"productId": "5741806961",
"offerId": "Xk6MuvhgNv0UlIrnf1k3Jg",
"sku": "103834569766",
"name": "Фен редмонд HD1702, Белый",
"url": "https://market.yandex.ru/card/fen-redmond-hd1702-1600-vt-2-skorosti-2-temperaturnykh-rezhima-belyy/4756956483",
"price": 1615,
"oldPrice": 2379,
"discountPercent": 32,
"priceWithoutCard": 1665,
"currency": "RUB",
"rating": 4.9,
"ratingCount": 89,
"purchasedText": null,
"sellerName": null,
"sellerId": "465852",
"sellerSlug": null,
"sellerUrl": null,
"brand": null,
"inStock": true,
"stockNote": null,
"conditionNote": null,
"deliveryText": null,
"categoryId": "90401",
"categoryName": null,
"badges": [],
"specs": [{"name": "Мощность фена", "value": "1600 Вт"}, {"name": "Дополнительные функции", "value": "ионизация, подача холодного воздуха"}],
"imageUrl": "https://avatars.mds.yandex.net/get-mpic/16369241/img_id6349726780689894057.png/orig",
"images": ["https://avatars.mds.yandex.net/get-mpic/16369241/img_id6349726780689894057.png/orig", "..."],
"searchQuery": "фен",
"sourceUrl": null,
"page": 1,
"scrapedAt": "2026-09-26T07:07:53.743Z"
}
| Field | What it is |
|---|---|
productId, offerId, sku | Yandex's model id, the id of the offer it chose to show, and the stock code. |
sellerId | The id of the shop behind the offer on the card. Group by it to see who sells what. |
sellerName, sellerSlug, sellerUrl, brand | Empty. The search pages stopped carrying them in September 2026. The fields stay so existing pipelines keep their columns. |
rating, ratingCount | The product score and how many ratings it came from. purchasedText is empty for the same reason as the seller name. |
inStock | true when the card offers an add-to-cart button. stockNote and deliveryText are empty. |
categoryId | Yandex's category id. categoryName is filled only when the page names it, which is rare now. |
specs | The short spec line from the card, as name and value pairs. Not the full spec sheet. |
badges | Always an empty list now. |
searchQuery, sourceUrl, page | Which of your inputs produced this row, and which page it came off. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it |
|---|---|
| A product | It has a productId and a price |
| The sample row | Written only when the input was empty |
| A diagnostic | It carries an errorCode |
Diagnostic rows are never charged, and neither are products your price or rating filters dropped.
| Code | What it means |
|---|---|
NO_RESULTS | Nothing came back for that term or URL. On a catalogue link this usually means the page only lists products when the URL carries its hid= category id; the row tells you so. |
BAD_URL | That entry is not a Yandex Market address. The other jobs carry on. |
CAPTCHA | Yandex put a check in front of that page instead of answering it. |
FETCH_FAILED | Yandex was unreachable, or the page did not carry the product data it normally does. |
TIME_LIMIT | The run got close to its time limit and stopped early. Everything delivered before that is in your dataset; give the run more time, or ask for fewer products, to get the rest. If nothing had come back by then, the run ends as failed. |
If a job stops part way, the products it already returned stay in your dataset and stay charged. The diagnostic row tells you where it stopped.
▶️ How to run it
1. Open Yandex Market Scraper and click Try for free. 2. Put your terms into Search terms, one per line, or paste links into Yandex Market URLs. 3. Set Maximum products low for the first run. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$1.70 per 1,000 products. Flat on every Apify plan, no volume tiers.
One row is one product. The sample row, every diagnostic row and every product dropped by your minPrice, maxPrice or minRating filters are not charged. A search that finds nothing produces no product rows to charge for.
💡 What people use it for
- Watching a competitor's prices on a schedule and diffing
pricebetween runs. - Pulling a whole category with
oldPriceanddiscountPercentto see who is really discounting. - Counting how many different shops a product line is sold by, through
sellerId. - Building a product feed with images, specs and stock already on the row.
- Checking where your own listings sit when a shopper sorts by cheapest first.
🚧 What it does not do
- No seller names, brands, "bought" counts, delivery lines or badges. Yandex Market stopped putting
them on its search pages in September 2026. You still get the shop id.
- Moscow prices only. Yandex Market serves this catalogue from Moscow and ignores a region hint,
so a price in Novosibirsk can differ from the one you get here.
- One offer per product. You get the offer Yandex chose to put on the card, not the full list of
sellers behind it.
- The same model can arrive twice. Rows are deduplicated on the exact offer, so if Yandex shows
the same product again later under a different offer, that counts as another product and is charged as one.
- No review text. You get
ratingandratingCount, not what anyone wrote. - No sponsored flag. Yandex marks effectively everything on these pages as promoted, so the flag
would tell you nothing and is not returned.
- A broad term runs dry well before 5,000 products. That is Yandex running out, not a cap here. To
go deeper, split the term, use a catalogue URL, or change the sort so a different slice comes back.
- Strict filters can make a run long and thin. If almost everything is filtered out, the job
keeps turning pages looking for matches. Set maxItems to what you actually need.
- Specs are the short list from the card. For the full sheet you need the product page itself.
🧭 Which Yandex scraper do you need?
| If you want | Use |
|---|---|
| Products, prices and sellers on Yandex Market | This one |
| Where a page ranks on Yandex search | Yandex Search Engine Scraper |
| Businesses, phones and opening hours | Yandex Maps Scraper |
| Second-hand listings and private sellers | Avito Listings Scraper |
❓ Questions people ask
Do I need a Yandex account or an API key? No. Nothing to register and no quota to watch.
Which price should I compare against? priceWithoutCard when you want the plain shelf price, and price when you want the number a shopper sees on the card. Do not mix the two between runs.
Can I get prices for my own city? No. The catalogue answers with Moscow pricing whatever region you ask for.
Can I paste a filtered catalogue page? Yes. Build the view you want on Yandex Market, copy the URL, and the filters in it are kept.
Can I run it on a schedule? Yes. productId is stable, so a daily run plus a join on that field gives you a price history.
Is scraping Yandex Market legal? These are public product listings. Apify's write-up on scraping and the law is a good place to start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search term or URL and the run ID. The errorCode on the diagnostic row usually names the problem on its own.