Request a tool
All toolsGuidesMCP serverRequest a toolPlatformsCategories
Yandex Search Engine Scraper (SERP API) icon

Yandex Search Engine Scraper (SERP API)

Scrape Yandex search results by keyword or URL. Rank, title, URL, domain, snippet, ads and SERP features, with region targeting. No API key.

27 runs on Apify
Run this in the cloudRun on Apify →

Ad Intelligence & Competitor Research

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust queries, startUrls, region (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Inputs

FieldWhat it doesType
queriesKeywords to search on Yandex. One row per result. Works in any language — Russian, Turkish, English, Kazakh.array
startUrlsPaste full Yandex search URLs instead of keywords, for example https://yandex.com/search/?text=pizza&lr=213. The query, region and start page are read from the URL.array
regionYandex region id that decides which regional ranking you get. Verified codes: 225 Russia, 213 Moscow, 2 Saint Petersburg, 65 Novosibirsk, 54 Yekaterinburg, 43 Kazan, 47 Nizhny Novgorod, 39 Rostov-on-Don, 35 Krasnodar, 51 Samara, 187 Ukraine, 143 Kyiv, 149 Belarus, 157 Minsk, 159 Kazakhstan, 163 Astana, 10393 Almaty, 983 Turkey, 11508 Istanbul, 171 Uzbekistan, 10335 Tashkent, 168 Azerbaijan, 167 Armenia, 10262 Yerevan, 169 Georgia, 84 USA, 102 Germany, 95 United Kingdom. Leave empty to let Yandex choose.integer
maxItemsPerQueryHow many results to return for each query. Yandex serves about 10-20 per page and this actor pages through automatically.integer
maxItemsHard cap across all queries. Every returned result is one charged event, so this is also your budget cap.integer
includeAdsInclude Yandex Direct ad slots (type "ad"). Their URL is Yandex's click tracker; the advertiser's own domain is in displayedDomain.boolean
includeFeaturedInclude non-organic SERP blocks such as video carousels, image strips, related searches and the AI answer teaser (type "featured"). They occupy a rank slot, which matters for rank tracking. Turn off if you only want the ten blue links.boolean
maxPagesPerQuerySafety stop on how deep to page for one query.integer
domainWhich Yandex front-end to query. All of them serve the same index and honour the same region code, but yandex.com.tr and yandex.uz answer automated requests far more reliably — the default is there for a reason. Change it only if you specifically need another host.string

What you get

A structured dataset — each result includes fields like:

positionorganicPositiontypetitledisplayedDomainurlsnippetpageregionsearchQuery

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Ad Intelligence & Competitor Research

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Google Ads Transparency Scraper iconAd Intelligence & Competitor Research

Google Ads Transparency Scraper

Scrape Google Ads Transparency Center by domain, advertiser name or advertiser ID. Ad creatives, formats, first/last shown dates, countries and previews.

Ready to run — no setup

Meta Ad Library Scraper iconAd Intelligence & Competitor Research

Meta Ad Library Scraper

Scrape Facebook and Instagram Ad Library ads by keyword, advertiser Page ID or URL. No login, no Meta API token. Ad copy, creatives, dates, platforms, spend.

Ready to run — no setup

TikTok Trending Hashtags iconAd Intelligence & Competitor Research

TikTok Trending Hashtags

Get official TikTok Creative Center hashtag rankings by country and period: rank, posts, views, popularity curves, industries and top creators.

Ready to run — no setup

SaaS Competitor Monitor: Pricing, Changelog & Positioning iconMonitors & Alerts

SaaS Competitor Monitor: Pricing, Changelog & Positioning

Track competitor SaaS pricing, changelogs, and positioning changes on a schedule. Get structured deltas and Slack alerts for only what changed.

4 use cases

G2 Reviews Scraper iconReviews & Reputation Data

G2 Reviews Scraper

Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Any product slug. No G2 account or API key needed.

Ready to run — no setup

Google Trends Scraper iconAd Intelligence & Competitor Research

Google Trends Scraper

Google Trends data with no API key: keyword interest over time, interest by region or city, top and rising related queries, and Trending Now by country.

Ready to run — no setup

See all Ad Intelligence & Competitor Research →

Yandex Search Engine Scraper (SERP API)

Scrapes Yandex web search result pages and returns one row per result: rank, title, URL, the domain Yandex displays, the snippet, sitelinks, and whether the slot is an organic listing, a Yandex Direct ad, or a featured block.

Yandex is the default search engine for a lot of Russia, Turkey, Kazakhstan, Belarus and Uzbekistan. If you track rankings, watch competitors or build datasets for those markets, Google-only data has a hole in it. This fills the hole.

No Yandex account, no API key, no captcha solving service.

$3.40 per 1,000 results. Flat — the same rate on every Apify plan, with no entry tier to clear and no volume tier to qualify for.

What you get

One row per result:

FieldExample
position2 — rank in the result list as Yandex ordered it, ads and widgets included
organicPosition1 — rank counting organic listings only (null for ads and featured blocks)
typeorganic, ad or featured
featureTypevideo, images, related, neuro-answer, … (null for organic and ads)
titleAmazon.com: Discover Ergonomic Desk Chairs Engineered...
urlhttps://www.amazon.com/ergonomic-chair/s?k=ergonomic+chair
displayedUrlamazon.com › ergonomic-chair — the breadcrumb Yandex prints
displayedDomainamazon.com
brandNameAmazon — the site name Yandex shows above the title
snippetDiscover ergonomic desk chairs engineered with adjustable components…
sitelinks[{ "title": "Rental cars", "url": "https://…" }]
isAdfalse
page, positionOnPagewhich SERP page it came from
region, regionRequestedthe Yandex lr region code that produced this ranking
domain, searchUrl, searchQuery, scrapedAtprovenance

Input

{
  "queries": ["купить пластиковые окна", "ergonomic office chair"],
  "region": 213,
  "maxItemsPerQuery": 50,
  "maxItems": 200
}
  • queries — keywords, any language. Cyrillic, Turkish and Kazakh all work.
  • startUrls — paste Yandex search URLs instead, e.g. https://yandex.com/search/?text=pizza&lr=213.

The query, region and start page are read out of the URL.

  • region — the Yandex lr code that decides which regional ranking you get. All of these are

tested and confirmed working: 225 Russia, 213 Moscow, 2 Saint Petersburg, 65 Novosibirsk, 54 Yekaterinburg, 43 Kazan, 47 Nizhny Novgorod, 39 Rostov-on-Don, 35 Krasnodar, 51 Samara, 187 Ukraine, 143 Kyiv, 149 Belarus, 157 Minsk, 159 Kazakhstan, 163 Astana, 10393 Almaty, 983 Turkey, 11508 Istanbul, 171 Uzbekistan, 10335 Tashkent, 168 Azerbaijan, 167 Armenia, 10262 Yerevan, 169 Georgia, 84 USA, 102 Germany, 95 United Kingdom.

  • maxItemsPerQuery / maxItems — the actor pages through Yandex on its own until it hits either.
  • includeAds, includeFeatured — set either to false if you only want the organic listings.

Region really does change the ranking

Same query, different lr, first organic result:

lrRegionTop result for pizza
213Moscowyoutube.com
983Turkeydominos.com.tr
11508Istanbulnefisyemektarifleri.com
10393Almatynefisyemektarifleri.com

Pagination

Yandex re-ranks between pages, so consecutive pages overlap. The actor deduplicates as it goes, which means maxItemsPerQuery: 100 gives you 100 distinct results, not 100 rows with 20 repeats in them. A 20-page run on one keyword returned 171 unique results from 180 raw cards.

Speed, from real runs

RunResultsTime
One keyword, first page54.1 s
One keyword with ads, Istanbul (lr=11508)157.8 s
Three keywords, English + Russian + Turkish, 10 pages deep25058.9 s

Roughly 4 results per second, and it holds at depth.

What this does not do

  • No total result count. Modern Yandex SERPs no longer print "about 12,000,000 results" into the

HTML, so there is nothing honest to return. The field does not exist rather than being guessed.

  • Ad destination URLs are Yandex click trackers. A Yandex Direct ad links through

yabs.yandex.ru/count/…. The advertiser's real domain is in displayedDomain, taken from the breadcrumb Yandex prints. We do not follow the tracker — that would cost you a request per ad and register a fake ad click.

  • The AI answer ("Yazeka") is a teaser only. Yandex loads that text with JavaScript after the

page renders. You get the fact that the block occupied a rank slot, not its body text.

  • Not images, video, maps or news search. This is /search/, the web index. Yandex Maps places

and reviews are separate actors.

  • Not a live rank checker down to position 500. Yandex gets progressively less willing to serve

very deep pages. Fifteen pages per query is the default ceiling and around 20 is realistic.

Reliability

Yandex defends its SERPs with SmartCaptcha, and it is genuinely aggressive. Two things make this actor work where a plain HTTP client gets a wall of "are you a robot":

1. A Firefox TLS fingerprint. Measured on the same addresses: a Chrome fingerprint got 0 pages out of 8; Firefox got 5 out of 8. Plain Node.js gets none. 2. A different exit address on every single request. Yandex challenges an address after a handful of searches and then keeps challenging it, so reusing one address is what kills a run — not the address being "bad". With a new proxy session per request, a 20-page run needed exactly 20 requests, no retries.

When Yandex does challenge a page anyway, the actor retries on new addresses, and if it still cannot get through it writes an uncharged diagnostic row saying so. You are never billed for a captcha page.

FAQ

Is there a Yandex search API I could use instead? Yandex's XML search interface (xmlsearch.yandex.ru) answers HTTP 403 without a paid Yandex Cloud key, and the paid Search API is billed per query with a signup that expects a Russian legal entity. This actor needs neither.

Do I need my own proxies? No. Leave the proxy input alone and it uses Apify's datacenter proxy, which is what it is tuned for. You can supply your own proxy URLs if you want a specific country.

Does it work for Russian-language queries? Yes, and that is the main use case. Pass Cyrillic straight through in queries.

Can I get results as they look in Moscow while running from anywhere? Yes. Set region: 213. The region code, not the proxy country, is what selects the ranking, and the row records which region Yandex actually served in region.

How many results per keyword can I get? About 10-20 on the first page and roughly 9 per page after that. 100-170 unique results per keyword is comfortable. Set maxItemsPerQuery to whatever you need and the actor pages until it gets there.

What counts as a charged result? Every row that carries a real result — organic, ad or featured. Diagnostic rows, the empty-input sample row, and captcha pages are never charged. A 250-result run billed exactly 250 result events and one actor-start event.

Is it really cheaper than the alternatives? Yes. This one is $0.0034 per result, flat, with no tiers to qualify for and no per-page minimum. Most Yandex SERP scrapers charge several times that, and the better rates they list are volume tiers you have to qualify for first.

Can I track a competitor's rank over time? Yes. Run it on a schedule with queries set to your keyword list and read organicPosition for the domain you care about. displayedDomain is there to make that a one-line filter.

Why does the run use yandex.com.tr by default? Every Yandex front-end serves the same index and obeys the same lr region code, but they do not defend themselves equally. Over 20 consecutive paginated requests, yandex.com.tr and yandex.uz answered every one on the first attempt while yandex.com and yandex.ru served page 1 and then challenged every deeper page. You can override it with the domain input.