Животные меняются при загрузке страницы
Как использовать API Яндекс.Вебмастера для мониторинга индексации и ошибок на сайте
Карточки, чек-листы, таблицы и примеры помогают быстро найти нужный ответ.
В работе с большим количеством сайтов важно быстро и надёжно получать сведения о состоянии индексации и возникающих ошибках. API Яндекс.Вебмастера предоставляет прямой доступ к этим данным, позволяя строить собственные отчёты, интегрировать мониторинг в CI/CD и автоматизировать исправление проблем.
1️⃣ Получить OAuth‑токен и список сайтов.
2️⃣ Выполнить запросы к эндпоинтам индексации и ошибок.
3️⃣ Сохранять ответы в БД или CSV.
4️⃣ Создать визуализацию (Grafana, Power BI, собственный UI).
5️⃣ Настроить cron‑задачу или серверless‑функцию для регулярного обновления.
Что такое API Яндекс.Вебмастера и зачем его использовать
API Яндекс.Вебмастера – это набор REST‑эндпоинтов, позволяющих получить структурированные данные о состоянии сайта без ручного копирования из консоли. В SEO‑аудите он выступает как источник метрик: индексируемость, ошибки, ссылки, скорость. Прямой доступ избавляет от ограничений интерфейса, даёт возможность собирать данные в реальном времени, хранить в собственной базе и анализировать тренды. В отличие от консоли, где каждый запрос требует открытия страницы, API позволяет пакетировать запросы, получать JSON‑ответы, легко интегрировать с BI‑системами, скриптами и CI/CD. Это открывает три ключевых сценария: 1) мониторинг – периодический сбор статуса страниц и автоматическое оповещение о падениях; 2) отчёты – генерация кастомных дашбордов, которые можно публиковать в Slack, Teams или в собственный портал; 3) автоматизация – триггерные действия, например, пересылка URL в Sitemap при обнаружении ошибки 404, или авто‑постинг в Google Search Console при изменении статуса индексации. API позволяет интегрировать данные с внешними системами, писать скрипты на Python, Node, PowerShell, использовать OAuth2 для безопасного доступа. В консоли же данные доступны только через веб‑интерфейс, а экспорт ограничен форматом CSV, который легко ломается при больших объёмах. Кроме того, API поддерживает фильтрацию по датам, статусам и типам ошибок, что экономит время и повышает точность.
| Сценарий | Что делаем | Преимущества |
|---|---|---|
| Мониторинг | Периодический запрос статуса страниц, оповещение в Slack | Раннее выявление падений, минимизация потерь трафика |
| Отчёты | Генерация дашбордов в Power BI, Grafana | Доступ к историческим данным, визуальная аналитика |
| Автоматизация | Триггерные скрипты: пересылка URL в Sitemap, авто‑постинг в GSC | Сокращение ручной работы, ускорение отклика на изменения |
Подготовка к работе: ключи, OAuth, scopes
Для работы с API Яндекс.Вебмастера необходимо создать OAuth‑приложение, получить клиентские данные и авторизовать его на чтение и запись. После этого можно запрашивать refresh_token и генерировать access_token, который будет использоваться в API‑запросах.
- Перейти в диспетчер OAuth‑приложений и нажать «Создать приложение». Указать название, тип «Web‑приложение» и задать redirect_uri (например, https://example.com/auth/callback). После сохранения запишем client_id и client_secret.
- Сформировать URL авторизации:
https://oauth.yandex.com/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=webmaster.read,webmaster.write. Открыть его в браузере, авторизоваться и согласиться на доступ. В адресной строке появится параметрcode=…. - Обменять
codeна refresh_token и access_token: отправить POST‑запрос наhttps://oauth.yandex.com/tokenс полямиgrant_type=authorization_code,code,client_id,client_secretиredirect_uri. В ответе получимrefresh_tokenиaccess_token. - Для обновления access_token использовать refresh_token: POST‑запрос с
grant_type=refresh_token,refresh_token,client_id,client_secret. Полученный access_token действителен 1 час. - Сохраняем refresh_token в защищённом месте (например, в переменной окружения) и автоматически обновляем access_token перед каждым запросом к API.
# Получение токенов по authorization code
curl -X POST https://oauth.yandex.com/token \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "redirect_uri=YOUR_REDIRECT_URI"
# Обновление access_token по refresh_token
curl -X POST https://oauth.yandex.com/token \
-d "grant_type=refresh_token" \
-d "refresh_token=YOUR_REFRESH_TOKEN" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
Получение списка сайтов и выбор нужного
- Отправьте запрос
GET /v1/sitesс заголовкомAuthorization: Bearer YOUR_TOKENкhttps://api-metrika.yandex.net/webmaster/v3. - Проверьте, что в ответе статус
200 OKи тело содержит массив объектов с полямиid,urlиstatus. - Фильтруйте сайты по полю
status:active– сайт готов к мониторингу,pending– в ожидании проверки. Сайты со статусомerrorможно игнорировать. - Выберите
idнужного сайта и сохраните его – он понадобится для всех последующих запросов (индексация, ошибки, статистика). - Проверьте, что выбранный
idприсутствует в списке и соответствует ожидаемомуurl.
import fetch from 'node-fetch';
const token = 'YOUR_TOKEN';
const url = 'https://api-metrika.yandex.net/webmaster/v3/sites';
async function getSites() {
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json'
}
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
const activeSites = data.filter(site => site.status === 'active');
console.log('Active sites:', activeSites);
// Выберите нужный id
const targetId = activeSites[0].id;
console.log('Используемый id:', targetId);
}
getSites().catch(console.error);
Получив и отфильтрованный id, вы готовы к точному мониторингу индексации и ошибок конкретного сайта через API Яндекс.Вебмастера.
Запросы к API: индексация, ошибки, sitemap
Ниже – минимальный набор Python‑скрипта, который позволяет получать данные о индексации, ошибках и sitemap из API Яндекс.Вебмастера, а также быстро обрабатывать ключевые поля: indexed, not_indexed, error_codes и urls.
import requests, json
from datetime import datetime
API_BASE = "https://api.webmaster.yandex.net/v1/sites"
def _request(endpoint, site_id, token):
url = f"{API_BASE}/{site_id}{endpoint}"
headers = {"Authorization": f"Bearer {token}"}
resp = requests.get(url, headers=headers, timeout=30)
resp.raise_for_status()
return resp.json()
def get_indexing(site_id, token):
data = _request("/indexing", site_id, token)
# Поля: indexed, not_indexed
return {
"indexed": data.get("indexed", 0),
"not_indexed": data.get("not_indexed", 0),
"updated": datetime.utcnow().isoformat()
}
def get_errors(site_id, token):
data = _request("/errors", site_id, token)
# Поля: error_codes (dict), urls (list)
return {
"error_codes": data.get("error_codes", {}),
"urls": data.get("urls", []),
"updated": datetime.utcnow().isoformat()
}
def get_sitemap(site_id, token):
data = _request("/sitemap", site_id, token)
# Поля: indexed, not_indexed, error_codes
return {
"indexed": data.get("indexed", 0),
"not_indexed": data.get("not_indexed", 0),
"error_codes": data.get("error_codes", {}),
"updated": datetime.utcnow().isoformat()
}
# Пример использования
if __name__ == "__main__":
SITE_ID = "https://example.com/"
TOKEN = "ya29.a0AfH6SMB...your_access_token..."
print("Индексация:", get_indexing(SITE_ID, TOKEN))
print("Ошибки:", get_errors(SITE_ID, TOKEN))
print("Sitemap:", get_sitemap(SITE_ID, TOKEN))
Парсинг и хранение данных: формат JSON, база, расписание
| Параметр | Описание |
|---|---|
| JSON: siteUrl | URL сайта в Яндекс.Вебмастере |
| JSON: indexation | Объект с полями indexed, pending, excluded |
| JSON: lastChecked | ISO‑строка даты последнего запроса |
| JSON: errors | Массив объектов errorCode, errorUrl, message |
| DB: sites | id (PK), url, token, created_at |
| DB: indexing_log | id, site_id (FK), indexed, pending, excluded, checked_at |
| DB: errors_log | id, site_id (FK), error_code, error_url, message, logged_at |
- Запустить скрипт вручную и убедиться, что JSON парсится без ошибок.
- Проверить, что записи попадают в таблицы sites, indexing_log, errors_log.
- Убедиться, что индексация записана в правильный тип данных (integer).
- Настроить cron: 0 0 * * * для ежедневного запуска и */15 * * * * для 15‑минутных проверок.
- Проверить лог cron‑запусков: наличие записи о выполнении и отсутствии ошибок.
- Тестировать обработку ошибок API: при 429 и 500 проверять запись в errors_log.
- Сравнить данные в indexing_log с ручным запросом API для одного сайта.
- Проверить, что старые записи в errors_log удаляются по стратегии retention (30 дней).
- Запустить нагрузочный тест с 10 сайтами, убедиться, что время выполнения
- Проверить, что при обновлении token в sites таблице скрипт использует новый токен.
Проверка и визуализация: графики, отчёты
После запуска API Яндекс.Вебмастера стоит держать под контролем динамику индексации и частоту ошибок. Построение графиков по времени позволяет быстро видеть, как меняется охват страниц, а отчёт о 404, 500 и проблемах с robots.txt даёт точный диагноз. Интеграция с Grafana или собственным Dash превращает сырые данные в удобные дашборды. На них можно визуализировать:
- Периодический процент проиндексированных URL.
- Общее количество ошибок по категориям.
- Тренд появления новых 404.
- Время отклика сервера (500).
Настройка оповещений в Slack или Telegram при превышении порогов (например, более 5 % новых 404 за сутки или 10 % 500 за час) позволяет реагировать до того, как ошибки повлияют на ранжирование. В Grafana это реализуется через Alerting‑rules, а в Dash – через Flask‑mail или python‑telegram‑bot. Важно хранить метрики в базе Prometheus или InfluxDB, чтобы иметь историю и возможность сравнивать периоды.
| Параметр | Что смотреть |
|---|---|
| Процент проиндексированных URL | Снижение выше 3 % в неделю → проверяем robots.txt и sitemap |
| Количество 404 за сутки | Больше 5 % новых → проверяем ссылки в контенте и редиректы |
| Количество 500 за час | Больше 10 % → проверяем логи сервера и конфигурацию приложения |
| Время отклика сервера | Свыше 2 сек → оптимизируем backend и кэширование |
| Периодичность обновления sitemap | Не чаще 24 ч → гарантируем свежесть индексации |
Частые ошибки и как их исправлять
-
robots.txt блокирует сканирование
Если в robots.txt указаноDisallow: /blog/, поисковый бот не видит страницы блога, их контент не попадает в индекс. Это снижает охват и видимость новых статей. Убедитесь, что в robots.txt разрешен доступ к нужным разделам или используйтеnoindexв метатеге, если блокировка нужна только для поисковиков. -
403/404 в sitemap.xml
При сканировании sitemap.xml поисковик возвращает статус 403 или 404 для URL. Такие страницы не индексируются, а в Яндекс.Вебмастере отмечаются как «неиндексируемые». Исправьте статус, обновите sitemap и отправьте его снова через API. -
Несогласованные canonical‑теги
Если страница A указывает canonical на B, но B не содержит соответствующего canonical, контент дублируется. Это разброс ссылочного веса и ухудшает позиционирование. Проверьте, что canonical совпадает и не конфликтует с другими страницами. -
Код ответа 200, но статус «неиндексировано»
Сервер возвращает 200, но в Яндекс.Вебмастере статус «неиндексировано». Возможные причины: наличиеnoindex, robots‑запрещение, медленный отклик или ошибки в метатегах. Проверьте заголовки, скорость ответа и наличиеnoindex. -
Отсутствие sitemap.xml
Если сайт не содержит sitemap.xml, поисковый бот не узнает о новых страницах. Добавьте sitemap, убедитесь, что он валиден, и отправьте его через API для ускорения индексации.
План автоматизации и развертывания
Timeline of Automation Deployment
- Week 1 – Repo & Docker
• Создать репозиторий и добавитьDockerfileс Python‑скриптом, который делает запросы к API Яндекс.Вебмастера.
• Тестировать скрипт локально, убедиться в корректной обработке JSON‑ответов и хранении токена в переменной окружения. - Week 2 – GitHub Actions (PR & Deploy)
• Добавить workflowci.ymlдля pull‑request: lint, build image, run unit‑тесты.
• Создать workflowdeploy.ymlдля push‑а вmain: сборка Docker‑образа, push в GitHub Container Registry, развертывание в staging‑окружение.
• Настроитьscheduleтриггер – ежедневный запускmonitor.yml, который запускает контейнер, собирает данные о индексации и сохраняет в S3‑совместимом bucket. - Week 3 – Serverless Function
• Перенести скрипт вyandex-cloud-functionsпроект, упаковать какindex.pyсrequirements.txt.
• Настроить триггер HTTP/cron для однократных задач (bulk‑sitemap‑submission, force‑re‑index).
• Добавить IAM‑роль для доступа к API и к Cloud Storage. - Week 4 – Documentation & README
• СоставитьREADME.mdс инструкциями: как настроить переменные окружения, секреты GitHub, как запустить локально, как вызвать функции.
• Добавить раздел «Интеграция в CI/CD» с примерами конфигураций, описанием веток и политик развертывания.
• Сохранить внутренний wiki‑проект с чек‑листами и FAQ.
Вопросы и ответы
Как получить токен доступа к API Яндекс.Вебмастера?
Для получения токена нужно перейти в личный кабинет Яндекс.Вебмастера, выбрать пункт «Настройки» → «API‑доступ», включить OAuth‑приложение, авторизоваться и скопировать токен, который будет действовать 90 дней. После истечения срока его нужно обновить.
Можно ли использовать API для мониторинга нескольких сайтов одновременно?
Да, один токен может обслуживать несколько сайтов, но каждый запрос требует указания идентификатора сайта. В запросах можно перечислить несколько ID, однако лимиты запросов применяются к каждому сайту отдельно.
Как узнать, какие ошибки индексирования возвращает API?
В ответе метода sites.getIndexInfo содержится массив ошибок. Поле status содержит код ошибки, а message поясняет причину. Ошибки можно фильтровать по коду и сохранять для дальнейшего анализа.
Как настроить регулярный запрос к API?
Создайте cron‑задачу, которая будет вызывать скрипт на PHP/Node/Go каждые 30 минут. Внутри скрипта формируйте запрос к endpoint /indexInfo, сохраняйте результат в БД и отправляйте уведомление при изменениях.
Как обрабатывать лимиты запросов?
API Яндекс.Вебмастера ограничивает 1000 запросов в час. При превышении сервера возвращает код 429. В таком случае добавьте задержку, используйте back‑off и распределяйте запросы по времени, чтобы не превышать лимит.
Как хранить данные из API?
Лучше сохранять JSON‑ответы в таблице с полями site_id, fetched_at, data. Используйте индексы по site_id и fetched_at для быстрых выборок. При больших объёмах можно архивировать старые записи в отдельную таблицу.
Как использовать данные для исправления ошибок?
Извлеките из ответа список страниц с ошибками, проанализируйте причины (404, robots, canonical) и примените исправления через CMS или вручную. После исправления повторите запрос, чтобы убедиться, что ошибки исчезли.
Можно ли интегрировать API с внешними системами?
Да, API предоставляет JSON‑ответы, которые легко парсить в любой язык. Вы можете подключить его к Slack, Telegram‑боту, BI‑системе или собственному дашборду, чтобы получать отчёты в реальном времени.
Как обновлять токен?
Токен истекает через 90 дней. В личном кабинете выберите «API‑доступ», нажмите «Обновить токен» и получите новый. В коде замените старый токен в конфигурации и перезапустите сервис.
Как закрывать НЧ‑запросы?
НЧ‑запросы (низкочастотные ключи) можно закрыть, если они не приносят трафика. В API через метод sites.getIndexInfo получите список страниц, затем в CMS удалите или перенаправьте их. После обновления индексация исчезнет.
Важно
Материал носит информационный характер. Перед внедрением рекомендаций учитывайте нишу, регион, конкурентов, текущее состояние сайта и бизнес-цели проекта.
Материал подготовлен и проверен редакцией AX.SEO
Редакция AX.SEO готовит материалы о SEO, разработке, AI, аналитике, маркетинге и росте digital-проектов.
Проверяет практическую применимость рекомендаций, корректность терминов и соответствие материала digital-тематике.