ДАРА
Разделы документации

ДокументацияСправочник

Справочник API

Методы API v1 с параметрами, телами запросов, ответами и схемами данных — собирается из описания OpenAPI.

Справочник собирается из описания API при каждой выкладке, поэтому совпадает с работающим сервером. Машиночитаемая схема OpenAPI — /api/v1/openapi.json, без авторизации: по ней можно сгенерировать клиент или импортировать API в Postman и Insomnia.

Обязательные поля и параметры отмечены звёздочкой. Раздел «Вебхуки» описывает запросы ДАРА на ваш адрес: у них нет ключа, отправителя подтверждает подпись.

Правила и примеры интеграции — в руководствах: Объекты, Результаты анализа, События и заказы, Пользователи, Рекомендации, Поиск, Вебхуки, Ошибки и лимиты. Загрузка файлами идёт в кабинете и методов API не имеет — Импорт файлов.

Версия 4.0.8 · сервер https://core.daratech.ru · исходная схема — openapi.json

API ДАРА: объекты, события и заказы, пользователи, рекомендации, поиск и вебхуки.

Аутентификация — Authorization: Bearer <ключ проекта>; ключ в адресе не принимается. Формат — JSON в UTF-8, время — ISO-8601 с Z. Ошибки — {"error": {"code", "message", "details"?}}. Каждый ответ содержит X-Request-ID — сообщите его при обращении в поддержку.

Объекты

GET /api/v1/items/{id}

Объект с результатами анализа

Данные объекта, состояние обработки, медиа и сводка. Тяжёлые части — по include: transcript, frames, search_chunks через запятую. Удалённый объект отдаётся с deleted: true.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков
includeстрока запросаstring или nullТяжёлые части ответа через запятую: transcript — транскрипты речи медиа с фрагментами и временем; frames — кадры с описанием, метками, текстом на кадре, оценками безопасности и ссылкой на изображение; search_chunks — куски поиска (текст и время фрагментов). Например, transcript,frames

Ответы

КодКогдаТело
200ОбъектItemDetail
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Объект не найденErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

PUT /api/v1/items/{id}

Создать или заменить объект

Идемпотентная полная замена объекта. Непереданные поля очищаются, PUT удалённого объекта снимает удаление. Анализ перезапускается только для изменившихся частей: текст — сводка и векторы, медиа (url или version) — изменённые медиа и всё, что от них зависит.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков

Тело запроса

JSON: ItemPutRequest. Объект целиком

ПолеТипОписание
type *stringТип объекта
одно из: video, image, audio, text, mixed
titlestring или nullЗаголовок
до 1000 знаков
descriptionstring или nullОписание
до 20000 знаков
bodystring или nullОсновной текст (статья, пост)
до 1000000 знаков
authorstring или nullid автора у клиента: близость к автору и разнообразие выдачи
до 191 знаков
urlstring или nullСсылка на объект на сайте клиента
до 2048 знаков
published_atstring или nullВремя публикации ISO-8601; по умолчанию — время создания
propertiesobject или nullПроизвольные свойства до 16 КБ; фильтруемые свойства проекта — объявленного типа
mediaMediaIn[] или nullМедиа по порядку. Для video, image, audio обязательно хотя бы одно медиа своего вида; у text медиа нет
до 50 элементов
availablebooleanМожно ли показывать объект в выдаче; null не принимается
по умолчанию true

Ответы

КодКогдаТело
200Объект обновлёнItemWriteResponse
201Объект созданItemWriteResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

PATCH /api/v1/items/{id}

Изменить часть полей объекта

Переданные поля заменяются, null очищает поле; media и available не принимают null. type через PATCH не меняется. Правила переобработки — как у PUT. Удаление PATCH не снимает.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков

Тело запроса

JSON: ItemPatchRequest. Изменяемые поля

ПолеТипОписание
titlestring или nullЗаголовок; null очищает
до 1000 знаков
descriptionstring или nullОписание; null очищает
до 20000 знаков
bodystring или nullОсновной текст; null очищает
до 1000000 знаков
authorstring или nullid автора у клиента; null очищает
до 191 знаков
urlstring или nullСсылка на объект на сайте клиента; null очищает
до 2048 знаков
published_atstring или nullВремя публикации ISO-8601; null — время создания
propertiesobject или nullПроизвольные свойства целиком, до 16 КБ; null очищает
mediaMediaIn[]Новый список медиа целиком, по порядку; null не принимается
до 50 элементов
availablebooleanМожно ли показывать объект в выдаче; null не принимается

Ответы

КодКогдаТело
200Объект обновлёнItemWriteResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Объект не найденErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

DELETE /api/v1/items/{id}

Удалить объект

Мягкое удаление: объект навсегда исключается из выдачи и поиска, результаты анализа и события сохраняются и участвуют в профилях. Повторный DELETE тоже отвечает 200.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков

Ответы

КодКогдаТело
200Объект удалёнItemDeleteResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Объект не найденErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/items/batch

Пакет операций с объектами

До 500 операций put, patch, delete. Выполняются по порядку и независимо: ошибка одной не отменяет остальные. Больше лимита — 413 payload_too_large.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: BatchRequest. Операции

ПолеТипОписание
operations *BatchOperation[]До 500 операций, выполняются по порядку и независимо
до 500 элементов

Ответы

КодКогдаТело
200Результат по каждой операцииBatchResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

GET /api/v1/items

Список объектов для сверки

Объекты проекта по возрастанию updated_at, включая удалённые. Постраничный обход — cursor из next_cursor; объект, изменённый во время обхода, появится на последующих страницах снова.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
statusстрока запросаstring или nullСтатус объекта
одно из: queued, processing, ready, partial, failed, deferred
availableстрока запросаboolean или nullТолько доступные (true) или недоступные (false)
updated_sinceстрока запросаstring или nullИзменённые не раньше этого времени, ISO-8601
cursorстрока запросаstring или nullКурсор из next_cursor
до 512 знаков
limitстрока запросаintegerДо 500
от 1 до 500; по умолчанию 100

Ответы

КодКогдаТело
200Страница спискаItemListResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/items/{id}/reprocess

Переобработать объект

Шаги speech, vision, summary, embedding; без steps переобрабатывается всё, включая подготовку медиа. Зависимые шаги пересчитываются следом.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков

Тело запроса

JSON: ReprocessRequest — необязательно. Шаги

ПолеТипОписание
stepsstring[] или nullШаги; без steps переобрабатывается всё, включая подготовку медиа

Ответы

КодКогдаТело
202Переобработка поставлена в очередьItemWriteResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Объект не найденErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

GET /api/v1/items/{id}/subtitles

Субтитры медиа объекта

Файл субтитров WebVTT или SRT по транскрипту речи медиа на позиции media: реплики не длиннее 7 секунд, до 2 строк по 42 знака, короткие реплики объединяются. Ответ 200 — файл в UTF-8 без BOM (Content-Type: text/vtt; charset=utf-8 или application/x-subrip; charset=utf-8, Content-Disposition: inline), ошибки — JSON. Пустой транскрипт (музыка без слов) — файл без реплик; удалённый объект тоже отдаёт субтитры. 404 — нет объекта, медиа на этой позиции или транскрипта (речь ещё распознаётся, не выполняется, завершилась ошибкой, медиа — изображение). 503 с Retry-After: 1 — сейчас собирается слишком много файлов, повторите через секунду. id с символами вне [A-Za-z0-9._:-] субтитры через API не получает: пакетного метода нет.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
id *путьstringid объекта у клиента; в пути — только [A-Za-z0-9._:-], до 191 символа. Другие id — через пакет.
до 191 знаков
mediaстрока запросаintegerПозиция медиа в объекте, с 0 (media[].position в GET /items/{id}); по умолчанию 0
от 0 до 65535; по умолчанию 0
formatстрока запросаstringФормат файла: vtt — WebVTT, srt — SubRip; по умолчанию vtt
одно из: vtt, srt; по умолчанию vtt

Ответы

КодКогдаТело
200Файл субтитровфайл WebVTT text/vtt — string
файл SubRip (SRT) application/x-subrip — string
400Неверный id объекта в пути или параметры `media`, `format`ErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Нет объекта, медиа на этой позиции или транскрипта медиаErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна или сейчас собирается слишком много файлов субтитров; есть Retry-AfterErrorResponse

Пример ответа 200 · text/vtt

WEBVTT

00:00:01.200 --> 00:00:04.800
Добрый день! Сегодня расскажем,
как выбрать городской велосипед.

Пример ответа 200 · application/x-subrip

1
00:00:01,200 --> 00:00:04,800
Добрый день! Сегодня расскажем,
как выбрать городской велосипед.

События и заказы

GET /api/v1/event-types

Типы событий проекта

Коды, режимы, веса и флаги типов событий. Типы настраиваются в кабинете.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Ответы

КодКогдаТело
200Типы событийEventTypesResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/events

Принять события

До 1000 событий за запрос. События дедуплицируются по id: повтор отвечает в duplicates и ничего не меняет. Показы (is_impression) не хранятся поштучно, только агрегируются. Отклонённые события перечислены в rejected с кодом: unknown_type, inactive_type, unknown_item, no_user, invalid_user, invalid_value, too_old, order_managed. События по удалённым и недоступным объектам принимаются.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: EventsRequest. События

