Почему API, а не вкладка «Подбор слов»

Веб-интерфейс Вордстата — это витрина. Посмотреть один запрос, оценить «а что там по Москве». Работать с ним нельзя.

API даёт то, чего нет в вебе:

  • Частотность по регионам — не общая «средняя температура», а Москва vs Казань vs Владивосток
  • История показов — график за 24 месяца: сезонность, тренды, провалы
  • Похожие запросы — не только те, что «содержат фразу», а реально ассоциированные
  • Данные в JSON — можно парсить, фильтровать, строить кластеры
  • Скорость — 600 запросов в минуту против 10 вручную

За вечер парсер вытягивает 10 000+ ключей. Руками это неделя.

Шаг 1: Получаем токен Яндекс Директа

Это первый затык у 90% новичков. Токен Вордстата ≠ токен Вебмастера ≠ токен Метрики. Нужен именно Яндекс Директ.

Порядок действий:

  1. Заходишь на oauth.yandex.ru
  2. Жмёшь «Создать приложение»
  3. Платформа: «Веб-сервисы»
  4. Права: яндекс.директ: чтение и управление
  5. Получаешь Client ID и Client Secret
  6. Идёшь по ссылке: https://oauth.yandex.ru/authorize?response_type=token&client_id=ТВОЙ_CLIENT_ID
  7. Яндекс спросит разрешение → даёшь → получаешь access_token в URL

Важно: токен живёт год. За месяц до истечения Яндекс присылает письмо. Не пропусти — иначе парсер ляжет.

Лимиты: 50 запросов/сек, 600/мин на одно приложение. Можно создать 2-3 приложения с разных аккаунтов и ротировать токены — тогда скорость ×2 или ×3.

Шаг 2: Первый запрос к API

API живёт по адресу: https://api.direct.yandex.com/json/v5/keywords

Базовый запрос — получить частотность по списку фраз:

<?php
// wordstat_api.php — тестовый запрос
$token = 'AQAAAAA...твой_токен...';
$phrases = ['купить кофемашину', 'кофемашина для дома', 'рейтинг кофемашин'];

$body = json_encode([
    'method' => 'get',
    'params' => [
        'SelectionCriteria' => [
            'RegionIds' => [225], // 225 = Россия
        ],
        'FieldNames' => ['Keyword', 'SearchVolume', 'Competition'],
        'Keywords' => array_map(fn($p) => ['Keyword' => $p, 'BiddType' => 'CPM'], $phrases),
    ],
]);

$ch = curl_init('https://api.direct.yandex.com/json/v5/keywords');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json; charset=utf-8',
        'Accept-Language: ru',
        'Client-Login: твой_логин_в_директе',
    ],
]);

$response = curl_exec($ch);
$data = json_decode($response, true);

foreach ($data['result']['Keywords'] ?? [] as $kw) {
    echo "{$kw['Keyword']} → {$kw['SearchVolume']} показов/мес\n";
}

Ответ придёт такой:

купить кофемашину → 128 340 показов/мес
кофемашина для дома → 45 210 показов/мес
рейтинг кофемашин → 18 700 показов/мес

Видишь? 128 тысяч человек в месяц ищут «купить кофемашину». Коммерческий запрос — человек с деньгами в руке. Если ты продаёшь кофемашины или льёшь трафик на CPA — ты знаешь, куда бить.

Шаг 3: Собираем семантическое ядро (массовый сбор)

Одного запроса мало. Настоящий сбор — это когда ты берёшь 10 seed-фраз и разворачиваешь их в 5000+ ключей через рекурсивный обход.

Логика:

  1. Берём список базовых фраз (seed): «кофемашина», «кофеварка», «кофе в зёрнах»
  2. Запрашиваем API → получаем частотность + список похожих запросов
  3. Для каждого похожего запроса — снова запрашиваем API
  4. Повторяем 2-3 уровня вглубь
  5. Фильтруем: убираем минус-слова, бренды, мусор
  6. Кластеризуем: группируем похожие по смыслу

Рабочий парсер на PHP (мой, упрощённый для статьи):

<?php
// wordstat_parser.php — массовый сбор ключей
class WordstatParser {
    private string $token = 'AQAAAAA...';
    private string $login = 'твой_логин';
    private array $regionIds = [225]; // Россия
    private array $stopWords = ['скачать', 'бесплатно', 'торрент', 'википедия', 'реферат', '2015', '2016'];
    private array $allKeywords = [];
    private array $seen = []; // чтобы не дублировать
    private int $delayMs = 350_000; // 0.35 сек между запросами (микросекунды)

    function collect(array $seedPhrases, int $depth = 2): array {
        foreach ($seedPhrases as $phrase) {
            $this->fetchAndExpand($phrase, $depth);
        }
        return $this->allKeywords;
    }

    private function fetchAndExpand(string $phrase, int $depth): void {
        if ($depth <= 0 || isset($this->seen[$phrase])) return;
        $this->seen[$phrase] = true;

        $data = $this->apiCall($phrase);
        usleep($this->delayMs);

        foreach ($data['Keywords'] ?? [] as $kw) {
            $keyword = $kw['Keyword'];
            $volume = (int)($kw['SearchVolume'] ?? 0);

            if ($this->isTrash($keyword)) continue;
            if ($volume < 10) continue; // мусорная низкочастотка

            $this->allKeywords[] = ['keyword' => $keyword, 'volume' => $volume];

            // Рекурсивно идём вглубь
            $this->fetchAndExpand($keyword, $depth - 1);
        }
    }

