Yandex Market (Яндекс Маркет) Scraper - Prices & Ratings
Pricing
$3.99 / 1,000 products
Yandex Market (Яндекс Маркет) Scraper - Prices & Ratings
Public Yandex Market product offers by keyword or category URL: price, old price, rating, review count, brand and shop IDs, image and rank.
Pricing
$3.99 / 1,000 products
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Features
Share
Yandex Market (Яндекс Маркет) Scraper — Prices, Ratings & Shop IDs from Any Category
A Lantern Lab Actor. Give it Yandex Market keywords or any result-list URL you can open in a browser — a category, a filtered category, a search with its filters on it — and get back every public offer on it: title, price and struck-out old price in roubles, rating, review count, brand and shop IDs, image, product URL and its rank on the page. No Yandex login, no cookies of your own, no account.
Price: you pay per product row. Inputs that find nothing, pages Yandex refused, status rows and the run summary are free, and there is no run-start fee.
What you get
- Offers from a keyword (
searchQueries) or from any Yandex Market result-list URL (categoryUrls) — the URL's own filters, sorting and category are kept, and a URL copied from page 3 starts at page 3. - price in RUB: the number the card shows as the price now. oldPrice is the struck-out price beside it and priceWithoutCard the price without the Yandex Pay card discount, each
null— never 0 — when the card does not show one. priceText keeps the price exactly as the page prints it ("41 661 ₽"). - rating and reviewCount out of the page's own structured data,
nullfor a product nobody has rated — never 0. - Three identifiers per row, broad to narrow: productId (the product model many shops sell), skuId, and offerId (the one shop's offer this price belongs to). Rows are deduplicated by
offerId, so a price watcher keeps every shop's price for the same model. - brandId and sellerId on every row. brand and sellerName are filled in where the result page spells the name out in its own filter chips — Yandex names its most popular brands and shops there and no others, so the rest come back
nullrather than guessed. - imageUrl at full size, specs (the line Yandex prints under the title), categoryId and the canonical url.
- sponsored on every row:
truewhen Yandex marks the placement as paid. Yandex answers a keyword it matched nothing of its own for by filling the page with paid placements instead of an empty list, so an input whose rows are allsponsoredis telling you exactly that — and the status row says so in words. - Clear status for every input. A rendered but empty result list, a URL Yandex would not render at all (
page_unavailable), a refused request, a captcha page and an input cut short by a limit are five different, labelled records — never confused, never reported as "0 results". - No duplicates. An offer that shows up under several inputs or on two pages is written and charged once; the repeats are free.
- A budget per input, if you want one.
maxProductsis the run's total;maxProductsPerInputshares it out so input one does not spend what input two needed. - A hard request ceiling.
maxUpstreamRequestscaps the whole run; leave it empty and the Actor derives one from your input.
Input example
{"searchQueries": ["iphone 15", "наушники беспроводные"],"categoryUrls": ["https://market.yandex.ru/catalog--smartfony/54726/list","https://market.yandex.ru/search?text=iphone%2015&glfilter=7893318%3A153043"],"maxProducts": 200,"maxProductsPerInput": 50}
| Field | Default | Meaning |
|---|---|---|
searchQueries | — | One keyword per line, in Russian or English. Each is searched separately and its rows carry it in query. |
categoryUrls | — | Yandex Market result-list URLs copied from the browser. Use this, searchQueries, or both. |
maxProducts | 100 | Product rows for the whole run. A result page carries 8 offers on page 1 and 16 from page 2 on, so this also decides how deep the Actor pages. |
maxProductsPerInput | whole budget | Share of the budget one keyword or URL may spend. Set it when you give several inputs and want each of them collected. |
maxUpstreamRequests | derived | Hard ceiling on requests to Yandex Market, counting result pages and retries from a fresh exit IP (derived as two per page the run may need). |
proxyConfiguration | Apify Unblocker, RU exit | Keep it. Yandex Market answers Apify datacenter exits with a captcha page, not results; Unblocker with a Russian exit is served. Your Apify plan needs Unblocker enabled. |
Output example
One product row (trimmed to the fields most runs read):
{"recordType": "product","productId": "6135179380","skuId": "6135179381","offerId": "7-rZEHnIMlY_VU7GLN8flw","title": "Смартфон Apple iPhone 15 6/128 ГБ, NFC, nano SIM розовый/pink","url": "https://market.yandex.ru/card/smartfon-apple-iphone-15-6128-gb-nfc-nano-sim-rozovyypink/6135179381","price": 41661,"oldPrice": 107151,"priceWithoutCard": 42949,"currency": "RUB","priceText": "41 661 ₽","rating": null,"reviewCount": null,"brand": "Apple","brandId": "153043","sellerName": null,"sellerId": "216978117","categoryId": "91491","imageUrl": "https://avatars.mds.yandex.net/get-mpic/11778691/img_id1668632208685720845.jpeg/orig","specs": "Диагональ экрана: 6.1\"; Встроенная память: 128 ГБ; Оперативная память: 6 ГБ","sponsored": true,"query": "iphone 15","sourceUrl": "https://market.yandex.ru/search?text=iphone+15","page": 1,"pagePosition": 1,"rank": 1,"partial": false,"partialReason": null,"publishedAt": null,"collectedAt": "2026-10-25T02:41:07.004Z"}
One free input_status row per keyword or URL:
{"recordType": "input_status","sourceUrl": "https://market.yandex.ru/search?text=iphone+15","query": "iphone 15","productsReturned": 24,"duplicatesSkipped": 3,"sponsoredReturned": 15,"pagesFetched": 2,"lastPageRead": 2,"partial": false,"partialReason": null,"statusText": "Collected 24 product(s) for this input; the result list was followed to its end or to the limits you set."}
The last row of the dataset is a RUN_SUMMARY with the run's totals — products, paid placements, duplicates, pages read, empty inputs, incomplete inputs and why, requests sent, refusals and captchas. The same object is in the run's key-value store under RUN_SUMMARY.
Limits — read before you run
- Public result pages only. What the Actor collects is what a logged-out browser sees on a Yandex Market search or category page. It does not log in, hold a Yandex account, send cookies of yours, or open a product card page, so anything that lives only behind a login or only on the card page is not here.
- No seller or brand name for most rows. A result page states a shop by its numeric id and a brand by its vendor id; it spells names out only for the handful in its filter chips.
sellerId/brandIdare always filled;sellerName/brandarenullunless the page named them. - One region: the Moscow default. Yandex Market picks the delivery region from a cookie this Actor does not send, so prices and availability are the ones it shows by default (Moscow). A URL parameter cannot change it.
- No publish date. Yandex Market does not publish a date for an offer, so
publishedAtis alwaysnull.collectedAtis our own observation time. - Paid placements are included and labelled, not filtered out — filter on
sponsoredyourself if you want organic results only. See thesponsorednote above for what an all-paid page means. - Depth. Yandex Market stops serving result pages at some depth and answers deeper ones with its own error page; the Actor treats that as the end of the list and says how many pages it read.
- The proxy is not optional. Yandex Market answers Apify's datacenter exits with its captcha page instead of results — measured 36 of 36 requests, 0 products — so the default is Apify Unblocker with a Russian exit, which is served. Your Apify plan needs Unblocker enabled. Each page is retried from a fresh proxy session; if every try is refused or captcha'd, the input is written as
blocked/captchaand never as empty. Nothing here solves a captcha.