Yandex SERP Scraper - Organic Results & Ads
Pricing
from $3.20 / 1,000 search results
Yandex SERP Scraper - Organic Results & Ads
Scrape Yandex search results by keyword. Extract organic positions, titles, URLs, domains and snippets with region targeting. Export JSON/CSV.
Pricing
from $3.20 / 1,000 search results
Rating
0.0
(0)
Developer
Santhej Kallada
Maintained by CommunityActor stats
0
Bookmarked
26
Total users
11
Monthly active users
13 days ago
Last modified
Categories
Share
Yandex SERP Scraper — Organic Results, Ads & Snippets
Scrape Yandex search results for any keyword without an API key, XML quota or captcha handling. Every result comes back as a clean row with its rank, title, URL, display domain and full snippet, and paid ads are flagged separately. $4.00 per 1,000 results.
What does Yandex SERP Scraper do?
It runs your keywords on Yandex and returns the organic results page by page, in the order Yandex shows them. You can target any Yandex region (Moscow, St Petersburg, Istanbul, Almaty, ...), filter results by language, restrict them to one site or to a recent time window, and optionally collect the paid ads on the same pages.
Built for SEO rank tracking, competitor monitoring and market research in Russia, Turkey, Kazakhstan and the wider CIS, where Yandex holds a share of search that Google data does not show.
- Organic results: rank, title, URL, display domain and snippet.
- Yandex keyword rankings:
positionis the result's rank for the keyword across pages (page 2 continues at 11), ready for rank tracking. - Yandex ads: paid placements parsed and flagged with
isAd, returned only when you ask for them. - Region targeting: any Yandex region ID (
lr), e.g.213Moscow,2St Petersburg,11508Istanbul,162Almaty. - Language, site and recency filters: Yandex's results-language filter, a single-site restriction and Yandex's recency windows.
- Bulk keywords: up to 50 keywords per run, processed concurrently.
Use cases
- Yandex rank tracking: monitor where your domain sits for a keyword set in a specific Yandex region, on any schedule.
positionanddisplayUrlare all a rank tracker needs. - Competitor visibility: see which domains hold the top positions for your commercial keywords, and how that changes over time.
- Keyword and content research: snippets show what Yandex considers relevant for a query, useful for content briefs aimed at the RU/TR/KZ market.
- Ad intelligence: turn on
includeAdsto see who bids on your keywords and what their ad copy says. - Market entry research: Yandex is the main search engine in several markets where Google data tells you very little.
How to use Yandex SERP Scraper
- Enter your keywords in Search keywords, one per line (Cyrillic, Turkish and other scripts work as typed).
- Set Max organic results per keyword. Yandex serves about 10 per page, so 30 fetches about three pages.
- Set the Yandex region ID (lr) for the market you care about, e.g.
213for Moscow. Optionally add a Results language, a Restrict to site domain, or a recency filter. - Tick Include ads if you also want the paid results.
- Click Start, then export the dataset as JSON, CSV or Excel, or read it through the Apify API.
Example input
{"queries": ["купить кроссовки", "доставка цветов москва"],"maxResults": 20,"includeAds": false,"region": 213,"language": "ru"}
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
queries | array of strings | required | Keywords to search, up to 50 per run. |
maxResults | integer | 30 | Organic results per keyword, 1 to 300. Yandex serves about 10 per page. Asking for more than exists returns everything available. |
includeAds | boolean | false | Also return paid results. Ads are billed like organic results. |
region | integer | empty | Yandex region ID (lr), e.g. 213 Moscow, 2 St Petersburg, 11508 Istanbul, 983 Turkey, 162 Almaty. Empty uses Yandex's default for the connection, which is a city in Turkey, so set this for any other market. |
language | string | empty | Yandex's results-language filter, e.g. ru, en, tr. Only results in that language are returned. Empty means all languages. |
site | string | empty | Only results from this domain, e.g. lamoda.ru. A full URL is reduced to its domain. |
withinDays | integer | empty (all time) | Recency filter. Yandex offers three windows, so the value is rounded up to the nearest one: 1 = past 24 hours, 2–14 = past 2 weeks, 15–31 = past month. Above 31 means all time. |
concurrency | integer | 3 | Keywords processed at once, 1 to 6. |
pageConcurrency | integer | 5 | Result pages requested in parallel per keyword, 1 to 8. |
country | string | empty | No longer used and ignored. Kept only so saved inputs keep working; use region to choose the market. |
Example output
{"position": 1,"title": "Мужские кроссовки купить на OZON по низкой цене","url": "https://www.ozon.ru/category/muzhskiy-krossovki/","displayUrl": "Ozon.ru","snippet": "Мужские кроссовки – покупайте на OZON по выгодным ценам! Быстрая и бесплатная доставка, большой ассортимент, бонусы...","isAd": false,"searchQuery": "купить кроссовки","sourcePage": 1,"scrapedAt": "2026-09-23T06:52:11.402Z"}
| Field | Description |
|---|---|
position | Rank for the keyword, numbered from 1 and continuing across pages (the first result on page 2 is usually 11). Ads are numbered separately from organic results. |
title | Result title, reassembled from Yandex's highlighted fragments. |
url | Destination URL. For ads this is Yandex's ad click link. |
displayUrl | Domain as Yandex displays it. |
snippet | The description text shown under the result. |
isAd | true for a paid placement. |
searchQuery | The keyword that produced the row. |
sourcePage | The results page it came from. |
scrapedAt | When the row was collected (UTC). |
A run summary is saved to the run's key-value store as OUTPUT: organic_results, ads, pages_fetched, zero_result_queries, blocked_pages, failed_pages, failed_queries and billing_stopped_early.
How much does Yandex SERP Scraper cost?
Pay per event. You pay for results returned, not for pages fetched.
| Event | Free / Bronze plan | Silver plan | Gold plan and above |
|---|---|---|---|
Result returned (organic, or ad when includeAds is on) | $0.004 | $0.0036 | $0.0032 |
| Zero-result keyword (Yandex answered, but with no results at all) | $0.002 | $0.0018 | $0.0016 |
| Actor start (once per run) | $0.0005 | $0.00045 | $0.0004 |
Worked examples at Free/Bronze prices:
- 1 keyword, top 10 organic results: 10 × $0.004 + $0.0005 = $0.0405
- 2 keywords, top 20 organic each: 40 × $0.004 + $0.0005 = $0.1605
- 1 keyword, 10 organic + 8 ads with
includeAds: 18 × $0.004 + $0.0005 = $0.0725
Pages that time out or are blocked by a captcha are never billed, and a keyword is only billed as "zero-result" when Yandex actually returned an empty results page. There is no subscription.
FAQ
Do I need a Yandex API key or XML quota? No. Yandex's official XML API needs registration and has quotas; this actor needs neither.
Can I track rankings for a specific city?
Yes. Set region to the Yandex lr ID for that city: Moscow is 213, St Petersburg is 2, Istanbul is 11508. 983 is the whole of Turkey.
Where do the results come from?
From Yandex search, collected through Yandex's Turkish portal (yandex.com.tr) with your region applied by Yandex itself, so 213 returns Moscow-localised results. Rankings can differ somewhat from what yandex.ru shows for the same region, most visibly for English-language keywords, which lean more international. Set language to ru to keep results Russian-language.
Can I scrape Yandex in Russian or Turkish?
Yes. Type the keywords in their own script. To return only results in one language, set language to ru, tr or en.
How do I separate ads from organic results?
It is done for you. Organic rows have isAd: false. Ads are only returned, and only billed, when includeAds is on. The number of ads depends on who is bidding at that moment and can be zero.
Why did a keyword come back empty?
Yandex challenges automated traffic, and a page that cannot be fetched after several retries is skipped rather than billed. The run log names the keyword, and OUTPUT counts it under failed_pages / failed_queries. If no page at all could be fetched, the run ends as Failed with an explanation and only the Actor start is billed. Running it again later usually works.
How recent can results be?
Yandex offers three recency windows: past 24 hours, past 2 weeks and past month. withinDays is rounded up to the nearest one, so 7 returns results from the past 2 weeks.
Can I run this on a schedule? Yes. Save your input as a task and add an Apify schedule for daily or weekly rank tracking, or trigger it from your own pipeline through the API.
Support
Open an issue on the Actor's Issues tab and I'll take a look.