Yandex Wordstat
collect · synonymsBase frequency, refinements and similar queries through the Yandex Cloud API. API key and folder ID; hourly quota.
Collect, clean, cluster and grow a keyword pool per project: Yandex Wordstat demand, SERP clusters, exact frequency and competitor mining, with an offline plan before every paid call.

Each stage changes a status and records the reason, so a phrase is never deleted and every decision can be explained. Free stages sit between the paid ones, so you check the pool before you buy the next answer.
Bring what you already have: a CSV or one sheet of an XLSX. Map query, frequency, group, subgroup, URL and comment, then add, update or replace. The preview shows new, existing and duplicate rows before anything is written.
phrasesExpands your seeds by region and re-expands strong phrases up to the depth you set. The queue is deduplicated, and --resume continues an interrupted run without asking for the same phrase again.
phrases, expansions, provenanceApplies the project filters (intent, stop words, informational patterns), flags frequency outliers and groups phrases by lemma. A phrase with observed impressions or positions is never cut by frequency rules.
status, route, lemma groupBuilds a word graph of the pool. Homonym candidates go to review and candidate clusters land in anomalies.md, before you pay for anything else.
anomalies.mdA phrase belongs in the core only when the site offers it. Phrases without any term from catalog.txt go to review as off-catalog.
review listFetches one top 10 per phrase and caches it, so a repeated run pays only for new phrases. Phrases that share pages form a cluster; --method louvain regroups the cached results to break long chains.
SERP cache, clusters, landing candidatesIf no site of your kind from vendors.txt appears in a phrase's top 10, the topic is probably off scope. The phrase goes to review; nothing is deleted.
review listReads the cached results: which domains hold your clusters and which words they use in titles. Candidates go to synonyms.txt.
competitors.md, synonyms.txtOpens the most frequent competitor pages from the collected results and reads their title, description, H1 and first H2 headings. Topical two- and three-word phrases go to synonyms.txt.
competitor_mining.md, synonyms.txtChecks the candidates in synonyms.txt. Only phrases with demand join the core; then collect --resume grows the pool from them.
checked phrasesBuys the exact !W frequency once per lemma group, at the end, when the pool has stopped changing. Above the project's budget gate it needs --yes.
exact frequency, task receiptsreport.md and clusters.csv for reading, an XLSX workbook (Summary, Core, Info, Clusters, Rejected) for the client, pool.csv and pool.json for other tools.
report.md, XLSX, CSV, JSONAfter launch, pick each cluster's landing page from measured candidates, then read weekly cluster signals from your local Search Console, Webmaster and Metrika data and turn chosen ones into checklist tasks.
landing, weekly signals, tasksThe core is not collected once. Competitors and mining feed new candidates, synonyms checks them, collection resumes and clustering runs again. Exact frequency is bought last.
collectclean · graph · site matchclustercompetitors · minesynonymscollect --resumeexact, oncereportThe collection pipeline runs on Yandex data. Google demand, rank tracking and search analytics are separate toolkit commands that work next to the core.
collect · synonymsBase frequency, refinements and similar queries through the Yandex Cloud API. API key and folder ID; hourly quota.
clusterOne top 10 per phrase and region, cached with its fetch time and region. The async endpoint only.
exactThe exact !W frequency the Wordstat API does not give. Billed at task creation; the task_id is kept, so a timed-out result is fetched again, not bought again.
google-keywordsGoogle search volume, competition and seed expansion. Sandbox by default.
keywords-expand · keywords-seasonality · regions-treeExpand one phrase, read its demand by month, browse the region tree (the tree is free).
topvisor-readReads projects, keywords and recorded position history from your existing account. Paid checks cannot be launched from the toolkit.
semantics insightsWeekly cluster signals from data the toolkit already synced locally. The insights step itself makes no provider calls.
Every paid stage has an offline plan: the region, the engine, the query source and an upper bound of requests or tasks. No provider client is created by a plan.
--dry-run --json prints the plan. The run itself needs --confirm-paid, even when the estimate is zero.
Wordstat attempts, SERP fetches and Arsenkin tasks are reserved before the call. An ambiguous request is never resubmitted automatically.
Cached SERPs and paid receipts survive a replace of the pool, so clustering again pays only for new phrases.
Each charge lands in spend-report with the semantic project and stage it belongs to.
When a provider price cannot be established offline, the plan says so instead of guessing a number.
Captured from the synthetic example project that ships with the toolkit. Its phrases are Russian, as Yandex demand is, and its frequencies are invented. No paid call was made.
$ seohead semantics clean --project ./core
$ seohead semantics graph --project ./core
$ seohead semantics sitematch --project ./core
clean: kept=34 review=4 dropped=3 | lemma groups=41 (median base=720, outlier>36000)
graph: homonyms=0, to review=0, candidate clusters=7 -> anomalies.md
sitematch: catalog terms=11 | off-catalog->review=8 | kept and matching the site=26$ seohead semantics cluster --project ./core --dry-run
"mode": "estimate", "stage": "cluster", "paid": true,
"provider": "yandex_search",
"request_estimate": {"unit": "requests", "count": 26, "kind": "upper_bound"},
"money_estimate": null,
"money_unavailable_reason": "provider pricing is not available from this offline preflight",
"paid_calls_made": 0$ seohead semantics status --project ./core
dropped=3 | kept=26 | review=12 | _total=41 | _exact=0 | _expanded=0 | _clusters=0
provider units: {'yandex_requests': 0, 'arsenkin': 0}
next: seohead semantics exact --project ./core$ seohead semantics export --project ./core --scope no-landing --dry-run
"mode": "preview", "scope": "no-landing", "rows": 41,
"planned_files": ["core/semantics/pool.csv", "core/semantics/pool.json"]seohead semantics status --project ./my-coreInstall first: installation guide. Every command also runs as an MCP tool for AI agents.
Ten MCP tools expose the same stages and reads. A paid call returns the plan and needs confirm_paid=true to send work.
seo_semantics_statusCounters, provider units and the next stageseo_semantics_runFree stagesseo_semantics_mineCompetitor pages, no provider quotaseo_semantics_paidPaid stages: plan first, then confirm_paid=trueseo_semantics_clustersPaged cluster listseo_semantics_cluster_showOne cluster with its landing evidenceseo_semantics_cluster_queriesPhrases of a cluster with the retained top 10seo_semantics_set_landingAssign or clear a landing pageseo_semantics_insightsWeekly signals by cluster and sourceseo_semantics_insights_tasksChosen signals into the checklist