Главная/Справочный центр/API & MCP

Справочник методов API

Здесь собраны все методы API SEO Reports. Каждый раздел содержит необходимые права, параметры и примеры. Настройки ключа и общий формат описаны во введении. Чтобы быстро познакомиться с API, выполните первый запрос.

Все методы и OpenAPI

МетодНазначениеПраво
GET /api/meАккаунт и права ключаЛюбой действующий ключ
GET /api/projectsПоиск и список проектовprojects:read
GET /api/projects/{projectId}/report-optionsШаблоны и настройки генерацииprojects:read
GET /api/projects/{projectId}/reportsИстория отчётов проектаreports:read
POST /api/reports/generateГенерация или пересчёт отчётаreports:create
GET /api/reports/{reportId}Статус, ссылка и структура отчётаreports:read
GET /api/reports/{reportId}/blocks/{blockRef}Данные и настройки блокаreports:read
PUT /api/reports/{reportId}/structureИзменение блоков и комментариевreports:write
GET /api/reports/{reportId}/export/{format}Выгрузка Word или PDFreports:read

Вы можете скачать спецификацию OpenAPI в YAML для импорта в Postman или другой API-клиент. В файле описаны методы, параметры и форматы запросов и ответов, поэтому их не придётся добавлять вручную.

В cURL-примерах замените {apiKey} своим ключом и подставьте идентификаторы из ответов API. Пошаговый сценарий — в статье «Первый запрос к API». В примерах ответов используются демонстрационные данные. Реальные значения зависят от проекта.

Аккаунт и права ключа

GET/api/meлюбой действующий ключ, без проверки тарифа

Метод для проверки настройки авторизации. Он не требует отдельного права доступа (scope) и доступен даже без действующего тарифа.

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/me" \
  -H "Authorization: Bearer {apiKey}"
json
{
  "user_id": "123",
  "token": {
    "token_id": "456",
    "name": "CRM",
    "type": "personal",
    "scopes": [
      "projects:read",
      "reports:read"
    ],
    "expires_at": null
  }
}

Ответ содержит владельца user_id и объект token: идентификатор, название, тип, права и срок. Тип personal — персональный ключ, oauth — подключение ассистента. Если expires_at равен null, ключ бессрочный. В остальных случаях поле содержит дату со временем и часовым поясом.

Важно. У OAuth-подключения срок сдвигается при использовании.

Поиск и список проектов

GET/api/projectsprojects:read

Метод для поиска проектов по названию или адресу и получения их списка. Используйте его, чтобы получить project_id нужного проекта для использования в других методах.

Параметр URLТип и значение
searchПоиск по названию и адресу. Если не указано - будут выгружены все проекты.
pageЦелое число от 1. Значение по умолчанию — 1.
page_sizeОт 1 до 100. Значение по умолчанию — 20.
curl
curl --fail-with-body -sS "https://seo-reports.ru/api/projects?search=example.ru&page=1&page_size=20" \
  -H "Authorization: Bearer {apiKey}"
json
{
  "items": [
    {
      "project_id": "35328",
      "name": "example.ru",
      "url": "https://example.ru",
      "source": "yandex_metrika",
      "default_template_id": "412"
    }
  ],
  "page": 1,
  "page_size": 20,
  "total": 1
}

items содержит проекты текущего владельца ключа. Поле source показывает тип базового источника данных проекта. В кабинете эти же состояния отображаются в колонке «Источник» в списке проектов.

Значение sourceОписание
yandex_metrikaЯндекс.Метрика.
google_analyticsGoogle Analytics.
vk_communitiesСообщество ВКонтакте.
unknownАккаунт источника отключили в «Аккаунтах». У проекта сохраняется service_id, но тип источника уже нельзя определить. Генерация такого отчёта вернёт 409 source_unavailable.
nullПроект без привязки к аналитике.

default_template_id — ID шаблона, выбранного для автогенерации отчётов проекта. При создании отчёта его можно передать в поле template_id. Если шаблон автогенерации не выбран, API возвращает null.

Для следующей страницы увеличьте page, пока page × page_size меньше total. Пустой items — не ошибка. Это значит, что по указанному запросу проектов не найдено.

Шаблоны и настройки генерации

GET/api/projects/{projectId}/report-optionsprojects:read

Метод возвращает доступные шаблоны, шаблон по умолчанию, сведения о предыдущем отчёте и источник наследуемых настроек.

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/projects/{projectId}/report-options" \
  -H "Authorization: Bearer {apiKey}"
