Developer API
REST API экспорта аналитики
Программно выгружайте аналитику бренда из GEO Scout — для BI, кастомных дашбордов и автоматизации.
Что вы получаете
- —Аналитику бренда за период до 90 дней одним запросом
- —15 датасетов: промпты, источники, ответы AI, Share of Voice, восприятие бренда, конкуренты со справочником, таймлайны, пробелы и реклама
- —CSV-архив (zip с несколькими файлами) или JSON-bundle
- —Те же данные, что и кнопка экспорта в дашборде
Аутентификация
Эндпоинт принимает Bearer-токен. Используются те же токены, что и для MCP-интеграции — Personal Access Token (PAT) или OAuth-токен.
Сгенерировать PAT можно на странице /mcp. Требуется scope mcp:read (выдаётся по умолчанию).
Каталог датасетов
15 датасетов покрывают весь спектр GEO-аналитики — от сырых источников и ответов AI до готовых GEO-метрик и action-oriented срезов. Выбирайте любую комбинацию.
| Ключ | Что в нём |
|---|---|
| prompts | Запросы бренда с per-period метриками: охват, SoV, тональность для каждого промпта. |
| source_domains | Цитирования, свёрнутые по домену, по убыванию — таблица доменов со страницы «Источники»: used (все появления) / cited (из них реальные цитирования), citation_share_pct, priority_score, unique_urls, brand_confirmed_urls / brand_not_found_urls / brand_unchecked_urls (сколько URL домена подтверждённо упоминают бренд на странице, прочитаны без упоминания, ещё не проверены), prompts_count, prompt_ids (джойнятся с «Запросами бренда»), группы и провайдеры. |
| source_pages | То же, свёрнутое по URL: source_title, used / cited, citation_share_pct, priority_score, brand_mentioned_on_page (true — имя бренда найдено на странице, false — страница прочитана и бренда на ней нет, null — не проверялась), brand_page_check (confirmed / not_found / unverifiable / not_checked), brand_page_snippets (до 20 фрагментов страницы вокруг упоминаний бренда; пусто, если не confirmed), prompts_count, prompt_ids, группы и провайдеры. |
| responses | Сырые строки ответов AI: prompt_id, response_id, провайдер, тональность, позиция бренда, тип цитирования, а также answered_from_memory (движок ответил из памяти, без поиска), forced_search (мы отправили запрос найти актуальные данные) и forced_search_error. Полный текст ответа и ответ до поиска добавляются только при includeResponseText: true. |
| share_of_voice | Снапшот SoV: брэнд + конкуренты, упоминания и доли за период. |
| sentiment | Snapshot распределения тональности (positive/neutral/negative/not_mentioned), 4 строки. |
| brand_perception | Матрица восприятия: по строке на пару «атрибут × сущность». attribute, polarity (positive / negative / neutral / null), entity_type, entity_id, entity_name, market_score (0–100 рыночная заметность), market_rank, entities_ranked, responses_with, attribute_responses, entity_mentions. Для строк бренда ещё association_score (0–100, насколько заметно AI называет атрибут, описывая бренд) и terms — сами формулировки нейросетей. |
| competitors | Бренд + все отслеживаемые конкуренты, бренд первой строкой. Справочная часть: id (то же пространство, что entity_id в competitor_timeline / brand_perception), name, normalized_name, aliases (все вариации написания, по которым матчатся упоминания), website, domains, is_active, discovery_source, created_at. Метрики за окно выгрузки: mention_count, mention_rate_pct, sov_pct, avg_position, domain_citation_rate_pct. 0 в метрике = посчитано, ни разу не упомянут; null = метрика не посчиталась (см. notes в манифесте). |
| providers | Каталог AI-провайдеров (id, slug, name) — для join'ов с другими датасетами. |
| daily_timeline | Бренд-level метрики по дням: ответы, mentions, охват %, SoV %, sentiment counts. |
| competitor_timeline | Per-day × per-entity: бренд + топ-20 конкурентов по дням (long-form). Для multi-line чартов. |
| provider_timeline | Per-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 | Промпты где конкуренты упомянуты, а бренд НЕТ — приоритетный список «здесь теряете долю». |
| ads | Реклама рядом с ответами AI: response_id, prompt_id, формат и место блока, домен рекламодателя и его резолв в бренд/конкурента (advertiser_name, advertiser_type), заголовок, текст и ссылка объявления. Пока только Alice AI, сбор с 5 июля 2026 — ретроспективы нет. |
Запрос
Метод и URL
POST /api/v1/analytics/export
Поля запроса
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| brandId | string (uuid) | ✓ | UUID бренда. Должен принадлежать владельцу токена. |
| datasets | string[] | ✓ | Массив. Допустимые ключи: prompts, source_domains, source_pages, responses, share_of_voice, sentiment, brand_perception, competitors, providers, daily_timeline, competitor_timeline, provider_timeline, position, competitive_gaps, ads. Минимум один. См. «Каталог датасетов» ниже. |
| format | "csv" | "json" | ✓ | csv или json. Для csv с >1 датасетом будет возвращён zip. |
| includeResponseText | boolean | Опционально. Если true и выбран датасет responses, добавляет полный текст ответа AI в колонку response_text, а исходный ответ до поиска — в memory_response_text. По умолчанию false. | |
| includeInactivePrompts | boolean | Опционально. Если true и выбран датасет prompts, добавляет в него отключённые промпты (status = inactive) с их метриками за период. По умолчанию false — только активные. | |
| filters.startDate | string (ISO) | ✓ | ISO-дата начала периода (UTC). Период ≤ 90 дней. |
| filters.endDate | string (ISO) | ✓ | ISO-дата конца периода (UTC). |
| filters.providerIds | string[] (uuid) | Опционально. UUID провайдеров (фильтр). | |
| filters.promptIds | string[] (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", "source_domains", "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/jsonContent-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_request | 400 | Невалидный JSON или Zod-валидация не прошла (см. поле detail) |
| unauthorized | 401 | Токен отсутствует, неверного формата или не найден |
| token_expired | 401 | Срок действия токена истёк |
| token_revoked | 401 | Токен отозван владельцем |
| insufficient_scope | 403 | Токен не имеет scope mcp:read |
| forbidden | 403 | Бренд не принадлежит владельцу токена |
| rate_limited | 429 | Превышен лимит 10 запросов в час |
| internal | 500 | Внутренняя ошибка. Подробности в логах сервера, не в ответе |
Пример ответа на ошибку
{
"error": "rate_limited"
}Лимиты
- —Период экспорта: до 90 дней
- —Строк на датасет: зависит от датасета (например, source_pages до 50 000, responses до 100 000, а с полным текстом ответов — до 10 000). Превышение → данные обрезаны, см. X-Export-Truncated
- —Rate-limit: 10 запросов в час на пользователя (PAT и OAuth-токены одного юзера разделяют квоту)
- —Тяжёлые экспорты могут занять 10-30 секунд — таймаут клиента ставьте от 60 секунд