Когда нужно проверить частотность 50 ключевых фраз, веб-интерфейс Wordstat с капчей превращается в час нудной работы. Кустарный парсер через Playwright обходится в 3 раза дороже, чем официальный API. С 2024 года Яндекс открыл программный доступ через Yandex Cloud Search API - без капчи, с легальной квотой, с авторизацией через IAM-токен. В этой статье - всё что нужно для интеграции в вашу систему за 2-3 часа.

TL;DR: Wordstat API за минуту

ПараметрЗначение
Что этоREST API для получения частотности фраз без капчи
Сервис Yandex CloudSearch API (раздел Foundation Models / Search API)
АвторизацияIAM-токен сервисного аккаунта (12 часов TTL)
Лимит~10 000 запросов в сутки на сервисный аккаунт
Цена~0.20 ₽ за фразу через batch-endpoint
Регионыпо коду: Москва=213, Россия=225, СПб=2
Главные методыgetKeywordsTop, getTopRequests, getDynamics
АльтернативаKeyCollector (платный), Playwright-парсер (3х дороже)

Что такое Yandex Cloud Search API

Yandex Cloud Search API - официальный программный интерфейс к данным Wordstat и поисковой статистике Yandex. Доступен через сервисные аккаунты в Yandex Cloud (yandex.cloud).

Что даёт:

  • Частотность фразы за период (день / неделя / месяц / год)
  • Динамика частоты по месяцам
  • Топ похожих и расширенных запросов
  • Региональная разбивка (общероссийская + по областям)
  • Без капчи и без блокировок аккаунта

API REST-овый, ответ JSON, авторизация через Bearer-токен. Стандартная схема для современных Yandex Cloud-сервисов.

Авторизация: IAM-токен через сервисный аккаунт

Прежде чем дёргать API - регистрируем сервисный аккаунт в Yandex Cloud:

  1. Открываем https://console.yandex.cloud → раздел «Сервисные аккаунты»
  2. Создаём аккаунт wordstat-bot с ролью search-api.executor
  3. Создаём авторизованный ключ (Authorized Key) - JSON-файл с приватным ключом
  4. Сохраняем JSON-файл в безопасное место (не в git!)

Дальше код для получения IAM-токена:

import jwt
import time
import requests
import json

def get_iam_token(key_file: str) -> str:
    with open(key_file) as f:
        key = json.load(f)
    
    # JWT для запроса IAM-токена
    payload = {
        'aud': 'https://iam.api.cloud.yandex.net/iam/v1/tokens',
        'iss': key['service_account_id'],
        'iat': int(time.time()),
        'exp': int(time.time()) + 3600,
    }
    
    encoded_token = jwt.encode(
        payload,
        key['private_key'],
        algorithm='PS256',
        headers={'kid': key['id']},
    )
    
    # Обмен JWT на IAM-токен
    r = requests.post(
        'https://iam.api.cloud.yandex.net/iam/v1/tokens',
        json={'jwt': encoded_token},
    )
    r.raise_for_status()
    return r.json()['iamToken']

# Кешируем IAM-токен на 11 часов (он живёт 12 часов)
iam_token = get_iam_token('keys/wordstat-bot.json')

IAM-токен живёт 12 часов, после чего нужно дёрнуть get_iam_token снова. В нашем production-коде токен в Redis с TTL 11 часов.

Запрос частотности фразы: getKeywordsTop

Основной метод - получение топ-похожих фраз с частотностью:

import requests

def get_keywords_top(phrase: str, iam_token: str, folder_id: str, region: int = 213) -> dict:
    url = 'https://search.api.cloud.yandex.net/v2/search/wordstat:getKeywordsTop'
    headers = {
        'Authorization': f'Bearer {iam_token}',
        'Content-Type': 'application/json',
    }
    payload = {
        'folderId': folder_id,
        'phrase': phrase,
        'regions': [str(region)],
        'period': 'last_month',
    }
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
    return r.json()

# Пример:
result = get_keywords_top('чат-бот для бизнеса', iam_token, folder_id='b1g...')
# Возвращает:
# {
#   'topRequests': [
#     {'phrase': 'чат бот для бизнеса', 'count': 1049},
#     {'phrase': 'чат бот для малого бизнеса', 'count': 18},
#     ...
#   ],
#   'totalShows': 1234
# }

