Yandex Search Engine Scraper (SERP API)
Pricing
from $3.40 / 1,000 search result returneds
Yandex Search Engine Scraper (SERP API)
Scrape Yandex search results by keyword or URL. Each row has rank, title, URL, snippet, sitelinks and result type. Yandex ranks by region, so the same query gives a different page in Moscow and Istanbul. You pick the region code (lr). No API key. $3.40 per 1,000.
Pricing
from $3.40 / 1,000 search result returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
25
Monthly active users
a day ago
Last modified
Categories
Share
Yandex Search Engine Scraper: Yandex results by keyword and region, no API key
The same query put to Yandex from Moscow and from Istanbul does not come back as the same page. Yandex ranks by region, the region is a code in the URL, and you can ask for any of them from anywhere. One row per slot: rank, title, link, the domain Yandex shows, the snippet, sitelinks, and whether the slot is organic, a Direct ad or a featured block.
The honest part. Yandex does not always serve a query, and when it refuses you get an uncharged diagnostic row instead of results, so a run can come back with far fewer rows than you asked for. There is also no total-result count anywhere on a modern Yandex page, so nothing here can report one.
| Input | Keywords, or full Yandex search URLs |
| Output | One row per result slot |
| Ceiling | 20,000 results per run, up to 40 pages per query |
| Account needed | None, and no API key |
| Price | $3.40 per 1,000 results, flat on every plan |
🔎 What Yandex Search Engine Scraper does
Give it keywords and a region code and it pages through the results, writing a row for every slot on the page in the order Yandex put them.
The region code is the point. lr=213 is Moscow, 225 is Russia, 11508 is Istanbul, 163 is
Astana. Set one and you get that region's ranking wherever the run happens to execute. Leave it empty
and Yandex picks, which is fine for a look and wrong for a comparison.
Three kinds of slot come back, and all three take up a rank position: organic listings, Yandex
Direct ads, and featured blocks like video carousels, image strips and the AI answer teaser. Each
row carries position for the slot's place on the page and organicPosition for its place among the
organic rows only, which is the one rank trackers want.
📥 What you give it
{"queries": ["купить пластиковые окна", "ergonomic office chair"],"domain": "yandex.com.tr","region": 213,"maxItemsPerQuery": 20,"maxItems": 100}
| Field | Default | What it is |
|---|---|---|
queries | box holds ergonomic office chair | Keywords, in any language Yandex handles. Russian, Turkish, English, Kazakh. |
startUrls | empty | Full Yandex search URLs instead. The query, region and start page are read out of the address. |
domain | yandex.com.tr | Which Yandex front end to ask. They share one index. yandex.com.tr is the default because it honours the region code and answers consistently. yandex.uz ignores the region code and always ranks for Uzbekistan. |
region | empty | The lr code. Verified ones include 225 Russia, 213 Moscow, 2 Saint Petersburg, 43 Kazan, 187 Ukraine, 143 Kyiv, 149 Belarus, 159 Kazakhstan, 10393 Almaty, 983 Turkey, 11508 Istanbul, 171 Uzbekistan, 168 Azerbaijan, 169 Georgia, 84 USA, 102 Germany, 95 United Kingdom. |
maxItemsPerQuery | 20 | Results per query, up to 2,000. Yandex serves about 10 to 20 a page. |
maxItems | 100 | Hard cap across every query. Every returned result counts, so this is your budget cap. |
maxPagesPerQuery | 15 | How deep to page for one query, up to 40. |
includeAds | on | Include Direct ad slots, typed ad. |
includeFeatured | on | Include carousels, image strips, related searches and the AI answer teaser, typed featured. Turn it off for the ten blue links only. |
proxyConfiguration | on | Optional. Not needed for a normal run. |
Run it with no queries and no URLs and you get one labelled sample row.
📤 What you get back
A real row from a recent run. This one happens to be the AI answer teaser, which is why title and
url are empty on it:
{"searchQuery": "ergonomic office chair","page": 1,"position": 1,"positionOnPage": 1,"organicPosition": null,"type": "featured","featureType": "neuro-answer","isAd": false,"title": null,"url": null,"displayedUrl": null,"displayedDomain": null,"brandName": null,"snippet": "Yazeka Arama sonuclarina dayanarak olusturuldu Internette arama Uygun kaynak secimi ...","sitelinks": [],"region": 213,"regionRequested": 213,"domain": "yandex.com.tr","domainRequested": "yandex.com.tr","searchUrl": "https://yandex.com.tr/search/?text=ergonomic+office+chair&lr=213","scrapedAt": "2026-09-21T01:45:43.797Z"}
| Field | What it is |
|---|---|
position, positionOnPage | The slot's rank across the whole result set, and its place on its own page. Ads and featured blocks occupy a slot. |
organicPosition | Rank counting organic rows only. null on ads and featured blocks. |
type, featureType, isAd | organic, ad or featured, and which kind of block a featured row is. |
title, url, snippet | The listing as Yandex renders it. On an ad, url is Yandex's click tracker. |
displayedUrl, displayedDomain, brandName | The breadcrumb Yandex prints, and the real domain behind it. On an ad this is where you find the advertiser. |
sitelinks | The extra links under a listing, as {title, url}. |
region, regionRequested | What Yandex actually served, and what you asked for. Compare them before trusting a ranking. |
domain, domainRequested | Which front end answered, and which one you picked. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it |
|---|---|
| A result | It has a position and a type |
| The sample row | Written only when there were no queries and no URLs |
| A notice or diagnostic | It carries an errorCode |
Diagnostic and notice rows are never charged.
| Code | What it means |
|---|---|
BAD_URL | That entry is not a Yandex search URL. The other jobs carry on. |
DOMAIN_FAILOVER | The host you picked would not serve that query, so it was retried on yandex.com.tr at the same region. The domain field on the rows says who answered. |
CAPTCHA | Yandex answered with a robot check instead of results. Re-run, or try fewer queries at once. |
FETCH_FAILED | Yandex was unreachable or answered badly. |
NO_RESULTS | The query returned nothing usable. |
ABORTED | Three queries in a row came back dead, so the rest were skipped rather than burned through. |
PROXY_GROUP_IGNORED | A setting in proxyConfiguration could not be used, so the run carried on without it. |
▶️ How to run it
- Open Yandex Search Engine Scraper and click Try for free.
- Put your keywords into Search queries, replacing the example.
- Set Region (Yandex lr code) to the market you care about. This is the setting that changes the answer.
- Set Max results in total low for the first run, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$3.40 per 1,000 results. Flat on every Apify plan, no volume tiers.
Every row with a rank counts, ads and featured blocks included, because they take up a rank slot.
If you only want organic listings, turn includeAds and includeFeatured off and you stop paying
for them.
Sample rows, notice rows and diagnostic rows are not charged, and a query Yandex refuses costs you nothing.
💡 What people use it for
- Tracking where a site ranks in Moscow, Almaty or Istanbul, where a Google-only view says nothing.
- Watching which advertisers are buying a keyword, through
displayedDomainon the ad rows. - Pulling the snippet Yandex writes for your pages, which is not always the meta description.
- Comparing the same keyword across regions by running it once per
lrcode. - Checking whether featured blocks are pushing the organic results down a market you care about.
🚧 What it does not do
- No total result count. Yandex does not print one any more, so nothing can report it.
- Leave
regionempty and each query keeps its own. Every query pins to whatever region its first page came back with, so two queries in one run can be ranked for different places. Setregionwhenever you are comparing anything. yandex.uzignores the region code and always ranks for Uzbekistan.- An ad row can come back typed
organic. The tell is the link: an ad'surlpoints at ayabs.yandexclick tracker, and the advertiser's own domain sits indisplayedDomain. - The AI answer block is a teaser, so its row carries the visible text with
titleandurlempty, as above. - Some queries will not be served. You get an uncharged row saying so, and a run can end with very few results.
- About 20 pages is the realistic depth for one query, whatever the page cap allows.
- Web results only. No images, video, maps or news verticals.
- A ranking is a snapshot, and Yandex personalises less than Google but still moves daily.
🧭 Which Yandex scraper do you need?
| If you want | Use |
|---|---|
| Search results by keyword and region | This one |
| Businesses and places from Yandex Maps | Yandex Maps Scraper |
| Reviews for a place on Yandex Maps | Yandex Maps Reviews Scraper |
| Products and prices on Yandex Market | Yandex Market Scraper |
| The same job on Google | Google Search Results Scraper |
❓ Questions people ask
Do I need a Yandex account or an API key? No. Nothing to apply for and no quota to watch.
Which region code should I use? The one for the market you sell in. 213 for Moscow, 225 for
Russia as a whole, 11508 for Istanbul, 163 for Astana. The list in the input has the verified
ones.
Why did I get fewer rows than I asked for? Either the query ran out of pages, or Yandex refused it. The diagnostic row tells you which, and neither costs you anything.
Can I search in Russian? Yes, and in Turkish, Kazakh and English. Put the query in whatever language you want to rank in.
Does the domain I pick change the ranking? The index is the same. The region code is what
changes the ranking, except on yandex.uz, which ignores it.
Is scraping search results legal? They are public pages. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the query, the region code and the run ID. The
errorCode on the diagnostic row usually names the problem on its own.