json
{
  "project_id": "35328",
  "templates": [
    {
      "template_id": "412",
      "name": "SEO-отчёт"
    }
  ],
  "default_template_id": "412",
  "previous_report": {
    "report_id": "35328.a3f1c9e84b2d7061fe5c8a94d20b3e77",
    "settings_inherited": true
  },
  "settings_source": "last_report"
}
ПолеЗначение
templatesДоступные template_id и названия.
default_template_idID шаблона автогенерации проекта. Его можно передать как template_id при создании отчёта. Если такой шаблон не выбран, возвращается null.
previous_reportПредыдущий отчёт и признак наследования, либо null.
settings_sourcelast_report, auto_settings или defaults.
Обратите внимание. Параметры целей, кампаний, источников и остальные настройки наследуются от последнего отчёта проекта, при его отсутствии — из автогенерации, затем из значений по умолчанию. Произвольных полей управления всеми этими настройками в запросе генерации нет. При необходимости сначала настройте отчёт в кабинете.

История отчётов проекта

GET/api/projects/{projectId}/reportsreports:read

Метод возвращает отчёты, уже собранные по проекту, — тот же список, что история отчётов в кабинете. Используйте его, чтобы найти готовый отчёт за нужный период без новой генерации.

Параметр URLТип и значение
pageЦелое число от 1. Значение по умолчанию — 1.
page_sizeОт 1 до 50. Значение по умолчанию — 20.
curl
curl --fail-with-body -sS "https://seo-reports.ru/api/projects/{projectId}/reports?page=1&page_size=20" \
  -H "Authorization: Bearer {apiKey}"
json
{
  "project_id": "35328",
  "items": [
    {
      "report_id": "35328.a3f1c9e84b2d7061fe5c8a94d20b3e77",
      "status": "ready",
      "created_at": "2026-09-01T10:15:00+03:00",
      "auto": false,
      "period": {
        "from": "2026-08-01",
        "to": "2026-08-31"
      },
      "comparison": {
        "from": "2026-07-01",
        "to": "2026-07-31"
      },
      "preview_url": "https://seo-reports.ru/p/35328/a3f1c9e84b2d7061fe5c8a94d20b3e77",
      "preview_public": false
    }
  ],
  "page": 1,
  "page_size": 20,
  "total": 1
}
ПолеНазначение
report_idИдентификатор для карточки, данных блоков, правок и выгрузки.
statusgenerating, ready или failed.
created_atДата и время генерации.
autotrue — отчёт собран автогенерацией по расписанию.
periodОтчётный период from/to. null, если параметры отчёта не удалось прочитать: тогда период есть в карточке отчёта.
comparisonПериод сравнения. Есть только у отчётов со сравнением.
error_codeПричина ошибки. Есть только при failed.
preview_url / preview_publicСсылка просмотра и признак гостевого доступа.

Отчёты отсортированы от новых к старым по дате генерации. Как и в кабинете, за каждый день в истории остаётся последний ручной и последний автоматический отчёт. Удалённые отчёты в список не попадают. Чтобы найти отчёт за август, выберите строку с нужным period и прочитайте карточку по её report_id. Для следующей страницы увеличьте page, пока page × page_size меньше total.

Обратите внимание. История отчётов доступна начиная с тарифа «Бизнес». На других тарифах метод для любого проекта возвращает 403 history_forbidden со ссылкой на оплату в details.payment_url, а не пустой список. Последний отчёт проекта доступен на любом тарифе: его report_id есть в поле previous_report настроек генерации.

Генерация и пересчёт отчёта

POST/api/reports/generatereports:create

Метод для создания отчёта за выбранный период или повторной сборки готового отчёта. Чтобы собрать отчёт заново, передайте refresh: true. Генерация выполняется в фоне, её статус проверяется по карточке отчёта.

Поле JSONТип и назначение
project_idОбязательная строка, идентификатор проекта.
periodОбязательный объект с from и to в формате YYYY-MM-DD. Начало не позже конца.
template_idСтрока, доступный шаблон. Без поля выбирается шаблон автогенерации, затем последнего отчёта. Если их нет, поле обязательно.
comparisonНеобязательный период from/to. Передавайте обе даты. Без поля сравнение отключено.
refreshЛогическое значение, по умолчанию false. true запрашивает пересборку, даже если результат уже есть.
make_publicЛогическое значение, по умолчанию false. true включает для отчёта гостевой режим (доступ по ссылке).
curl
curl --fail-with-body -sS -X POST "https://seo-reports.ru/api/reports/generate" \
  -H "Authorization: Bearer {apiKey}" \
  -H "Content-Type: application/json" \
  --data '{
  "project_id": "{projectId}",
  "template_id": "{templateId}",
  "period": {
    "from": "2026-08-01",
    "to": "2026-08-31"
  },
  "comparison": {
    "from": "2026-07-01",
    "to": "2026-07-31"
  },
  "refresh": false,
  "make_public": false
}'
json
{
  "report_id": "35328.a3f1c9e84b2d7061fe5c8a94d20b3e77",
  "status": "generating",
  "preview_url": "https://seo-reports.ru/p/35328/a3f1c9e84b2d7061fe5c8a94d20b3e77",
  "preview_public": false,
  "warnings": [],
  "poll_after_ms": 2000
}