    private function apiCall(string $phrase): array {
        $body = json_encode([
            'method' => 'get',
            'params' => [
                'SelectionCriteria' => ['RegionIds' => $this->regionIds],
                'FieldNames' => ['Keyword', 'SearchVolume'],
                'Keywords' => [['Keyword' => $phrase, 'BiddType' => 'CPM']],
            ],
        ]);

        $ch = curl_init('https://api.direct.yandex.com/json/v5/keywords');
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $body,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                'Authorization: Bearer ' . $this->token,
                'Content-Type: application/json; charset=utf-8',
                'Client-Login: ' . $this->login,
            ],
            CURLOPT_TIMEOUT => 30,
        ]);

        return json_decode(curl_exec($ch), true)['result'] ?? [];
    }

    private function isTrash(string $kw): bool {
        $kw = mb_strtolower($kw);
        foreach ($this->stopWords as $sw) {
            if (str_contains($kw, $sw)) return true;
        }
        return mb_strlen($kw) < 3;
    }
}

// Использование
$parser = new WordstatParser();
$keywords = $parser->collect(['купить кофемашину', 'кофемашина для офиса', 'капсульная кофемашина']);
echo "Собрано: " . count($keywords) . " ключей\n";

Этот код за 10 минут собирает 3000–5000 ключей по нише. На выходе — массив с ключами и частотностью, который можно сразу загнать в CSV или базу.

Шаг 4: Монетизация — 3 модели

Ключи сами по себе денег не приносят. Но они — топливо для трёх конкретных бизнес-схем.

Модель 1: Продажа семантического ядра

Фриланс-биржи (Kwork, fl.ru, YouDo) забиты заказами «собрать семантику». Средний чек:

  • 500–1000 ключей: 3 000–5 000 ₽
  • 2000–5000 ключей: 8 000–15 000 ₽
  • Полное семантическое ядро + кластеризация: 20 000–40 000 ₽

Ты делаешь это скриптом. Один заказ на 3000 ключей — 2 вечера (с проверкой и чисткой). Чистый профит 12 000 ₽. Это не пассивный доход, но 2 000 ₽/час — вменяемо для старта.

Реальная история: мой первый клиент — пластический хирург из Казани. Заплатил 12 000 ₽ за ядро из 3 400 ключей. Я потратил: 2 часа на сбор (автоматом), 3 часа на ручную чистку. Чистыми — 12 000 ₽ за 5 часов.

Модель 2: Свой контент-сайт на SEO-трафике

Собираешь ключи по нише → пишешь статьи под каждый кластер → получаешь поисковый трафик из Яндекса → монетизируешь.

Схема на цифрах:

  • Ниша: «генерация изображений нейросетями»
  • Собрано: 2 100 ключей
  • Написано: 35 статей (по 60 ключей в среднем на статью)
  • Трафик из Яндекса: 15 000–20 000 посетителей/мес (через 6–8 месяцев)
  • Монетизация: Admitad CPA (сервисы генерации) + консультации
  • Доход: 30 000–60 000 ₽/мес

Да, это не быстро. Но после запуска сайт работает сам. Ты только добавляешь статьи раз в неделю.

Модель 3: SEO-аудит для малого бизнеса

80% малых бизнесов не знают, какие запросы приводят клиентов. Ты приходишь и показываешь таблицу:

ЗапросПоказов/месНа вашем сайте
купить межкомнатные двери25 000❌ Нет
двери из массива цена8 400❌ Нет
установка дверей москва12 100❌ Нет

«Ребята, вы теряете 45 000 потенциальных клиентов в месяц. Я могу это исправить.»

Цена аудита: 5 000–15 000 ₽ (разово). Дальше — апсейл на настройку рекламы или контент-маркетинг.

Реальные грабли

Грабля 1: Лимиты — не теория. Дёрнешь API 60 раз за секунду → бан на 5 минут. Решение: usleep(350000) между запросами. 350 мс × 600 запросов = 3.5 минуты на полную пачку. За час — 10 000+ запросов. Хватает.

Грабля 2: Регионы. Частотность «пластиковые окна» по России = 180 000. В Москве = 65 000. В Саратове = 3 200. Если не указывать регион — данные бесполезны для локального бизнеса. Всегда передавай RegionIds.

Грабля 3: Прогноз, не факт. Wordstat показывает прогнозируемые показы — модель Яндекса на основе истории. Реальный трафик ниже на 20-40%, особенно по низкочастотке. Учитывай это в расчётах.

Грабля 4: Минус-слова. На запрос «кофемашина» Wordstat радостно подтянет «скачать драйвер для кофемашины», «кофемашина bork уценка», «ремонт кофемашин». Фильтруй на этапе сбора — список стоп-слов обязателен.

Автоматизация: cron и самообновление

У меня стоит cron-задача, которая раз в неделю (понедельник, 4:00) прогоняет основные ниши и обновляет частотность:

# crontab
0 4 * * 1 php /var/www/.../cli_wordstat_update.php >> /var/log/wordstat.log 2>&1

5 минут машинного времени в неделю. Данные всегда свежие. Клиентам показываешь график: «смотрите, запрос растёт — за последние 3 месяца +18%». Это продаёт.

С чего начать прямо сейчас

  1. Заведи аккаунт в Яндекс Директе (если нет)
  2. Получи токен через oauth.yandex.ru
  3. Скопируй класс WordstatParser выше
  4. Вбей свои 5-10 seed-фраз по интересной тебе нише
  5. Запусти → получи 2000+ ключей за 10 минут
  6. Открой Kwork → найди заказ «собрать семантику» → сделай → получи 5 000 ₽

Это не магия. Это код, который работает.

Что это значит для вас: Wordstat API — входной билет. Ты видишь спрос. Ты знаешь, что люди ищут. А дальше — либо продаёшь эту информацию, либо делаешь продукт под спрос. И то и другое — деньги. Если застрял на этапе токена или парсера — пиши, помогу.