Региональный код 213 = Москва. Для всей России - 225. Полный список регионов в Yandex регионы.

Batch-обработка: 100 фраз за 5 минут

В реальной работе нужно прогнать 50-200 фраз за один присест. Делаем через ThreadPoolExecutor с rate-limit 10 RPS:

from concurrent.futures import ThreadPoolExecutor, as_completed
import time

def batch_wordstat(phrases: list[str], iam_token: str, folder_id: str) -> list[dict]:
    results = []
    with ThreadPoolExecutor(max_workers=5) as executor:
        futures = {}
        for phrase in phrases:
            future = executor.submit(get_keywords_top, phrase, iam_token, folder_id)
            futures[future] = phrase
            time.sleep(0.1)  # rate limit 10 RPS
        
        for future in as_completed(futures):
            phrase = futures[future]
            try:
                data = future.result()
                results.append({'phrase': phrase, 'data': data})
            except Exception as e:
                results.append({'phrase': phrase, 'error': str(e)})
    
    return results

# 100 фраз - около 3-5 минут
results = batch_wordstat(my_100_phrases, iam_token, folder_id)

10 запросов в секунду - безопасная скорость. На 11-12 RPS Yandex начинает возвращать 429 (rate limit exceeded). С rate limit - 100 фраз за 10 секунд, плюс время на каждый запрос - итого ~5 минут на 100 фраз.

Динамика по времени: getDynamics

Для сезонного контента и трендового анализа - метод getDynamics:

def get_dynamics(phrase: str, iam_token: str, folder_id: str, period: str = 'last_year') -> dict:
    url = 'https://search.api.cloud.yandex.net/v2/search/wordstat:getDynamics'
    headers = {
        'Authorization': f'Bearer {iam_token}',
        'Content-Type': 'application/json',
    }
    payload = {
        'folderId': folder_id,
        'phrase': phrase,
        'period': period,  # last_year, last_3_months
        'groupBy': 'month',
    }
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
    return r.json()

# Возвращает массив points: [{date: '2025-05', count: 234}, ...]

Применение: подбор сезонного контента под пик спроса. Например, подарок на 8 марта растёт в феврале-марте, школьная форма в августе.

Региональная статистика: getRegions

Какие регионы лучше для нашей ниши - можно посмотреть через getRegions:

def get_regions(phrase: str, iam_token: str, folder_id: str) -> dict:
    url = 'https://search.api.cloud.yandex.net/v2/search/wordstat:getRegions'
    payload = {
        'folderId': folder_id,
        'phrase': phrase,
    }
    # Возвращает: [{regionId: 213, regionName: 'Москва', affinityIndex: 1.4, count: 234}, ...]
    # affinityIndex > 1 - регион любит эту фразу больше среднего

Применение: для регионального ретаргетинга в Yandex Direct или для нишевых статей с региональным таргетингом.

Сколько это стоит

Стоимость Yandex Cloud Search API в 2026 году - ориентировочно 0.20 ₽ за фразу через batch-endpoint. На объёмах:

  • 100 фраз/сутки: ~20 ₽
  • 1 000 фраз/сутки: ~200 ₽
  • 10 000 фраз/сутки: ~2 000 ₽

Для SEO-агентства с ежедневной работой над 5-10 проектами - 5-10к ₽/мес расходы. Дешевле любого KeyCollector-аналога.

Есть бесплатная квота на тестирование - около 100 запросов в день в первый месяц.

Точные цены и тарифы - на yandex.cloud/ru/prices, могут пересматриваться. Перед production-внедрением проверьте актуальные ставки.

Подводные камни

1. IAM-токен живёт 12 часов

Если ваш сервер не перезапускается в течение дня - токен протухает в самый неподходящий момент. Решение: кешировать с TTL 11 часов, обновлять заранее.

2. Rate limit 10 RPS

На 11-12 RPS - 429 ошибки. Учитывайте при batch-обработке. Безопасная скорость - 10 запросов в секунду максимум, с буфером лучше 8-9.

3. Региональная нумерация - не очевидная

