Васин Константин
Васин Константин · инструкция

API поисковиков: Вебмастер и Search Console

Кабинет вы уже завели — сайт добавлен, права подтверждены, карта отправлена. Эта инструкция про следующий шаг: как дать программе ходить в Вебмастер и Search Console вместо вас — тянуть запросы и позиции, слать страницы на переобход, отправлять карту после каждой публикации. Оба маршрута ниже проверены живыми запросами 9 августа 2026 года, а не переписаны из документации.

Что получится на выходе
Семь строк в .env вашего проекта — из них обязательных пять. Дальше SEO-завод сам берёт данные и сам пингует поисковики — вам в кабинеты заходить не нужно.
.env после настройки
YANDEX_WEBMASTER_TOKEN=y0__x...
YANDEX_WEBMASTER_USER_ID=12345678          # необязательно, завод найдёт сам
YANDEX_WEBMASTER_HOST_ID=https:example.ru:443   # необязательно, завод найдёт сам

GSC_SITE_URL=sc-domain:example.ru
GSC_OAUTH_CLIENT_ID=...apps.googleusercontent.com
GSC_OAUTH_CLIENT_SECRET=GOCSPX-...
GSC_OAUTH_REFRESH_TOKEN=1//0...

Зачем это, если кабинет уже есть

Кабинет и API решают разные задачи. В кабинет вы заходите руками, когда что-то заподозрили. API нужен, чтобы завод работал без вас.

ЗадачаЧерез кабинетЧерез API
Отправить новую статью на переобходруками, по одному адресуавтоматически при публикации
Найти «быстрые победы» (позиции 11–20)выгружать CSV и сортироватьотчёт приходит сам
Заметить, что страницы выпали из индексаесли вспомнили зайтиалерт в Telegram в тот же день
Новые темы из реальных запросовсмотреть глазами раз в месяцподмешивается в семантику каждую неделю
Отправить карту сайта после релизарукамиодной строкой в деплое
Честно про приоритет. Без этих ключей завод работает — просто часть отчётов будет пустой, а индексация пойдёт медленнее. Если вы только выкатили сайт, сначала наполните его страницами: пустой сайт с идеально настроенным API всё равно нечего показывать поисковику. Подключайте, когда пошли первые публикации.

Что понадобится

Для зарубежного сайта (market.scope: intl) Яндекс не нужен вовсе — хватит одного Google. Для российского нужны оба.

Яндекс.Вебмастер: токен за 7 минут

Токен Вебмастера — это не пароль от Яндекса. Это OAuth-токен приложения, которое вы сами создаёте за минуту. Звучит страшнее, чем есть.

  1. Создайте приложение. oauth.yandex.ru/client/new. Название — любое, например «SEO-завод». Иконка не нужна.
  2. Платформа — «Веб-сервисы». В поле Redirect URI вставьте ровно это: https://oauth.yandex.ru/verification_code
  3. Доступ к данным — два права: webmaster:hostinfo и webmaster:verify. Первое даёт читать данные сайта, второе — отправлять страницы на переобход. Больше ничего отмечать не надо.
  4. Создайте приложение и скопируйте ClientID — он появится на странице приложения.
  5. Получите токен. Подставьте ClientID в адрес ниже, откройте его в браузере и скопируйте токен со страницы.
Ссылка для получения токенаподставьте свой ClientID
https://oauth.yandex.ru/authorize?response_type=token&client_id=ВАШ_CLIENT_ID
Токен живёт 6 месяцев. Это официальный срок Яндекса. Поставьте себе напоминание на пять месяцев вперёд — когда токен протухнет, отчёты по Яндексу молча опустеют, а переобход перестанет работать. Обновляется он повторным переходом по той же ссылке из шага 5, приложение пересоздавать не нужно.

Яндекс: где взять user_id и host_id

Все адреса API выглядят как /v4/user/{user_id}/hosts/{host_id}/…, поэтому эти два значения нужны при каждом запросе. Вопрос только в том, кто их подставляет.

Если вы работаете на нашем SEO-заводе — достаточно токена. Завод сам спрашивает у API свой user_id, сам находит нужный сайт по домену из site.config.yml и предпочитает подтверждённое https-зеркало. Две переменные в .env — это кэш, чтобы не ходить лишний раз, а не требование: наши собственные сайты живут с одним заполненным токеном. Если пишете свою интеграцию — доставайте значения сами, ниже как.

Идентификатор сайта угадать нельзя. Он выглядит как https:example.ru:443 — схема, хост и порт через двоеточие, без слэшей. Именно поэтому его получают списком, а не собирают из адреса сайта руками.

Два запроса — и оба значения у васподставьте свой токен
# 1. Свой user_id
curl -s -H "Authorization: OAuth ВАШ_ТОКЕН" \
  https://api.webmaster.yandex.net/v4/user/

# → {"user_id": 12345678}

# 2. Список сайтов с их идентификаторами
curl -s -H "Authorization: OAuth ВАШ_ТОКЕН" \
  https://api.webmaster.yandex.net/v4/user/12345678/hosts/

