Документация API
Ниже представлены доступные эндпоинты для получения данных из поисковых систем и Вордстата. Машиночитаемая спека: openapi.json (OpenAPI 3.1).
Содержание
Аутентификация
Все методы API используют один и тот же ключ из личного кабинета.
Передать его можно двумя способами: заголовком запроса или параметром key в адресе.
Заголовком запроса:
Authorization: Bearer ВАШ_КЛЮЧ
Параметром key:
https://jsonseo.ru/api/yandex?text=пицца&key=ВАШ_КЛЮЧ
Быстрая проверка через curl:
curl -H "Authorization: Bearer ВАШ_КЛЮЧ" "https://jsonseo.ru/api/yandex?text=пицца"
Параметры-флаги, описанные ниже как 0 или 1, принимают также
true и false в любом регистре.
Коды ответов
| Код | Описание |
|---|---|
| 200 | Успешный запрос, в теле результат. |
| 402 | На балансе недостаточно средств. Пополните счёт. |
| 403 | API-ключ не передан или недействителен. |
| 422 | Ошибка валидации: не хватает обязательного параметра или значение вне допустимых. Детали в поле
errors.
|
| 429 | Превышен лимит бесплатных методов: 30 запросов в минуту на ключ. |
| 503 | Поиск временно недоступен. Деньги за такой запрос не списываются, повторите попытку позже. |
AI-ответ (ai=1)
Над выдачей поисковики показывают блок нейросети: текст, собранный по найденным страницам, со ссылками на источники. У Яндекса это «Быстрый ответ Алисы AI», у Google - AI Overview, у Bing - ответ Copilot.
Параметр общий для /yandex, /google и
/bing: по умолчанию блок не собирается, включается через
ai=1.
curl "https://jsonseo.ru/api/yandex?text=чем+ipv6+отличается+от+ipv4&ai=1&key=ВАШ_КЛЮЧ"
curl "https://jsonseo.ru/api/google?q=чем+ipv6+отличается+от+ipv4&ai=1&key=ВАШ_КЛЮЧ"
curl "https://jsonseo.ru/api/bing?q=чем+ipv6+отличается+от+ipv4&ai=1&key=ВАШ_КЛЮЧ"
Рядом с results появляется aiAnswer - одинаковый у всех трёх:
{
"pages": 1,
"results": [ ... ],
"aiAnswer": {
"markdown": "IPv6 отличается от IPv4 длиной адреса: 128 бит против 32. [`1`](https://example.ru/ipv6)",
"sources": [
{
"id": 1,
"url": "https://example.ru/ipv6",
"domain": "example.ru",
"title": "Чем IPv6 отличается от IPv4",
"description": "Разбираем адресацию, заголовок пакета и NAT",
"citations": 1
}
],
"followUps": ["Почему IPv6 внедряется так медленно?"]
}
}
- markdown: текст ответа. Сноски - обычные markdown-ссылки, подпись каждой
равна
idисточника - sources: источники, на которые опирается ответ -
id,url,domain,title - citations (в источнике): сколько сносок в тексте ведёт на этот источник.
0означает, что поисковик его показал, но в тексте не сослался - description (в источнике): описание источника, если поисковик его дал
- followUps: уточняющие вопросы, которые предлагаются под ответом
Ответ приходит целиком либо не приходит вовсе.
Цена и время
Цена: +0.01 ₽ к запросу, и только если ответ пришёл. Если у поисковика ответа
по запросу нет, поля aiAnswer не будет и запрос обойдётся в обычную цену.
Время: с ai=1 запрос идёт дольше - закладывайте это в таймауты.
От pages задержка не зависит.
Доступен только с первой страницы. ai=1 вместе со смещением (page,
p, start, first) - ошибка 422.
Отдаётся только в JSON. На /yandex/xml и
/google/xml параметр ai отклоняется - в схеме Яндекс XML
такого блока нет.
/balance
Текущий баланс аккаунта. Удобно для мониторинга остатка средств из ваших скриптов и интеграций.
Метод:
GET https://jsonseo.ru/api/balance
Стоимость запроса:
Бесплатно
Ключ обязателен: по нему находится аккаунт и считается лимит в 30 запросов в минуту.
Пример запроса:
curl "https://jsonseo.ru/api/balance?key=ВАШ_КЛЮЧ"
Пример ответа:
{
"balance": 123.45,
"currency": "RUB"
}
/yandex
Получение поисковой выдачи из Яндекс.
Метод:
GET https://jsonseo.ru/api/yandex
Параметры запроса:
- text* (или query, q): поисковый запрос
- region (или lr): ID региона (по умолчанию: 213)
- pages: количество страниц выдачи (от 1 до 20, по умолчанию - 1). Начать не с первой страницы - смещение выдачи
- filter: фильтрация поиска (none, moderate, strict, по умолчанию - moderate)
- hlword: выделять слова запроса в результатах (0 или 1, по умолчанию 0). При
hlword=1рядом сtitleиpassageпоявляютсяtitleHlиpassageHl- тот же текст с маркерами выделения - ai: забрать «Быстрый ответ Алисы AI» - блок нейросети над выдачей (0 или 1,
по умолчанию 0). Приходит полем
aiAnswer, стоит ещё 0.01 ₽ - подробнее - noreask: отключение автоматического исправления запроса (0 или 1, по умолчанию - 0)
- zone: доменная зона поиска (ru, com, kz, kk, by, be, uz, tr, com.tr, по умолчанию - ru)
- device: устройство (desktop, mobile, tablet). По умолчанию выдача мобильная
- break_domain: домен, на котором остановить поиск (example.com)
Поможет сократить стоимость и время поиска, в сценариях когда нужно получить только позицию.
Стоимость запроса:
0.01₽ × количество страниц
Указывается максимальное количество страниц, которое нужно получить. Если поиск вернёт меньше страниц, чем вы запросили, списание произойдёт только за фактически полученные страницы. Приai=1 прибавляется ещё 0.01 ₽ - и только если ответ Алисы пришёл.
Пример запроса:
curl
curl "https://jsonseo.ru/api/yandex?text=купить+ноутбук®ion=213&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'text' => 'купить ноутбук',
'region' => 213,
]);
$response = file_get_contents('https://jsonseo.ru/api/yandex?' . $params);
$data = json_decode($response, true);
foreach ($data['results'] as $index => $item) {
echo ($index + 1) . '. ' . $item['url'] . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/yandex',
params={'text': 'купить ноутбук', 'region': 213},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for index, item in enumerate(response.json()['results'], start=1):
print(index, item['url'])
JavaScript
const params = new URLSearchParams({text: 'купить ноутбук', region: 213});
const response = await fetch(`https://jsonseo.ru/api/yandex?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const data = await response.json();
data.results.forEach((item, index) => console.log(index + 1, item.url));
Пример ответа:
{
"pages": 1,
"exhausted": false,
"breakDomainHit": false,
"found": 116000000,
"found_human": "нашлось 116 млн результатов",
"lr": 213,
"query": "купить ноутбук",
"rawQuery": "купть ноутбук",
"results": [
{
"url": "https://www.VZON.ru/category/noutbuki-15692/",
"domain": "www.vzon.ru",
"title": "Ноутбуки: купить ноутбук на VZON по низкой цене",
"passage": "Покупайте ноутбуки на VZON по выгодным ценам, быстрая и бесплатная доставка...",
"breadcrumbs": "vzon.ru›Электроника›Ноутбуки, планшеты и электронные книги"
}
]
}
Поля ответа:
- results: результаты выдачи по порядку. Пустой массив - по запросу ничего не найдено, это оплачиваемый ответ (поиск был выполнен).
- pages: сколько страниц фактически получено - ровно за них и списываются деньги
- exhausted:
true- выдача закончилась: дальше страниц нет, повторять запрос с бо́льшимpagesнет смысла. Например, запрошено 10 страниц, а по запросу их всего 3. Флаг ставится и когда выдача закончилась ровно на последней запрошенной странице. - breakDomainHit:
true- поиск остановлен, потому что на странице найден домен изbreak_domain; результаты этой страницы включены в ответ. - query и rawQuery: запрос после исправления Яндексом и исходный
- found: сколько всего нашлось. Величина приблизительная и точной не
бывает: поисковик округляет её сам и отдаёт словами — 27 787 131 показывается как «28 млн»
и возвращается как
28000000. Восстановить исходное число невозможно.null, если разобрать не удалось;0— когда не нашлось ничего - found_human: та же величина словами, как её показывает Яндекс, — «нашлось 116 млн результатов»
- lr: регион, в котором фактически выполнен поиск
- reqid: идентификатор запроса, присвоенный Яндексом
- mime (в результате): тип документа -
pdf,doc,xlsи т.д. У обычных страниц поля нет - aiAnswer: ответ Алисы, если его просили через
ai=1- см. AI-ответ
/yandex/xml
Получение поисковой выдачи Яндекса в формате XML.
Этот эндпоинт предназначен для интеграции в приложения и может использоваться вместо сервисов XMLRiver, XMLStock, XMLProxy, XMLSeo. Готовый URL для запросов доступен в личном кабинете.
Метод:
GET https://jsonseo.ru/api/yandex/xml
Параметры запроса:
- query*: поисковый запрос
- lr: ID региона (по умолчанию- 213)
- device: устройство (desktop, mobile, tablet). По умолчанию выдача мобильная
- filter: фильтр взрослого контента (none, moderate, strict, по умолчанию - moderate).
strict- семейный поиск,none- фильтр выключен - hlword: выделять слова запроса в
titleиpassageтегами<hlword>, как это делает Яндекс XML (0 или 1, по умолчанию 0). Без него содержимое тегов остаётся чистым текстом - domain: доменная зона поиска (ru, com, kz, kk, by, be, uz, tr, com.tr, по умолчанию - ru)
- groupby: количество позиций для сбора (кратное 10, до 200, по умолчанию 10) либо
строка группировки Яндекса вида
attr="".mode=flat.groups-on-page=10.docs-in-group=1-attr,mode,groups-on-pageиdocs-in-groupвозвращаются в ответе;curcateg,depthиkilldupпринимаются, но не используются. Группа равна документу: выдача и так склеена по сайту, поэтомуdocs-in-groupподдерживается только равным единице. Плоская группировка не сочетается с группировочным атрибутом, глубокая и широкая его требуют — иначе ошибка 19. - page: номер страницы (нумерация начинается с нуля, по умолчанию 0, первая страница).
Смещение выдачи равно
page × groupby, и поиск начинается сразу с него — пропущенные страницы не собираются и не оплачиваются. - page_base: с какого числа считать страницы -
0(по умолчанию) или1. Приpage_base=1первая страница -page=1, аpage=0возвращает ошибку 37 (формат ошибок).
Нужен при переезде с сервисов, где нумерация другая: Яндекс XML и XMLStock считают с нуля, XMLRiver для Google - с единицы. Тег<page>в ответе содержит номер в той же нумерации, в которой пришёл запрос; атрибутыfirstиlast- абсолютные номера позиций и от неё не зависят. Максимальную глубину не меняет. Разбор - в статье Нумерация страниц: с нуля или с единицы.
page=1 и groupby=100
списывается за 10 страниц выдачи, а не за 20. Максимальная глубина - 20 страниц (200 результатов): потолок
общий на page и groupby, поэтому при groupby=100
доступны две страницы: 0 и 1.
Все позиции сразу получают через groupby при
page=0 -
см. смещение выдачи.
Стоимость запроса:
0.01₽ × количество страниц
Количество страниц = количество позиций ÷ 10, независимо отpage. Например:
100 позиций - 10 страниц - 0.1 ₽; при page=1 те же 100 позиций стоят те же 0.1 ₽,
оплачивается только запрошенная страница.
Пример ответа:
<?xml version="1.0" encoding="utf-8"?>
<yandexsearch version="1.0">
<response date="20260504T120000" dateiso="2026-05-04T12:00:00Z">
<reqid>1746345600123456-1234567890123456789</reqid>
<found priority="phrase">128929</found>
<found priority="strict">128929</found>
<found priority="all">128929</found>
<found-human>нашлось 128 тыс. результатов</found-human>
<misspell>
<rule>Misspell</rule>
<source-text>кпить ноутбук</source-text>
<text>купить ноутбук</text>
</misspell>
<results>
<grouping attr="" mode="flat" groups-on-page="10" docs-in-group="1">
<page first="1" last="10">0</page>
<group>
<doccount>1</doccount>
<doc id="ZC2633C719742EBE4">
<url>https://www.example.com/category/noutbuki/</url>
<domain>www.example.com</domain>
<title>Ноутбуки: купить ноутбук по низкой цене</title>
<breadcrumbs/>
<mime-type>application/pdf</mime-type>
<passages>
<passage>Покупайте ноутбуки по выгодным ценам, быстрая и бесплатная доставка...</passage>
</passages>
<contenttype>organic</contenttype>
</doc>
</group>
</grouping>
</results>
</response>
</yandexsearch>
Тег <mime-type> появляется только у документов (pdf, doc, xls и т.д.);
у обычных страниц его нет. Блок <misspell> - только когда Яндекс сам исправил
запрос и искал по исправленному: <source-text> - что прислали вы,
<text> - по чему искали. При hlword=1 исправленные слова в
<source-text> выделяются.
Коды ошибок:
Ошибка возвращается XML-ом с кодом ответа 200 - так же, как это делают Яндекс XML и агрегаторы:
<error code="N">текст</error>. Номера совпадают с Яндекс XML.
- 19: заданы несовместимые параметры запроса - проверьте группировку
- 20: неизвестная ошибка
- 32: лимит запросов исчерпан - пополните баланс
- 37: неверное значение параметра запроса
- 42: ключ неверен - проверьте токен
- 55: превышено допустимое количество запросов в секунду
/yandex/suggest
Поисковые подсказки Яндекса (саджест): фразы, которые Яндекс предлагает при вводе запроса. Подсказки собираются без персонализации и истории - только «чистый» список запросов, с учётом региона. Источник идей для расширения семантики и анализа спроса.
Метод:
GET https://jsonseo.ru/api/yandex/suggest
Параметры запроса:
- text* (или query, q): поисковый запрос (префикс)
- region (или lr): ID региона (по умолчанию: 213). Подсказки региональные: «купить квартиру» в регионе 2 дополнится «в спб»
- zone: доменная зона поиска (ru, com, kz, kk, by, be, uz, tr, com.tr, по умолчанию - ru)
Стоимость запроса:
0.01₽ за запрос
Пагинации нет - все подсказки (до 50) приходят за один запрос.Пример запроса:
curl
curl "https://jsonseo.ru/api/yandex/suggest?text=купить+квартиру®ion=213&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'text' => 'купить квартиру',
'region' => 213,
]);
$response = file_get_contents('https://jsonseo.ru/api/yandex/suggest?' . $params);
$data = json_decode($response, true);
foreach ($data['results'] as $suggestion) {
echo $suggestion . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/yandex/suggest',
params={'text': 'купить квартиру', 'region': 213},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for suggestion in response.json()['results']:
print(suggestion)
JavaScript
const params = new URLSearchParams({text: 'купить квартиру', region: 213});
const response = await fetch(`https://jsonseo.ru/api/yandex/suggest?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const data = await response.json();
data.results.forEach(suggestion => console.log(suggestion));
Пример ответа:
{
"query": "купить квартиру",
"results": [
"купить квартиру в москве",
"купить квартиру в новостройке",
"купить квартиру в подмосковье",
"купить квартиру вторичка",
"купить квартиру от застройщика"
],
"lr": "213"
}
Поля ответа:
- results: подсказки в порядке, в котором их отдаёт Яндекс. Пустой массив - по запросу подсказок нет, это оплачиваемый ответ (запрос был выполнен).
- query: исходный запрос
- lr: регион, для которого собраны подсказки
/yandex/regions
Справочник регионов Яндекса: поиск кода региона (lr) по названию города или области.
Метод бесплатный, но ключ нужен: по нему считается лимит в 30 запросов в минуту. Тот же справочник доступен на странице
регионов Яндекса.
Метод:
GET https://jsonseo.ru/api/yandex/regions
Параметры запроса:
- name*: название города или области, можно частично («Казан», «Нижегородская»). Числовое значение ищется как ID региона.
- lang: язык названий в ответе (ru, en, по умолчанию - ru)
Возвращаются самые подходящие совпадения, не больше 30 за запрос: короткий запрос вроде «ново» совпадает с тысячами названий. Уточните название, если нужного региона нет в ответе.
Стоимость запроса:
Бесплатно
Пример запроса:
curl "https://jsonseo.ru/api/yandex/regions?name=Казань&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"name": "Казань",
"lang": "ru",
"regions": [
{
"id": 43,
"name": "Казань",
"subname": "Республика Татарстан",
"lat": 55.796129,
"lon": 49.106414
}
]
}
id подставляется в параметр region (он же lr)
методов /yandex, /yandex/xml,
/yandex/suggest и
/wordstat. Координаты lat и lon пригодятся
для геолокации в /bing.
Получение поисковой выдачи из Google (мобильная выдача google.com).
Метод:
GET https://jsonseo.ru/api/google
Параметры запроса:
- text* (или q): поисковый запрос
- region: ID региона Google
(например, 1011969, это Москва).
Сервер строит UULE по каноническому имени региона и подставляет gl по стране региона, если он не задан явно. - pages: количество страниц выдачи (от 1 до 20, по умолчанию - 1). Начать не с первой страницы - смещение выдачи
- gl: код страны (ISO, например: ru, us, de)
- hl: язык интерфейса (например: ru, en, de)
- uule: закодированная геолокация Google (UULE)
- ll: гео координаты в формате
longitude,latitude(например,37.617633,55.755830).
Используется только если не указаны uule и region: сервер сам закодирует координаты в UULE и привяжет выдачу к этой точке. - nfpr: отключение автоматического исправления запроса (0 или 1, по умолчанию - 0)
- filter: управление склейкой «очень похожих» результатов (0 или 1). По умолчанию
не передаётся - выдача как у обычного пользователя (Google скрывает похожие).
filter=0возвращает и скрытые результаты (обычно это углубляет выдачу).
Причину, по которой Google обрезал выдачу, смотрите в поле ответаfilter_description. - safe: безопасный поиск (SafeSearch).
active— включён,off— выключен. По умолчанию не передаётся (настройки Google по умолчанию). - ai: забрать AI Overview - обзор нейросети над выдачей (0 или 1, по умолчанию 0).
Приходит полем
aiAnswer, стоит ещё 0.01 ₽ - подробнее - break_domain: домен, на котором остановить поиск (example.com)
Поможет сократить стоимость и время поиска, в сценариях когда нужно получить только позицию. - zone: доменная зона Google - ccTLD (например,
ru,co.uk,com.ua), по умолчаниюcom.
Google свернул региональность доменов, поэтому на выдачу зона почти не влияет - регион задавайте через region/gl. Полный список и подробности - в статье домены Google по странам.
Стоимость запроса:
0.01₽ × количество страниц
Указывается максимальное количество страниц, которое нужно получить. Если поиск вернёт меньше страниц, чем вы запросили, списание произойдёт только за фактически полученные страницы. Приai=1 прибавляется ещё 0.01 ₽ - и только если AI Overview пришёл.
Пример запроса:
curl
curl "https://jsonseo.ru/api/google?q=купить+ноутбук®ion=1011969&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'q' => 'купить ноутбук',
'region' => 1011969,
]);
$response = file_get_contents('https://jsonseo.ru/api/google?' . $params);
$data = json_decode($response, true);
foreach ($data['results'] as $index => $item) {
echo ($index + 1) . '. ' . $item['url'] . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/google',
params={'q': 'купить ноутбук', 'region': 1011969},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for index, item in enumerate(response.json()['results'], start=1):
print(index, item['url'])
JavaScript
const params = new URLSearchParams({q: 'купить ноутбук', region: 1011969});
const response = await fetch(`https://jsonseo.ru/api/google?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const data = await response.json();
data.results.forEach((item, index) => console.log(index + 1, item.url));
Пример ответа:
{
"pages": 1,
"exhausted": false,
"breakDomainHit": false,
"query": "купить ноутбук",
"rawQuery": "купть ноутбук",
"region": "Москва, Россия",
"url": "https://www.google.com/search?q=...",
"results": [
{
"url": "https://www.example.com/category/noutbuki/",
"domain": "www.example.com",
"title": "Ноутбуки: купить ноутбук по низкой цене",
"passage": "Покупайте ноутбуки по выгодным ценам, быстрая и бесплатная доставка...",
"breadcrumbs": "example.com › Электроника › Ноутбуки"
}
]
}
Поля ответа:
- results: результаты выдачи по порядку. Пустой массив - по запросу ничего не найдено, это оплачиваемый ответ (поиск был выполнен).
- pages: сколько страниц фактически получено - ровно за них и списываются деньги
- exhausted:
true- выдача закончилась: дальше страниц нет, повторять запрос с бо́льшимpagesнет смысла. Например, запрошено 10 страниц, а по запросу их всего 3. Флаг ставится и когда выдача закончилась ровно на последней запрошенной странице. - breakDomainHit:
true- поиск остановлен, потому что на странице найден домен изbreak_domain; результаты этой страницы включены в ответ. - query и rawQuery: запрос после исправления Google и исходный
- mime и mime_type (в результате): тип документа, если Google пометил
результат как файл -
pdfиapplication/pdf. У обычных страниц полей нет, а метка[PDF]из заголовка при этом убирается - region: подпись региона, к которому Google привязал выдачу
- filter_description: пояснение Google, если часть результатов скрыта как «очень
похожие на уже показанные» - это и есть частая причина
exhausted. Чтобы получить скрытые результаты, повторите запрос сfilter=0. Пусто, если фильтрации не было. - aiAnswer: AI Overview, если его просили через
ai=1- см. AI-ответ
/google/xml
Получение поисковой выдачи Google в формате XML.
Ответ имеет ту же структуру, что и /yandex/xml, поэтому эндпоинт подходит программам, которые умеют работать с Яндекс XML (Key Collector, TopSite и другие), и может использоваться вместо сервисов XMLRiver, XMLStock, XMLProxy, XMLSeo. Готовый URL для запросов доступен в личном кабинете.
Метод:
GET https://jsonseo.ru/api/google/xml
Параметры запроса:
- query* (или text, q): поисковый запрос
- region (или loc): ID региона
Google (например, 1011969, это Москва). По нему строится UULE, а gl
подставляется по стране региона.
Ради совместимости регион принимается и в параметреlr, но только числом: в XMLRiverlrозначает язык результатов, а не регион. - gl: код страны (ISO, например: ru, us, de)
- hl: язык интерфейса (например: ru, en, de)
- uule: закодированная геолокация Google (UULE), если хотите задать её сами
- ll: гео координаты в формате
longitude,latitude. Используется, только если не заданы uule и region. - nfpr: отключение автоматического исправления запроса (0 или 1, по умолчанию - 0)
- safe: безопасный поиск (SafeSearch):
active— включён,off— выключен. - groupby: количество позиций для сбора (кратное 10, до 200, по умолчанию 10) либо
строка группировки Яндекса вида
attr="".mode=flat.groups-on-page=10.docs-in-group=1- разбирается так же, как в Яндекс XML. - hlword: выделять исправленные слова в
<source-text>тегами<hlword>(0 или 1, по умолчанию 0). Подсветки слов запроса в самой выдаче Google нет - сниппет приходит чистым текстом. - page: номер страницы (нумерация начинается с нуля, по умолчанию 0).
Смещение выдачи равно
page × groupby, и поиск начинается сразу с него — пропущенные страницы не собираются и не оплачиваются. - page_base: с какого числа считать страницы -
0(по умолчанию) или1. Приpage_base=1первая страница -page=1, аpage=0возвращает ошибку 37 (формат ошибок).
Нужен при переезде с сервисов, где нумерация другая: Яндекс XML и XMLStock считают с нуля, XMLRiver для Google - с единицы. Тег<page>в ответе содержит номер в той же нумерации, в которой пришёл запрос; атрибутыfirstиlast- абсолютные номера позиций и от неё не зависят. Максимальную глубину не меняет. Разбор - в статье Нумерация страниц: с нуля или с единицы.
page=1 и groupby=100
списывается за 10 страниц выдачи, а не за 20. Максимальная глубина - 20 страниц (200 результатов): потолок
общий на page и groupby, поэтому при groupby=100
доступны две страницы: 0 и 1.
Все позиции сразу получают через groupby при
page=0 -
см. смещение выдачи.
Стоимость запроса:
0.01₽ × количество страниц
Количество страниц = количество позиций ÷ 10, независимо отpage. Например:
100 позиций - 10 страниц - 0.1 ₽; при page=1 те же 100 позиций стоят те же 0.1 ₽,
оплачивается только запрошенная страница.
Пример ответа:
<?xml version="1.0" encoding="utf-8"?>
<yandexsearch version="1.0">
<response date="20260504T120000" dateiso="2026-05-04T12:00:00Z">
<found priority="phrase">100</found>
<found priority="strict">100</found>
<found priority="all">100</found>
<misspell>
<rule>Misspell</rule>
<source-text>recieve payment</source-text>
<text>receive payment</text>
</misspell>
<results>
<grouping attr="" mode="flat" groups-on-page="10" docs-in-group="1">
<page first="1" last="10">0</page>
<group>
<doccount>1</doccount>
<doc id="ZC2633C719742EBE4">
<url>https://www.example.com/category/noutbuki/</url>
<domain>www.example.com</domain>
<title>Ноутбуки: купить ноутбук по низкой цене</title>
<breadcrumbs>example.com › Электроника › Ноутбуки</breadcrumbs>
<mime-type>application/pdf</mime-type>
<passages>
<passage>Покупайте ноутбуки по выгодным ценам, быстрая и бесплатная доставка...</passage>
</passages>
<contenttype>organic</contenttype>
</doc>
</group>
</grouping>
</results>
</response>
</yandexsearch>
/google/suggest
Поисковые подсказки Google (autocomplete): фразы, которые Google предлагает при вводе запроса. Подсказки собираются без персонализации - «чистый» список запросов с учётом региона. Источник идей для расширения семантики и анализа спроса.
Метод:
GET https://jsonseo.ru/api/google/suggest
Параметры запроса:
- q* (или text, query): поисковый запрос (префикс)
- region: ID региона Google (например, 1011969, это Москва). Сервер строит UULE по региону и подставляет gl по его стране. Регион влияет на состав подсказок.
- gl: код страны (ISO, например: ru, us, de) - главный рычаг региональности подсказок, если region не задан
- hl: язык интерфейса (например: ru, en, de)
- uule: закодированная геолокация Google (UULE)
- zone: доменная зона Google (ccTLD, по умолчанию
com). На подсказки почти не влияет - см. домены Google по странам.
Стоимость запроса:
0.01₽ за запрос
Пагинации нет - все подсказки (до ~15) приходят за один запрос.Пример запроса:
curl
curl "https://jsonseo.ru/api/google/suggest?q=купить+ноутбук®ion=1011969&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'q' => 'купить ноутбук',
'region' => 1011969,
]);
$response = file_get_contents('https://jsonseo.ru/api/google/suggest?' . $params);
$data = json_decode($response, true);
foreach ($data['results'] as $suggestion) {
echo $suggestion . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/google/suggest',
params={'q': 'купить ноутбук', 'region': 1011969},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for suggestion in response.json()['results']:
print(suggestion)
JavaScript
const params = new URLSearchParams({q: 'купить ноутбук', region: 1011969});
const response = await fetch(`https://jsonseo.ru/api/google/suggest?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const data = await response.json();
data.results.forEach(suggestion => console.log(suggestion));
Пример ответа:
{
"query": "купить ноутбук",
"results": [
"купить ноутбук игровой",
"купить ноутбук бу",
"купить ноутбук недорого",
"купить ноутбук apple",
"купить ноутбук в москве"
]
}
Поля ответа:
- results: подсказки в порядке, в котором их отдаёт Google. Пустой массив - по запросу подсказок нет, это оплачиваемый ответ (запрос был выполнен).
- query: исходный запрос
/google/regions
Справочник регионов Google: поиск числового ID региона по названию города или страны. Вместе с ID
возвращается готовый параметр uule, который можно подставить прямо в адрес выдачи Google.
Метод бесплатный, но ключ нужен: по нему считается лимит в 30 запросов в минуту. Те же данные есть на страницах
регионов Google и
генератора UULE.
Метод:
GET https://jsonseo.ru/api/google/regions
Параметры запроса:
- name*: название города или страны на русском либо английском, можно частично («Казан», «Omsk»). Числовое значение ищется как ID региона.
- lang: язык названий в ответе (ru, en, по умолчанию - ru)
Возвращаются самые популярные совпадения, не больше 30 за запрос: короткий запрос вроде «ново» совпадает с тысячами названий. Уточните название, если нужного региона нет в ответе.
Стоимость запроса:
Бесплатно
Пример запроса:
curl "https://jsonseo.ru/api/google/regions?name=Казань&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"name": "Казань",
"lang": "ru",
"regions": [
{
"id": 1012054,
"name": "Казань",
"subname": "Республика Татарстан, Россия",
"type": "city",
"type_name": "город",
"canonical_name": "Kazan,Republic of Tatarstan,Russia",
"uule": "w+CAIQICIiS2F6YW4sUmVwdWJsaWMgb2YgVGF0YXJzdGFuLFJ1c3NpYQ",
"lat": 55.7878944,
"lon": 49.1233293
}
]
}
id подставляется в параметр region методов
/google и /google/xml: сервер сам соберёт UULE и
подставит страну. uule нужен, только если вы обращаетесь к Google напрямую.
canonical_name всегда английское: именно из него собирается UULE. Параметр
lang меняет только name и subname.
/bing
Получение поисковой выдачи из Bing (bing.com). Тарификация постраничная: одна страница - 0.01 ₽ независимо от числа результатов в ней.
Метод:
GET https://jsonseo.ru/api/bing
Параметры запроса:
Локация: при нескольких параметрах Bing берёт верхний, остальные игнорирует.
Без них: выдача по России (mkt=ru-RU).
- text* (или q): поисковый запрос.
- pages: страниц выдачи, от 1 до 20 (по умолчанию 1). Начать не с первой страницы - смещение выдачи
- mkt: рынок
язык-страна(ru-RU,en-US). - cc (или gl): код страны (
RU,US). - ll: координаты
latitude,longitude(55.753930,37.620795это Красная площадь). Подпись локации придёт в поле region. - setlang (или hl): язык интерфейса (
ru,en). Регион не меняет, совместим со всеми параметрами выше. - safesearch:
off,moderate(default),strict. - break_domain: остановить поиск на домене (поддерживает
*.example.com). - ai: забрать ответ Copilot - блок нейросети над выдачей (0 или 1, по умолчанию 0).
Приходит полем
aiAnswer, стоит ещё 0.01 ₽ - подробнее
Стоимость запроса:
0.01₽ × количество страниц
Указывается максимальное количество страниц, которое нужно получить. Если поиск вернёт меньше страниц, чем вы запросили, списание произойдёт только за фактически полученные страницы. Приai=1 прибавляется ещё 0.01 ₽ - и только если ответ Copilot пришёл.
Пример запроса:
curl
curl "https://jsonseo.ru/api/bing?q=пицца&ll=55.753930,37.620795&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'q' => 'пицца',
'll' => '55.753930,37.620795',
]);
$response = file_get_contents('https://jsonseo.ru/api/bing?' . $params);
$data = json_decode($response, true);
foreach ($data['results'] as $index => $item) {
echo ($index + 1) . '. ' . $item['url'] . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/bing',
params={'q': 'пицца', 'll': '55.753930,37.620795'},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for index, item in enumerate(response.json()['results'], start=1):
print(index, item['url'])
JavaScript
const params = new URLSearchParams({q: 'пицца', ll: '55.753930,37.620795'});
const response = await fetch(`https://jsonseo.ru/api/bing?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const data = await response.json();
data.results.forEach((item, index) => console.log(index + 1, item.url));
Пример ответа:
{
"pages": 1,
"exhausted": false,
"breakDomainHit": false,
"query": "пицца",
"rawQuery": "пицца",
"region": "Москва, Москва",
"url": "https://www.bing.com/search?q=...",
"results": [
{
"url": "https://lolo-pizza.ru/",
"domain": "lolo-pizza.ru",
"title": "Лоло Пицца: кушай и ржи",
"passage": "Заказать горячую и ржачную пиццу с доставкой за 30 минут...",
"breadcrumbs": "https://lolo-pizza.ru"
}
]
}
Поля ответа:
- results: результаты выдачи по порядку. Пустой массив - по запросу ничего не найдено, это оплачиваемый ответ (поиск был выполнен).
- pages: сколько страниц фактически получено - ровно за них и списываются деньги
- exhausted:
true- выдача закончилась: дальше страниц нет, повторять запрос с бо́льшимpagesнет смысла. Например, запрошено 10 страниц, а по запросу их всего 3. Флаг ставится и когда выдача закончилась ровно на последней запрошенной странице. - breakDomainHit:
true- поиск остановлен, потому что на странице найден домен изbreak_domain; результаты этой страницы включены в ответ. - query и rawQuery: запрос после исправления Bing и исходный
- region: подпись локации, к которой Bing привязал выдачу
- mkt и lang: фактический рынок и язык интерфейса выдачи
- aiAnswer: ответ Copilot, если его просили через
ai=1- см. AI-ответ
/bing/suggest
Поисковые подсказки Bing (autocomplete): фразы, которые Bing предлагает при вводе запроса. Источник идей для расширения семантики и анализа спроса.
Метод:
GET https://jsonseo.ru/api/bing/suggest
Параметры запроса:
- q* (или text, query): поисковый запрос (префикс)
- ll: координаты
latitude,longitude(55.753930,37.620795это Красная площадь) - делают подсказки региональными - mkt: рынок
язык-страна(ru-RU,en-US). По умолчаниюru-RU - cc (или gl): код страны (
RU,US) - setlang (или hl): язык интерфейса (
ru,en)
Стоимость запроса:
0.01₽ за запрос
Пагинации нет - все подсказки приходят за один запрос.Пример запроса:
curl "https://jsonseo.ru/api/bing/suggest?q=купить+ноутбук&ll=55.753930,37.620795&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"query": "купить ноутбук",
"results": [
"купить ноутбук игровой",
"купить ноутбук бу",
"купить ноутбук недорого"
]
}
Поля ответа:
- results: подсказки в порядке, в котором их отдаёт Bing. Пустой массив - по запросу подсказок нет, это оплачиваемый ответ (запрос был выполнен).
- query: исходный запрос
/wordstat
Списки популярных и похожих запросов из Яндекс Вордстата - материал для расширения семантики. Частота самой фразы - отдельным методом /wordstat/frequency.
Метод:
GET https://jsonseo.ru/api/wordstat
Параметры запроса:
- text*: ключевое слово или фраза. Операторы Вордстата ("фраза", !слово, [порядок], -минус, +предлог) передаются как есть
- kind: вид частотности - операторы расставятся автоматически, передавайте
обычную фразу без кавычек. Значения:
base- базовая, фраза как есть (по умолчанию),phrase- фразовая ("фраза"),exact- точная ("!слово !слово"),superexact- сверхточная ("[!слово !слово]").
Какой вид когда нужен - в статье про виды частотности. Для прогноза трафика беритеexact. - region: ID регионов через запятую (по умолчанию: all)
- device: типы девайсов через запятую (по умолчанию: desktop,phone,tablet)
Стоимость запроса:
0.01₽ за запрос
Фиксированная цена за запрос. Вордстат отдаёт полные списки популярных и похожих запросов сразу, пагинации нет - параметрpages больше не используется.
Пример запроса:
curl
curl "https://jsonseo.ru/api/wordstat?text=ремонт+айфона®ion=213&key=ВАШ_КЛЮЧ"
PHP
<?php
$params = http_build_query([
'key' => 'ВАШ_КЛЮЧ',
'text' => 'ремонт айфона',
'region' => 213,
]);
$response = file_get_contents('https://jsonseo.ru/api/wordstat?' . $params);
$data = json_decode($response, true);
foreach ($data['results']['popular'] as $item) {
echo $item['text'] . ': ' . $item['value'] . PHP_EOL;
}
Python
import requests
response = requests.get(
'https://jsonseo.ru/api/wordstat',
params={'text': 'ремонт айфона', 'region': 213},
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
)
response.raise_for_status()
for item in response.json()['results']['popular']:
print(item['text'], item['value'])
JavaScript
const params = new URLSearchParams({text: 'ремонт айфона', region: 213});
const response = await fetch(`https://jsonseo.ru/api/wordstat?${params}`, {
headers: {Authorization: 'Bearer ВАШ_КЛЮЧ'},
});
const {results} = await response.json();
results.popular.forEach((item) => console.log(item.text, item.value));
Пример ответа:
{
"text": "ремонт айфона",
"region": "213",
"device": "desktop,phone,tablet",
"results": {
"popular": [
{
"text": "ремонт айфонов",
"value": 128927
},
{
"text": "сколько ремонт айфона",
"value": 8365
}
],
"associations": [
{
"text": "починить телефон",
"value": 30546
}
]
}
}
/wordstat/frequency
Частота запроса из Вордстата одним числом. Вид частотности задаётся параметром
kind - операторы расставляются автоматически, фразу передавайте без кавычек.
Метод:
GET https://jsonseo.ru/api/wordstat/frequency
Параметры запроса:
Те же, что у /wordstat: text*, kind, region, device.
Стоимость запроса:
0.01₽ за запрос
Пример запроса:
curl "https://jsonseo.ru/api/wordstat/frequency?text=ремонт+айфона&kind=exact®ion=213&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"text": "\"!ремонт !айфона\"",
"region": "213",
"device": "desktop,phone,tablet",
"results": {
"totalValue": 27356
}
}
В text возвращается фраза, как она ушла в Вордстат - с операторами,
подставленными по kind. Снять четыре вида частотности по всему ядру - четыре
вызова на фразу, по 0.01 ₽ каждый; какой вид когда нужен - в статье про
виды частотности.
/wordstat/graph
Динамика показов запроса: по месяцам и неделям - история с 2018 года, по дням - последние 60 дней. Подходит для оценки сезонности и тренда спроса.
Метод:
GET https://jsonseo.ru/api/wordstat/graph
Параметры запроса:
- text*, kind, region, device - как у /wordstat
- graph_type: шаг динамики -
month(по умолчанию),week,day
Стоимость запроса:
0.01₽ за запрос
Пример запроса:
curl "https://jsonseo.ru/api/wordstat/graph?text=купить+ёлку&graph_type=month&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"text": "купить ёлку",
"region": "all",
"device": "desktop,phone,tablet",
"type": "month",
"results": {
"graph": [
{
"date": "2026-06-01",
"text": "июнь 2026",
"absolute": 9042,
"relative": 0.0001
},
{
"date": "2026-07-01",
"text": "июль 2026",
"absolute": 11780,
"relative": 0.0001
}
]
}
}
absolute - показы за период, relative - доля показов
запроса среди всех показов Яндекса за тот же период (удобно сравнивать сезонность без
влияния роста самого поиска).
/wordstat/map
Распределение показов запроса по регионам и городам России. Параметр region здесь не применяется: метод сам раскладывает спрос по всем регионам.
Метод:
GET https://jsonseo.ru/api/wordstat/map
Параметры запроса:
- text*, kind, device - как у /wordstat
- map_type: разрез -
all(по умолчанию),regions(регионы),cities(города)
Стоимость запроса:
0.01₽ за запрос
Пример запроса:
curl "https://jsonseo.ru/api/wordstat/map?text=купить+ноутбук&map_type=regions&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"text": "купить ноутбук",
"device": "desktop,phone,tablet",
"type": "regions",
"results": {
"rows": [
{
"type": "regions",
"text": "Москва и область",
"absolute": 111666,
"popularity": 117.07,
"relative": 0.005483,
"region_id": 1
},
{
"type": "regions",
"text": "Центр",
"absolute": 178801,
"popularity": 108.69,
"relative": 0.00509,
"region_id": null
}
]
}
}
absolute - показы из региона за период, popularity -
региональная популярность (affinity-индекс: 100 - средний интерес по стране, выше -
повышенный), relative - доля запроса среди всех показов региона.
region_id - ID региона Яндекса из
справочника: его можно сразу передавать
в параметр region других методов. null - когда название
неоднозначно (в стране одиннадцать «Дзержинских районов») или это сводный макрорегион
Вордстата вроде «Центра».
/geoip
Определение геолокации по IP-адресу: страна, регион и координаты. ID региона совпадает с ID региона Яндекса: результат можно сразу использовать в параметре region эндпоинтов /yandex и /wordstat.
Метод:
GET https://jsonseo.ru/api/geoip
Аутентификация:
Метод бесплатный, но ключ обязателен: по нему считается лимит в 30 запросов в минуту.
Параметры запроса:
- ip*: IPv4-адрес, для которого нужно определить местоположение
Пример запроса:
curl "https://jsonseo.ru/api/geoip?ip=77.88.55.242&key=ВАШ_КЛЮЧ"
Пример ответа:
{
"ip": "77.88.55.242",
"latitude": 55.753215,
"longitude": 37.622504,
"region": {
"id": 213,
"name": "Москва"
},
"country": {
"id": 225,
"name": "Россия",
"iso_name": "RU"
}
}
Если IP-адрес удалось привязать только к стране, поле region отсутствует,
а координаты указывают на центр страны.
Смещение выдачи (page)
По умолчанию выдача собирается с первой страницы, а pages задаёт,
сколько страниц собрать подряд. Параметр page сдвигает начало: он говорит,
с какой страницы начинать, и работает вместе с pages.
page=3&pages=5 - страницы 3–7.
По умолчанию 0. Доступен в /yandex, /google, /bing и в XML-методах.
Нумерация страниц
Нумерация начинается с нуля: page=0 - первая страница. В JSON-методах она
всегда такая; параметр page_base там не принимается и возвращает
ошибку 422.
В XML-методах нумерацию можно переключить на счёт с единицы - это нужно при переезде с сервисов, где она другая. Описание ниже, в разделах /yandex/xml и /google/xml.
Максимальная глубина
20 страниц, то есть 200 результатов. Предел общий для смещения и ширины окна: сумма
page и pages больше 20 - ошибка 422. Одинаково во всех
методах, включая XML, где глубина считается как (page + 1) × groupby;
там та же ошибка приходит кодом 37 внутри XML с HTTP-статусом 200.
Параметры поисковых систем
То же смещение принимается под теми именами, которыми его называют сами поисковые системы. При одновременной передаче с page используется параметр поисковой системы.
- p (Яндекс): номер страницы с нуля, совпадает с page. Максимум 19
- start (Google): номер результата с нуля, кратный десяти.
start=30равноpage=3. Максимум 190 - first (Bing): номер результата с единицы.
first=11равноpage=1. Максимум 191
Значение передаётся поисковой системе без изменений. Это единственный способ задать
смещение, которое не попадает на границу страницы - например first=19 у Bing.
Особенности Bing
Точное попадание на запрошенное смещение у Bing не гарантируется: границы страниц
он двигает сам. page запрашивает круглые границы:
page=1 уходит как first=11, page=2 - как
first=21. Обычно страницы там и начинаются. При меньшем числе результатов на
странице граница смещается, например на 19-й результат - на неё page уже
не наведёшь. Ровно на такую границу ставит только first; само значение можно
взять из ссылки «Следующая страница» в выдаче Bing.
Ограничения
ai=1вместе со смещением - ошибка 422: AI-ответ есть только на первой странице, подробнее- Оплата постраничная и от смещения не зависит:
page=5&pages=1стоит 0.01 ₽, пропущенные страницы не собираются и не оплачиваются
Когда лучше pages
Несколько страниц подряд следует запрашивать одним запросом через pages, а не несколькими запросами со смещением: выдача динамическая и успевает измениться между обращениями. Разбор - в статье Параметр page: смещение выдачи и почему pages надёжнее. Про расхождение нумерации между сервисами - в статье Нумерация страниц: с нуля или с единицы.
Пример запроса:
curl "https://jsonseo.ru/api/yandex?text=купить+ноутбук&page=2&pages=3&key=ВАШ_КЛЮЧ"
curl "https://jsonseo.ru/api/google?q=купить+ноутбук&start=20&pages=3&key=ВАШ_КЛЮЧ"
curl "https://jsonseo.ru/api/bing?q=купить+ноутбук&first=21&pages=3&key=ВАШ_КЛЮЧ"