Справочник API индексации в Google
Всё, что умеет бот, доступно по HTTP. Отправляйте адреса, как только страница вышла, опрашивайте задачу, смотрите, что принято и что отсеяно. Баланс и проверки те же, $0.01 за принятый адрес.
Быстрый старт
- Получите ключ. Откройте @IndexForgeBot и нажмите 🔑 API. Ключ показывается один раз, сохраните его.
- Отправьте адреса.
POST /v1/submitс JSON-массивом до 10 000 адресов. Идентификатор задачи приходит сразу. - Опрашивайте задачу.
GET /v1/tasks/{id}примерно раз в 10 секунд, пока статус не станетdone,partialилиfailed. - Заберите результат. Принято, отсеяно с причинами, списано и возвращено, всё в одном объекте.
$ curl -X POST https://api.indexforge.help/v1/submit \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"urls": [ "https://site.com/page-1", "https://site.com/page-2"]}'
import requests, time API = "https://api.indexforge.help" H = {"Authorization": "Bearer YOUR_KEY"} task = requests.post(API + "/v1/submit", headers=H, json={"urls": urls}).json()["task"] while task["status"] in ("queued", "checking", "submitting"): time.sleep(10) task = requests.get(API + "/v1/tasks/" + task["id"], headers=H).json()["task"] print(task["accepted"], "принято", task.get("rejected", 0), "отсеяно")
const API = "https://api.indexforge.help"; const H = { Authorization: "Bearer YOUR_KEY", "Content-Type": "application/json" }; let { task } = await (await fetch(API + "/v1/submit", { method: "POST", headers: H, body: JSON.stringify({ urls }) })).json(); while (["queued", "checking", "submitting"].includes(task.status)) { await new Promise(r => setTimeout(r, 10000)); ({ task } = await (await fetch(API + "/v1/tasks/" + task.id, { headers: H })).json()); } console.log(task.accepted, "принято");
$ch = curl_init("https://api.indexforge.help/v1/submit"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_KEY", "Content-Type: application/json"], CURLOPT_POSTFIELDS => json_encode(["urls" => $urls]), ]); $task = json_decode(curl_exec($ch), true)["task"];
202 Accepted · 184 ms # 202 · задача создана { "ok": true, "task": { "id": "3f9c2a7d1b6e4c80", "status": "queued", "urls": 2 } }
Базовый адрес и авторизация
Все запросы идут на https://api.indexforge.help. Тела запросов и ответы в JSON, кодировка UTF-8, в каждом ответе есть поле ok.
Ключ передаётся в одном из заголовков:
Authorization: Bearer YOUR_KEY
X-API-Key: YOUR_KEY
- Ключ выдаёт бот по кнопке 🔑 API и показывает один раз. Храните его как пароль.
- Новый ключ сразу отключает старый. Так и поступайте, если ключ утёк.
- Баланс у API и бота общий: пополняете в боте, тратите где удобно.
POST /v1/submit
Создаёт задачу: проверяет адреса так, как их видит Googlebot, и отправляет прошедшие на индексацию.
| Поле | Тип | Описание |
|---|---|---|
urls | массив, обязательно | До 10 000 адресов http(s). Дубли и строки не http отбрасываются. |
check | bool, по умолчанию true | Проверять ли адреса. При false проверки нет, и списание идёт за все адреса. |
{ "urls": ["https://site.com/page-1", "https://site.com/page-2"], "check": true }
Ответ 202 Accepted с новой задачей:
{ "ok": true,
"task": { "id": "3f9c2a7d1b6e4c80", "status": "queued",
"created": 1760263200, "urls": 2 } }
При check: true для старта нужен хотя бы 1 кредит. После проверки кредиты резервируются только под прошедшие адреса. Принятые списываются, остальные возвращаются автоматически. При check: false баланс должен покрывать все адреса запроса. Тело запроса ограничено 5 МБ.
GET /v1/tasks/{id}
Статус и счётчики одной задачи. Задачу видит только владелец ключа.
| Поле | Описание |
|---|---|
id | Идентификатор задачи |
status | queued, checking, submitting, done, partial или failed |
created · finished | Время в формате Unix. finished появляется, когда задача завершена |
urls | Адресов в задаче после удаления дублей |
checked | Сколько адресов проверено |
rejected | Сколько отсеяно проверкой |
rejected_urls | Отсеянные адреса по причинам, до 200 на причину |
accepted | Сколько принято на индексацию |
charged · refunded | Сколько кредитов списано и возвращено |
error | Короткий код, если что-то пошло не так, см. статусы |
{ "ok": true, "task": {
"id": "3f9c2a7d1b6e4c80", "status": "done",
"created": 1760263200, "finished": 1760263295,
"urls": 3, "checked": 3, "rejected": 1,
"rejected_urls": { "404": ["https://site.com/old"] },
"accepted": 2, "charged": 2, "refunded": 0 } }
Причины в rejected_urls:
| Ключ | Что значит |
|---|---|
404 | Страница отдала 404 или 410 |
4xx | Другая ошибка клиента, например 401 или 403 |
5xx | Ошибка сервера |
redirect | Адрес перенаправляет. Отправляйте конечный адрес |
noindex | noindex в meta robots, meta googlebot или в заголовке X-Robots-Tag |
robots | Закрыт для Googlebot в robots.txt |
canonical | Canonical указывает на другой адрес |
error | Страница не открылась: таймаут, ошибка DNS или соединения, некорректный адрес |
GET /v1/tasks
Последние задачи, от новых к старым. Необязательный limit от 1 до 100, по умолчанию 20.
GET /v1/tasks?limit=20
{ "ok": true, "tasks": [ { "id": "3f9c2a7d1b6e4c80", "status": "done", … }, … ] }
GET /v1/balance
Остаток кредитов и текущая цена.
| Поле | Описание |
|---|---|
balance | Кредитов на счёте. Один кредит = один адрес |
unlimited | true для аккаунтов без ограничения баланса, тогда balance равен null |
price_per_url_usd | Цена одного адреса в долларах США |
{ "ok": true, "balance": 1250, "unlimited": false, "price_per_url_usd": 0.01 }
Статусы задачи
queuedСоздана, ждёт очереди.checkingКаждый адрес открывается как Googlebot и фильтруется.submittingПрошедшие адреса отправляются.doneВсё прошедшее проверку принято.Завершённая задача получает один из трёх статусов:
done: принято всё, что прошло проверку. Если не прошло ничего, задача тожеdoneсaccepted: 0и без списаний.partial: принята часть, кредиты за остальное возвращены.failed: ничего не отправлено, зарезервированные кредиты возвращены.
Поле error объясняет результат partial или failed:
| error | Что значит |
|---|---|
insufficient_credits | Не хватило кредитов на адреса, прошедшие проверку |
service_unavailable | Отправка временно не удалась. Кредиты за непринятое возвращены, попробуйте позже |
restarted | Задачу прервал перезапуск сервиса. Зарезервированные кредиты возвращаются |
internal_error | Непредвиденная ошибка на нашей стороне |
Ошибки
Ошибки приходят с HTTP-кодом и JSON-телом, чтобы ваш код отличал кривой запрос от пустого баланса:
{ "ok": false, "error": "insufficient_credits", "message": "Balance is 0. Top up in the bot." }
| HTTP | error | Когда |
|---|---|---|
| 400 | bad_json | Тело запроса не является корректным JSON |
| 400 | no_urls | Поля urls нет, оно пустое или в нём нет корректных адресов http(s) |
| 400 | too_many_urls | Больше 10 000 адресов в одном запросе |
| 401 | unauthorized | Ключа нет, он неверный или заменён новым |
| 402 | insufficient_credits | Баланс 0 или при check: false он не покрывает все адреса |
| 403 | forbidden | Доступ к API для этого аккаунта закрыт |
| 404 | not_found | Неизвестный метод или задача, которой нет или она не ваша |
| 413 | too_large | Тело запроса больше 5 МБ |
| 429 | rate_limited | Больше 60 запросов в минуту |
| 429 | too_many_tasks | Уже идут 3 ваши задачи |
| 500 | internal_error | Непредвиденная ошибка на нашей стороне. Повторите чуть позже |
Лимиты
Индексация обычно занимает 1–3 дня после завершения задачи. Цена: $0.01 за принятый адрес, как и в боте.
Вопросы про API
Это официальный Google Indexing API?
Нет. Это наш собственный API, который делает ту же проверку и отправку, что и бот, для страниц любого типа. Официальный Indexing API от Google формально предназначен для страниц вакансий и трансляций. Подробнее в гайде Indexing API или сервисы индексации.
Нужен отдельный баланс для API?
Нет. Баланс у API и бота общий. Пополняете в боте, тратите где удобно.
Платить ли за отсеянные адреса?
Нет. Они перечислены в rejected_urls по причинам и не списываются, если только вы не отправили задачу с check: false.
Как часто опрашивать задачу?
Раза в 10 секунд достаточно. Большие задачи проверяются дольше, а частые запросы только съедают лимит в 60 запросов в минуту.
Потерял ключ. Что делать?
Нажмите 🔑 API в боте и выпустите новый ключ. Старый в тот же момент перестанет работать.