# → "host_id": "https:example.ru:443", "verified": true
На Windows пишите curl.exe. Иначе PowerShell подставит вместо curl свой Invoke-WebRequest и ругнётся на -H — выглядит так, будто сломан запрос, хотя сломана только команда.
Заголовок — OAuth, а не Bearer. Это общая черта Яндекса и самая частая ошибка тех, кто пришёл из мира Google. Поставите Bearer по привычке — получите 403 и будете долго искать проблему не там.

Google: два маршрута

У Google есть два способа дать программе доступ, и они принципиально разные по цене обслуживания.

А — сервисный аккаунтБ — OAuth
Настройка10 минут20 минут
Срок жизни доступане истекает7 дней или бессрочно — см. ниже
Нужен браузер при настройкенетда, разовый вход
Годится для сервера без GUIдатолько после разовой настройки на своей машине
РискGSC не всегда принимает email сервисного аккаунтазабыть опубликовать приложение — доступ умрёт через неделю
Что выбрать. Начинайте с маршрута А: он проще в обслуживании, потому что там нечему протухать. Если Google откажется добавлять email сервисного аккаунта в пользователей ресурса — переходите на Б.

Маршрут А — сервисный аккаунт

  1. Создайте проект. console.cloud.google.com → выпадающий список проектов вверху → New Project. Название любое.
  2. Включите API. В поиске консоли вбейте Google Search Console APIEnable. Без этого шага все запросы будут падать, даже с верным ключом.
  3. Создайте сервисный аккаунт. В поиске — Service AccountsCreate Service Account. Роли на этом шаге не нужны, жмите «Готово».
  4. Скачайте ключ. Откройте созданный аккаунт → вкладка KeysAdd Key → Create new key → JSON. Файл скачается один раз — положите его рядом с проектом и никогда не коммитьте в git.
  5. Главный шаг: дайте роботу права в Search Console. Откройте GSC → Настройки → Пользователи и разрешения → Добавить пользователя. Вставьте email из скачанного JSON (поле client_email, выглядит как что-то@проект.iam.gserviceaccount.com), разрешение — Владелец.
Пятый шаг пропускают чаще всего. Без него ключ валиден, запросы уходят, а в ответ приходит пустой список сайтов — как будто аккаунт ни к чему не привязан. Так и есть: сервисный аккаунт — это отдельный «пользователь», и пока вы не пустили его в ресурс, он не видит ничего. Проверяли сегодня на своём: сервисный аккаунт без делегирования вернул ровно ноль сайтов.

Маршрут Б — OAuth

  1. Проект и API — те же первые два шага, что в маршруте А.
  2. Настройте экран согласия. APIs & Services → OAuth consent screen, тип External. Заполните название и почту поддержки.
  3. Опубликуйте приложение. На том же экране — кнопка Publish app, статус должен стать In production. Не пропускайте этот шаг, объяснение — в следующем разделе.
  4. Создайте OAuth Client ID. Credentials → Create Credentials → OAuth client ID, тип приложения — Desktop app. Скачайте JSON.
  5. Обменяйте на refresh-токен. Один раз запустите скрипт из пакета — он откроет браузер, попросит войти под аккаунтом-владельцем ресурса и сам допишет три строки в .env.
Разовый обмен на refresh-токен
cd путь-к-заводу
./venv-python engine/seo-agent/modules/gsc_oauth_setup.py

# допишет в .env:
#   GSC_OAUTH_REFRESH_TOKEN
#   GSC_OAUTH_CLIENT_ID
#   GSC_OAUTH_CLIENT_SECRET

Ловушка на 7 дней

Самая дорогая ошибка в этом гайде — и её почти невозможно заметить сразу, потому что всё работает. Неделю.

Проект Google Cloud с экраном согласия типа External и статусом публикации «Testing» выдаёт refresh-токен, который истекает через 7 дней.
— документация Google по OAuth 2.0

Что происходит на практике: вы настраиваете доступ, видите данные Google в отчётах, радуетесь. Через неделю блок «трафик из Google» тихо пустеет с ошибкой invalid_grant: Token has been expired or revoked. Остальные модули при этом работают, поэтому поломку замечают не сразу.

Лечится одним кликом: Google Cloud Console → OAuth consent screen → Publish app → статус In production. После этого refresh-токен бессрочный. Если токен уже успел умереть — опубликуйте приложение и перевыпустите токен скриптом из шага 5.

Вторая ловушка того же места. На один Google-аккаунт и один OAuth-клиент действует лимит 100 refresh-токенов. При превышении самый старый аннулируется без предупреждения. Если вы ведёте много сайтов одним аккаунтом и раз за разом перевыпускаете токен, старые ключи будут отваливаться «сами собой». На сервисные аккаунты этот лимит не распространяется — ещё один довод за маршрут А.

Проверка живыми запросами

Не верьте настройке на слово — проверьте каждый доступ одним запросом.

