Проекты
Список проектов
GET /api/projects
Возвращает список проектов текущего пользователя. Включает собственные проекты и расшаренные.
curl -X GET "https://ai.pixeltools.ru/api/projects" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"data": [
{
"id": 1,
"user_id": 1,
"name": "My Project",
"brand": "MyBrand",
"domain": "example.com",
"activities": "Продажа товаров",
"is_paused": false,
"created_at": "2026-01-01T12:00:00Z"
}
]
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID проекта. Используется во всех последующих запросах как {project}. |
user_id | integer | ID владельца проекта |
name | string | Название проекта |
brand | string | Бренд проекта |
domain | string | Домен проекта |
activities | string | Вид деятельности |
is_paused | boolean | Проект на паузе |
created_at | datetime | Дата создания |
Информация по проекту и статус съёма
GET /api/projects/{project}
Возвращает информацию по проекту, включая текущий статус съёма ответов нейросетей.
Используется для проверки состояния после запуска съёма (см. POST /api/projects/{project}/parse).
curl -X GET "https://ai.pixeltools.ru/api/projects/7953" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"data": {
"id": 7953,
"user_id": 1,
"name": "My Project",
"brand": "MyBrand",
"domain": "example.com",
"activities": "Продажа товаров",
"is_paused": false,
"created_at": "2026-01-01T12:00:00Z",
"parse": {
"status": "in_progress",
"in_progress": true,
"progress": 42,
"phase": "receive",
"started_at": "2026-06-23 10:15:00",
"last_completed_at": "2026-06-22 09:00:00"
}
}
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID проекта |
user_id | integer | ID владельца проекта |
name | string | Название проекта |
brand | string | Бренд проекта |
domain | string | Домен проекта |
activities | string | Вид деятельности |
is_paused | boolean | Проект на паузе |
created_at | datetime | Дата создания |
parse.status | string | Статус съёма: idle (съёмов не было), queued (в очереди), in_progress (выполняется), completed (есть завершённый ранее съём) |
parse.in_progress | boolean | Идёт ли съём прямо сейчас (включая ожидание в очереди) |
parse.progress | integer | Прогресс текущего съёма, 0–100 |
parse.phase | string|null | Текущая фаза пайплайна (queue_wait, submit, receive, analysis_submit, saving_results, …); null, если съём не идёт |
parse.started_at | datetime|null | Когда стартовал текущий съём; null, если съём не идёт |
parse.last_completed_at | datetime|null | Когда завершился последний успешный съём |
Запуск съёма ответов нейросетей
POST /api/projects/{project}/parse
Ставит проект в очередь на съём ответов нейросетей. После запуска проект переходит
в статус выполнения съёма — отслеживать его можно через GET /api/projects/{project}
(поле parse.status). Аналог метода parse в SEO-API.
Требует право на изменение проекта. Лимиты на съём списываются с баланса владельца проекта.
curl -X POST "https://ai.pixeltools.ru/api/projects/7953/parse" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
Параметры тела запроса (необязательные)
| Параметр | Тип | Описание |
|---|---|---|
with_recommendations | boolean | Принудительно включить/выключить генерацию рекомендаций после съёма. Если не передан — используется расписание проекта. |
with_frequency | boolean | Принудительно включить/выключить проверку частотности после съёма. Если не передан — используется расписание проекта. |
Ответ (202 Accepted)
{
"message": "Проект #7953 поставлен в очередь на съём.",
"data": {
"id": 7953,
"name": "My Project",
"brand": "MyBrand",
"domain": "example.com",
"is_paused": false,
"parse": {
"status": "queued",
"in_progress": true,
"progress": 1,
"phase": "queue_wait",
"started_at": "2026-06-23 10:15:00",
"last_completed_at": "2026-06-22 09:00:00"
}
}
}
Коды ответа
| Код | Описание |
|---|---|
202 | Проект поставлен в очередь на съём |
403 | Недостаточно лимитов на балансе владельца проекта |
409 | Съём уже выполняется или проект уже в очереди |
422 | В проекте не выбрана ни одна нейросеть или нет ни одного промпта |
Доступные нейросети
GET /api/neurals
Возвращает список доступных нейросетей (ИИ-систем). ID нейросетей используются в параметре neurals[] для фильтрации данных.
curl -X GET "https://ai.pixeltools.ru/api/neurals" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"data": [
{ "id": 1, "system_name": "openai", "display_name": "ChatGPT", "model_url": "https://chatgpt.com" },
{ "id": 2, "system_name": "gemini", "display_name": "Gemini", "model_url": "https://gemini.google.com" },
{ "id": 3, "system_name": "perplexity", "display_name": "Perplexity", "model_url": "https://perplexity.ai" },
{ "id": 4, "system_name": "claude", "display_name": "Claude", "model_url": "https://claude.ai" }
]
}
Группы запросов проекта
GET /api/projects/{project}/groups
Возвращает список групп запросов (промптов) проекта.
Используйте ID групп из этого ответа для параметра groups[] в эндпоинтах данных.
curl -X GET "https://ai.pixeltools.ru/api/projects/1/groups" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"data": [
{ "id": 5, "name": "Репутационные запросы", "is_favourite": true, "prompts_count": 12 },
{ "id": 8, "name": "Информационные запросы", "is_favourite": false, "prompts_count": 25 },
{ "id": 12, "name": "Сравнительные запросы", "is_favourite": false, "prompts_count": 8 },
{ "id": 15, "name": "Транзакционные запросы", "is_favourite": true, "prompts_count": 6 }
]
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID группы. Используется в параметре groups[] для фильтрации данных. |
name | string | Название группы |
is_favourite | boolean | Группа отмечена как избранная |
prompts_count | integer | Количество запросов в группе |
Доступные фильтры проекта
GET /api/projects/{project}/filters
Возвращает все доступные значения фильтров для проекта в одном запросе: нейросети, группы, даты обновлений и допустимые значения перечислимых фильтров. Используйте этот эндпоинт перед запросами к данным, чтобы узнать какие ID и значения передавать.
curl -X GET "https://ai.pixeltools.ru/api/projects/1/filters" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"neurals": [
{ "id": 1, "system_name": "openai", "display_name": "ChatGPT" },
{ "id": 2, "system_name": "gemini", "display_name": "Gemini" },
{ "id": 3, "system_name": "perplexity", "display_name": "Perplexity" }
],
"groups": [
{ "id": 5, "name": "Репутационные запросы", "is_favourite": true, "prompts_count": 12 },
{ "id": 8, "name": "Информационные запросы", "is_favourite": false, "prompts_count": 25 },
{ "id": 12, "name": "Сравнительные запросы", "is_favourite": false, "prompts_count": 8 }
],
"update_dates": ["2026-03-05", "2026-03-12", "2026-03-19", "2026-03-26"],
"first_update_date": "2026-03-05T10:00:00.000000Z",
"last_update_date": "2026-03-26T10:00:00.000000Z",
"prompts_count": 45,
"enums": {
"mention": [
{ "value": "has", "label": "Упомянут" },
{ "value": "not", "label": "Не упомянут" },
{ "value": "has_source", "label": "Есть в источниках" }
],
"tone": [
{ "value": "positive", "label": "Положительная" },
{ "value": "neutral", "label": "Нейтральная" },
{ "value": "negative", "label": "Негативная" }
],
"visibility": [
{ "value": "up", "label": "Выросла" },
{ "value": "down", "label": "Упала" }
],
"competitor_type": [
{ "value": "brand", "label": "Бренд" },
{ "value": "competitor", "label": "Конкурент" }
],
"metrics": [
{ "value": "visibility", "label": "Видимость" },
{ "value": "mentions", "label": "Упоминания" },
{ "value": "share_of_voice", "label": "Доля голоса" }
],
"metrics_action": [
{ "value": "up", "label": "Рост" },
{ "value": "down", "label": "Падение" },
{ "value": "zero", "label": "Без изменений" }
]
}
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
neurals | array | Нейросети, подключённые к проекту. Используйте id в параметре neurals[]. |
groups | array | Группы запросов проекта. Используйте id в параметре groups[]. |
update_dates | array<string> | Даты завершённых обновлений (формат YYYY-MM-DD). Используйте для параметра dates[]. |
first_update_date | string|null | Дата первого обновления (ISO 8601). null если обновлений ещё не было. |
last_update_date | string|null | Дата последнего обновления (ISO 8601). |
prompts_count | integer | Общее количество запросов в проекте. |
enums | object | Допустимые значения перечислимых фильтров с русскими подписями. Содержит: mention, tone, visibility, competitor_type, metrics, metrics_action. |
Соответствие enums и параметров эндпоинтов
| Enum | Параметр | Эндпоинты |
|---|---|---|
mention | mention | answers |
tone | tone | answers |
visibility | visibility | answers, sources |
competitor_type | type | competitors |
metrics | metrics | competitors |
metrics_action | metricsAction | competitors |
Примеры использования каждого фильтра
Ниже показано, как применять каждый параметр фильтрации в запросах к API. Значения берутся из ответа /filters.
neurals[] — фильтр по нейросетям
Оставить данные только по ChatGPT (id=1) и Perplexity (id=3):
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?neurals[]=1&neurals[]=3" \
-H "Authorization: Bearer YOUR_API_TOKEN"
groups[] — фильтр по группам запросов
Данные только по группе «Репутационные запросы» (id=5):
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
dates[] — фильтр по диапазону дат
Данные за март 2026 (используйте даты из update_dates):
curl -X GET "https://ai.pixeltools.ru/api/projects/1/summary?dates[]=2026-03-01&dates[]=2026-03-31" \
-H "Authorization: Bearer YOUR_API_TOKEN"
mention — фильтр по упоминаниям бренда
Только запросы, где бренд упомянут:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?mention=has" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Только запросы, где бренд не упомянут:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?mention=not" \
-H "Authorization: Bearer YOUR_API_TOKEN"
tone — фильтр по тональности
Только запросы с негативной тональностью:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?tone=negative" \
-H "Authorization: Bearer YOUR_API_TOKEN"
visibility — фильтр по динамике видимости
Только запросы, где видимость выросла:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?visibility=up" \
-H "Authorization: Bearer YOUR_API_TOKEN"
type — фильтр по типу конкурента
Только бренды (без конкурентов):
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?type=brand" \
-H "Authorization: Bearer YOUR_API_TOKEN"
metrics + metricsAction — фильтр конкурентов по метрике и динамике
Конкуренты с растущей долей голоса:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?metrics=share_of_voice&metricsAction=up" \
-H "Authorization: Bearer YOUR_API_TOKEN"
prompt — поиск по тексту запроса
Найти запросы, содержащие слово «отзывы»:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?prompt=%D0%BE%D1%82%D0%B7%D1%8B%D0%B2%D1%8B" \
-H "Authorization: Bearer YOUR_API_TOKEN"
search — поиск по имени конкурента
Найти конкурента по названию:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?search=Yandex" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Комбинирование нескольких фильтров
Все фильтры можно комбинировать в одном запросе. Например, репутационные запросы + только ChatGPT + за март + только упомянутые:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?\
groups[]=5&\
neurals[]=1&\
dates[]=2026-03-01&dates[]=2026-03-31&\
mention=has" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Фильтрация по группам запросов
Запросы (промпты) в проекте можно организовать в группы — например, «репутационные запросы», «сравнительные запросы», «информационные запросы» и т.д. Группы создаются в интерфейсе проекта на вкладке «Запросы».
Все основные эндпоинты выгрузки данных (answers, competitors, sources, summary)
принимают параметр groups[], который фильтрует данные только по запросам из указанных групп.
Это позволяет строить отчёты в разрезе конкретной тематики запросов.
Получить список групп и их ID можно через эндпоинт GET /api/projects/{project}/groups.
Формат параметра
# Фильтр по одной группе (ID = 5)
?groups[]=5
# Фильтр по нескольким группам (ID = 5 и 12)
?groups[]=5&groups[]=12
Когда groups[] не передан или пустой — данные возвращаются по всем запросам проекта (без фильтрации по группам).
Пример: данные по ответам только для группы «Репутационные запросы»
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Пример: конкуренты по двум группам «Сравнительные» + «Информационные»
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?groups[]=12&groups[]=8" \
-H "Authorization: Bearer YOUR_API_TOKEN"
При указании нескольких групп данные фильтруются по запросам, которые входят хотя бы в одну из указанных групп (логическое ИЛИ).
Сводка
GET /api/projects/{project}/summary
Возвращает сводные данные по проекту: кривую видимости бренда, тональность, видимость по группам.
Параметры запроса (query)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
dates[] | array | весь период | Диапазон дат: dates[]=2026-03-01&dates[]=2026-03-31 |
neurals[] | array<int> | все нейросети проекта | ID нейросетей для фильтрации |
groups[] | array<int> | все запросы | ID групп запросов. Фильтрует данные только по промптам из указанных групп. |
curl -X GET "https://ai.pixeltools.ru/api/projects/1/summary?groups[]=5&neurals[]=1&neurals[]=3" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
В примерах ниже строки с // — пояснения для читателя; в реальном JSON-ответе комментариев нет. Массивы показаны сокращённо (1–2 элемента).
{
"project": {
"id": 1,
"name": "My Project",
"brand": "MyBrand",
"domain": "example.com",
"region": 225,
"language": "ru",
"prompts_count": 15,
"created_at": "2025-06-01T10:00:00.000000Z"
// ... прочие поля проекта (см. эндпоинт «Список проектов»)
},
"filters": {
"dates": ["2026-03-01", "2026-03-31"],
"neurals": [1, 3],
"groups": [5]
},
"events": [
{ "id": 10, "project_id": 1, "type": "update_finished", "message": "Обновление завершено", "created_at": "2026-03-26T10:05:00.000000Z" }
],
"updateDates": ["2026-03-05", "2026-03-12", "2026-03-19", "2026-03-26"],
"firstUpdateDate": "2026-03-05T10:00:00.000000Z",
"lastUpdateDate": "2026-03-26T10:00:00.000000Z",
"data": {
"updateStats": {
// Кривая видимости: серия "all" (общая, order -1, только если нейросетей > 1) + по одной на нейросеть.
// Точка: x — дата (д.м.Г), y — видимость %, z — число упоминаний, w — % для виджета.
"visibility_curve": [
{
"label": { "system_name": "all", "display_name": "Все", "logo": null, "order": -1 },
"data": [
{ "x": "05.03.2026", "y": 45.33, "z": 12, "w": 45.33 },
{ "x": "26.03.2026", "y": 56.67, "z": 17, "w": 56.67 }
]
},
{
"label": { "system_name": "openai", "display_name": "ChatGPT", "logo": "openai", "order": 1 },
"data": [
{ "x": "05.03.2026", "y": 40.0, "z": 6, "w": 40.0 },
{ "x": "26.03.2026", "y": 60.0, "z": 9, "w": 60.0 }
]
}
],
// Тональность по последнему обновлению периода, % от упоминаний
"tone_chart": { "positive": 65.45, "neutral": 25.45, "negative": 9.1 },
// Видимость по избранным группам запросов (пустой массив, если избранных групп < 3)
"group_visibility_chart": [
{ "slug": "Репутационные запросы", "value": 72.5 },
{ "slug": "Брендовые запросы", "value": 58.33 }
],
// Те же серии, что visibility_curve, но точка укорочена: y — число упоминаний, w — %
"visibility": [
{
"label": { "system_name": "all", "display_name": "Все", "logo": null, "order": -1 },
"data": [ { "x": "05.03.2026", "y": 12, "w": 45.33 }, { "x": "26.03.2026", "y": 17, "w": 56.67 } ]
}
],
// Доля голоса (share of voice): ваш бренд (type "own") + top-5 конкурентов + "Другие". Точка {x, y%}.
"share_of_voice": [
{ "id": "9f1c2e8a-...-uuid", "label": "MyBrand", "type": "own", "label_meta": { "grayscale": false }, "data": [ { "x": "05.03.2026", "y": 35.5 } ] },
{ "id": 101, "label": "Конкурент А", "type": "direct", "label_meta": { "grayscale": false }, "data": [ { "x": "05.03.2026", "y": 28.75 } ] },
{ "id": "other", "label": "Другие", "type": "other", "label_meta": { "grayscale": true }, "data": [ { "x": "05.03.2026", "y": 12.0 } ] }
],
// Топ-5 конкурентов — строка такая же, как в /competitors → data.tableData
"competitors": {
"table": [
{ "id": 1, "competitor": { "id": 101, "name": "Конкурент А", "type": "direct" }, "members": [], "visibility": { "first": 45.5, "last": 52.3, "delta": 6.8 }, "mentions": 15, "tone": "positive", "share_of_voice": { "first": 18.2, "last": 21.0, "delta": 2.8 } }
]
},
// Промпты с наибольшим ростом/падением видимости (до 5 в каждую сторону)
"topPrompts": {
"up": [ { "prompt": "купить MyBrand", "visibility": 78.5, "dynamic": 15.2 } ],
"down": [ { "prompt": "MyBrand отзывы", "visibility": 42.5, "dynamic": -8.5 } ],
"up_reason": null, // 'no_growth' если роста нет
"down_reason": null // 'no_decline' если падения нет
},
// История позиции бренда в ответах (топ-N промптов по частотности)
"brand_position_history": {
"tableData": {
"dates": ["2026-03-05", "2026-03-26"],
"neurals": [ { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" } ],
"data": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand", "groups": ["Репутационные запросы"] },
// positions_by_date: дата → (neural_id → ячейка)
"positions_by_date": {
"2026-03-05": { "1": { "mention": 1, "mention_position": 2, "tone": "positive", "occurrences": ["MyBrand"], "competitors": ["Конкурент А"], "has_data": true } }
},
"dynamics": "up" // up | down | not_changed
}
]
},
"chartData": [ /* серии как visibility_curve, точка {x, y%} */ ]
},
// История позиции сайта проекта в источниках (та же структура; ячейка — {mentioned, position})
"site_position_history": {
"tableData": {
"dates": ["2026-03-05", "2026-03-26"],
"neurals": [ { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" } ],
"data": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand" },
"positions_by_date": { "2026-03-05": { "1": { "mentioned": true, "position": 6 } } },
"dynamics": "up"
}
]
},
"chartData": []
}
},
// Конфигурация виджетов сводки для интерфейса (не нужна для аналитики)
"widgets": [
{ "value": "visibility", "active": true, "order": 1 },
{ "value": "tone", "active": true, "order": 2 }
]
}
}
Поля data.updateStats
| Поле | Описание |
|---|---|
visibility_curve | Кривая видимости бренда по датам обновлений: серия all (общая) + по серии на каждую нейросеть. Точка: {x: дата, y: видимость %, z: упоминаний, w: % виджета}. |
tone_chart | Тональность по последнему обновлению: {positive, neutral, negative} в %. |
group_visibility_chart | Видимость по избранным группам запросов: [{slug, value%}]. Пусто, если избранных групп < 3. |
visibility | Те же серии, что visibility_curve, в формате виджета (точка {x, y: упоминаний, w: %}). |
share_of_voice | Доля голоса по датам: ваш бренд + top-5 конкурентов + «Другие». Ряд: {id, label, type, label_meta, data:[{x, y%}]}. |
competitors.table | Топ-5 конкурентов; строка идентична /competitors → data.tableData[]. |
topPrompts | Промпты с макс. ростом/падением видимости: {up[], down[], up_reason, down_reason}. |
brand_position_history | История позиции бренда в ответах: {tableData:{dates, neurals, data}, chartData}; ячейка — {mention, mention_position, tone, occurrences, competitors, has_data}. |
site_position_history | История позиции сайта проекта в источниках; ячейка — {mentioned, position}. |
data.widgets — конфигурация виджетов сводки для интерфейса; для аналитики не используется.
Конкуренты
GET /api/projects/{project}/competitors
Возвращает данные по конкурентам: таблицу видимости, графики, радарные диаграммы, долю голоса (share of voice).
Параметры запроса (query)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
dates[] | array | весь период | Диапазон дат |
neurals[] | array<int> | все нейросети проекта | ID нейросетей |
groups[] | array<int> | все запросы | ID групп запросов. Фильтрует конкурентов только по промптам из указанных групп. |
type | string | — | Тип конкурента: brand, competitor или пусто (все) |
search | string | — | Поиск по имени конкурента |
metrics | string | — | Метрика: visibility, mentions, share_of_voice |
metricsAction | string | — | Фильтр динамики: up (рост), down (падение), zero (без изменений) |
competitors_count | integer | — | Ограничить количество конкурентов в ответе |
Пример: конкуренты по группе «Сравнительные запросы»
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?groups[]=12" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"project": { "id": 1, "name": "My Project", "brand": "MyBrand", "domain": "example.com" }, // полный объект — см. раздел «Сводка»
"filters": {
"dates": ["2026-03-01", "2026-03-31"],
"neurals": [1, 2, 3],
"groups": [12],
"type": null,
"search": null,
"metrics": null,
"metricsAction": null,
"competitors_count": null
},
"types": {
"key": "Ключевой",
"direct": "Прямой",
"indirect": "Косвенный",
"hidden": "Скрытый"
},
"data": {
"updateDates": ["2026-03-05", "2026-03-12"],
"firstUpdateDate": "2026-03-05",
"lastUpdateDate": "2026-03-12",
"tableData": [
{
"id": 1,
"competitor": { "id": 101, "name": "Конкурент А", "type": "direct" },
"members": [ { "id": 102, "competitor_id": 102, "name": "Competitor A" } ],
"visibility": { "first": 45.5, "last": 52.3, "delta": 6.8, "dates": { "first": "2026-03-05", "last": "2026-03-12" } },
"mentions": 15,
"tone": "positive",
"share_of_voice": { "first": 18.2, "last": 21.0, "delta": 2.8 }
}
],
// «Выпавшие»: были видимы в начале периода, но в последнем обновлении видимость = 0. Строка как в tableData.
"excludedTableData": [
{
"id": 1,
"competitor": { "id": 205, "name": "Конкурент Б", "type": "indirect" },
"members": [],
"visibility": { "first": 12.0, "last": 0, "delta": -12.0, "dates": { "first": "2026-03-05", "last": "2026-03-12" } },
"mentions": 0,
"tone": "neutral",
"share_of_voice": { "first": 5.0, "last": 0, "delta": -5.0 }
}
],
// Линейные графики по датам. Каждый ряд — отдельный конкурент (+ ваш бренд, type "own").
"chartData": {
// y — видимость %
"visibility": [
{ "id": "own-uuid", "label": "MyBrand", "type": "own", "data": [ { "x": "05.03.2026", "y": 50.0 }, { "x": "12.03.2026", "y": 55.0 } ] },
{ "id": 101, "label": "Конкурент А", "type": null, "data": [ { "x": "05.03.2026", "y": 45.5 }, { "x": "12.03.2026", "y": 52.3 } ] }
],
// y — число упоминаний, percent — доля голоса %
"mentions": [
{ "id": "own-uuid", "label": "MyBrand", "type": "own", "data": [ { "x": "05.03.2026", "y": 20, "percent": 35.5 }, { "x": "12.03.2026", "y": 24, "percent": 37.0 } ] },
{ "id": 101, "label": "Конкурент А", "type": null, "data": [ { "x": "05.03.2026", "y": 12, "percent": 18.2 }, { "x": "12.03.2026", "y": 15, "percent": 21.0 } ] }
],
// y — доля голоса %
"share_of_voice": [
{ "id": "own-uuid", "label": "MyBrand", "type": "own", "data": [ { "x": "05.03.2026", "y": 35.5 }, { "x": "12.03.2026", "y": 37.0 } ] },
{ "id": 101, "label": "Конкурент А", "type": null, "data": [ { "x": "05.03.2026", "y": 18.2 }, { "x": "12.03.2026", "y": 21.0 } ] }
]
},
// Радар в разрезе нейросетей по последнему обновлению (нужно >= 3 нейросетей; иначе datasets пуст).
// labels — оси (нейросети), data в датасете — значения по этим осям в том же порядке.
"radarChartData": {
"visibility": {
"labels": [
{ "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" },
{ "id": 3, "display_name": "Gemini", "system_name": "gemini", "logo": "gemini" }
],
"datasets": [
{ "label": "MyBrand", "competitor_id": "own-uuid", "type": "own", "data": [ 60.0, 53.3 ] },
{ "label": "Конкурент А", "competitor_id": 101, "type": "direct", "data": [ 52.3, 48.0 ] }
]
},
"mentions": { "labels": [ /* как выше */ ], "datasets": [ /* data — число упоминаний по нейросети */ ] },
"share_of_voice": { "labels": [ /* как выше */ ], "datasets": [ /* data — доля голоса % по нейросети */ ] }
}
}
}
Поля data
| Поле | Описание |
|---|---|
tableData | Текущие конкуренты (видимость в последнем обновлении > 0) плюс строка вашего бренда (competitor.type: "own"). Отсортированы по видимости последнего обновления. Строка: {id, competitor:{id, name, type}, members[], visibility:{first, last, delta, dates}, mentions, tone, share_of_voice:{first, last, delta}}. |
excludedTableData | «Выпавшие» конкуренты — бренды, у которых была видимость в начале выбранного периода, но в последнем обновлении видимость = 0 (перестали попадать в ответы). Структура строки идентична tableData, у них visibility.last = 0. Вынесены в отдельный список, чтобы не засорять основную таблицу. |
chartData | Линейные графики по датам обновлений: visibility (видимость, %), mentions (число упоминаний; в точке также percent = доля голоса, %), share_of_voice (доля голоса, %). Каждый ряд — отдельный конкурент (и ваш бренд): {id, label, type, data:[{x, y}]}. |
radarChartData | Радар-диаграммы в разрезе нейросетей для последнего обновления (требуется ≥ 3 нейросетей): {labels:[нейросети], datasets:[{label, competitor_id, type, data:[значения по нейросетям]}]}. |
Ряды по нейросетям. В отличие от Сводки, где visibility_curve сразу отдаёт
и совокупный ряд, и ряды по каждой нейросети (для одного бренда), в Конкурентах линейные графики
(chartData) строятся по конкурентам и агрегируются по всем выбранным нейросетям.
Чтобы получить динамику по конкретной нейросети, повторите запрос с фильтром neurals[]={id}.
Срез по нейросетям для последнего обновления уже доступен в radarChartData.
Ответы
GET /api/projects/{project}/answers
Возвращает анализ ответов нейросетей по проекту: таблицу видимости (позиции, упоминания, тональность) и историю по датам обновлений.
Параметры запроса (query)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
dates[] | array | весь период | Диапазон дат |
neurals[] | array<int> | все нейросети проекта | ID нейросетей |
groups[] | array<int> | все запросы | ID групп запросов. Возвращает данные только по промптам из указанных групп. |
prompt | string | — | Поиск по тексту запроса (LIKE) |
mention | string | — | Фильтр упоминаний: has (упомянут), not (не упомянут), has_source (есть в источниках) |
tone | string | — | Фильтр тональности: positive, neutral, negative |
visibility | string | — | Фильтр динамики видимости: up (выросла), down (упала) |
sortField | string | — | Поле сортировки (например frequency_sort) |
sortOrder | string | — | Направление сортировки: asc или desc |
Пример: ответы по группе «Репутационные запросы» с фильтром по упоминаниям
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?groups[]=5&mention=has" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"project": { "id": 1, "name": "My Project", "brand": "MyBrand", "domain": "example.com" }, // полный объект — см. раздел «Сводка»
"filters": {
"dates": ["2026-03-01", "2026-03-31"],
"neurals": [1, 2, 3],
"groups": [5],
"prompt": "",
"mention": "has",
"tone": null,
"visibility": null,
"sortField": null,
"sortOrder": null
},
"data": {
"visibility": {
"tableData": {
"has_answer": true,
"rows": [
{
"prompt": {
"id": 101,
"value": "отзывы о MyBrand",
"groups": ["Репутационные запросы"],
"groups_raw": ["Репутационные запросы"],
"visibility": 75.0,
"dynamic": "up",
"frequency": 1200,
"relevant_query": "отзывы mybrand"
},
"data": [
{
"neural": { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" },
"mention": 1,
"mention_position": 2,
"tone": "positive",
"occurrences": ["MyBrand", "Май Бренд"],
"competitors": ["Конкурент А", "Конкурент Б"],
"answer": "Полный текст ответа нейросети...",
"urls": [
{ "url": "https://habr.com", "domain": "habr.com", "position": 1, "favicon": "..." },
{ "url": "https://sravni.ru", "domain": "sravni.ru", "position": 2, "favicon": "..." }
],
"site_mentioned": true,
"site_position": 6,
"comment": "Бренд упомянут в позитивном контексте...",
"update_id": 555
}
]
}
],
"has_more": true,
"next_cursor": "eyJ..."
},
"chartData": [
// Кривая видимости бренда: серия "all" (общая) + по серии на нейросеть. Точка {x, y%}.
{ "id": "5f8a1c2e-...-uuid", "label": { "system_name": "all", "display_name": "Все", "logo": null, "order": -1 }, "data": [ { "x": "05.03.2026", "y": 62.5 }, { "x": "26.03.2026", "y": 81.25 } ] },
{ "id": "6b1c7d3a-...-uuid", "label": { "system_name": "openai", "display_name": "ChatGPT", "logo": "openai", "order": 1 }, "data": [ { "x": "05.03.2026", "y": 58.0 }, { "x": "26.03.2026", "y": 80.0 } ] }
]
},
"history": {
// Таблица истории по топ-промптам: колонки-даты, под каждой — данные по нейросетям.
"tableData": {
"dates": ["2026-03-05", "2026-03-12", "2026-03-19", "2026-03-26"],
"neurals": [ { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" } ],
"data": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand", "groups": ["Репутационные запросы"], "groups_raw": ["Репутационные запросы"], "visibility": 75.0, "dynamic": "up", "frequency": 1200, "relevant_query": "отзывы mybrand" },
// positions_by_date: дата → (neural_id → ячейка)
"positions_by_date": {
"2026-03-05": { "1": { "mention": 1, "mention_position": 2, "tone": "positive", "occurrences": ["MyBrand"], "competitors": ["Конкурент А"], "has_data": true } },
"2026-03-26": { "1": { "mention": 1, "mention_position": 1, "tone": "positive", "occurrences": ["MyBrand"], "competitors": [], "has_data": true } }
},
"dynamics": "up" // up | down | not_changed
}
],
"next_cursor": "eyJ...",
"has_more": false
},
// Та же структура, что visibility.chartData
"chartData": [
{ "id": "7c2d9e4b-...-uuid", "label": { "system_name": "all", "display_name": "Все", "logo": null, "order": -1 }, "data": [ { "x": "05.03.2026", "y": 50.0 }, { "x": "26.03.2026", "y": 80.0 } ] }
]
}
}
}
Каждый элемент visibility.tableData.rows[] состоит из двух частей:
prompt — данные запроса, и data[] — массив строк по каждой нейросети
(позиция и упоминание бренда, тональность, цитируемые источники и позиция сайта в источниках).
Поля rows[].prompt
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID промпта |
value | string | Текст запроса |
groups | array<string> | Названия групп, в которые входит запрос |
groups_raw | array<string> | Исходные названия групп запроса |
visibility | float|null | Видимость (%) для последнего обновления |
dynamic | string|null | Динамика: up, down, not_changed |
frequency | integer|null | Частотность запроса (Wordstat) |
relevant_query | string|null | Релевантный запрос для Wordstat (только для админов) |
Поля rows[].data[] (строка по нейросети)
| Поле | Тип | Описание |
|---|---|---|
neural | object | Нейросеть: {id, display_name, system_name, logo} |
mention | integer | Упоминание бренда в ответе: 1 — да, 0 — нет |
mention_position | integer|null | Позиция бренда в тексте ответа (только при mention=1) |
tone | string|null | Тональность: positive, neutral, negative |
occurrences | array<string> | Формы бренда так, как они встречаются в тексте ответа |
competitors | array<string> | Другие бренды/конкуренты, найденные в ответе |
answer | string|null | Полный текст ответа нейросети |
urls | array | Цитируемые источники ответа. Массив {url, domain, position, favicon}, отсортирован по position по возрастанию, максимум 15. position — позиция источника в списке цитирований ответа. |
site_mentioned | boolean | Присутствует ли сайт проекта среди источников ответа |
site_position | integer|null | Позиция сайта проекта в источниках (минимальная позиция среди URL, принадлежащих домену проекта). null, если сайт не цитируется. Соответствует колонке «Позиция сайта в источниках» в интерфейсе. |
comment | string|null | Комментарий анализа по упоминанию бренда |
update_id | integer | ID обновления, к которому относится строка |
Источники и их позиции. Список цитируемых источников по каждому ответу находится
в поле data[].urls — это отдельное поле, источники не входят в comment.
Позиция конкретного источника — в data[].urls[].position; позиция сайта проекта в источниках —
в data[].site_position. Не путайте с data[].mention_position — это позиция бренда в тексте ответа.
Пагинация: ответы возвращаются по 50 записей. Для получения следующей страницы передавайте cursor из next_cursor. Поле chartData возвращается только на первой странице.
Источники
GET /api/projects/{project}/sources
Возвращает данные по источникам: какие страницы ИИ-системы используют при генерации ответов.
Параметры запроса (query)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
dates[] | array | весь период | Диапазон дат |
neurals[] | array<int> | нейросети с источниками | ID нейросетей (используются только нейросети, поддерживающие источники) |
groups[] | array<int> | все запросы | ID групп запросов. Фильтрует источники только по промптам из указанных групп. |
prompt_search | string | — | Поиск по тексту запроса |
mention_filter | string | — | Фильтр упоминаний |
urls_count | integer | 100000 | Максимальное количество URL в ответе |
min_frequency | integer | — | Минимальная частотность запроса |
visibility | string | — | Фильтр динамики: up, down |
Пример: источники по группе «Информационные запросы»
curl -X GET "https://ai.pixeltools.ru/api/projects/1/sources?groups[]=8" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Ответ
{
"project": { "id": 1, "name": "My Project", "brand": "MyBrand", "domain": "example.com" }, // полный объект — см. раздел «Сводка»
"filters": {
"dates": ["2026-03-01", "2026-03-31"],
"neurals": [1, 3],
"groups": [8],
"urls_count": 100000,
"prompt_search": null,
"mention_filter": null,
"min_frequency": null,
"visibility": null
},
"data": {
"visibility": {
// Видимость сайта проекта в источниках — по промптам и нейросетям.
"tableData": {
"has_answer": true,
"rows": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand", "groups": ["Информационные запросы"], "groups_raw": ["Информационные запросы"] },
"data": [
{
"neural": { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" },
"mentioned": true, // сайт проекта встретился среди источников ответа
"position": 2, // позиция сайта проекта среди источников
"answer": "Текст ответа нейросети...",
"urls": [
{ "url": "https://example.com/page", "domain": "example.com", "position": 2, "favicon": "https://tools.pixelplus.ru/projects/shared/getfavicon/example.com" },
{ "url": "https://habr.com/article", "domain": "habr.com", "position": 5, "favicon": "https://tools.pixelplus.ru/projects/shared/getfavicon/habr.com" }
]
}
]
}
]
},
// Кривая видимости сайта в источниках: серия "all" + по нейросети. Точка {x, y%}.
"chartData": [
{ "id": "a1b2c3d4-...-uuid", "label": { "system_name": "all", "display_name": "Все", "logo": null, "order": -1 }, "data": [ { "x": "05.03.2026", "y": 50.0 }, { "x": "12.03.2026", "y": 75.5 } ] }
]
},
"sources": {
// Источники, сгруппированные по домену. Внутри каждого домена — массив urls (отдельные страницы).
"tableData": [
{
"domain": "example.com",
"favicon": "https://tools.pixelplus.ru/projects/shared/getfavicon/example.com",
"sources_count": 2,
"dominant_type": { "value": "blog", "label": "Блог", "description": "...", "icon": "..." },
"is_admin_forced": false,
"prompts_count": 2,
"prompts": [ { "id": 101, "value": "отзывы о MyBrand" }, { "id": 102, "value": "MyBrand цена" } ],
"frequency": { "first": 5, "last": 12, "delta": 7 },
"urls": [
{
"source": { "id": 1, "url": "https://example.com/about", "name": "https://example.com/about", "domain": "example.com", "type": { "value": "blog", "label": "Блог" }, "is_admin_forced": false, "favicon": "https://tools.pixelplus.ru/projects/shared/getfavicon/example.com" },
"frequency": { "first": 3, "last": 8, "delta": 5 },
"prompts": [ { "id": 101, "value": "отзывы о MyBrand" } ]
}
]
}
]
// Дополнительно в "sources" приходят: chartData, domainChartData, excludedTableData, minFrequency, pagination, excludedPagination, totalExcluded
},
"history": {
// История попадания сайта проекта в источники по топ-промптам. Ячейка — {mentioned, position}.
"tableData": {
"dates": ["2026-03-05", "2026-03-12"],
"neurals": [ { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" } ],
"data": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand" },
"positions_by_date": {
"2026-03-05": { "1": { "mentioned": true, "position": 3 } },
"2026-03-12": { "1": { "mentioned": true, "position": 2 } }
},
"dynamics": "up" // up | down | not_changed
}
]
}
}
}
}
Разделы data
| Раздел | Описание |
|---|---|
visibility | Видимость сайта проекта в источниках: таблица + график по датам |
sources | Список источников (URL или доменов) с количеством упоминаний |
history | История изменений по датам |
Сценарий: отчёт в разрезе группы запросов
Допустим, в проекте есть группы запросов: «Репутационные запросы» (id=5), «Сравнительные запросы» (id=12),
«Информационные запросы» (id=8). Чтобы построить отдельный отчёт по каждой группе,
выполните запросы к нужным эндпоинтам с параметром groups[].
Шаг 1. Получить список проектов
curl -X GET "https://ai.pixeltools.ru/api/projects" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Из ответа берём id проекта, например id = 1
Шаг 2. Получить список групп проекта
curl -X GET "https://ai.pixeltools.ru/api/projects/1/groups" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Ответ:
# { "data": [
# { "id": 5, "name": "Репутационные запросы", "is_favourite": true, "prompts_count": 12 },
# { "id": 8, "name": "Информационные запросы", "is_favourite": false, "prompts_count": 25 },
# { "id": 12, "name": "Сравнительные запросы", "is_favourite": false, "prompts_count": 8 }
# ]}
Шаг 3. Запросить данные по каждой группе
Репутационные запросы (id=5)
# Сводка
curl -X GET "https://ai.pixeltools.ru/api/projects/1/summary?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Ответы (видимость + история)
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Конкуренты
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Источники
curl -X GET "https://ai.pixeltools.ru/api/projects/1/sources?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Сравнительные запросы (id=12)
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?groups[]=12" \
-H "Authorization: Bearer YOUR_API_TOKEN"
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?groups[]=12" \
-H "Authorization: Bearer YOUR_API_TOKEN"
curl -X GET "https://ai.pixeltools.ru/api/projects/1/sources?groups[]=12" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Шаг 4. Комбинирование фильтров
Параметр groups[] можно комбинировать с другими фильтрами:
# Репутационные запросы + только ChatGPT (neural id=1) + за март 2026
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?\
groups[]=5&\
neurals[]=1&\
dates[]=2026-03-01&dates[]=2026-03-31" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Сравнительные запросы + только упомянутые + позитивная тональность
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers?\
groups[]=12&\
mention=has&\
tone=positive" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# Конкуренты по репутационным запросам, только растущие
curl -X GET "https://ai.pixeltools.ru/api/projects/1/competitors?\
groups[]=5&\
metricsAction=up" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Все параметры фильтрации
Сводная таблица параметров, поддерживаемых каждым эндпоинтом.
| Параметр | summary | competitors | answers | sources | Описание |
|---|---|---|---|---|---|
dates[] |
✓ | ✓ | ✓ | ✓ | Диапазон дат [start, end] |
neurals[] |
✓ | ✓ | ✓ | ✓ | ID нейросетей |
groups[] |
✓ | ✓ | ✓ | ✓ | ID групп запросов |
prompt |
✓ | Поиск по тексту запроса | |||
prompt_search |
✓ | Поиск по тексту запроса (источники) | |||
mention |
✓ | has / not / has_source |
|||
mention_filter |
✓ | Фильтр упоминаний для источников | |||
tone |
✓ | positive / neutral / negative |
|||
visibility |
✓ | ✓ | up / down |
||
type |
✓ | brand / competitor |
|||
search |
✓ | Поиск по имени конкурента | |||
metrics |
✓ | visibility / mentions / share_of_voice |
|||
metricsAction |
✓ | up / down / zero |
|||
competitors_count |
✓ | Лимит количества конкурентов | |||
urls_count |
✓ | Лимит URL | |||
min_frequency |
✓ | Минимальная частотность | |||
sortField |
✓ | Поле сортировки | |||
sortOrder |
✓ | asc / desc |
Возможные ошибки
401 Unauthorized
{
"message": "Invalid API token"
}
Неверный или отсутствующий API-токен.
403 Forbidden
Нет доступа к проекту. Убедитесь, что проект принадлежит вам или расшарен для вас.
404 Not Found
Проект не найден.
422 Validation Error
Ошибка валидации параметров запроса.
{
"message": "The given data was invalid.",
"errors": {
"dates.0": ["Поле dates.0 должно быть корректной датой."],
"neurals.1": ["Выбранное значение neurals.1 некорректно."]
}
}