К содержимому

Аналитика проектов и источников B4

Аналитика проектов показывает показатели проектов за выбранный период. Проект B4 может содержать много источников с разной эффективностью: для их сравнения запустите отдельный расчёт и получите все подходящие источники одним ответом.

Подготовьте доступ и период

Примеры используют Bash и curl. Получите JWT в ALITOS_EXTERNAL_JWT и выберите кабинет по быстрому старту. Замените фиктивный 123456789 точным cabinetId в виде строки, даты — своим периодом.

Для аналитики проектов нужен cabinet:read, для B4 — cabinet:exports:run. Если проходите оба сценария, ключ и JWT должны разрешать оба scope. Пользователю также нужны текущие права на соответствующее действие в кабинете. Добавить scope существующему ключу нельзя — см. авторизацию.

Оба метода принимают от 1 до 5 cabinetIds и даты YYYY-MM-DD. Начало и конец включаются в период; его длина не должна превышать 370 дней.

Аналитика проектов: запрос и ответ

curl --request POST 'https://api.alitos.io/v1/external/analytics/projects/query' \
  --header "Authorization: Bearer ${ALITOS_EXTERNAL_JWT}" \
  --header 'Content-Type: application/json' \
  --data '{
    "cabinetIds": ["123456789"],
    "dateFrom": "2026-09-01",
    "dateTo": "2026-09-30",
    "projectScope": "active",
    "metricPreset": "cabinet_overview",
    "rowMode": "top",
    "maxResults": 50
  }'

Ответ приходит сразу с HTTP 200; создавать или опрашивать операцию не нужно. Этот пример выбирает активные проекты и набор показателей cabinet_overview.

Читайте строки из projects, общие показатели — из totals, если они присутствуют. Сравнивайте totalProjects, returnedProjects и truncated: пример намеренно запрашивает не более 50 строк проектов и не обещает полный список. Обращайте внимание на dataQualityWarnings.

Для работы со статусами прочитайте GET /v1/external/cabinets/{cabinetId}/analytics-config с cabinet:read. В объекте config состав групп указан в summaryGroups, пользовательские названия — в statusLabelOverrides, доступные ключи — в supportedStatusKeys. Не приписывайте историческим именам вроде status12 фиксированный бизнес-смысл и не считайте отсутствие разметки доказательством отсутствия результата.

Другие наборы показателей, фильтры, сортировка и режимы строк описаны в OpenAPI.

B4: запустите расчёт всех подходящих источников

Сформируйте и сохраните новый Idempotency-Key для этого расчёта. Для команды ниже нужен Node.js; если ключ формирует ваша интеграция, используйте его:

IDEMPOTENCY_KEY="$(node -p 'crypto.randomUUID()')"

При повторе запуска не генерируйте ключ заново: сохраняйте исходные ключ, тело и reason. Запуск расчёта:

curl --include --request POST 'https://api.alitos.io/v1/external/analytics/sources/jobs' \
  --header "Authorization: Bearer ${ALITOS_EXTERNAL_JWT}" \
  --header 'Content-Type: application/json' \
  --header "Idempotency-Key: ${IDEMPOTENCY_KEY}" \
  --data '{
    "reason": "Анализ источников B4 за сентябрь",
    "cabinetIds": ["123456789"],
    "dateFrom": "2026-09-01",
    "dateTo": "2026-09-30",
    "projectScope": "active",
    "metricPreset": "b4_source_quality",
    "sourceRowsMode": "all"
  }'

Из ответа 202 Accepted сохраните operationId в OPERATION_ID. Заголовок Retry-After задаёт задержку перед следующим опросом.

sourceRowsMode: "all" возвращает все источники, подходящие под выбранные кабинеты, проекты, период и фильтры. Строки не обрезаются, даже если в запросе дополнительно указан положительный maxResults.

По умолчанию выбираются активные проекты, includeUnidentified=true включает неопознанные строки, а includeDeletedFromHistory=false не добавляет удалённые источники из истории. Для исследования истории выберите нужный projectScope (active, deleted или both) и явно задайте includeDeletedFromHistory=true. Полнота результата не отменяет выбранных условий отбора.

Дождитесь расчёта и получите результат

curl --include \
  "https://api.alitos.io/v1/external/operations/${OPERATION_ID}?view=compact" \
  --header "Authorization: Bearer ${ALITOS_EXTERNAL_JWT}"

При queued или running продолжайте опрос, соблюдая Retry-After и интервал не меньше двух секунд с небольшой случайной задержкой. При failed прочитайте error; правила повторов приведены в операциях и ошибках.

После succeeded получите все строки:

curl \
  "https://api.alitos.io/v1/external/operations/${OPERATION_ID}/result?view=all" \
  --header "Authorization: Bearer ${ALITOS_EXTERNAL_JWT}"

Массив rows содержит все сохранённые строки источников одним ответом, nextCursor равен null. Не передавайте cursor или pageSize: в view=all они запрещены. Этот режим предназначен только для B4. Перед чтением результата сервер заново проверяет доступ ко всем исходным кабинетам.

Для итогов и предупреждений отдельно запросите:

curl \
  "https://api.alitos.io/v1/external/operations/${OPERATION_ID}?view=compact&includeSummary=true" \
  --header "Authorization: Bearer ${ALITOS_EXTERNAL_JWT}"

В result находятся сводные данные, включая totalSources, returnedSources, scannedDeals, truncated и доступные предупреждения dataQualityWarnings. Сами строки источников находятся в ответе /result?view=all.

Когда нужен ограниченный результат

Для намеренного рейтинга используйте sourceRowsMode: "top" и положительный maxResults от 1 до 5000. Для итогов и групп без строк — sourceRowsMode: "none". По умолчанию maxResults=0 и includeSourceRows=true, поэтому без явного режима выбирается all. Для совместимости положительный maxResults без режима при включённых строках означает top, а includeSourceRows=false без переопределяющего режима — none.

Эти режимы выбора строк не заменяют проверку прав и не меняют исходные данные. Хранение результата, обновление JWT и ошибки чтения описаны в правилах операций.