Яндекс: квота переобходаесли ответила — токен и оба id верны
curl -s -H "Authorization: OAuth ВАШ_ТОКЕН" \
 "https://api.webmaster.yandex.net/v4/user/USER_ID/hosts/HOST_ID/recrawl/quota"

# → {"daily_quota": 150, "quota_remainder": 150}
Google: список ресурсовваш сайт должен быть в списке со статусом siteOwner
curl -s -H "Authorization: Bearer ВАШ_ACCESS_ТОКЕН" \
 https://www.googleapis.com/webmasters/v3/sites

# → "siteUrl": "sc-domain:example.ru", "permissionLevel": "siteOwner"
Google: отправить карту сайтапустой ответ 204 = принято
curl -s -X PUT -H "Authorization: Bearer ВАШ_ACCESS_ТОКЕН" -H "Content-Length: 0" \
 "https://www.googleapis.com/webmasters/v3/sites/sc-domain%3Aexample.ru/sitemaps/https%3A%2F%2Fexample.ru%2Fsitemap.xml"
Адреса в пути нужно кодировать. И идентификатор ресурса, и адрес карты — оба идут внутрь пути URL, поэтому двоеточия и слэши превращаются в %3A и %2F. Забыли закодировать — получите 404 на ровном месте.

Грабли

Яндекс

Google

Проверка сайта закрытым robots.txt. Если у вас, как у меня, модель «запрещено всё, кроме явно открытого», не забудьте добавить Allow: для файла подтверждения и ключа IndexNow. Иначе поисковик не сможет их прочитать и подтверждение не пройдёт.

Куда вставлять и как проверить

Все значения — только в .env рядом с конфигом сайта. В site.config.yml, документации и отчётах должны быть указатели, а не сами ключи. Файл .env обязан быть в .gitignore.

Проверка, что завод всё увидел
./venv-python engine/seo-agent/orchestrator.py doctor

doctor покажет по каждому ключу «задан / не задан» и что из-за отсутствия выключено. Значения он не печатает — это сделано намеренно, чтобы вывод можно было спокойно показать кому угодно.

Что это включает в заводе

КлючЧто заработаетЧто будет без него
YANDEX_WEBMASTER_TOKENзапросы Яндекса, переобход новых страниц, алерты по индексациистатьи индексируются медленнее, данных Яндекса нет
GSC_OAUTH_REFRESH_TOKENтрафик и запросы Google, «быстрые победы» по позициям 11–20семантика без данных Google, быстрые победы не считаются
YANDEX_CLOUD_API_KEYживая частотность Wordstat при сборе темчастоты только из вебмастеров — новые темы не найти
INDEXNOW_KEYмгновенный пинг новых адресов в Яндекс и Bingждёте планового обхода робота

Ключ Wordstat — отдельная инструкция

Живая частотность собирается не через Вебмастер, а через Yandex Cloud Search API — там свои шаги, свой Folder ID и свои грабли. Разобрал отдельно: Wordstat API за 15 минут.

Источники

Читать дальше

Все гайды рабочие: каждый — то, что реально крутится у меня, а не пересказ документации.

Claude Code и агенты

Хуки в Claude CodeАгент сам запускает твой скрипт: память на старте, сохранение контекста между сессиями, стоп-кран на опасные команды. Экономия токеновСтартовый вес сессии пересылается каждый ход. Как срезать его в разы: 48 400 → 15 200 токенов, готовые правила. Панель анализа расходаГотовый промпт: собирает локальную панель — сколько токенов и денег ушло по дням, проектам и моделям. Разбор инструментаСкилл: кидаешь ссылку на Reels, пост или репозиторий — получаешь вердикт, брать или мимо, и первый тест.

SEO и сайты

SEO-машинаКарта из десяти систем, из которых собран сайт на ИИ-агентах: что делает каждая и как собрать такую же. GEO-оптимизация сайтаКак попадать в ответы ChatGPT, AI Overviews и Яндекс Нейро: механика, чеклист по четырём уровням и промпт для аудита и правок. Разведка нишиСкилл: go/no-go по нише до сборки сайта — спрос через Wordstat, деньги-страницы, контент-план. Сайт с нуля с ИИ-агентомЧто решить до первого промпта, зачем два раздельных ТЗ и как сразу заложить блог с категориями. Самоаудит сайта20 проверок за 30 секунд и сравнение с медианой по 83 сайтам малого бизнеса. Скрипт бесплатный. Wordstat APIПодключение через Yandex Cloud за 15 минут: API-ключ, Folder ID, роль, проверка, лимиты и деньги.

Видео и контент

6 проектов в Claude CodeКонтент-пайплайн целиком: карусели, Reels, озвучка клон-голосом, авто-монтаж, второй мозг. Монтаж «голова + экран»Обучающий ролик с лицом поверх записи экрана: синхронизация, резка тишины, поиск фальстартов, вставки. Индекс видеотекиГотовый промпт: ИИ режет все видео на диске на смысловые куски с таймкодами — что происходит, что говорится, подо что годится.