ПолеТипОписание
events *EventIn[]До 1000 событий
до 1000 элементов

Ответы

КодКогдаТело
202Пакет обработанEventsResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/orders

Передать заказ

Заказ раскладывается на события типа «покупка»: строка — событие с id o: + 32 hex SHA-256 от order_id и item. Строки одного товара складываются. Повтор того же order_id заменяет состав: новые строки добавляются, пропавшие отменяются. status=cancelled снимает вклад заказа. Товар вне каталога с title заводится недоступным объектом, без title строка отклоняется unknown_item. Нет типа «покупка» — 422 no_purchase_type.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: OrderIn. Заказ

ПолеТипОписание
order_id *stringid заказа, до 64 печатных символов ASCII; повтор заменяет состав
до 64 знаков
user *EndUserIdsПокупатель: хотя бы один из user_id, anonymous_id, fingerprint_uuid
occurred_atstring или nullВремя заказа ISO-8601; по умолчанию — время приёма, при повторе — прежнее время заказа
statusstring или nullcancelled снимает вклад всего заказа
одно из: created, cancelled; по умолчанию created
itemsOrderLineIn[] или nullДо 200 строк; для cancelled можно не передавать
до 200 элементов

Ответы

КодКогдаТело
202Заказ записанOrderResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/orders/batch

Пакет заказов

До 500 заказов и не больше 5000 строк в сумме — для переноса истории (даты до 730 дней назад). Заказы обрабатываются независимо, ответ — по каждому.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: OrdersBatchRequest. Заказы

ПолеТипОписание
orders *OrderIn[]До 500 заказов и не больше 5000 строк в сумме
до 500 элементов

Ответы

КодКогдаТело
202Результат по каждому заказуOrdersBatchResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

Пользователи

POST /api/v1/users/link

Склеить анонима с пользователем при входе

Переносит историю и данные профиля анонима (найденного по anonymous_id, а если его нет — по неспорному проверенному fingerprint_uuid) в пользователя user_id. Заполненные поля профиля пользователя не перезаписываются. Анонимная история, уже перенесённая одному пользователю, другому не переносится. fingerprint_uuid записывается как вход на устройстве.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: UserLinkRequest. Пользователь и идентификаторы устройства

ПолеТипОписание
user_id *stringАккаунт, в который вошёл пользователь
до 191 знаков
anonymous_idstring или nullБраузер или устройство до входа
до 191 знаков
fingerprint_uuidstring или nullvisitor_uuid DARA Fingerprint: записывается как вход на устройстве
analytics_idstring или nullИдентификатор посетителя ДАРА АНАЛИТИКИ (UUID): привязывается к пользователю, в которого идёт склейка

Ответы

КодКогдаТело
200Результат склейкиUserLinkResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

GET /api/v1/users/profile

Прочитать профиль пользователя

Поля профиля в том виде, в каком их хранит ДАРА, attributes и дата обновления каждого поля — для сверки интеграции. Пользователь ищется без создания и без узнавания; неизвестный — 404. При подключённой ДАРА АНАЛИТИКЕ у найденного в её сети пользователя добавляется блок network: это данные сети, а не данные клиента — они не заменяют поля профиля и не меняются POST /users/profile.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Параметры

ИмяГдеТипОписание
user_idстрока запросаstring или nullАккаунт у клиента
anonymous_idстрока запросаstring или nullБраузер или устройство
fingerprint_uuidстрока запросаstring или nullУстройство: visitor_uuid DARA Fingerprint

Ответы

КодКогдаТело
200ПрофильStoredProfile
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
404Пользователь не найденErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/users/profile

Записать данные о пользователе

Что клиент знает о пользователе: пол, год рождения или возраст, город, интересы, любимые и скрытые авторы, отказ от персонализации, произвольные атрибуты. Действия с объектами передаются событиями. Без user_id пишется анонимный профиль, даже если пользователь узнан без входа. Персональные данные в attributes — 422 pii_not_allowed.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: ProfileRequest. Пользователь и поля профиля

ПолеТипОписание
genderstring или nullПол
одно из: male, female
birth_yearinteger или nullОт 1900 до текущего года
от 1900
ageinteger или nullВместо birth_year: пересчитывается в год рождения
от 0 до 120
interestsstring[] или nullДо 50 строк до 200 знаков: интересы текстом на любом языке
до 50 элементов
excluded_interestsstring[] или null«Не интересно»
до 50 элементов
followed_authorsstring[] или nullid авторов: подписки
до 500 элементов
hidden_authorsstring[] или nullid авторов, которых не показывать
до 500 элементов
citystring или nullХранится в нижнем регистре без лишних пробелов
до 100 знаков
countrystring или nullСтрана: название или код
до 100 знаков
personalizationboolean или nullfalse — не персонализировать
attributesobject или nullЛюбые данные до 16 КБ, кроме персональных: ключи email, phone, name, first_name, last_name, middle_name, address, birth_date, passport на любой глубине — 422 pii_not_allowed
user *EndUserIdsПользователь: без user_id пишется анонимный профиль

Ответы

КодКогдаТело
200Профиль записанProfileResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/users/profile/batch

Пакет профилей

До 500 профилей в формате POST /users/profile, каждый обрабатывается независимо.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: ProfileBatchRequest. Профили

ПолеТипОписание
profiles *ProfileRequest[]До 500 профилей
до 500 элементов

Ответы

КодКогдаТело
200Результат по каждому профилюProfileBatchResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/users/delete

Удалить пользователя

Удаляет данные клиента о пользователе, идентификаторы, входы на устройствах, события, заказы, сигналы, профиль, снимки выдачи и данные ДАРА АНАЛИТИКИ о нём — сразу. В самой ДАРА АНАЛИТИКЕ при этом не удаляется ничего. Агрегаты статистики объектов остаются обезличенными.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: UserDeleteRequest. Пользователь

ПолеТипОписание
user *EndUserIdsПользователь: хотя бы один идентификатор

Ответы

КодКогдаТело
200Результат удаленияUserDeleteResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

Рекомендации

POST /api/v1/recommendations/feed

Лента рекомендаций

Персональная лента пользователя (mode=personal) или неперсональная по популярному, свежему и текущей сессии (cold). Первая страница (offset = 0) строит выдачу до 500 объектов и сохраняет её снимком на 30 минут; следующие страницы берутся из снимка этого же пользователя — без повторов, даже без recommendation_id. Передавайте одни и те же идентификаторы на всех страницах; первая страница без anonymous_id тоже продолжается. Выдача без user одинакова для всех в течение часа. Удалённые, недоступные и скрытые пользователем объекты не показываются; уже досмотренные — только в конце ленты, когда остальные закончились. Если служба не успевает ответить или индекс проекта загружается — запасная выдача (mode=fallback) по трендовому списку с фильтрами запроса; 503 — только когда отдать нечего.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: FeedRequest — необязательно. Параметры ленты; пустое тело — все параметры по умолчанию

ПолеТипОписание
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
limitintegerОбъектов на странице, 1–100
от 1 до 100; по умолчанию 24
offsetintegerСмещение, 0–1000. Страницы после первой продолжают тот же список без повторов
от 0 до 1000; по умолчанию 0
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
excludestring[] или nullid объектов, которые не показывать (уже на странице и т. п.), до 500
до 500 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта (настройки выдачи): "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter. Нет свойства у объекта — условие не выполнено, кроме not_in
recommendation_idstring или nullid выдачи первой страницы (ULID). Необязателен: без него страница берётся из последнего снимка этого пользователя с теми же параметрами

Ответы

КодКогдаТело
200Страница лентыFeedResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/recommendations/similar

Похожие объекты

Похожие на объект (item) или «дополните заказ» для корзины (items, до 20 id): близкие по содержанию, покупаемые или смотримые вместе, того же автора, по интересам пользователя. Для объекта, неизвестного ДАРА, — популярное (mode=fallback), а не ошибка. Пагинации нет: длина — limit.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: SimilarRequest. Исходные объекты и параметры

ПолеТипОписание
itemstring или nullid исходного объекта; объект, неизвестный ДАРА, — популярное, mode=fallback
до 191 знаков; от 1 знаков
itemsstring[] или nullКорзина: до 20 id; неизвестные id не учитываются
до 20 элементов
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
limitintegerОбъектов, 1–50
от 1 до 50; по умолчанию 8
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
excludestring[] или nullid объектов, которые не показывать (уже на странице и т. п.), до 500
до 500 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта (настройки выдачи): "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter. Нет свойства у объекта — условие не выполнено, кроме not_in

Ответы

КодКогдаТело
200Похожие объектыSimilarResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

POST /api/v1/recommendations/rerank

Переранжировать свои объекты

Упорядочивает переданные id по оценке ленты пользователя, без разнообразия и разведки. В ответе все переданные id: сначала по убыванию оценки, затем в исходном порядке с score: null — неизвестные ДАРА, удалённые, недоступные, без векторов, скрытые пользователем и повторы. Фильтры, скрытые авторы и возраст здесь не применяются. Больше 1000 id — 413.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: RerankRequest. Объекты и пользователь

ПолеТипОписание
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
items *string[]id объектов, 1–1000; больше — 413 payload_too_large
до 1000 элементов
filtersobject или nullПринимается для совместимости и не применяется

Ответы