Ответ приходит сразу: HTTP 202 при сборке, HTTP 200 при готовом результате. Полученный report_id используйте для чтения карточки (см. ниже). Дождитесь, когда поле status примет значение ready, затем проверьте поле warnings. Ссылка на отчёт возвращается сразу в ответе, но открыть по ней отчёт можно только после завершения его формирования.

Важно. Повтор с теми же параметрами обычно возвращает тот же report_id и не создаёт вторую задачу.

Пока структуру не правили, пересчёт может обновить тот же отчёт и сохранить ссылку. После правки структура входит в наследуемые параметры: запрос с теми же шаблоном и периодом может создать новый report_id, сохранив прежний отчёт по старой ссылке. Отдельного метода пересчёта правленого отчёта по report_id нет.

Обратите внимание. make_public: false не закрывает уже публичный отчёт. Флаг true открывает доступ, а обратное закрытие этим запросом не предусмотрено. Не включайте публичность автоматически. Проверяйте preview_public в ответе.

Карточка отчёта и готовность

GET/api/reports/{reportId}reports:read

Метод нужен и для опроса готовности, и для чтения текущей структуры и версии.

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/reports/{reportId}" \
  -H "Authorization: Bearer {apiKey}"
json
{
  "report_id": "35328.a3f1c9e84b2d7061fe5c8a94d20b3e77",
  "project_id": "35328",
  "template_id": "412",
  "status": "ready",
  "revision": 3,
  "preview_url": "https://seo-reports.ru/p/35328/a3f1c9e84b2d7061fe5c8a94d20b3e77",
  "preview_public": false,
  "period": {
    "from": "2026-08-01",
    "to": "2026-08-31"
  },
  "warnings": [],
  "blocks": [
    {
      "block_ref": "publicTraffic",
      "title": "Трафик",
      "disabled": false,
      "comment_top_html": "",
      "comment_bottom_html": "",
      "settings": {
        "metric": "users"
      }
    },
    {
      "block_ref": "publicDevices",
      "title": "Устройства",
      "disabled": true,
      "comment_top_html": "",
      "comment_bottom_html": "",
      "settings": {}
    }
  ]
}

Это сокращённый пример с двумя блоками. В реальном отчёте блоков может быть больше. После сохранения структуры и повторной сборки значение revision растёт.

ПолеНазначение
statusgenerating, ready или failed.
poll_after_msПауза перед повторным чтением при generating.
error_codeПричина при failed.
preview_url / preview_publicСсылка просмотра и признак гостевого доступа.
warningsПредупреждения о полноте данных и выбранных настройках.
blocksПорядок и настройки блоков. Доступны у собранного отчёта. При generating отсутствуют.

При failed не считайте HTTP 200 успешной сборкой. При ready проверяйте предупреждения: их значения описаны в диагностике. Поле blocks описывает структуру отчёта. Чтобы получить цифры, используйте отдельный метод блока.

Данные и схема настроек блока

GET/api/reports/{reportId}/blocks/{blockRef}reports:read

Метод для получения данных отдельного блока отчёта и описания его настроек. Возвращает показатели блока для анализа, а также доступные параметры и допустимые значения для изменения настроек.

Для запроса используйте blockRef из blocks[].block_ref в карточке отчёта. Отчёт должен быть готов (status: ready).

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/reports/{reportId}/blocks/{blockRef}" \
  -H "Authorization: Bearer {apiKey}"

Формат ответа ниже условный: имена провайдеров, содержимое data и список settings_schema зависят от конкретного блока. Настоящие имена настроек берите только из ответа своего отчёта.

json
{
  "block_ref": "publicTraffic",
  "title": "Трафик",
  "disabled": false,
  "data": {
    "provider": {
      "total": 1540,
      "rows": [
        {
          "date": "2026-08-01",
          "value": 50
        }
      ]
    }
  },
  "settings_schema": [
    {
      "name": "metric",
      "type": "enum",
      "label": "Показатель",
      "value": "users",
      "options": [
        {
          "value": "users",
          "label": "Пользователи"
        }
      ]
    }
  ]
}

В data находятся данные провайдеров без служебных объектов. В settings_schema для каждого поля есть name, type и label, текущее value, а при необходимости options или min/max/step. Типы: enum, boolean, number, string. Проверяйте допустимые значения перед изменением settings.

Обратите внимание. Для скрытого блока доступны описание и настройки, но сами данные могут отсутствовать.

Комментарии и структура отчёта

PUT/api/reports/{reportId}/structurereports:write, а для предварительного чтения — также reports:read

Метод для изменения структуры и оформления отчёта: порядка блоков, их видимости, заголовков, комментариев и настроек. Также позволяет добавлять и удалять текстовые блоки.

