Most rank trackers price Yandex like an afterthought, when they cover it at all. If your clients sell into Russia, Turkey, Kazakhstan, or anywhere else Yandex matters, the tooling gap is real: you either pay for an enterprise tier you don't need or you track rankings by hand. I built the Yandex Rank Tracker API to close that gap. It's a per-result Yandex SERP scraper: you pay for exactly the rows you pull, whether that's a 10-keyword daily check or a 1,000-keyword monthly sweep.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Yandex have a search API?
Technically yes, which makes this different from most sources I scrape. Yandex offers developer search APIs, but getting there means account registration in the Yandex ecosystem, API keys, quota tiers, and output built for site owners rather than rank trackers. What you don't get is the SERP as users see it: the ads, the knowledge graph card, the inline image and video blocks. A scraper-as-API fills that hole. You send a keyword and a region, and you get back the live results page as structured JSON, no key ceremony involved.
What the Yandex tracking data looks like
The Yandex Rank Tracker API returns each search result as its own JSON row: ranking position, title, target URL, snippet, favicon, publication date, and rich snippets when present.
| Field | Example | Notes |
|---|---|---|
| Position | 3 |
Rank on the page, the number you're tracking |
| Title | CRM для малого бизнеса |
Result headline as served |
| URL | https://example.ru/crm |
Target link for domain matching |
| Snippet | Попробуйте бесплатно... |
Description text under the title |
| Publication date | 2026-06-12 |
When Yandex shows one |
| Rich snippets | sitelinks, ratings |
Present on enhanced results |
Optional result types add paid ads with advertiser metadata, knowledge-graph entity cards, inline image strips, and video carousels. You can localize by domain (yandex.com, .ru, .by, .kz, .uz, .com.tr), pick from 19 interface languages, target a region ID, sort by relevance or date, and paginate as deep as you need.
Who this is for
SEO agencies with clients in CIS or Turkish markets, in-house teams that need daily Russian-language rank checks, ad-intelligence analysts watching who bids on which keywords, and builders giving an AI agent a second search engine beyond Google.
The manual way, and where it breaks
You can request a Yandex results page yourself and parse it. I tried, and the failure list got long fast. Yandex ships one of the more aggressive captcha walls in search, so unattended scripts stall within minutes. Regional targeting rides on an lr region ID system you have to map by hand. Cyrillic queries need careful encoding, the markup differs by domain and language, and ad blocks shift position between runs. Every one of those is fixable, and together they become a part-time job.
The faster way: run the Yandex Rank Tracker API
Documented input in, structured rows out, per-result billing.
Apify Console
- Open the Yandex Rank Tracker API and click Try for free.
- Set
textto your keyword, pick ayandex_domain, and optionally a region. - Run it and export the rows as JSON or CSV.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~yandex-scrape-yandex-search-results-at-scale---per-result/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "text": "купить квартиру москва", "yandex_domain": "yandex.ru", "lr": "225", "max_pages": 1 }'
Region 225 is Russia; the run endpoint itself is covered in the Apify API docs.
Track Yandex rankings in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/yandex-scrape-yandex-search-results-at-scale---per-result").call(
run_input={
"text": "CRM для малого бизнеса",
"yandex_domain": "yandex.ru",
"lr": "225",
"max_pages": 1,
}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row.get("position"), row.get("title"), row.get("url"))
Match url against your domain and you have a rank check; loop it over a keyword list and you have a tracker.
Track 1,000 keywords without a subscription
The flagship task, Track Yandex rankings for 1,000 keywords, shows the bulk pattern. Per-result pricing keeps the budget predictable: 1,000 keywords times a top-10 pull is 10,000 rows, about $150, whether that happens in one run or fifty.
Monitor SERPs and ads on a schedule
Bulk collect Yandex SERPs for SEO monitoring is the recurring-snapshot setup, and Monitor Yandex search ads by keyword points the same machinery at paid results, advertiser metadata included.
Pull knowledge graph, images, and video blocks
Rankings are not the whole SERP. Get Yandex knowledge graph entity data extracts the entity card, Extract Yandex inline images by query grabs the image strip, and Track Yandex video results by query covers the video carousel.
Go beyond Russian
There are ready-made tracks for 18 languages and several country markets, from Turkish SERPs to Kazakh SERPs to country-level runs like Yandex SERPs in Georgia. For the no-code crowd, Export Yandex search results to CSV skips the code entirely.
Let your AI agent read the SERPs
Over the Model Context Protocol, the Actor becomes a tool that Claude, Claude Code, or Cursor can call mid-conversation. Ask "where does mysite.ru rank for 'CRM для малого бизнеса', and who outranks it?" and the agent runs the check against live rows instead of guessing. The task Get Yandex SERP data in Claude via MCP walks through the config, and there's more on Claude at claude.ai.
FAQ about Yandex tracking with a scraper
How is this Yandex scraper different from the per-page Yandex Search API?
Same structured data, different meter. This Actor bills per result row, which wins for bulk rank tracking where you control exactly how many rows you pull. Its sibling, the Yandex Search API, bills per SERP page and wins for occasional full-page pulls.
What does the Yandex scraper cost per run?
About $0.015 per result row plus a small start fee, with no subscription underneath. A top-10 check on one keyword is roughly fifteen cents; new Apify accounts include free platform credit, so trial runs usually cost nothing.
Can Claude run this Yandex scraper through MCP?
Yes. Add it as an MCP tool and Claude or Cursor can run rank checks during a conversation, with the structured rows coming back as tool output.
How do I schedule the Yandex scraper for daily tracking?
Save your keyword list as a task, attach an Apify schedule with a cron expression, and each run appends fresh rows you can diff over time. Start from the Yandex Rank Tracker API and save your first task.
What won't this Yandex scraper tell you?
It reports the SERP for the domain, language, and region you request, which is not the personalized page any single logged-in user sees. It also can't see data Yandex doesn't render, search volume included; pair it with a keyword tool for that half of the picture.
More from Truffle Pig Data
I've written about the rank-tracking angle elsewhere: the Medium piece Build a Yandex Rank Tracker: Bulk SERP Monitoring at $0.015 per Result, the same story on LinkedIn, and a shorter build note on Peerlist.
Wrapping up
If your rank tracker goes blank east of Warsaw, this is the fix: per-result Yandex tracking that costs what you pull. Start with the Yandex Rank Tracker API and a ten-keyword test list.
Top comments (0)