Перейти к содержимому

REST API

Данные KleoGEO в ваших системах

Те же данные, что в кабинете: проекты, доля упоминаний бренда с доверительным интервалом, ответы ИИ-ассистентов, ошибки в фактах, источники и рекомендации. Подключайте BI, выгружайте данные к себе и запускайте замеры из своих скриптов.

Базовый адрес

https://api.kleogeo.ru/v1

Удобнее через ИИ-агента? Подключите MCP

GET/v1/projects/{id}/metrics/visibility
{
  "analyzer_version": "0.4.0",
  "series": [
    {
      "brand_id": "0199e8a4-1f6b-7c2e-9a41-3d5b7f0c2a11",
      "brand_name": "Acme",
      "is_primary": true,
      "points": [
        {
          "t": "2026-10-06", "provider": "all",
          "n": 150, "mentioned": 63,
          "share": 0.42, "ci_low": 0.344, "ci_high": 0.5
        }
      ]
    }
  ]
}

Быстрый старт

  1. Создайте ключ

    Откройте API-ключи в кабинете и создайте ключ с нужными правами. Ключ показывается один раз — сохраните его в хранилище секретов, а не в коде.

  2. Передайте ключ в запросе

    Передавайте ключ в заголовке каждого запроса. Принимаются только API-ключи: пароль и вход через браузер здесь не работают.

    Authorization: Bearer geo_live_…
  3. Сделайте первый запрос

    Проверьте ключ: GET /v1/me вернёт организацию, лимиты тарифа и права ключа.

    curl https://api.kleogeo.ru/v1/me \
      -H "Authorization: Bearer $KLEOGEO_API_KEY"

Примеры

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

GET/v1/projects

Список проектов — отправная точка: из него берётся id для всех остальных запросов. Длинные списки отдаются страницами (см. «Пагинация»).

curl https://api.kleogeo.ru/v1/projects \
  -H "Authorization: Bearer $KLEOGEO_API_KEY"

Доля упоминаний с доверительным интервалом

GET/v1/projects/{id}/metrics/visibility

Доля ответов ИИ, где упомянут бренд, по дням, неделям или запускам. Каждая доля приходит вместе с числом ответов n и 95% интервалом Уилсона ci_low–ci_high.

curl "https://api.kleogeo.ru/v1/projects/$PROJECT_ID/metrics/visibility?granularity=week&from=2026-09-01" \
  -H "Authorization: Bearer $KLEOGEO_API_KEY"
Ответ
{
  "analyzer_version": "0.4.0",
  "series": [
    {
      "brand_id": "0199e8a4-1f6b-7c2e-9a41-3d5b7f0c2a11",
      "brand_name": "Acme",
      "is_primary": true,
      "points": [
        {
          "t": "2026-10-06", "provider": "all",
          "n": 150, "mentioned": 63,
          "share": 0.42, "ci_low": 0.344, "ci_high": 0.5
        }
      ]
    }
  ]
}

Показывайте интервал рядом с числом: при малом числе ответов доля сильно колеблется, и разница в пару процентов может быть шумом. provider: "all" — сумма по всем ассистентам, остальные точки — по каждому отдельно.

Выгрузка в CSV

GET/v1/projects/{id}/exports/{dataset}.csv

Выгрузка сырых данных в CSV или Parquet для своего хранилища. Наборы: visibility_daily, mentions, citations, fact_errors, measurements. Файл отдаётся потоком — пишите его на диск по частям, не держите целиком в памяти.

curl -fSL -o mentions.csv \
  "https://api.kleogeo.ru/v1/projects/$PROJECT_ID/exports/mentions.csv?from=2026-09-01" \
  -H "Authorization: Bearer $KLEOGEO_API_KEY"

Нужно право «Выгрузки». Одновременно — не больше двух выгрузок на организацию; на тарифах Start и пробном доступны CSV за последние 90 дней.

Запуск замера

POST/v1/projects/{id}/runs

Запуск нового замера по всем активным вопросам проекта. Нужно право «Действия» (actions:write); замер расходует ответы ИИ из вашего тарифа. Заголовок Idempotency-Key защищает от двойного запуска при повторной отправке.

curl -X POST "https://api.kleogeo.ru/v1/projects/$PROJECT_ID/runs" \
  -H "Authorization: Bearer $KLEOGEO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

# then check the status
curl "https://api.kleogeo.ru/v1/runs/$RUN_ID" \
  -H "Authorization: Bearer $KLEOGEO_API_KEY"

Пока замер идёт, второй запуск того же проекта вернёт 409 run_already_active. Статус проверяйте через GET /v1/runs/{id} не чаще раза в 5–10 секунд; итоговые статусы — succeeded, partial, failed.

Права ключа

Ключ видит только данные своей организации и только то, что разрешено его правами. Выдавайте минимально нужные права и отдельный ключ на каждую интеграцию.