КодКогдаТело
200Объекты по порядкуRerankResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело больше 5 МБ или больше 1000 idErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

Поиск

POST /api/v1/search

Поиск

Поиск по смыслу и словам: находит видео, аудио и тексты по речи, описанию и сводке, в том числе по фразе из середины длинного видео — matches показывает фрагменты со временем, откуда открыть плеер. Первая страница (offset = 0) ищет заново и сохраняет результаты снимком на 30 минут; следующие страницы берутся из снимка этого же пользователя без повторов. Скрытые пользователем объекты и авторы, возрастные ограничения, types и filters применяются. Если вектор запроса сейчас недоступен, порядок строится по словам, а matches пусты. 503 с Retry-After: 1 — поиск перегружен, Retry-After: 2 — служба недоступна.

Авторизация: ключ проекта в заголовке Authorization: Bearer ck_…

Тело запроса

JSON: SearchRequest. Запрос и параметры поиска

ПолеТипОписание
query *stringТекст запроса: до 500 знаков после схлопывания пробелов и обрезки краёв. Ищется по смыслу (речь, описание и текст объекта, его сводка) и по словам с учётом окончаний; служебные слова не обязательны
до 500 знаков; от 1 знаков
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Нужен, чтобы не показывать скрытое пользователем и учитывать его интересы; передавайте одни и те же id на всех страницах
limitintegerОбъектов на странице, 1–50
от 1 до 50; по умолчанию 20
offsetintegerСмещение, 0–500. Страницы после первой продолжают тот же список без повторов
от 0 до 500; по умолчанию 0
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта, как в ленте: "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter
recommendation_idstring или nullid результатов первой страницы (ULID). Необязателен: без него страница берётся из последнего поиска этого пользователя с тем же запросом и параметрами

Ответы

КодКогдаТело
200Страница результатов поискаSearchResponse
400Неверный JSON или параметрыErrorResponse
401Нет ключа, ключ неверен или отозванErrorResponse
403Клиент заблокирован или проект в архивеErrorResponse
413Тело или пакет больше лимитаErrorResponse
422Поля не прошли проверкуErrorResponse
429Превышен лимит частоты; есть Retry-AfterErrorResponse
503Служба недоступна; есть Retry-AfterErrorResponse

Вебхуки

POST item.processed

Обработка завершена

Объект перешёл в статус ready: все применимые шаги анализа завершены. Приходит при каждой новой обработке объекта, завершившейся статусом ready. Тело и подпись формируются заново на каждую попытку; редиректы не выполняются; доставка «не меньше одного раза» — повторы отбрасывайте по delivery_id.

Запрос от ДАРА на ваш адрес, подпись — X-Core-Signature

Заголовки

ИмяГдеТипОписание
X-Core-Event *заголовокstringСобытие — то же, что поле event тела
X-Core-Timestamp *заголовокstringВремя начала попытки, unix-секунды; входит в подпись. Запросы со старой отметкой можно отклонять
X-Core-Signature *заголовокstringПодпись: sha256= и hex HMAC-SHA256 от X-Core-Timestamp, точки и сырого тела запроса; ключ — секрет вебхука целиком (whsec_…). Сравнивайте в постоянное время
X-Core-Delivery *заголовокstringИдентификатор доставки — тот же, что поле delivery_id тела; одинаков у всех попыток

Тело запроса

JSON: WebhookPayload

ПолеТипОписание
event *stringСобытие: item.processed — обработка завершена; item.failed — обработка завершилась с ошибкой; webhook.test — проверка из кабинета. Совпадает с заголовком X-Core-Event
одно из: item.processed, item.failed, webhook.test
project_id *stringИдентификатор проекта — как в кабинете, 12 символов
sent_at *string (date-time)Время начала этой попытки, ISO-8601 UTC с миллисекундами; у каждой попытки своё
delivery_id *stringИдентификатор доставки: одинаков у всех попыток одного события и равен заголовку X-Core-Delivery — по нему отбрасываются повторы
item *WebhookItemОбъект, статус которого изменился

Ответы

КодКогдаТело
2XXДоставлено: любой ответ 2xx не позже 10 с—
defaultЛюбой другой ответ или нет ответа за 10 с — повтор по расписанию: через 1 мин, 5 мин, 30 мин, 2 ч, 6 ч, 12 ч, затем доставка отмечается неудачной—

POST item.failed

Обработка завершилась с ошибкой

Объект перешёл в статус partial (часть шагов с ошибкой, объект участвует в выдаче) или failed (объект не обработан); статус — в item.status. Одно событие на смену статуса, а не на каждый шаг. Тело и подпись формируются заново на каждую попытку; редиректы не выполняются; доставка «не меньше одного раза» — повторы отбрасывайте по delivery_id.

Запрос от ДАРА на ваш адрес, подпись — X-Core-Signature

Заголовки

ИмяГдеТипОписание
X-Core-Event *заголовокstringСобытие — то же, что поле event тела
X-Core-Timestamp *заголовокstringВремя начала попытки, unix-секунды; входит в подпись. Запросы со старой отметкой можно отклонять
X-Core-Signature *заголовокstringПодпись: sha256= и hex HMAC-SHA256 от X-Core-Timestamp, точки и сырого тела запроса; ключ — секрет вебхука целиком (whsec_…). Сравнивайте в постоянное время
X-Core-Delivery *заголовокstringИдентификатор доставки — тот же, что поле delivery_id тела; одинаков у всех попыток

Тело запроса

JSON: WebhookPayload

ПолеТипОписание
event *stringСобытие: item.processed — обработка завершена; item.failed — обработка завершилась с ошибкой; webhook.test — проверка из кабинета. Совпадает с заголовком X-Core-Event
одно из: item.processed, item.failed, webhook.test
project_id *stringИдентификатор проекта — как в кабинете, 12 символов
sent_at *string (date-time)Время начала этой попытки, ISO-8601 UTC с миллисекундами; у каждой попытки своё
delivery_id *stringИдентификатор доставки: одинаков у всех попыток одного события и равен заголовку X-Core-Delivery — по нему отбрасываются повторы
item *WebhookItemОбъект, статус которого изменился

Ответы

КодКогдаТело
2XXДоставлено: любой ответ 2xx не позже 10 с—
defaultЛюбой другой ответ или нет ответа за 10 с — повтор по расписанию: через 1 мин, 5 мин, 30 мин, 2 ч, 6 ч, 12 ч, затем доставка отмечается неудачной—

POST webhook.test

Проверка вебхука

Кнопка «Отправить тест» в кабинете: одна попытка без повторов, item.id — «webhook-test», статус ready. Подпись — как у остальных событий.

Запрос от ДАРА на ваш адрес, подпись — X-Core-Signature

Заголовки

ИмяГдеТипОписание
X-Core-Event *заголовокstringСобытие — то же, что поле event тела
X-Core-Timestamp *заголовокstringВремя начала попытки, unix-секунды; входит в подпись. Запросы со старой отметкой можно отклонять
X-Core-Signature *заголовокstringПодпись: sha256= и hex HMAC-SHA256 от X-Core-Timestamp, точки и сырого тела запроса; ключ — секрет вебхука целиком (whsec_…). Сравнивайте в постоянное время
X-Core-Delivery *заголовокstringИдентификатор доставки — тот же, что поле delivery_id тела; одинаков у всех попыток

Тело запроса

JSON: WebhookPayload

ПолеТипОписание
event *stringСобытие: item.processed — обработка завершена; item.failed — обработка завершилась с ошибкой; webhook.test — проверка из кабинета. Совпадает с заголовком X-Core-Event
одно из: item.processed, item.failed, webhook.test
project_id *stringИдентификатор проекта — как в кабинете, 12 символов
sent_at *string (date-time)Время начала этой попытки, ISO-8601 UTC с миллисекундами; у каждой попытки своё
delivery_id *stringИдентификатор доставки: одинаков у всех попыток одного события и равен заголовку X-Core-Delivery — по нему отбрасываются повторы
item *WebhookItemОбъект, статус которого изменился

Ответы

КодКогдаТело
2XXДоставлено: любой ответ 2xx не позже 10 с—
defaultЛюбой другой ответ или нет ответа за 10 с — повтор по расписанию: через 1 мин, 5 мин, 30 мин, 2 ч, 6 ч, 12 ч, затем доставка отмечается неудачной—

Служебное

GET /api/v1/health

Состояние службы

Отвечает ok или degraded (БД недоступна, очередь анализа перегружена, индекс выдачи не обновляется или таблицы кусков поиска не загружаются). Авторизация не нужна.

Без авторизации

Ответы

КодКогдаТело
200СостояниеHealthResponse

Схемы

BatchError

ПолеТипОписание
code *stringКод ошибки, как в ответе с ошибкой: validation_failed, not_found, internal
message *stringТекст ошибки по-русски
detailsErrorDetail[] или nullОшибки по полям

Пример

{
    "code": "not_found",
    "message": "Объект не найден"
}

BatchOperation

ПолеТипОписание
op *stringОперация: как PUT, PATCH или DELETE /items/{id}
одно из: put, patch, delete
id *stringid объекта — до 191 символа Unicode
до 191 знаков; от 1 знаков
dataobject или nullТело PUT или PATCH; для delete не нужно

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "data": {
        "available": false
    },
    "id": "def",
    "op": "patch"
}

BatchRequest

