Проекты

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

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"
    }
  ]
}

Поля ответа

ПолеТипОписание
idintegerID проекта. Используется во всех последующих запросах как {project}.
user_idintegerID владельца проекта
namestringНазвание проекта
brandstringБренд проекта
domainstringДомен проекта
activitiesstringВид деятельности
is_pausedbooleanПроект на паузе
created_atdatetimeДата создания

Информация по проекту и статус съёма

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"
    }
  }
}

Поля ответа

ПолеТипОписание
idintegerID проекта
user_idintegerID владельца проекта
namestringНазвание проекта
brandstringБренд проекта
domainstringДомен проекта
activitiesstringВид деятельности
is_pausedbooleanПроект на паузе
created_atdatetimeДата создания
parse.statusstringСтатус съёма: idle (съёмов не было), queued (в очереди), in_progress (выполняется), completed (есть завершённый ранее съём)
parse.in_progressbooleanИдёт ли съём прямо сейчас (включая ожидание в очереди)
parse.progressintegerПрогресс текущего съёма, 0–100
parse.phasestring|nullТекущая фаза пайплайна (queue_wait, submit, receive, analysis_submit, saving_results, …); null, если съём не идёт
parse.started_atdatetime|nullКогда стартовал текущий съём; null, если съём не идёт
parse.last_completed_atdatetime|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_recommendationsbooleanПринудительно включить/выключить генерацию рекомендаций после съёма. Если не передан — используется расписание проекта.
with_frequencybooleanПринудительно включить/выключить проверку частотности после съёма. Если не передан — используется расписание проекта.

Ответ (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 }
  ]
}

Поля ответа

ПолеТипОписание
idintegerID группы. Используется в параметре groups[] для фильтрации данных.
namestringНазвание группы
is_favouritebooleanГруппа отмечена как избранная
prompts_countintegerКоличество запросов в группе

Доступные фильтры проекта

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": "Без изменений" }
    ]
  }
}

Поля ответа

ПолеТипОписание
neuralsarray Нейросети, подключённые к проекту. Используйте id в параметре neurals[].
groupsarray Группы запросов проекта. Используйте id в параметре groups[].
update_datesarray<string> Даты завершённых обновлений (формат YYYY-MM-DD). Используйте для параметра dates[].
first_update_datestring|null Дата первого обновления (ISO 8601). null если обновлений ещё не было.
last_update_datestring|null Дата последнего обновления (ISO 8601).
prompts_countinteger Общее количество запросов в проекте.
enumsobject Допустимые значения перечислимых фильтров с русскими подписями. Содержит: mention, tone, visibility, competitor_type, metrics, metrics_action.

Соответствие enums и параметров эндпоинтов

EnumПараметрЭндпоинты
mentionmentionanswers
tonetoneanswers
visibilityvisibilityanswers, sources
competitor_typetypecompetitors
metricsmetricscompetitors
metrics_actionmetricsActioncompetitors

Примеры использования каждого фильтра

Ниже показано, как применять каждый параметр фильтрации в запросах к 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 конкурентов; строка идентична /competitorsdata.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 групп запросов. Фильтрует конкурентов только по промптам из указанных групп.
typestring Тип конкурента: brand, competitor или пусто (все)
searchstring Поиск по имени конкурента
metricsstring Метрика: visibility, mentions, share_of_voice
metricsActionstring Фильтр динамики: up (рост), down (падение), zero (без изменений)
competitors_countinteger Ограничить количество конкурентов в ответе

Пример: конкуренты по группе «Сравнительные запросы»

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 групп запросов. Возвращает данные только по промптам из указанных групп.
promptstring Поиск по тексту запроса (LIKE)
mentionstring Фильтр упоминаний: has (упомянут), not (не упомянут), has_source (есть в источниках)
tonestring Фильтр тональности: positive, neutral, negative
visibilitystring Фильтр динамики видимости: up (выросла), down (упала)
sortFieldstring Поле сортировки (например frequency_sort)
sortOrderstring Направление сортировки: 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

ПолеТипОписание
idintegerID промпта
valuestringТекст запроса
groupsarray<string>Названия групп, в которые входит запрос
groups_rawarray<string>Исходные названия групп запроса
visibilityfloat|nullВидимость (%) для последнего обновления
dynamicstring|nullДинамика: up, down, not_changed
frequencyinteger|nullЧастотность запроса (Wordstat)
relevant_querystring|nullРелевантный запрос для Wordstat (только для админов)

Поля rows[].data[] (строка по нейросети)

ПолеТипОписание
neuralobjectНейросеть: {id, display_name, system_name, logo}
mentionintegerУпоминание бренда в ответе: 1 — да, 0 — нет
mention_positioninteger|nullПозиция бренда в тексте ответа (только при mention=1)
tonestring|nullТональность: positive, neutral, negative
occurrencesarray<string>Формы бренда так, как они встречаются в тексте ответа
competitorsarray<string>Другие бренды/конкуренты, найденные в ответе
answerstring|nullПолный текст ответа нейросети
urlsarrayЦитируемые источники ответа. Массив {url, domain, position, favicon}, отсортирован по position по возрастанию, максимум 15. position — позиция источника в списке цитирований ответа.
site_mentionedbooleanПрисутствует ли сайт проекта среди источников ответа
site_positioninteger|nullПозиция сайта проекта в источниках (минимальная позиция среди URL, принадлежащих домену проекта). null, если сайт не цитируется. Соответствует колонке «Позиция сайта в источниках» в интерфейсе.
commentstring|nullКомментарий анализа по упоминанию бренда
update_idintegerID обновления, к которому относится строка

Источники и их позиции. Список цитируемых источников по каждому ответу находится в поле 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_searchstring Поиск по тексту запроса
mention_filterstring Фильтр упоминаний
urls_countinteger100000 Максимальное количество URL в ответе
min_frequencyinteger Минимальная частотность запроса
visibilitystring Фильтр динамики: 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 некорректно."]
  }
}
Рейтинг статьи
0 (0 оценок)
Задайте вопрос или оставьте комментарий