ПолеНазначение
expected_revisionОбязательное целое значение revision из прочитанной карточки.
blocksОбязательный непустой массив всех сохраняемых блоков в новом порядке.
block_refИдентификатор существующего блока. Не выдумывайте его.
disabledЯвно сохраняйте true для скрытых блоков. Отсутствие поля трактуется как false.
titleНовый заголовок.
comment_top_html / comment_bottom_htmlHTML-комментарий над или под данными. Пустая строка очищает комментарий.
settingsПатч настроек с именами из settings_schema.
type: textblockНовый свободный текстовый блок. Сервер назначает block_ref.
Обратите внимание. Список blocks заменяется целиком. Все обычные блоки, включая скрытые, должны остаться в списке, иначе придёт 422. Чтобы скрыть обычный блок, передайте disabled: true. Отсутствие disabled может включить ранее скрытый блок, поэтому копируйте это поле из карточки явно.

Неуказанные заголовки, комментарии и настройки сохраняются, но для disabled действует правило выше. Чтобы удалить текстовый блок, исключите его из списка.

Текстовые блоки. У текстовых блоков есть только comment_top_html — именно в нём определяется содержимое блока. Если задать comment_bottom_html, API вернёт ошибку 422, так как такого поля нет в текстовых блоках. Новый текстовый блок передаётся без block_ref.

Сначала получите актуальную карточку отчёта. В тело запроса скопируйте её revision как expected_revision и полный массив blocks. Затем измените нужные поля, сохранив остальные блоки и их видимость (disabled).

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/reports/{reportId}" \
  -H "Authorization: Bearer {apiKey}"

Пример ниже соответствует демонстрационной карточке с двумя блоками выше и добавляет комментарий к publicTraffic. Для своего отчёта используйте его актуальную версию и полный список блоков. Не заменяйте свою структуру сокращённым списком из примера.

curl
curl --fail-with-body -sS -X PUT "https://seo-reports.ru/api/reports/{reportId}/structure" \
  -H "Authorization: Bearer {apiKey}" \
  -H "Content-Type: application/json" \
  --data '{
  "expected_revision": 3,
  "blocks": [
    {
      "block_ref": "publicTraffic",
      "title": "Трафик",
      "disabled": false,
      "comment_top_html": "",
      "comment_bottom_html": "<p>Вывод по проверенным данным отчёта.</p>",
      "settings": {
        "metric": "users"
      }
    },
    {
      "block_ref": "publicDevices",
      "title": "Устройства",
      "disabled": true,
      "comment_top_html": "",
      "comment_bottom_html": "",
      "settings": {}
    }
  ]
}'

Запрос возвращает обновлённую карточку с новым revision. Ссылка просмотра сохраняется. Запрос применяется целиком. При конфликте версии приходит 409 revision_conflict. Перечитайте отчёт и согласуйте изменения, не подставляйте новую версию вслепую.

Как применяются изменения:

  • Порядок объектов в blocks задаёт порядок в отчёте.
  • Сервер очищает HTML и не сохраняет скрипты. Используйте простые абзацы, списки, выделения и ссылки.
  • Чтобы добавить текстовый блок, включите в полный массив объект с type: textblock, title и comment_top_html.
  • Правки сохраняются в параметрах отчёта и могут наследоваться при следующей генерации.

Word, PDF и доступ по ссылке

GET/api/reports/{reportId}/export/{format}reports:read

Метод для выгрузки отчёта в Word или PDF. Отчёт должен быть готов (status: ready). Формат — word или pdf. При успешном запросе приходит файл с заголовком Content-Disposition: attachment. Возьмите имя файла из этого заголовка или задайте его в своём клиенте.

curl
curl --fail-with-body -sS "https://seo-reports.ru/api/reports/{reportId}/export/word" \
  -H "Authorization: Bearer {apiKey}" \
  --output report.docx
curl
curl --fail-with-body -sS "https://seo-reports.ru/api/reports/{reportId}/export/pdf" \
  -H "Authorization: Bearer {apiKey}" \
  --output report.pdf

Word имеет MIME-тип application/vnd.openxmlformats-officedocument.wordprocessingml.document, PDF — application/pdf. Учитывайте таймаут своего клиента: экспорт может занять десятки секунд. Обе выгрузки входят в тяжёлый лимит запросов.

Обратите внимание. URL экспорта не является публичной или одноразовой ссылкой: всегда нужен Bearer-ключ. Получите файл своей программой, чтобы не передавать клиенту ключ для скачивания. При ошибке вместо файла приходит JSON — проверяйте HTTP-статус и код завершения cURL.
Помогла статья?
Не нашли ответ в справке?

Напишите нам в любой удобный канал — почта, чат или мессенджер. Отвечает живой специалист, а не бот. В рабочее время помогаем в течение дня.

Наши контакты →