ПолеТипОписание
operations *BatchOperation[]До 500 операций, выполняются по порядку и независимо
до 500 элементов

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "operations": [
        {
            "data": {
                "title": "Заметка",
                "type": "text"
            },
            "id": "abc",
            "op": "put"
        },
        {
            "data": {
                "available": false
            },
            "id": "def",
            "op": "patch"
        },
        {
            "id": "old-1",
            "op": "delete"
        }
    ]
}

BatchResponse

ПолеТипОписание
results *BatchResult[]Результаты в порядке операций

Пример

{
    "results": [
        {
            "id": "abc",
            "ok": true,
            "status": "queued"
        },
        {
            "error": {
                "code": "not_found",
                "message": "Объект не найден"
            },
            "id": "def",
            "ok": false
        }
    ]
}

BatchResult

ПолеТипОписание
id *string или nullid объекта из операции; null, если он не строка
ok *booleanОперация выполнена
statusstring или nullСтатус объекта после put или patch
одно из: queued, processing, ready, partial, failed, deferred
errorBatchError или nullОшибка операции, если ok = false

Пример

{
    "id": "abc",
    "ok": true,
    "status": "queued"
}

EndUserIds

Идентификаторы конечного пользователя (ТЗ §8): хотя бы одно поле.

ПолеТипОписание
user_idstring или nullАккаунт у клиента, до 191 символа Unicode
до 191 знаков
anonymous_idstring или nullБраузер или устройство: до 191 печатного символа ASCII
до 191 знаков
fingerprint_uuidstring или nullvisitor_uuid DARA Fingerprint (UUID); учитывается только при подключённом DARA Fingerprint
analytics_idstring или nullИдентификатор посетителя ДАРА АНАЛИТИКИ (UUID, значение её cookie _dara_a): привязывается к пользователю запроса, но сам пользователя не определяет

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "anonymous_id": "b7f3c9",
    "user_id": "u-42"
}

ErrorDetail

Ошибка одного поля или параметра.

ПолеТипОписание
field *stringПоле тела (media[0].url, events[3].occurred_at) или параметр запроса
code *stringКод ошибки поля: required, invalid_type, invalid_value, too_long, unknown_field, unknown_filter, pii_not_allowed и другие
message *stringПояснение по-русски

Пример

{
    "code": "invalid_url",
    "field": "media[0].url",
    "message": "допустим только адрес https"
}

ErrorInfo

ПолеТипОписание
code *stringКод ошибки: invalid_request, unauthorized, forbidden, not_found, payload_too_large, validation_failed, rate_limited, internal, unavailable
message *stringТекст ошибки по-русски
detailsErrorDetail[] или nullОшибки по полям или параметрам; только у 400 и 422

ErrorResponse

ПолеТипОписание
error *ErrorInfoОшибка: код, текст и ошибки по полям

Пример

{
    "error": {
        "code": "validation_failed",
        "details": [
            {
                "code": "invalid_url",
                "field": "media[0].url",
                "message": "допустим только адрес https"
            }
        ],
        "message": "Поля не прошли проверку"
    }
}

EventIn

ПолеТипОписание
id *stringУникальный id события в проекте, до 64 печатных символов ASCII; повтор — дубль
до 64 знаков
type *stringКод типа события проекта (GET /event-types)
item *stringid объекта
до 191 знаков
user *EndUserIdsПользователь: хотя бы один из user_id, anonymous_id, fingerprint_uuid
valuenumber или nullpercent — 0…100; watch_seconds — секунды просмотра ≥ 0; number — любое число; для состояний 1 или 0 (по умолчанию 1); у типов без значения не учитывается
occurred_atstring или nullВремя события ISO-8601 с Z; по умолчанию — время приёма. Больше чем на 5 минут в будущем — время приёма; старше 730 дней — отказ too_old
recommendation_idstring или nullid выдачи, из которой пришёл пользователь
surfacestring или nullМесто показа: feed, next, …
до 16 знаков
positioninteger или nullПозиция в выдаче, с 0
от 0 до 65535
order_idstring или nullЗаказ: строки одного заказа образуют пары «вместе»
до 64 знаков
quantitynumber или nullКоличество в строке заказа
от 0
pricenumber или nullЦена за единицу
от 0

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "id": "evt-1001",
    "item": "v-123",
    "occurred_at": "2026-09-14T12:00:00.250Z",
    "position": 3,
    "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W3",
    "surface": "feed",
    "type": "watch",
    "user": {
        "user_id": "u-42"
    },
    "value": 184
}

EventRejection

ПолеТипОписание
index *integerНомер события в запросе, с 0
id *string или nullid события, если он строка
code *stringПричина: unknown_type — нет такого типа; inactive_type — тип выключен; unknown_item — нет объекта; no_user — пользователь не определён; invalid_user — неверные идентификаторы; invalid_value — неверное значение поля; too_old — старше 730 дней; order_managed — покупка по заказу передаётся через POST /orders
одно из: unknown_type, inactive_type, unknown_item, no_user, invalid_user, invalid_value, too_old, order_managed

EventTypeOut

ПолеТипОписание
code *stringКод типа: поле type события
title *stringНазвание типа
mode *stringfact — факты с окном дедупликации; max — наибольшее значение; state — последнее значение
одно из: fact, max, state
weight *numberВес в профиле; может быть отрицательным
value_kind *stringЗначение события: none — без значения; number — число; percent — 0…100; watch_seconds — секунды просмотра
одно из: none, number, percent, watch_seconds
value_map *object или nullПороги множителя по вовлечённости
dedup_window_sec *integerОкно дедупликации для fact, секунды
suppress_similar_days *integerСколько дней после события не показывать объект и похожие
is_impression *booleanПоказ: не хранится поштучно, только агрегируется
is_open *booleanОткрытие объекта: считается в метриках открытий
is_goal *booleanЦелевое действие: считается в метриках целей
is_purchase *booleanПокупка: строки заказов POST /orders пишутся этим типом
hides_item *booleanСкрывает объект из выдачи пользователя
is_active *booleanТип включён; события выключенного типа отклоняются inactive_type

EventTypesResponse

Тип: EventTypeOut[]

Пример

[
    {
        "code": "view",
        "dedup_window_sec": 86400,
        "hides_item": false,
        "is_active": true,
        "is_goal": false,
        "is_impression": false,
        "is_open": true,
        "is_purchase": false,
        "mode": "fact",
        "suppress_similar_days": 0,
        "title": "Открытие",
        "value_kind": "none",
        "weight": 0.2
    }
]

EventsRequest

ПолеТипОписание
events *EventIn[]До 1000 событий
до 1000 элементов

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "events": [
        {
            "id": "evt-1001",
            "item": "v-123",
            "occurred_at": "2026-09-14T12:00:00Z",
            "position": 0,
            "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W3",
            "surface": "feed",
            "type": "impression",
            "user": {
                "user_id": "u-42"
            }
        },
        {
            "id": "evt-1002",
            "item": "v-123",
            "occurred_at": "2026-09-14T12:00:03Z",
            "position": 0,
            "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W3",
            "surface": "feed",
            "type": "view",
            "user": {
                "user_id": "u-42"
            }
        },
        {
            "id": "evt-1003",
            "item": "v-123",
            "occurred_at": "2026-09-14T12:03:07.250Z",
            "type": "watch",
            "user": {
                "user_id": "u-42"
            },
            "value": 184
        },
        {
            "id": "evt-1004",
            "item": "v-77",
            "type": "like",
            "user": {
                "anonymous_id": "b7f3c9"
            },
            "value": 1
        }
    ]
}

EventsResponse

ПолеТипОписание
accepted *integerПринято новых событий
duplicates *integerУже присланные ранее (по id) — не учитываются повторно
rejected *EventRejection[]Отклонённые события с причиной

Пример

{
    "accepted": 998,
    "duplicates": 1,
    "rejected": [
        {
            "code": "unknown_item",
            "id": "evt-1018",
            "index": 17
        }
    ]
}

FeedItem

ПолеТипОписание
id *stringid объекта у клиента
score *numberОценка объекта, 4 знака; в fallback — трендовость или популярность объекта
reason *stringПочему объект в выдаче: interest — интересы; session — текущая сессия; together — вместе с понравившимся; author — близкий автор; trending — в тренде; fresh — новое; popular — популярное; segment — популярное у похожих пользователей
одно из: interest, session, together, author, trending, fresh, popular, segment

FeedRequest

Лента: первая страница (offset = 0) строит новую выдачу, следующие берутся из снимка выдачи.

ПолеТипОписание
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
limitintegerОбъектов на странице, 1–100
от 1 до 100; по умолчанию 24
offsetintegerСмещение, 0–1000. Страницы после первой продолжают тот же список без повторов
от 0 до 1000; по умолчанию 0
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
excludestring[] или nullid объектов, которые не показывать (уже на странице и т. п.), до 500
до 500 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта (настройки выдачи): "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter. Нет свойства у объекта — условие не выполнено, кроме not_in
recommendation_idstring или nullid выдачи первой страницы (ULID). Необязателен: без него страница берётся из последнего снимка этого пользователя с теми же параметрами

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "exclude": [
        "v-17"
    ],
    "filters": {
        "category": {
            "in": [
                "sport",
                "travel"
            ]
        }
    },
    "limit": 24,
    "offset": 0,
    "user": {
        "anonymous_id": "b7f3c9",
        "user_id": "u-42"
    }
}

