Проекты
Список проектов
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/visibility?neurals[]=1&neurals[]=3" \
-H "Authorization: Bearer YOUR_API_TOKEN"
groups[] — фильтр по группам запросов
Данные только по группе «Репутационные запросы» (id=5):
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?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/visibility?mention=has" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Только запросы, где бренд не упомянут:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?mention=not" \
-H "Authorization: Bearer YOUR_API_TOKEN"
tone — фильтр по тональности
Только запросы с негативной тональностью:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?tone=negative" \
-H "Authorization: Bearer YOUR_API_TOKEN"
visibility — фильтр по динамике видимости
Только запросы, где видимость выросла:
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?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/visibility?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/visibility?\
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/visibility?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/visibility |
Сводка | Упоминание и позиция бренда по каждой нейросети на последнем обновлении периода, тональность, источники, полный текст ответа + кривая видимости |
GET /api/projects/{project}/answers/history |
История позиций бренда | Упоминания и позиции бренда по датам обновлений |
GET /api/projects/{project}/answers/sources-history |
История позиций сайта | Позиции домена проекта в источниках по датам обновлений |
GET /api/projects/{project}/answers/comparison |
Сравнение ответов | «Было → стало» по двум точечным датам и одной нейросети |
GET /api/projects/{project}/answers (устарел) |
— | Сводка и История позиций бренда в одном ответе. Работает, но новые интеграции должны использовать вкладочные эндпоинты — см. ниже |
Формат ответа вкладочных эндпоинтов
Все четыре отдают одинаковую обёртку, различается только содержимое tableData:
{
"project": { "id": 1, "name": "My Project", "brand": "MyBrand", "domain": "example.com" },
"filters": { }, // фильтры, с которыми запрос реально отработал
"next_cursor": "eyJ...", // курсор следующей страницы; null — страниц больше нет
"has_more": true, // есть ли ещё страницы
"total_prompts": 202, // всего запросов под фильтром (НЕ на странице)
"total_mentions": 251, // всего упоминаний под фильтром (НЕ на странице)
"tableData": { }, // данные вкладки
"chartData": [ ] // график вкладки; только на первой странице (запрос без cursor)
}
Вкладка sources-history не пагинируется — она отдаёт данные сразу по всем
запросам под фильтром, поэтому у неё всегда has_more: false и next_cursor: null.
GET /api/projects/{project}/answers/visibility
Вкладка «Сводка»: по каждому запросу — строка на каждую нейросеть с упоминанием и позицией бренда, тональностью, цитируемыми источниками, позицией сайта в источниках и полным текстом ответа.
Параметры запроса (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 |
per_page | integer | 50 | Сколько запросов (промптов) отдать на страницу |
cursor | string | — | Курсор следующей страницы — значение next_cursor из предыдущего ответа |
Пример: сводка по группе «Репутационные запросы» с фильтром по упоминаниям
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?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
},
"next_cursor": "eyJ...", // курсор следующей страницы; null — страниц больше нет
"has_more": true, // есть ли ещё страницы
"total_prompts": 202, // всего запросов под фильтром (не на странице!)
"total_mentions": 251, // всего упоминаний под фильтром (не на странице!)
"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
}
]
}
],
"next_cursor": "eyJ...",
"has_more": true,
"total_prompts": 202,
"total_mentions": 251
},
"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 } ] }
]
}
Каждый элемент 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 запросов (промптов), а не все данные проекта. Пока
has_more: true, набор не выгружен полностью — повторяйте запрос с
cursor из next_cursor, пока не получите has_more: false.
Сравнивать нужно с total_prompts и total_mentions: это итоги по
всему набору под текущими фильтрами, они приходят на каждой странице и не
меняются при обходе. total_mentions — то же число, что в виджете
«Упоминания бренда» в интерфейсе проекта. Если упоминаний в ответе меньше, чем
total_mentions, значит остались непрочитанные страницы.
Размер страницы регулируется параметром per_page. Учтите, что по API в ответ
попадают полные тексты ответов нейросетей, поэтому большие значения дают очень тяжёлый JSON —
надёжнее обойти набор страницами, чем запросить его целиком.
Поле chartData возвращается только на первой странице (при запросе без cursor).
# Полная выгрузка упоминаний за дату: идём по курсору до has_more=false
URL="https://ai.pixeltools.ru/api/projects/1/answers/visibility?mention=has&dates[]=23.07.2026&dates[]=23.07.2026"
CURSOR=""
while :; do
RESP=$(curl -sG "$URL" --data-urlencode "cursor=$CURSOR" -H "Authorization: Bearer YOUR_API_TOKEN")
echo "$RESP" | jq '{total_mentions, has_more, on_page: [.tableData.rows[].data[] | select(.mention == 1)] | length}'
echo "$RESP" | jq -c '.tableData.rows[]' >> answers.jsonl
[ "$(echo "$RESP" | jq -r '.has_more')" = "true" ] || break
CURSOR=$(echo "$RESP" | jq -r '.next_cursor')
done
GET /api/projects/{project}/answers/history
Вкладка «История позиций бренда»: по каждому запросу — упоминание, позиция и тональность на каждую дату обновления в периоде. Фильтры и пагинация те же, что у visibility.
Фильтры mention и tone применяются по последней дате периода
— так вкладка показывает те же запросы, что и сводка.
{
// обёртка та же: project, filters, next_cursor, has_more, total_prompts, total_mentions
"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": ["Репутационные запросы"], "visibility": 75.0, "frequency": 1200 },
// 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,
"total_prompts": 202,
"total_mentions": 251
},
"chartData": [ ] // та же кривая видимости, что у visibility
}
GET /api/projects/{project}/answers/sources-history
Вкладка «История позиций сайта»: позиции домена проекта в источниках ответов по датам обновлений. Считается только по нейросетям, которые отдают источники (с учётом настройки веб-поиска проекта).
Не пагинируется — отдаёт данные сразу по всем запросам под фильтром, поэтому
has_more всегда false, а next_cursor всегда null.
Набор фильтров здесь общий с разделом
Источники
(urls_count, urls_mode, mention_filter и т.д.), а не с остальными вкладками «Ответов».
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/sources-history?dates[]=2026-03-01&dates[]=2026-03-31" \
-H "Authorization: Bearer YOUR_API_TOKEN"
GET /api/projects/{project}/answers/comparison
Вкладка «Сравнение ответов»: таблица «было → стало» по двум точечным датам
и одной нейросети. Для каждой даты берётся последний завершённый апдейт с датой
не позже выбранной («snap к последнему апдейту ≤ дата»), поэтому в ответе
tableData.date1/date2 — реальные даты снапшотов, а не то, что вы прислали.
Параметры запроса (query)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
neural | integer | первая нейросеть проекта | ID одной нейросети (не массив) |
date1 | string | предпоследняя проверка | Дата «было» |
date2 | string | последняя проверка | Дата «стало» |
presence | string | — | Фильтр присутствия по дате «стало»: brand_has, brand_not, site_has, site_not |
groups[] | array<int> | все запросы | ID групп запросов |
prompt | string | — | Поиск по тексту запроса (LIKE) |
per_page / cursor | integer / string | 50 / — | Пагинация, как у остальных вкладок |
Здесь total_mentions — упоминания бренда на дате «стало» по выбранной нейросети.
Поля dates[], neurals[], mention, tone этот
эндпоинт не использует.
{
// обёртка та же: project, filters, next_cursor, has_more, total_prompts, total_mentions
"tableData": {
"has_answer": true,
"total_prompts": 202,
"total_mentions": 148,
"neural": { "id": 1, "display_name": "ChatGPT", "system_name": "openai", "logo": "openai" },
"date1": "2026-03-19", // реальная дата снапшота «было»
"date2": "2026-03-26", // реальная дата снапшота «стало»
"rows": [
{
"prompt": { "id": 101, "value": "отзывы о MyBrand", "groups": ["Репутационные запросы"], "dynamic": "up" },
"answer1": {
"answer": "Текст ответа на дату «было»...",
"has_data": true,
"brand_position": 3,
"mention": 1,
"tone": "neutral",
"occurrences": ["MyBrand"],
"competitors": ["Конкурент А"],
"site_mentioned": false,
"site_position": null,
"urls": [ ]
},
"answer2": { } // та же структура на дату «стало»
}
],
"next_cursor": "eyJ...",
"has_more": true
},
"chartData": [ ] // у этой вкладки графика нет
}
prompt.dynamic считается по позиции бренда (меньше — лучше):
появился или поднялся → up, пропал или опустился → down,
иначе → not_changed.
GET /api/projects/{project}/answers — устаревший эндпоинт
Этот эндпоинт возвращает две вкладки сразу — «Сводка» и «История позиций
бренда» — в поле data.visibility и data.history. Он считает обе,
даже если вам нужна одна, и не покрывает две остальные вкладки страницы.
Эндпоинт продолжает работать и ломать действующие интеграции мы не будем, но он
помечен как устаревший и новых полей в нём не появится. В ответе приходит заголовок
Deprecation: true, заголовок Link со ссылками
rel="successor-version" и поле deprecation.successors с адресами замены.
Как перейти
| Было (легаси) | Стало |
|---|---|
data.visibility.tableData |
tableData у /answers/visibility |
data.visibility.chartData |
chartData у /answers/visibility |
data.history.tableData |
tableData у /answers/history |
| — (не было в API) | /answers/sources-history |
| — (не было в API) | /answers/comparison |
Фильтры, пагинация и total_prompts/total_mentions работают одинаково
в легаси и в новых эндпоинтах, так что переход — это смена URL и снятие одного уровня
вложенности в разборе ответа.
Источники
Источники — это страницы, которые ИИ-системы цитируют при генерации ответов. Данные разложены по эндпоинтам так же, как вкладки в интерфейсе: запрашивайте нужный, считается и передаётся только он.
| Эндпоинт | Вкладка в интерфейсе | Что отдаёт |
|---|---|---|
GET /api/projects/{project}/sources/list |
Список источников + Исключённые | Домены и их страницы с типом источника, упоминаниями и динамикой; в том же ответе исключённые домены и графики |
GET /api/projects/{project}/answers/sources-history |
История позиций сайта | Позиции домена проекта в источниках по датам обновлений. Эта вкладка живёт на странице «Ответы», её эндпоинт — там же: см. раздел «Ответы» |
GET /api/projects/{project}/sources (устарел) |
— | Все три вкладки в одном ответе. Работает, но новые интеграции должны использовать эндпоинты выше — см. ниже |
Пагинация здесь другая, чем в разделе «Ответы». Она есть только у
sources/list и работает по номеру страницы (page +
per_page), а не по курсору. Пока has_more: true, домены
выгружены не полностью.
Общие параметры фильтрации (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 |
page | integer | 1 | Номер страницы. Только sources/list. |
per_page | integer | 20 | Доменов на страницу, от 5 до 50. Только sources/list. Значение вне границ — ошибка 422, а не молчаливое приведение |
GET /api/projects/{project}/sources/list
Вкладка «Список источников»: домены, которые ИИ цитируют в ответах, с типом источника,
числом упоминаний и динамикой. Внутри каждого домена — массив urls
с отдельными страницами.
В том же ответе приходят исключённые домены
(excludedTableData) — те, что выпали из выдачи за период. Это отдельная
вкладка в интерфейсе, но считается она одной выборкой с основной таблицей, поэтому
разделять их на два эндпоинта означало бы посчитать всё дважды.
curl -X GET "https://ai.pixeltools.ru/api/projects/1/sources/list?groups[]=8&per_page=50" \
-H "Authorization: Bearer YOUR_API_TOKEN"
{
"project": { "id": 1, "name": "My Project", "brand": "MyBrand", "domain": "example.com" },
"filters": { },
"page": 1,
"per_page": 50,
"has_more": true, // домены выгружены не полностью — запросите page=2
"pagination": [ ], // ссылки пагинатора {url, label, active}
"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": "..." },
"frequency": { "first": 3, "last": 8, "delta": 5 },
"prompts": [ { "id": 101, "value": "отзывы о MyBrand" } ]
}
]
}
],
"excludedTableData": [ ], // домены, выпавшие из выдачи (та же структура)
"excludedPagination": [ ],
"totalExcluded": 12,
"chartData": [ ], // распределение источников по типам, по датам
"domainChartData": [ ] // топ-домены по датам
}
is_admin_forced: true означает, что тип источника для этого домена
принудительно задан администратором сервиса глобально — выбор пользователя
в проекте на него не влияет.
GET /api/projects/{project}/sources — устаревший эндпоинт
Этот эндпоинт возвращает три вкладки сразу — в полях
data.visibility, data.sources и data.history.
Он считает все три на каждый запрос, даже если вам нужна одна, отдаёт список доменов
целиком без пагинации, а две вкладки из трёх к странице «Источники» уже не относятся:
«История позиций сайта» переехала на страницу «Ответы», а «Видимость сайта» из сервиса
удалена.
Эндпоинт продолжает работать и ломать действующие интеграции мы не будем,
но он помечен как устаревший и новых полей в нём не появится. В ответе приходит заголовок
Deprecation: true, заголовок Link со ссылками
rel="successor-version" и поле deprecation.successors с адресами замены.
Как перейти
| Было (легаси) | Стало |
|---|---|
data.sources.tableData |
tableData у /sources/list |
data.sources.excludedTableData |
excludedTableData у /sources/list (там же) |
data.sources.chartData, domainChartData |
chartData, domainChartData у /sources/list |
data.visibility |
Замены нет. Вкладка «Видимость сайта» удалена из сервиса, новый эндпоинт под неё не заводился. В легаси поле остаётся, но развиваться не будет. Позиция сайта в источниках по каждому запросу и нейросети есть в /answers/visibility — поля site_mentioned, site_position, urls (учтите: там данные по последнему обновлению выбранного периода, а легаси-поле считает по последнему обновлению проекта и фильтр дат в его таблице не применяется) |
data.history.tableData |
/answers/sources-history |
Главное отличие при переходе на /sources/list: он пагинирует
список доменов, тогда как легаси отдавал его целиком. Чтобы выгрузить всё, идите по
page, пока has_more не станет false.
# Полная выгрузка доменов: идём по страницам до has_more=false
URL="https://ai.pixeltools.ru/api/projects/1/sources/list?per_page=50"
PAGE=1
while :; do
RESP=$(curl -sG "$URL" --data-urlencode "page=$PAGE" -H "Authorization: Bearer YOUR_API_TOKEN")
echo "$RESP" | jq -c '.tableData[] | {domain, sources_count}' >> domains.jsonl
[ "$(echo "$RESP" | jq -r '.has_more')" = "true" ] || break
PAGE=$((PAGE + 1))
done
Сценарий: отчёт в разрезе группы запросов
Допустим, в проекте есть группы запросов: «Репутационные запросы» (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/visibility?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/list?groups[]=5" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Сравнительные запросы (id=12)
curl -X GET "https://ai.pixeltools.ru/api/projects/1/answers/visibility?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/list?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/visibility?\
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/visibility?\
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 некорректно."]
}
}