Москва - 213. Россия (общая) - 225. Санкт-Петербург - 2. Список не алфавитный. Полный справочник: yandex.ru/dev/xml/doc/dg/concepts/regions.html. Лучше кешировать локально.

4. Капитализация и спецсимволы

API игнорирует регистр (Чат-бот = чат-бот), но дефисы важны (чат-ботчат бот). Перед запросом нормализуйте фразу.

5. Лимит 10 000 запросов в сутки

На больших проектах с 100к фраз - не хватит. Решения: несколько сервисных аккаунтов, batch-streaming в несколько дней, KeyCollector для очень больших проектов.

6. Аутентификационные ключи в git

Никогда не коммитьте JSON-ключи в git. Минимум - в .env или secret manager. Best practice - переменные окружения в production / Vault для команд.

Что мы делаем с Wordstat API

В нашей студии Wordstat API подключён к 3 типовым процессам:

  1. Аудит семантики статьи перед написанием - прогон 20-50 ключевых фраз за 10 минут, отбор по частотности > 100/мес.
  2. Мониторинг конкурентов - еженедельный замер их главных запросов в нашей нише, динамика.
  3. Сезонный контент-план - дёргаем getDynamics для 50 тематических фраз, ищем пики, подгоняем публикации к ним.

Скрипты в scripts/yandex/wordstat.py, исходники в нашем репозитории - можем поделиться с клиентами как часть проекта.

Альтернативы (когда не подходит)

KeyCollector - десктопное приложение, около 7 тыс ₽ единоразово. Плюс: дополнительные источники данных (Bukvarix, MOAB). Минус: нет API, ручной запуск.

Бесплатный wordstat.yandex.ru через Playwright - дешевле API, но капча через 50-100 запросов. Подходит для разовых проверок 10-20 фраз.

Зарубежные сервисы (Ahrefs, SEMrush) - дают западные источники, недоступны напрямую из РФ.

Для регулярной работы с русским рынком - Yandex Cloud Search API лучший вариант на 2026.

FAQ

Wordstat API - официальный сервис Яндекса?

Да. Yandex Cloud Search API. yandex.cloud/ru/docs/search-api.

Можно ли использовать без капчи?

Да, при программном доступе через API. Капча только в веб-интерфейсе wordstat.yandex.ru.

Сколько стоит?

~0.20 ₽ за фразу через batch. Точные тарифы - на yandex.cloud/ru/prices.

Есть ли бесплатный режим?

Free tier на тестирование (~100 запросов/день первый месяц). Дальше платно.

Какие региональные ограничения?

По регионам Яндекса: Москва=213, Россия=225, Санкт-Петербург=2 и т.д. Не все регионы дают полные данные на малых нишах.

Можно ли использовать на стороне фронтенда?

Нет, IAM-ключи должны быть на сервере. Фронтенд может только дёргать ваш бэкенд, который дёргает API.

Что делать если 429?

Снизить RPS до 8-9, добавить retry с backoff (1с, 5с, 30с).

Можно ли получить историю частотности?

Через getDynamics за последний год по месяцам. За более длинные периоды - нет, только через накопленные собственные данные.

Какая точность данных?

Те же что в веб-интерфейсе Wordstat. Округлённые значения, точность ±10%.

Можно ли использовать в коммерческих проектах?

Да. По договору-оферте Yandex Cloud, на правах сервисного аккаунта.

Готовы обсудить вашу задачу?

Если эта статья откликнулась - у вас сейчас одна из трёх ситуаций:

  1. Нужна интеграция Wordstat API в свой сервис. Сделаем за 1-2 недели, типичная цена 30-80к.
  2. Нужно собрать семантику под контент-стратегию. Часовой созвон + предложение по работе с семантикой 1000+ фраз. От 50к.
  3. Хотите автоматизацию SEO-работы целиком (мониторинг конкурентов + дашборд + алерты). 150-300к, срок 4-8 недель.

📱 Telegram @viktdo - отвечаю в течение часа в будни 📝 Форма обратной связи

О нас: BotKraft - студия чат-ботов и автоматизации (5 лет, 300+ проектов, ИНН 701718749598). Используем Yandex Cloud Search API в production-инструментах для своих клиентов и для собственной контент-стратегии.

Связанные материалы