FeedResponse

ПолеТипОписание
recommendation_id *stringid выдачи (ULID): передавайте в событиях показа, открытия и цели
items *FeedItem[]Объекты по порядку; страница может быть короче limit, если объекты успели удалить или скрыть
has_more *booleanЕсть ли следующая страница: offset + limit меньше длины выдачи
mode *stringpersonal — по профилю пользователя; cold — по популярному, свежему и текущей сессии; fallback — запасная выдача (служба не успела или индекс проекта загружается)
одно из: personal, cold, fallback
identity *stringКак определён пользователь: user — по user_id; recognized — узнан без входа (DARA Fingerprint); anonymous — по anonymous_id или fingerprint_uuid; none — без user
одно из: user, recognized, anonymous, none

Пример

{
    "has_more": true,
    "identity": "user",
    "items": [
        {
            "id": "v-123",
            "reason": "interest",
            "score": 0.8123
        },
        {
            "id": "v-77",
            "reason": "trending",
            "score": 0.6402
        }
    ],
    "mode": "personal",
    "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W3"
}

FrameOut

ПолеТипОписание
media_position *integerПозиция медиа в объекте, с 0
ts *numberВремя кадра, секунды
duplicate_of_tsnumber или nullВремя исходного кадра, если это дубль
descriptionstring или nullОписание кадра
tagsstring[] или nullМетки кадра
ocr_textstring или nullТекст на кадре
safetyobject или nullОценки безопасности кадра 0…1 по категориям
image_urlstring или nullПодписанная ссылка на 1 час

HealthResponse

ПолеТипОписание
status *stringok — служба работает; degraded — БД недоступна, очередь анализа перегружена, индекс выдачи или таблицы поиска не обновляются
одно из: ok, degraded

Пример

{
    "status": "ok"
}

ItemDeleteResponse

ПолеТипОписание
id *stringid объекта у клиента
deleted *booleanВсегда true

Пример

{
    "deleted": true,
    "id": "abc"
}

ItemDetail

Объект с результатами анализа; transcript, frames, search_chunks — только по include.

ПолеТипОписание
id *stringid объекта у клиента
type *stringТип объекта
одно из: video, image, audio, text, mixed
titlestring или nullЗаголовок
descriptionstring или nullОписание
authorstring или nullid автора у клиента
urlstring или nullСсылка на объект на сайте клиента
published_atstring или nullВремя публикации, ISO-8601 с Z
propertiesobject или nullСвойства, как прислал клиент
origin *stringОткуда объект: api, import — файл импорта, order — товар вне каталога из заказа
одно из: api, import, order
available *booleanМожно ли показывать объект в выдаче
deleted *booleanОбъект удалён (результаты анализа сохраняются)
status *stringСтатус объекта: queued — в очереди, processing — обрабатывается, ready — готов, partial — готов частично (часть шагов с ошибкой), failed — ошибка, deferred — анализ медиа отложен до available: true
одно из: queued, processing, ready, partial, failed, deferred
processing *ProcessingСостояние шагов анализа
updated_at *stringВремя последнего изменения, ISO-8601 с миллисекундами
media *MediaOut[]Медиа по порядку
summarySummaryOut или nullСводка; null — ещё нет или не выполняется
transcriptTranscriptOut[] или nullПри include=transcript
framesFrameOut[] или nullПри include=frames
search_chunksSearchChunkOut[] или nullПри include=search_chunks

Пример

{
    "author": "channel-42",
    "available": true,
    "deleted": false,
    "description": "Обзор городских моделей",
    "id": "v-123",
    "media": [
        {
            "duration_sec": 312.48,
            "height": 1080,
            "kind": "video",
            "position": 0,
            "status": "ready",
            "url": "https://cdn.example.ru/v-123.mp4",
            "width": 1920
        }
    ],
    "origin": "api",
    "processing": {
        "embedding": "done",
        "prepare": "done",
        "speech": "done",
        "summary": "done",
        "vision": "done"
    },
    "properties": {
        "category": "sport"
    },
    "published_at": "2026-09-14T12:00:00Z",
    "status": "ready",
    "summary": {
        "age_rating": "0+",
        "description": "Обзор городских велосипедов: рама, передачи, тормоза.",
        "entities": [
            {
                "name": "Москва",
                "type": "place"
            }
        ],
        "language": "ru",
        "moderation": {
            "categories": {
                "adult": 0,
                "drugs": 0,
                "extremism": 0,
                "gambling": 0,
                "gore": 0,
                "hate": 0,
                "self_harm": 0,
                "spam": 0.01,
                "violence": 0,
                "weapons": 0
            },
            "evidence": [],
            "level": "none"
        },
        "summary": "Ведущий сравнивает городские велосипеды и объясняет, как подобрать раму по росту.",
        "tags": [
            "велосипед",
            "обзор",
            "рама",
            "передачи",
            "тормоза"
        ],
        "topics": [
            "велосипеды",
            "городской транспорт",
            "выбор снаряжения"
        ]
    },
    "title": "Как выбрать велосипед",
    "transcript": [
        {
            "language": "ru",
            "media_position": 0,
            "segments": [
                {
                    "end": 4.8,
                    "start": 1.2,
                    "text": "Добрый день! Сегодня расскажем, как выбрать городской велосипед."
                }
            ],
            "text": "Добрый день! Сегодня расскажем, как выбрать городской велосипед.",
            "timestamps": "model"
        }
    ],
    "type": "video",
    "updated_at": "2026-09-14T12:06:41.512Z",
    "url": "https://example.ru/v/v-123"
}

ItemListEntry

ПолеТипОписание
id *stringid объекта у клиента
status *stringСтатус объекта
одно из: queued, processing, ready, partial, failed, deferred
available *booleanМожно ли показывать объект в выдаче
deleted *booleanОбъект удалён
updated_at *stringВремя последнего изменения, ISO-8601 с миллисекундами

ItemListResponse

ПолеТипОписание
items *ItemListEntry[]Объекты страницы по возрастанию updated_at
next_cursor *string или nullКурсор следующей страницы; null — страниц больше нет

Пример

{
    "items": [
        {
            "available": true,
            "deleted": false,
            "id": "abc",
            "status": "ready",
            "updated_at": "2026-09-14T12:00:00.123Z"
        }
    ]
}

ItemPatchRequest

Частичное обновление: переданные поля заменяются, null очищает поле, кроме media и available; type не меняется.

ПолеТипОписание
titlestring или nullЗаголовок; null очищает
до 1000 знаков
descriptionstring или nullОписание; null очищает
до 20000 знаков
bodystring или nullОсновной текст; null очищает
до 1000000 знаков
authorstring или nullid автора у клиента; null очищает
до 191 знаков
urlstring или nullСсылка на объект на сайте клиента; null очищает
до 2048 знаков
published_atstring или nullВремя публикации ISO-8601; null — время создания
propertiesobject или nullПроизвольные свойства целиком, до 16 КБ; null очищает
mediaMediaIn[]Новый список медиа целиком, по порядку; null не принимается
до 50 элементов
availablebooleanМожно ли показывать объект в выдаче; null не принимается

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "available": false
}

ItemPutRequest

Объект целиком. Непереданные поля очищаются.

ПолеТипОписание
type *stringТип объекта
одно из: video, image, audio, text, mixed
titlestring или nullЗаголовок
до 1000 знаков
descriptionstring или nullОписание
до 20000 знаков
bodystring или nullОсновной текст (статья, пост)
до 1000000 знаков
authorstring или nullid автора у клиента: близость к автору и разнообразие выдачи
до 191 знаков
urlstring или nullСсылка на объект на сайте клиента
до 2048 знаков
published_atstring или nullВремя публикации ISO-8601; по умолчанию — время создания
propertiesobject или nullПроизвольные свойства до 16 КБ; фильтруемые свойства проекта — объявленного типа
mediaMediaIn[] или nullМедиа по порядку. Для video, image, audio обязательно хотя бы одно медиа своего вида; у text медиа нет
до 50 элементов
availablebooleanМожно ли показывать объект в выдаче; null не принимается
по умолчанию true

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "author": "channel-42",
    "available": true,
    "description": "Обзор городских моделей",
    "media": [
        {
            "kind": "video",
            "url": "https://cdn.example.ru/abc.mp4",
            "version": "1"
        }
    ],
    "properties": {
        "category": "sport"
    },
    "published_at": "2026-09-14T12:00:00Z",
    "title": "Как выбрать велосипед",
    "type": "video",
    "url": "https://example.ru/v/abc"
}

ItemWriteResponse

ПолеТипОписание
id *stringid объекта у клиента
status *stringСтатус объекта: queued — в очереди, processing — обрабатывается, ready — готов, partial — готов частично (часть шагов с ошибкой), failed — ошибка, deferred — анализ медиа отложен до available: true
одно из: queued, processing, ready, partial, failed, deferred
available *booleanМожно ли показывать объект в выдаче
deleted *booleanОбъект удалён
processing *ProcessingСостояние шагов анализа

Пример

{
    "available": true,
    "deleted": false,
    "id": "abc",
    "processing": {
        "embedding": "queued",
        "prepare": "queued",
        "speech": "queued",
        "summary": "queued",
        "vision": "queued"
    },
    "status": "queued"
}

MediaIn