ПравоЧто открывает
projects:readПроекты, бренды, вопросы, запуски и их статус
metrics:readМетрики видимости, позиции, тон, источники, ошибки в фактах, рекомендации, алерты, аудит сайта
evidence:readОтветы ИИ-ассистентов за цифрами и полнотекстовый поиск по ним
exports:readВыгрузки CSV и Parquet (текст ответов в выгрузке — дополнительно evidence:read)
actions:writeЗапуск замеров и аудита сайта, добавление вопросов, отметка рекомендаций и алертов

GET /v1/me доступен любому действующему ключу. Не хватает права — ответ 403 insufficient_scope.

Лимиты и повторы

  • 10 запросов в секунду на ключ (кратковременно до 20) и общий лимит организации 20 в секунду.
  • Каждый ответ показывает лимит ключа: RateLimit-Policy: "api-key";q=20;w=2 и RateLimit: "api-key";r=17;t=1 — сколько запросов осталось (r) и через сколько секунд лимит восстановится (t).
  • Сверх лимита — 429 rate_limited с заголовком Retry-After (секунды). Подождите указанное время и повторите.
  • 503 server_busy и 503 upstream_timeout тоже несут Retry-After: GET-запросы безопасно повторять, POST — с тем же Idempotency-Key.
  • Тело запроса — не больше 1 МБ. Повторяющиеся GET-ответы можно не скачивать заново: отправьте If-None-Match со значением ETag и получите 304.

Ошибки

Все ошибки приходят в одном формате. Опирайтесь на code — он не меняется; message — пояснение на английском для логов. Иногда в объекте есть детали, например limit и current.

{
  "error": {
    "code": "rate_limited",
    "message": "too many requests, slow down"
  }
}
СтатусКодКогда возникает
400validation_error

Неверный параметр или тело запроса

Неверный параметр или тело запроса
401unauthorized

Нет ключа, ключ неверный, отозван или истёк

Нет ключа, ключ неверный, отозван или истёк
402plan_limit_exceededsubscription_inactive

Действие выходит за лимиты тарифа или подписка не активна

Действие выходит за лимиты тарифа или подписка не активна
403insufficient_scopeemail_not_verified

У ключа нет нужного права; адрес почты создателя ключа не подтверждён

У ключа нет нужного права; адрес почты создателя ключа не подтверждён
404not_found

Объекта нет, он принадлежит другой организации, или такого метода нет

Объекта нет, он принадлежит другой организации, или такого метода нет
409run_already_activeidempotency_in_progress

Замер проекта уже идёт; первый запрос с этим Idempotency-Key ещё выполняется

Замер проекта уже идёт; первый запрос с этим Idempotency-Key ещё выполняется
413payload_too_large

Тело запроса больше 1 МБ

Тело запроса больше 1 МБ
422idempotency_key_reusedinvalid_region

Тот же Idempotency-Key с другим запросом; неизвестный код региона

Тот же Idempotency-Key с другим запросом; неизвестный код региона
428consent_required_update

Создатель ключа должен принять обновлённые условия в кабинете

Создатель ключа должен принять обновлённые условия в кабинете
429rate_limitedtoo_many_attemptstoo_many_active_runs

Слишком много запросов или одновременных замеров — ждите Retry-After

Слишком много запросов или одновременных замеров — ждите Retry-After
503server_busyupstream_timeout

Временная перегрузка — повторите через Retry-After

Временная перегрузка — повторите через Retry-After

Соглашения

Пагинация

Списки отдаются страницами: ?limit= от 1 до 200 (по умолчанию 50). Ответ — {"items": [...], "next_cursor": "…"}.

Следующая страница — тот же запрос с &cursor=<next_cursor>. next_cursor: null — это последняя страница. Курсор не разбирайте и не собирайте сами.

Безопасные повторы

Добавьте к POST и PATCH заголовок Idempotency-Key — случайный UUID на каждое действие. Повтор того же запроса в течение 24 часов вернёт сохранённый успешный ответ (с заголовком Idempotent-Replayed: true) и не выполнит действие второй раз; ошибки не запоминаются — повтор после ошибки выполняется заново.

Версии

Версия — в адресе: /v1. В ней появляются только совместимые изменения: новые методы, необязательные параметры, поля в ответах, значения перечислений и коды ошибок. Игнорируйте незнакомые поля.

Несовместимые изменения выйдут только в /v2; /v1 после этого работает не меньше 12 месяцев, а устаревшие методы заранее получают заголовки Deprecation и Sunset.

Доказательство за каждой цифрой

Каждая цифра проверяема: measurement_id в ошибках фактов, измерениях, поиске и выгрузках ведёт к GET /v1/measurements/{id} — исходному ответу ассистента и его разбору.

Справочник API

Все методы с параметрами, схемами ответов и примерами. Спецификация OpenAPI 3.1 — для генерации клиентов и импорта в Postman или Insomnia.

Скачать OpenAPI
Загружаем справочник…