Руководство

Developer API

REST API экспорта аналитики

Программно выгружайте аналитику бренда из GEO Scout — для BI, кастомных дашбордов и автоматизации.

Что вы получаете

  • Аналитику бренда за период до 90 дней одним запросом
  • 12 датасетов: промпты, источники, ответы AI, Share of Voice, конкуренты, таймлайны и пробелы
  • CSV-архив (zip с несколькими файлами) или JSON-bundle
  • Те же данные, что и кнопка экспорта в дашборде

Аутентификация

Эндпоинт принимает Bearer-токен. Используются те же токены, что и для MCP-интеграции — Personal Access Token (PAT) или OAuth-токен.

Сгенерировать PAT можно на странице /mcp. Требуется scope mcp:read (выдаётся по умолчанию).

Каталог датасетов

12 датасетов покрывают весь спектр GEO-аналитики — от сырых источников и ответов AI до готовых GEO-метрик и action-oriented срезов. Выбирайте любую комбинацию.

КлючЧто в нём
promptsЗапросы бренда с per-period метриками: охват, SoV, тональность для каждого промпта.
sourcesЦитированные источники long-form: response_id, prompt_id, URL, домен, заголовок страницы, флаги brand/competitor source и атрибуция бренда/конкурентов по каждому источнику. По prompt_id видно, к какому промпту относится источник.
responsesСырые строки ответов AI: prompt_id, response_id, провайдер, тональность, позиция бренда, тип цитирования. Полный текст ответа добавляется только при includeResponseText: true.
share_of_voiceСнапшот SoV: брэнд + конкуренты, упоминания и доли за период.
sentimentSnapshot распределения тональности (positive/neutral/negative/not_mentioned), 4 строки.
competitorsСравнительная таблица бренд+конкуренты с одинаковыми GEO-метриками (reach, SoV, avg position, recommendation rate, citation share).
providersКаталог AI-провайдеров (id, slug, name) — для join'ов с другими датасетами.
daily_timelineБренд-level метрики по дням: ответы, mentions, охват %, SoV %, sentiment counts.
competitor_timelinePer-day × per-entity: бренд + топ-20 конкурентов по дням (long-form). Для multi-line чартов.
provider_timelinePer-day × per-provider: total_responses, brand_mentions, mention_rate%, sov% по каждому AI-провайдеру по дням.
positionПозиция бренда: avg_position, top_1_rate%, top_3_rate%, position_4_plus_rate%.
competitive_gapsПромпты где конкуренты упомянуты, а бренд НЕТ — приоритетный список «здесь теряете долю».

Запрос

Метод и URL

POST /api/v1/analytics/export

Поля запроса

ПолеТипОбяз.Описание
brandIdstring (uuid)UUID бренда. Должен принадлежать владельцу токена.
datasetsstring[]Массив. Допустимые ключи: prompts, sources, responses, share_of_voice, sentiment, competitors, providers, daily_timeline, competitor_timeline, provider_timeline, position, competitive_gaps. Минимум один. См. «Каталог датасетов» ниже.
format"csv" | "json"csv или json. Для csv с >1 датасетом будет возвращён zip.
includeResponseTextbooleanОпционально. Если true и выбран датасет responses, добавляет полный текст ответа AI в колонку response_text. По умолчанию false.
filters.startDatestring (ISO)ISO-дата начала периода (UTC). Период ≤ 90 дней.
filters.endDatestring (ISO)ISO-дата конца периода (UTC).
filters.providerIdsstring[] (uuid)Опционально. UUID провайдеров (фильтр).
filters.promptIdsstring[] (uuid)Опционально. UUID промптов (фильтр).

Пример: curl

Замените brandId и токен на свои.

curl -X POST https://geoscout.pro/api/v1/analytics/export \
  -H "Authorization: Bearer gs_..." \
  -H "Content-Type: application/json" \
  -d '{
    "brandId": "00000000-0000-0000-0000-000000000000",
    "datasets": ["prompts", "responses", "sources", "daily_timeline"],
    "format": "csv",
    "includeResponseText": true,
    "filters": {
      "startDate": "2026-04-01T00:00:00Z",
      "endDate": "2026-04-30T23:59:59Z"
    }
  }' -o export.zip

Ответ

200 OK — тело файла. Файл-имя в заголовке Content-Disposition (RFC 5987).

Полезные заголовки

  • Content-Type MIME-тип: text/csv, application/zip или application/json
  • Content-Disposition attachment + UTF-8 имя файла
  • X-Export-Truncated Список датасетов, где данные были обрезаны своим лимитом строк (CSV-строка ключей). Пусто = всё выгружено целиком.
  • Retry-After Секунды до сброса rate-limit (только при 429)

Пример: формат JSON

{
  "manifest": {
    "exported_at": "2026-05-24T10:15:00.000Z",
    "brand_id": "...",
    "brand_name": "Acme",
    "format": "json",
    "filters": { ... },
    "datasets": ["prompts", "responses"],
    "include_response_text": true,
    "row_counts": { "prompts": 59, "responses": 640 },
    "truncated": {},
    "notes": {
      "responses": "one row per response; join on prompt_id to the prompts dataset for prompt-level metrics"
    }
  },
  "datasets": {
    "prompts": { "rows": [ ... ], "truncated": false },
    "responses": { "rows": [ ... ], "truncated": false }
  }
}

Коды ошибок

КодHTTPКогда возвращается
invalid_request400Невалидный JSON или Zod-валидация не прошла (см. поле detail)
unauthorized401Токен отсутствует, неверного формата или не найден
token_expired401Срок действия токена истёк
token_revoked401Токен отозван владельцем
insufficient_scope403Токен не имеет scope mcp:read
forbidden403Бренд не принадлежит владельцу токена
rate_limited429Превышен лимит 10 запросов в час
internal500Внутренняя ошибка. Подробности в логах сервера, не в ответе

Пример ответа на ошибку

{
  "error": "rate_limited"
}

Лимиты

  • Период экспорта: до 90 дней
  • Строк на датасет: зависит от датасета (например, sources до 100 000, responses до 10 000). Превышение → данные обрезаны, см. X-Export-Truncated
  • Rate-limit: 10 запросов в час на пользователя (PAT и OAuth-токены одного юзера разделяют квоту)
  • Тяжёлые экспорты могут занять 10-30 секунд — таймаут клиента ставьте от 60 секунд