ПолеТипОписание
kind *stringВид медиа
одно из: video, audio, image
url *stringАдрес https, откуда ДАРА заберёт медиа: файл целиком или плейлист HLS (.m3u8, с 4.0.4)
до 2048 знаков
versionstring или nullВерсия от клиента: изменилась — медиа переобрабатывается
до 64 знаков

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "kind": "video",
    "url": "https://cdn.example.ru/abc.mp4",
    "version": "1"
}

MediaOut

ПолеТипОписание
position *integerПозиция медиа в объекте, с 0 (параметр media субтитров)
kind *stringВид медиа
одно из: video, audio, image
url *stringАдрес медиа, присланный клиентом
duration_secnumber или nullДлительность видео или аудио, секунды
widthinteger или nullШирина кадра или изображения, пиксели
heightinteger или nullВысота кадра или изображения, пиксели
status *stringnew — ещё не подготовлено, ready — подготовлено, failed — не удалось загрузить или прочитать
одно из: new, ready, failed

Пример

{
    "duration_sec": 312.48,
    "height": 1080,
    "kind": "video",
    "position": 0,
    "status": "ready",
    "url": "https://cdn.example.ru/abc.mp4",
    "width": 1920
}

Moderation

ПолеТипОписание
levelstring или nullУровень риска по наибольшей оценке категорий
одно из: none, low, medium, high
categoriesobject или nullОценки 0…1 по категориям: adult, violence, gore, weapons, drugs, extremism, hate, self_harm, gambling, spam
evidenceobject[] или nullДоказательства, до 10: {source: speech|frame|text, ts, quote, category}

NetworkChild

ПолеТипОписание
age_group *stringВозрастная группа ребёнка
одно из: 0_2, 3_6, 7_10, 11_13, 14_17

NetworkCompany

ПолеТипОписание
type *stringlegal — организация, individual — предприниматель
одно из: legal, individual
industry *string или nullОтрасль организации
region *string или nullРегион организации: её адрес, а не место человека

NetworkData

ПолеТипОписание
status *stringfound — человек найден в сети ДАРА АНАЛИТИКИ
всегда found
genderstring или nullПол по данным сети
одно из: male, female
gender_confidencenumber или nullУверенность в поле, от 0 до 1
age_groupstring или nullВозрастная группа: lt14, 14_17, 18_24, 25_34, 35_44, 45_54, 55_64 или 65p; года рождения в данных сети нет
countrystring или nullСтрана кодом ISO 3166-1 alpha-2
regionstring или nullРегион в нижнем регистре
citystring или nullГород в нижнем регистре
childrenNetworkChild[] или nullВозрастные группы детей
companyNetworkCompany или nullОрганизация человека
interestsNetworkInterest[] или nullТемы интересов по убыванию доли
purchasesNetworkPurchase[] или nullКатегории покупок
checked_at *stringКогда данные сети проверялись в последний раз

Пример

{
    "age_group": "25_34",
    "checked_at": "2026-09-24T10:00:00Z",
    "children": [
        {
            "age_group": "3_6"
        }
    ],
    "city": "нижний новгород",
    "company": {
        "industry": "Торговля",
        "region": "Москва",
        "type": "legal"
    },
    "country": "RU",
    "gender": "female",
    "gender_confidence": 0.95,
    "interests": [
        {
            "path": "Дом > Ремонт",
            "sensitive": false,
            "share": 0.6,
            "topic_id": 11
        }
    ],
    "purchases": [
        {
            "category_id": 5,
            "path": "Дом > Мебель",
            "segment": "mid"
        }
    ],
    "region": "нижегородская область",
    "status": "found"
}

NetworkInterest

ПолеТипОписание
topic_id *integerid темы в справочнике ДАРА АНАЛИТИКИ
path *stringПуть темы в справочнике
share *numberДоля темы среди интересов человека
sensitive *booleanЧувствительная тема: такие не отдаются, пока ДАРА АНАЛИТИКА не разрешила передачу

NetworkPurchase

ПолеТипОписание
category_id *integerid категории в справочнике ДАРА АНАЛИТИКИ
path *stringПуть категории в справочнике
segment *string или nullЦеновой сегмент покупок в категории
одно из: low, mid, high

OrderIn

ПолеТипОписание
order_id *stringid заказа, до 64 печатных символов ASCII; повтор заменяет состав
до 64 знаков
user *EndUserIdsПокупатель: хотя бы один из user_id, anonymous_id, fingerprint_uuid
occurred_atstring или nullВремя заказа ISO-8601; по умолчанию — время приёма, при повторе — прежнее время заказа
statusstring или nullcancelled снимает вклад всего заказа
одно из: created, cancelled; по умолчанию created
itemsOrderLineIn[] или nullДо 200 строк; для cancelled можно не передавать
до 200 элементов

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "items": [
        {
            "item": "sku-1",
            "price": 990,
            "quantity": 2
        },
        {
            "item": "sku-2",
            "price": 450
        },
        {
            "item": "sku-new",
            "properties": {
                "brand": "Дом"
            },
            "title": "Кружка керамическая"
        }
    ],
    "occurred_at": "2026-09-14T12:00:00Z",
    "order_id": "A-100500",
    "user": {
        "user_id": "u-42"
    }
}

OrderLineIn

ПолеТипОписание
item *stringid объекта (товара)
до 191 знаков
quantitynumber или nullКоличество, по умолчанию 1
pricenumber или nullЦена за единицу
от 0
titlestring или nullНазвание: товара нет в каталоге — заводится недоступный объект
до 1000 знаков
propertiesobject или nullСвойства для такого объекта, до 16 КБ

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

OrderLineRejection

ПолеТипОписание
index *integerНомер строки в items, с 0
item *string или nullid объекта строки, если он строка
code *stringunknown_item — товара нет в каталоге и нет title; invalid_value — неверное значение строки
одно из: unknown_item, invalid_value

OrderResponse

ПолеТипОписание
order_id *stringid заказа
accepted *integerПринято строк
rejected *OrderLineRejection[]Отклонённые строки с причиной

Пример

{
    "accepted": 2,
    "order_id": "A-100500",
    "rejected": [
        {
            "code": "unknown_item",
            "index": 2,
            "item": "sku-x"
        }
    ]
}

OrdersBatchRequest

ПолеТипОписание
orders *OrderIn[]До 500 заказов и не больше 5000 строк в сумме
до 500 элементов

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "orders": [
        {
            "items": [
                {
                    "item": "sku-1",
                    "price": 990,
                    "quantity": 2
                },
                {
                    "item": "sku-2",
                    "price": 450
                }
            ],
            "occurred_at": "2026-03-02T09:15:00Z",
            "order_id": "A-100500",
            "user": {
                "user_id": "u-42"
            }
        },
        {
            "items": [
                {
                    "item": "sku-2",
                    "price": 450,
                    "quantity": 1
                },
                {
                    "item": "sku-archive-7",
                    "price": 1290,
                    "title": "Термос 0,5 л"
                }
            ],
            "occurred_at": "2026-03-05T18:40:00Z",
            "order_id": "A-100501",
            "user": {
                "user_id": "u-43"
            }
        },
        {
            "occurred_at": "2026-02-11T10:00:00Z",
            "order_id": "A-100377",
            "status": "cancelled",
            "user": {
                "user_id": "u-42"
            }
        }
    ]
}

OrdersBatchResponse

ПолеТипОписание
results *OrdersBatchResult[]Результаты в порядке заказов

Пример

{
    "results": [
        {
            "accepted": 3,
            "index": 0,
            "ok": true,
            "order_id": "A-1",
            "rejected": []
        },
        {
            "error": {
                "code": "validation_failed",
                "details": [
                    {
                        "code": "too_old",
                        "field": "occurred_at",
                        "message": "заказ старше 730 дней"
                    }
                ],
                "message": "Поля не прошли проверку"
            },
            "index": 1,
            "ok": false,
            "order_id": "A-2"
        }
    ]
}

OrdersBatchResult

ПолеТипОписание
index *integerНомер заказа в запросе, с 0
order_id *string или nullid заказа, если он строка
ok *booleanЗаказ записан
acceptedinteger или nullПринято строк, если ok = true
rejectedOrderLineRejection[] или nullОтклонённые строки, если ok = true
errorBatchError или nullОшибка заказа, если ok = false

Processing

Состояние публичных шагов анализа.

ПолеТипОписание
prepare *stringПодготовка медиа: загрузка, проверка, звук и кадры. queued, running, done, skipped (шаг не нужен или отключён), failed, deferred (отложен до available: true), waiting (ждёт лимита, модели или внешней службы)
одно из: queued, running, done, skipped, failed, deferred, waiting
speech *stringРаспознавание речи
одно из: queued, running, done, skipped, failed, deferred, waiting
vision *stringАнализ кадров
одно из: queued, running, done, skipped, failed, deferred, waiting
summary *stringСводка: описание, темы, теги, модерация
одно из: queued, running, done, skipped, failed, deferred, waiting
embedding *stringВекторы для выдачи и поиска; пока не готовы куски поиска — их состояние
одно из: queued, running, done, skipped, failed, deferred, waiting

Пример

{
    "embedding": "done",
    "prepare": "done",
    "speech": "running",
    "summary": "queued",
    "vision": "done"
}

ProfileBatchRequest

