Google Indexing API предназначен не для любых SEO-страниц. Google разрешает применять его только к страницам с JobPosting и к страницам прямых трансляций, где BroadcastEvent вложен в VideoObject. Для категории, карточки товара или статьи API не является ускорителем индексации: там нужно проверять доступность URL, canonical, noindex, robots.txt, рендеринг, внутренние ссылки и Sitemap.
Ни успешный ответ API, ни запрос на переобход не гарантируют обход, включение в индекс или показ в выдаче. API только сообщает Google, что подходящая страница создана, обновлена или удалена.

Когда Indexing API применим
| Страница | Использовать API | Что проверить до отправки |
|---|---|---|
| Вакансия с корректной разметкой JobPosting | Да | URL доступен без авторизации, вакансия актуальна, разметка соответствует видимому содержимому |
| Прямая трансляция с BroadcastEvent внутри VideoObject | Да | Есть фактическая трансляция и корректные даты события |
| Категория, карточка товара, статья, лендинг | Нет | Диагностика обхода и индексирования из раздела ниже |
Область применения зафиксирована в официальном руководстве Google по Indexing API. Если тип страницы не входит в этот список, не маскируйте проблему обхода вызовом неподдерживаемого API.
Какие доступы нужны
Здесь легко перепутать два разных уровня прав.
Google Cloud IAM. Самому сервисному аккаунту не нужна роль Owner или Editor проекта для вызова Indexing API. При создании аккаунта этап выдачи ему ролей проекта можно пропустить. Пользователю, который включает API и создаёт ключ, нужны соответствующие административные права — это не повод делать сервисный аккаунт владельцем всего Cloud-проекта.
Google Search Console. По официальной инструкции Google сервисный аккаунт нужно добавить делегированным владельцем того ресурса Search Console, URL которого отправляются через API. Это требование именно Search Console, а не роль Owner в Cloud IAM.
OAuth scope. Клиенту достаточно области https://www.googleapis.com/auth/indexing.
Добавляйте сервисный аккаунт только в нужный ресурс Search Console. Не используйте один ключ для несвязанных сайтов и проектов.
Как хранить JSON-ключ
Не помещайте JSON в репозиторий, образ контейнера, архив для подрядчика или публичную папку. Добавьте имя файла и шаблон *.json для локальных секретов в .gitignore.
Передавайте путь через GOOGLE_APPLICATION_CREDENTIALS; в CI/CD храните значение в штатном secret store. Не вставляйте содержимое ключа в код и команды shell.
Ограничьте круг людей и процессов, которые могут прочитать секрет. Не выводите private_key, токен и полный JSON в логи или сообщения об ошибках.
Задайте владельца ключа и план ротации. После утечки, ухода ответственного или завершения проекта немедленно замените ключ, а не просто удаляйте файл из Git.
Если ключ скомпрометирован: создайте новый, обновите секрет в среде выполнения, выполните контрольный запрос, отключите и удалите старый ключ, затем удалите сервисный аккаунт из владельцев Search Console, если доступ больше не нужен. Google отдельно предупреждает, что удаление ключа из истории репозитория не отменяет уже раскрытые учётные данные; ключ нужно отозвать или удалить.
Безопасный клиент на Node.js
Ниже — минимальный клиент без пакета requests и без npm audit fix --force. Зафиксированная для этой редакции среда: Node.js 22 и google-auth-library@11.0.2; для production Node рекомендует ветки со статусом Active LTS или Maintenance LTS. Версия пакета проверена 24.08.2026 в официальном реестре npm; исходный код выпуска находится в официальном репозитории Google, тег google-auth-library-v11.0.2.
node --version
# ожидается v22.x
mkdir indexing-client
cd indexing-client
npm init -y
npm pkg set type=module
npm install --save-exact google-auth-library@11.0.2
npm audit --omit=devЕсли npm audit сообщает об уязвимости, сначала прочитайте цепочку зависимостей и changelog. Не запускайте npm audit fix --force как стандартный шаг: документация npm audit предупреждает, что --force может поставить несовместимую major-версию и снять защитные ограничения.
Создайте файл publish.mjs:
import {GoogleAuth} from 'google-auth-library';
const [url, type = 'URL_UPDATED'] = process.argv.slice(2);
const allowedTypes = new Set(['URL_UPDATED', 'URL_DELETED']);
if (!url || !allowedTypes.has(type)) {
console.error('Usage: node publish.mjs [URL_UPDATED|URL_DELETED]');
process.exit(2);
}
const auth = new GoogleAuth({
scopes: ['https://www.googleapis.com/auth/indexing'],
});
try {
const client = await auth.getClient();
const response = await client.request({
url: 'https://indexing.googleapis.com/v3/urlNotifications:publish',
method: 'POST',
data: {url, type},
});
console.log(`HTTP ${response.status}`);
console.log(JSON.stringify(response.data, null, 2));
} catch (error) {
const status = error.response?.status ?? 'no-http-status';
const body = error.response?.data ?? error.message;
console.error(`Indexing API error: ${status}`);
console.error(JSON.stringify(body, null, 2));
process.exit(1);
}Перед запуском задайте путь к ключу вне каталога проекта:
export GOOGLE_APPLICATION_CREDENTIALS="/secure/path/indexing-service-account.json"
node publish.mjs "https://example.ru/vacancy/seo-specialist/" URL_UPDATEDНормальный технический результат — HTTP 200 и метаданные уведомления. Это подтверждает приём уведомления, но не индексирование.
Что означают ошибки
| Код | Сначала проверьте | Следующее действие |
|---|---|---|
| 401 | Путь к JSON, целостность ключа, системное время, OAuth scope | Перевыпустить токен через исправленный ключ; при компрометации — ротировать ключ |
| 403 | Включён ли API; добавлен ли service account владельцем нужного ресурса Search Console; относится ли URL к этому ресурсу и допустимому типу | Исправить конкретное право или тип страницы; не повышать роль в Cloud IAM до Owner |
| 429 | Суточная/минутная квота и частота повторов | Остановить цикл, применить backoff, убрать повторы и проверить квоту проекта |
У API есть квоты, в том числе стартовая квота на публикацию уведомлений. Текущие значения смотрите в официальной таблице квот, а не переносите число из статьи в автоматизацию без проверки.
Что доказывает каждый этап
| Стадия | Какой сигнал доступен | Где проверить | Что доказывает | Чего не доказывает |
|---|---|---|---|---|
| Уведомление отправлено | HTTP-статус и тело ответа | Лог клиента; метод metadata API | Google принял или отклонил уведомление | Что робот уже пришёл |
| URL обойдён | Дата/результат последнего обхода | URL Inspection и серверные логи | Googlebot запросил URL и получил конкретный ответ | Что выбранная версия проиндексирована |
| URL проиндексирован | Статус индексирования и выбранный canonical | URL Inspection | Google сообщает о состоянии URL и canonical на момент проверки | Что URL будет показан по конкретному запросу |
| URL показан | Показы и запросы | Search Console Performance; ручная проверка только как вспомогательный сигнал | Был зарегистрирован показ по запросу/стране/устройству | Стабильную позицию или будущие показы |
Метод urlNotifications:publish возвращает сведения об уведомлении. В документации метода нет обещания индексирования или показа.
Если обычная страница не индексируется
Для категории, товара, статьи или лендинга работайте по цепочке, а не через Indexing API.
Проверьте HTTP-ответ, отсутствие авторизации и soft 404. Сравните исходный HTML и отрендеренный DOM: основной контент и ссылка на canonical должны быть доступны роботу.
Проверьте robots.txt, meta/X-Robots-Tag noindex и canonical. Заблокированный robots.txt URL не даёт роботу увидеть noindex или изменения canonical.
Убедитесь, что на URL ведут обычные внутренние ссылки с индексируемых страниц, а не только JS-событие или форма.
Оставьте в Sitemap только канонические URL, которые действительно должны быть в поиске; обновляйте lastmod при существенном изменении содержимого.
Для нескольких URL используйте URL Inspection и запрос индексирования; для большого набора — Sitemap. Google прямо указывает, что запрос не гарантирует включение в индекс: как попросить Google о повторном обходе.
Сопоставьте данные URL Inspection с серверными логами. Если робот приходит, но URL не индексируется, проверяйте дубли, качество/полноту страницы и выбранный Google canonical, а не частоту отправки.
Если задача обратная — убрать документ из поиска, используйте отдельный алгоритм: как удалить страницу или сайт из поиска Яндекса и Google. Для диагностики различий двух систем пригодится разбор что делать одинаково в Яндексе и Google, а что проверять отдельно.
Как превратить проблему в проверяемое действие
Без данных конкретного проекта можно зафиксировать диагностический план, но нельзя обещать рост трафика или срок индексирования.
| Наблюдение | Возможные причины | Проверка | Действие и владелец | Приоритет / критерий приёмки |
|---|---|---|---|---|
| API вернул 403 | Нет владельца Search Console; не тот ресурс; неподдерживаемый тип URL | Сверить email service account, property и разметку | SEO + администратор доступов: исправить точное несоответствие | P0: тестовый допустимый URL получает 200 без Cloud IAM Owner |
| API вернул 429 | Квота исчерпана; цикл повторяет URL; нет backoff | Логи по URL/времени, Console Quotas | Разработчик: дедупликация, очередь, backoff | P0: повтор не создаёт шторм запросов; ошибки логируются |
| Уведомление 200, обхода нет | URL недоступен роботу; слабое обнаружение; очередь обхода | URL Inspection, HTTP, robots.txt, серверные логи | SEO + разработчик: устранить блокировку; ожидать без повторного спама | P1: URL доступен, не заблокирован, в логах появляется запрос робота либо документировано ожидание |
| Обход есть, индексации нет | noindex; иной canonical; soft 404; дубль/малоценная страница | HTML/headers, URL Inspection, сравнение шаблонов | SEO: исправить противоречивый сигнал или объединить дубль после согласования | P1: сигналы согласованы; выбранный canonical ожидаемый |
| URL индексирован, показов нет | Нет релевантного спроса; документ не отвечает запросу; отчёт отфильтрован неверно | Performance за согласованный период, запрос/страна/устройство | SEO/аналитик: проверить интент и настройки отчёта | P2: вывод описывает данные, а не обещает позицию |
Ограничение: эта таблица задаёт порядок проверки, а не результат проекта. Для приоритизации по эффекту нужны Search Console, логи, список URL и история изменений.
Получите бесплатный аудит и стратегию роста
Изучим сайт, покажем точки роста и подготовим прогноз до квалифицированных лидов и оборота из SEO/GEO.