ПолеТипОписание
profiles *ProfileRequest[]До 500 профилей
до 500 элементов

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "profiles": [
        {
            "birth_year": 1997,
            "city": "Казань",
            "gender": "female",
            "interests": [
                "горные велосипеды",
                "фотография"
            ],
            "user": {
                "user_id": "u-42"
            }
        },
        {
            "age": 35,
            "followed_authors": [
                "channel-7"
            ],
            "hidden_authors": [
                "channel-13"
            ],
            "user": {
                "user_id": "u-43"
            }
        },
        {
            "attributes": {
                "tier": "silver"
            },
            "personalization": false,
            "user": {
                "user_id": "u-44"
            }
        }
    ]
}

ProfileBatchResponse

ПолеТипОписание
results *ProfileBatchResult[]Результаты в порядке профилей

Пример

{
    "results": [
        {
            "index": 0,
            "ok": true
        },
        {
            "error": {
                "code": "validation_failed",
                "details": [
                    {
                        "code": "pii_not_allowed",
                        "field": "attributes.email",
                        "message": "персональные данные не принимаются"
                    }
                ],
                "message": "Поля не прошли проверку"
            },
            "index": 1,
            "ok": false
        }
    ]
}

ProfileBatchResult

ПолеТипОписание
index *integerНомер профиля в запросе, с 0
ok *booleanПрофиль записан
errorBatchError или nullОшибка профиля, если ok = false

ProfileRequest

Переданные поля заменяются, null очищает поле, непереданные не меняются.

ПолеТипОписание
genderstring или nullПол
одно из: male, female
birth_yearinteger или nullОт 1900 до текущего года
от 1900
ageinteger или nullВместо birth_year: пересчитывается в год рождения
от 0 до 120
interestsstring[] или nullДо 50 строк до 200 знаков: интересы текстом на любом языке
до 50 элементов
excluded_interestsstring[] или null«Не интересно»
до 50 элементов
followed_authorsstring[] или nullid авторов: подписки
до 500 элементов
hidden_authorsstring[] или nullid авторов, которых не показывать
до 500 элементов
citystring или nullХранится в нижнем регистре без лишних пробелов
до 100 знаков
countrystring или nullСтрана: название или код
до 100 знаков
personalizationboolean или nullfalse — не персонализировать
attributesobject или nullЛюбые данные до 16 КБ, кроме персональных: ключи email, phone, name, first_name, last_name, middle_name, address, birth_date, passport на любой глубине — 422 pii_not_allowed
user *EndUserIdsПользователь: без user_id пишется анонимный профиль

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "age": 29,
    "attributes": {
        "subscriptions": 3,
        "tier": "gold"
    },
    "city": "Казань",
    "followed_authors": [
        "channel-7"
    ],
    "gender": "female",
    "interests": [
        "горные велосипеды",
        "фотография"
    ],
    "user": {
        "user_id": "u-42"
    }
}

ProfileResponse

ПолеТипОписание
identity *stringЧей профиль записан: user — по user_id, anonymous — анонима
одно из: user, anonymous
updated_fields *string[]Поля, значение которых изменилось

Пример

{
    "identity": "user",
    "updated_fields": [
        "gender",
        "birth_year"
    ]
}

RecommendationUser

Идентификаторы пользователя (ТЗ §8): хотя бы одно поле.

ПолеТипОписание
user_idstring или nullАккаунт у клиента, до 191 символа Unicode
до 191 знаков
anonymous_idstring или nullБраузер или устройство: до 191 печатного символа ASCII
до 191 знаков
fingerprint_uuidstring или nullvisitor_uuid DARA Fingerprint (UUID); учитывается только при подключённом DARA Fingerprint
analytics_idstring или nullИдентификатор посетителя ДАРА АНАЛИТИКИ (UUID): принимается, но пользователя не определяет и запросом выдачи не привязывается — выдача ничего не пишет

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "anonymous_id": "b7f3c9",
    "user_id": "u-42"
}

ReprocessRequest

ПолеТипОписание
stepsstring[] или nullШаги; без steps переобрабатывается всё, включая подготовку медиа

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "steps": [
        "summary",
        "embedding"
    ]
}

RerankItem

ПолеТипОписание
id *stringid объекта из запроса
score *number или nullОценка, 4 знака; null — объект не ранжируется: неизвестен ДАРА, удалён, недоступен, без векторов, скрыт пользователем или повтор id

RerankRequest

Упорядочить свои id по оценке ленты пользователя.

ПолеТипОписание
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
items *string[]id объектов, 1–1000; больше — 413 payload_too_large
до 1000 элементов
filtersobject или nullПринимается для совместимости и не применяется

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "items": [
        "v-5",
        "v-9",
        "v-12"
    ],
    "user": {
        "user_id": "u-42"
    }
}

RerankResponse

ПолеТипОписание
recommendation_id *stringid выдачи (ULID)
items *RerankItem[]Все переданные id: сначала по убыванию оценки, затем в исходном порядке без оценки
identity *stringКак определён пользователь: user — по user_id; recognized — узнан без входа (DARA Fingerprint); anonymous — по anonymous_id или fingerprint_uuid; none — без user
одно из: user, recognized, anonymous, none

Пример

{
    "identity": "user",
    "items": [
        {
            "id": "v-9",
            "score": 0.5521
        },
        {
            "id": "v-5",
            "score": 0.4108
        },
        {
            "id": "v-12"
        }
    ],
    "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W5"
}

SearchChunkOut

ПолеТипОписание
media_positioninteger или nullПозиция медиа; нет — кусок текста или сводки
start_secnumber или nullНачало фрагмента в медиа, секунды
end_secnumber или nullКонец фрагмента, секунды
text *stringТекст куска

SearchItem

Найденный объект.

ПолеТипОписание
id *stringid объекта у клиента
score *numberОценка соответствия запросу, 4 знака; сравнивайте только внутри одного ответа
matches *SearchMatch[]До 3 фрагментов, по убыванию близости; пусто — у объекта нет фрагментов или они сейчас недоступны (порядок результатов от этого не меняется)
до 3 элементов

SearchMatch

Фрагмент объекта, близкий к запросу. Поля без значения не передаются.

ПолеТипОписание
media_positioninteger или nullНомер медиа объекта (с 0), к которому относится фрагмент; нет — фрагмент текста или описания объекта
start_secnumber или nullНачало фрагмента в медиа, секунды (оценка по транскрипту): откройте плеер с этого места
end_secnumber или nullКонец фрагмента в медиа, секунды
text *stringТекст фрагмента — не длиннее 2000 знаков
до 2000 знаков

Пример

{
    "end_sec": 675.5,
    "media_position": 0,
    "start_sec": 585,
    "text": "…и теперь добавляем свёклу…"
}

SearchRequest

Поиск: первая страница (offset = 0) ищет заново, следующие берутся из снимка результатов.

ПолеТипОписание
query *stringТекст запроса: до 500 знаков после схлопывания пробелов и обрезки краёв. Ищется по смыслу (речь, описание и текст объекта, его сводка) и по словам с учётом окончаний; служебные слова не обязательны
до 500 знаков; от 1 знаков
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Нужен, чтобы не показывать скрытое пользователем и учитывать его интересы; передавайте одни и те же id на всех страницах
limitintegerОбъектов на странице, 1–50
от 1 до 50; по умолчанию 20
offsetintegerСмещение, 0–500. Страницы после первой продолжают тот же список без повторов
от 0 до 500; по умолчанию 0
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта, как в ленте: "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter
recommendation_idstring или nullid результатов первой страницы (ULID). Необязателен: без него страница берётся из последнего поиска этого пользователя с тем же запросом и параметрами

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "filters": {
        "category": {
            "in": [
                "food"
            ]
        }
    },
    "limit": 20,
    "offset": 0,
    "query": "как приготовить борщ",
    "types": [
        "video",
        "text"
    ],
    "user": {
        "anonymous_id": "b7f3c9",
        "user_id": "u-42"
    }
}

SearchResponse

Страница результатов поиска.

ПолеТипОписание
recommendation_id *stringid результатов (ULID): передавайте в событиях показа, открытия и цели с surface: "search"
items *SearchItem[]Объекты по убыванию оценки; страница может быть короче limit, если объекты успели удалить или скрыть
has_more *booleanЕсть ли следующая страница: offset + limit меньше длины результатов
identity *stringКак определён пользователь: user — по user_id; recognized — узнан без входа (DARA Fingerprint); anonymous — по anonymous_id или fingerprint_uuid; none — без user
одно из: user, recognized, anonymous, none

Пример

{
    "has_more": true,
    "identity": "user",
    "items": [
        {
            "id": "v-123",
            "matches": [
                {
                    "end_sec": 675.5,
                    "media_position": 0,
                    "start_sec": 585,
                    "text": "…и теперь добавляем свёклу…"
                }
            ],
            "score": 1.2841
        },
        {
            "id": "a-7",
            "matches": [],
            "score": 0.9312
        }
    ],
    "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W6"
}

SimilarItem

ПолеТипОписание
id *stringid объекта у клиента
score *numberОценка объекта, 4 знака; в fallback — популярность или трендовость объекта
reason *stringsimilar — близок по содержанию; together — покупают или смотрят вместе; author — тот же автор; interest — интересы пользователя; popular — популярное; trending — в тренде (запасная выдача)
одно из: similar, together, author, interest, popular, trending

SimilarRequest

Похожие на объект (item) или «дополните заказ» для корзины (items): ровно одно из двух полей.

ПолеТипОписание
itemstring или nullid исходного объекта; объект, неизвестный ДАРА, — популярное, mode=fallback
до 191 знаков; от 1 знаков
itemsstring[] или nullКорзина: до 20 id; неизвестные id не учитываются
до 20 элементов
userRecommendationUser или nullПользователь, как в событиях: хотя бы один id. Без user выдача неперсональная и одинакова для всех в течение часа. Передавайте одни и те же id на всех страницах
limitintegerОбъектов, 1–50
от 1 до 50; по умолчанию 8
typesstring[] или nullТолько объекты этих типов: 1–5 разных значений
до 5 элементов
excludestring[] или nullid объектов, которые не показывать (уже на странице и т. п.), до 500
до 500 элементов
filtersobject или nullУсловия по фильтруемым свойствам проекта (настройки выдачи): "in_stock": true — равенство; {"in": [...]} и {"not_in": [...]}; {"gte": 100, "lte": 5000} — для чисел; {"any": [...]} — для свойств-списков. Несколько условий — И. Свойство, не отмеченное фильтруемым, или условие не того типа — 422 с кодом unknown_filter. Нет свойства у объекта — условие не выполнено, кроме not_in

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "item": "v-123",
    "limit": 8,
    "user": {
        "user_id": "u-42"
    }
}

SimilarResponse

ПолеТипОписание
recommendation_id *stringid выдачи (ULID)
items *SimilarItem[]Объекты по порядку, не больше limit
mode *stringpersonal — по профилю пользователя; cold — по популярному, свежему и текущей сессии; fallback — запасная выдача (служба не успела или индекс проекта загружается)
одно из: personal, cold, fallback
identity *stringКак определён пользователь: user — по user_id; recognized — узнан без входа (DARA Fingerprint); anonymous — по anonymous_id или fingerprint_uuid; none — без user
одно из: user, recognized, anonymous, none

Пример

{
    "identity": "user",
    "items": [
        {
            "id": "v-88",
            "reason": "similar",
            "score": 0.7311
        }
    ],
    "mode": "cold",
    "recommendation_id": "01J8Z3K4M5N6P7Q8R9S0T1V2W4"
}

StoredProfile

ПолеТипОписание
identity *stringuser — пользователь с user_id, anonymous — аноним
одно из: user, anonymous
gender *string или nullПол
одно из: male, female
birth_year *integer или nullГод рождения (возраст хранится годом)
city *string или nullГород в нижнем регистре
country *string или nullСтрана
interests *string[] или nullИнтересы
excluded_interests *string[] или null«Не интересно»
followed_authors *string[] или nullid авторов в подписках
hidden_authors *string[] или nullid скрытых авторов
personalization *booleanfalse — пользователь отказался от персонализации
attributes *object или nullПроизвольные атрибуты
fields_updated_at *objectДата последнего изменения каждого поля
networkNetworkData или nullДанные ДАРА АНАЛИТИКИ о человеке: отдельный блок, поля профиля они не заменяют. Пустые значения в блоке не отдаются, а самого блока нет, пока подключения нет или данные не найдены

Пример

{
    "attributes": {
        "tier": "gold"
    },
    "birth_year": 1997,
    "city": "казань",
    "fields_updated_at": {
        "birth_year": "2026-09-14T12:00:00Z",
        "gender": "2026-09-14T12:00:00Z"
    },
    "followed_authors": [
        "channel-7"
    ],
    "gender": "female",
    "identity": "user",
    "interests": [
        "горные велосипеды"
    ],
    "personalization": true
}

SummaryOut

ПолеТипОписание
summarystring или nullКраткое содержание
descriptionstring или nullОписание для карточки
topicsstring[]Темы, 3–7
по умолчанию []
tagsstring[]Теги, 5–15
по умолчанию []
entitiesobject[]Сущности: {name, type}, type — person, organization, brand, place, product, event, other
по умолчанию []
languagestring или nullЯзык содержания, код из двух букв
age_ratingstring или nullВозрастная маркировка
одно из: 0+, 6+, 12+, 16+, 18+
moderationModeration или nullМодерация

TranscriptOut

ПолеТипОписание
media_position *integerПозиция медиа в объекте, с 0
languagestring или nullЯзык речи
timestamps *stringmodel — время от модели; estimated — оценочное по паузам, точность до пары секунд
одно из: model, estimated
text *stringПолный текст
segmentsTranscriptSegment[]Фрагменты со временем
по умолчанию []

TranscriptSegment

ПолеТипОписание
start *numberНачало, секунды от начала медиа
end *numberКонец, секунды
text *stringТекст фрагмента
speakerstring или nullГоворящий, если модель его различает

UserDeleteRequest

ПолеТипОписание
user *EndUserIdsПользователь: хотя бы один идентификатор

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "user": {
        "user_id": "u-42"
    }
}

UserDeleteResponse

ПолеТипОписание
deleted *booleanfalse — пользователь неизвестен

Пример

{
    "deleted": true
}

UserLinkRequest

ПолеТипОписание
user_id *stringАккаунт, в который вошёл пользователь
до 191 знаков
anonymous_idstring или nullБраузер или устройство до входа
до 191 знаков
fingerprint_uuidstring или nullvisitor_uuid DARA Fingerprint: записывается как вход на устройстве
analytics_idstring или nullИдентификатор посетителя ДАРА АНАЛИТИКИ (UUID): привязывается к пользователю, в которого идёт склейка

Другие поля не принимаются: неизвестное поле — ошибка unknown_field.

Пример

{
    "anonymous_id": "b7f3c9",
    "fingerprint_uuid": "0b8f6a52-3f3e-4a57-9d51-6c1a1f0e7a01",
    "user_id": "u-42"
}

UserLinkResponse

ПолеТипОписание
merged *booleanfalse — анонима нет или его история уже перенесена другому пользователю
events_moved *integerСколько событий анонима перенесено пользователю

Пример

{
    "events_moved": 12,
    "merged": true
}

WebhookItem

ПолеТипОписание
id *stringid объекта в вашей системе — тот, что передан в PUT /items/{id}; у события webhook.test — «webhook-test»
status *stringНовый статус объекта: ready — всё готово; partial — часть шагов с ошибкой; failed — объект не обработан
одно из: ready, partial, failed
processing *WebhookProcessingСостояние шагов обработки — как в GET /items/{id}
summaryWebhookSummary или nullСводка — как в GET /items/{id}; ключа нет, пока сводка не построена

WebhookModeration

ПолеТипОписание
levelstring или nullИтоговый уровень модерации: none, low, medium, high
одно из: none, low, medium, high
categoriesobject или nullОценки категорий модерации от 0 до 1 (adult, violence, drugs и другие)
evidenceobject[] или nullОснования оценки: кадры и фрагменты речи, где найдено нарушение

WebhookPayload

ПолеТипОписание
event *stringСобытие: item.processed — обработка завершена; item.failed — обработка завершилась с ошибкой; webhook.test — проверка из кабинета. Совпадает с заголовком X-Core-Event
одно из: item.processed, item.failed, webhook.test
project_id *stringИдентификатор проекта — как в кабинете, 12 символов
sent_at *string (date-time)Время начала этой попытки, ISO-8601 UTC с миллисекундами; у каждой попытки своё
delivery_id *stringИдентификатор доставки: одинаков у всех попыток одного события и равен заголовку X-Core-Delivery — по нему отбрасываются повторы
item *WebhookItemОбъект, статус которого изменился

Пример

{
    "delivery_id": "Dl1very0000A",
    "event": "item.processed",
    "item": {
        "id": "v-1042",
        "processing": {
            "embedding": "done",
            "prepare": "done",
            "speech": "done",
            "summary": "done",
            "vision": "done"
        },
        "status": "ready",
        "summary": {
            "age_rating": "0+",
            "moderation": {
                "categories": {
                    "adult": 0,
                    "violence": 0
                },
                "evidence": [],
                "level": "none"
            },
            "summary": "Как выбрать горный велосипед: рама, колёса и тормоза",
            "tags": [
                "велосипед",
                "горный велосипед",
                "тормоза"
            ],
            "topics": [
                "велоспорт",
                "снаряжение"
            ]
        }
    },
    "project_id": "XXXXXXXXXXXX",
    "sent_at": "2026-09-21T14:00:00.000Z"
}

WebhookProcessing

ПолеТипОписание
prepare *stringПодготовка медиа
одно из: queued, running, done, skipped, failed, deferred, waiting
speech *stringРаспознавание речи
одно из: queued, running, done, skipped, failed, deferred, waiting
vision *stringАнализ кадров и изображений
одно из: queued, running, done, skipped, failed, deferred, waiting
summary *stringСводка: краткое содержание, темы, теги, модерация
одно из: queued, running, done, skipped, failed, deferred, waiting
embedding *stringВекторы для рекомендаций и поиска
одно из: queued, running, done, skipped, failed, deferred, waiting

WebhookSummary

ПолеТипОписание
summarystring или nullКраткое содержание материала
topicsstring[]Темы материала
tagsstring[]Теги материала
age_ratingstring или nullВозрастная маркировка
одно из: 0+, 6+, 12+, 16+, 18+
moderationWebhookModeration или nullМодерация материала