Для разработчиков и ИИ-агентов

Документация Хуксиса

Хуксис отдаёт разбор Reels двумя способами: MCP-сервер для ИИ-чатов и REST API для своих сервисов. Один аккаунт, один тариф, один ключ.

MCP-сервер

Подключение к ИИ-чату

Хуксис подключается к Claude, ChatGPT и Claude Code как MCP-сервер (Streamable HTTP). Инструменты и подсказки зависят от тарифа аккаунта; после смены тарифа переподключите Хуксис в чате.

Адрес сервера

https://app.hooksis.ru/mcp

Вход

Claude и ChatGPT подключаются по OAuth: чат открывает экран входа Хуксиса — войдите по почте и паролю от администратора и разрешите доступ. Claude Code подключается персональным ключом hk_… в заголовке Authorization: Bearer hk_…: ключ создаётся в личном кабинете и показывается один раз. Тот же ключ открывает REST API.

Claude (claude.ai)

  1. В Claude откройте «Настройки» → «Коннекторы» → «Добавить свой коннектор».
  2. Название — «Хуксис», адрес — скопированный выше.
  3. Нажмите «Подключить»: откроется Хуксис. Войдите по почте и паролю от администратора и нажмите «Разрешить».
  4. В новом чате включите Хуксис в меню инструментов и начните с шаблона вопроса с лендинга.

ChatGPT

  1. В ChatGPT откройте «Настройки» → «Приложения и коннекторы» и включите режим разработчика.
  2. Нажмите «Создать», вставьте адрес, способ входа — OAuth.
  3. Войдите в Хуксис по почте и паролю от администратора и нажмите «Разрешить».
  4. Подсказки-шаблоны ChatGPT не показывает — пишите вопрос своими словами.

Claude Code

Создайте персональный ключ в кабинете и выполните в терминале, подставив ключ:

claude mcp add --transport http hooksis https://app.hooksis.ru/mcp --header "Authorization: Bearer <ваш токен hk_…>"

Без токена Claude Code предложит войти через браузер: команда `/mcp` → hooksis → «Authenticate».

Инструменты по тарифам

  • Пульс — 9 инструментов
  • Разбор — 9 инструментов
  • Студия — 11 инструментов
  • Полный отчёт — 12 инструментов
  • hooksis_account_statusПульсРазборСтудияПолный отчёт

    Состояние тарифа и квот

    REST: GET /account, GET /collections/{collection_id}

  • hooksis_collectПульсРазборСтудияПолный отчёт

    Запустить сбор роликов

    REST: POST /collections

  • hooksis_collection_videosПульсРазборСтудияПолный отчёт

    Ролики сбора постранично

    REST: GET /collections/{collection_id}/videos

  • hooksis_collection_summaryПульсРазборСтудияПолный отчёт

    Сводки по всему сбору

    REST: GET /collections/{collection_id}/summary

  • hooksis_report_htmlПолный отчёт

    HTML-отчёт по сбору

    REST: POST /collections/{collection_id}/report

  • hooksis_video_getПульсРазборСтудияПолный отчёт

    Карточка ролика

    REST: GET /videos/{video_id}

  • hooksis_video_voiceoverПульсРазборСтудияПолный отчёт

    Речь ролика по секундам

    REST: GET /videos/{video_id}/voiceover

  • hooksis_video_segmentsСтудияПолный отчёт

    Покадровая раскладка видеоряда

    REST: GET /videos/{video_id}/segments

  • hooksis_trends_listПульсРазборСтудияПолный отчёт

    Тренды ниши

    REST: GET /trends

  • hooksis_trend_getПульсРазборСтудияПолный отчёт

    Карточка тренда

    REST: GET /trends/{trend_id}

  • hooksis_trend_evidenceСтудияПолный отчёт

    Проверка тренда

    REST: GET /trends/{trend_id}/evidence

  • hooksis_feedbackПульсРазборСтудияПолный отчёт

    Отзыв о Хуксисе: оценка от 1 до 5 и по желанию — что понравилось, чего не хватило, комментарий. Агент предлагает оценку один раз за диалог и передаёт слова пользователя дословно. Сборы и чтения не расходует.

    Только в MCP: операции REST API у инструмента нет.

Подсказки по тарифам

Подсказки — готовые вопросы, которые клиент показывает в меню подсказок; аргументы подсказки клиент спрашивает перед отправкой. ChatGPT подсказок не показывает — там вопрос пишется своими словами.

  • Оставить отзывПульсРазборСтудияПолный отчёт

    feedback

  • Знакомство и тренды неделиПульсРазборСтудияПолный отчёт

    pulse_start · аргументы: тема, аудитория, цель

  • Инструкции к трендам и тип контентаПульсРазборСтудияПолный отчёт

    pulse_trends · аргументы: ниша

  • Ролики, которые набираютПульсРазборСтудияПолный отчёт

    pulse_collect · аргументы: тема

  • Почему ролик набралПульсРазборСтудияПолный отчёт

    pulse_why · аргументы: ролик

  • Хуки, монтаж, длина, звукиПульсРазборСтудияПолный отчёт

    pulse_patterns

  • Речь по секундамПульсРазборСтудияПолный отчёт

    pulse_voiceover · аргументы: ролик

  • Идея ReelsПульсРазборСтудияПолный отчёт

    pulse_idea · аргументы: товар или тема

  • Бриф и сборРазборСтудияПолный отчёт

    razbor_start · аргументы: бренд и продукт, кто смотрит, страна, формат, длительность, языки, период

  • Хуки выше нормы автораРазборСтудияПолный отчёт

    razbor_hooks · аргументы: категория

  • Драматургия роликов-лидеровРазборСтудияПолный отчёт

    razbor_drama

  • Сцены и предметы в кадреРазборСтудияПолный отчёт

    razbor_scenes

  • Охват трендаРазборСтудияПолный отчёт

    razbor_reach · аргументы: тренд

  • 3 концепта под брифРазборСтудияПолный отчёт

    razbor_concepts · аргументы: бриф

  • Питч для клиентаСтудияПолный отчёт

    studio_start · аргументы: бренд, категория, рынок, аудитория, языки, период

  • 5 аргументов для клиентаСтудияПолный отчёт

    studio_args

  • Каким трендам веритьСтудияПолный отчёт

    studio_trend_check

  • Покадровая раскладкаСтудияПолный отчёт

    studio_frames · аргументы: ролик

  • Момент хука и продуктаСтудияПолный отчёт

    studio_hook_product

  • 5 концептов для питчаСтудияПолный отчёт

    studio_concepts

  • Тот же ресерч для нового брифаСтудия

    studio_next_brief · аргументы: бренд, продукт, рынок

  • Собрать HTML-отчётПолный отчёт

    report_build · аргументы: бриф

Ошибки инструментов

Отказ инструмента — результат с isError: true и structuredContent.error = {code, message}: ветвление по code (таблица кодов ошибок общая с REST API), message — текст для пользователя. Сбор и скан, которые ещё идут, — не ошибка: ответ несёт status: running или scanning и прогресс. Ответ HTTP 401 с заголовком WWW-Authenticate — только когда ключа нет или он недействителен.

REST API

Справочник REST API

Те же данные, тарифы, квоты и коды ошибок, что у MCP-сервера: каждая операция соответствует инструменту MCP. Спецификация OpenAPI 1.0.0: Скачать openapi.yaml

Базовый адрес

https://app.hooksis.ru/api/v1

Ключ

Персональный API-ключ аккаунта: Authorization: Bearer hk_…. Ключ создаётся в личном кабинете (раздел подключения), показывается один раз, хранится на сервере только хэшем, срока не имеет и отзывается в кабинете. Это тот же ключ, которым подключается MCP. Ключ привязан к аккаунту, а через аккаунт — к его текущему тарифу: смена тарифа действует со следующего запроса без перевыпуска ключа. Отсутствующий, неизвестный и отозванный ключ, а также ключ заблокированного аккаунта — 401.

Общие правила

REST API отдаёт те же данные, что MCP-сервер Хуксиса: каждый ресурс соответствует одному инструменту MCP (расширение x-mcp-tool у операции), поля ответа проходят тот же белый список тарифа, ошибки несут те же коды.

Тариф. Тариф хранится в аккаунте и проверяется на каждом запросе в порядке: тариф → ресурс → параметры → квота → выполнение → суточный лимит → белый список полей → ответ. Поле, которого нет в белом списке тарифа, в ответ не попадает. У каждого поля в схемах указано, с какого тарифа оно отдаётся (x-plans и строка «Тарифы: …» в описании). Поле тарифа присутствует в ответе всегда; отсутствие данных — null, ноль означает измеренный ноль. У каждой операции x-plans — тарифы, в которых ресурс доступен; в остальных — 403 PLAN_FEATURE_UNAVAILABLE.

Асинхронность. Сбор роликов и скан трендов ниши идут минуты. Пока данные готовятся, ресурсы чтения отвечают 202 с status, progress (0–100) и eta_sec и заголовком Retry-After; такой ответ не тратит суточный лимит.

Время. Границы суток, месяца и 7 дней считаются по Москве (Europe/Moscow). Даты — ISO 8601.

Базовый адрес — публичный адрес сервиса (HOOKSIS_PUBLIC_URL) с путём /api/v1: тот же адрес, что у MCP-сервера (/mcp) и личного кабинета.

GET/account

Состояние тарифа и квот

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_account_status

Тариф, язык тарифа, остаток сборов, дата сброса, срок доступа, активные сборы (идущие и готовые в пределах 24 часов) с прогрессом и other_plans — возможности, которых нет в тарифе, с тарифом, где каждая есть. notice называет ожидание словами (минуты и часы): у каждого идущего сбора и у нового сбора, если сбор есть в остатке; та же оценка приходит в notice ответа запуска сбора. Работает без тарифа и с истёкшим тарифом: тогда в ответе только notice, а у закончившегося доступа ещё feedback_form_url — ссылка анонимной формы отзыва. Не тратит сбор и суточный лимит.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/account" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Состояние аккаунта.

    Тело → Account

    Поля ответа 200
    • planPlan
    • plan_languagestring

      Язык тарифа Пульс (ISO 639-1), по умолчанию ru; закреплён за аккаунтом.

    • quotaQuota
    • resets_atstring (date)

      Дата сброса сборов (Москва). Только подписки.

    • expires_atstring (date-time)

      Конец доступа: подписка — месяц от оплаты, Полный отчёт — 7 дней от оплаты.

    • active_collectionsCollectionBrief[]

      Идущие сборы и готовые в пределах 24 часов.

    • recent_failuresRecentFailure[]

      Упавшие за последние 24 часа сборы и поиски трендов ниш аккаунта, свежие первыми (до пяти каждого вида). Провал, после которого по той же теме или нише запускался новый сбор или поиск, не показывается: его заменил новый запуск. Упавший сбор не списан, упавший поиск трендов не засчитан в лимит новых ниш; оба запускаются заново сразу. Поле есть, когда такие провалы есть; notice называет их словами.

    • feedback_form_urlstring (uri)

      Ссылка анонимной формы отзыва (4 вопроса, без имени и почты) — только когда доступ закончился, то есть тариф или бета истекли. Та же ссылка, что в notice; действует 30 суток.

    • other_plansOtherPlan[]

      Возможности, которых нет в тарифе, и тариф, где каждая есть. Строка называет только тариф, который сохраняет всё из текущего: каждый инструмент и поле ответа, квоты одного сбора (языки, период, ролики, примеры тренда) не ниже. Возможность — первый по старшинству такой тариф; квота — каждый такой тариф, поднимающий её выше. Число сборов сравнивается внутри одной модели покупки: подписки — «в месяц», Полный отчёт — «на покупку». Выводится из тех же правил, что решают доступ; строка возможности инструмента начинается текстом details.what отказа PLAN_FEATURE_UNAVAILABLE и называет тот же тариф, что details.nearest. У Полного отчёта массив пустой: HTML-отчёт есть только в нём.

    • noticeNotice
    Пример ответа 200: Пульс: идёт один сбор
    {
      "plan": "pulse",
      "plan_language": "ru",
      "quota": {
        "used": 1,
        "left": 2,
        "limit": 3,
        "resets_at": "2026-11-08"
      },
      "active_collections": [
        {
          "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
          "topic": "уход за кудрявыми волосами",
          "languages": [
            "ru"
          ],
          "period_days": 7,
          "status": "running",
          "progress": 40,
          "eta_sec": 400
        }
      ],
      "resets_at": "2026-11-08",
      "expires_at": "2026-11-08T00:00:00+03:00",
      "notice": "Сбор «уход за кудрявыми волосами» идёт, ожидание — около 7 минут. Новый сбор займёт около 3 часов",
      "other_plans": [
        {
          "feature": "сколько авторов сняли тренд, свободен ли он, своя ниша или общий (охват тренда)",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "сюжет и драматургия роликов",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "типы сцен роликов",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "предметы в кадре",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "ниши роликов",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "сравнение с нормой автора",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "момент хука и появления продукта",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "темп смены планов",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "покадровая раскладка видеоряда",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "проверка тренда — подтверждён ли он, можно ли ему верить",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "HTML-отчёт по сбору для клиента",
          "plan": "report",
          "plan_title": "Полный отчёт"
        },
        {
          "feature": "до 3 языков в одном сборе",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "все языки в одном сборе",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "период сбора до 30 дней",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "до 300 роликов в сборе",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "до 500 роликов в сборе",
          "plan": "studio",
          "plan_title": "Студия"
        },
        {
          "feature": "все ролики-примеры тренда",
          "plan": "razbor",
          "plan_title": "Разбор"
        },
        {
          "feature": "4 сбора в месяц",
          "plan": "razbor",
          "plan_title": "Разбор"
        }
      ]
    }

Ошибки

POST/collections

Запустить сбор роликовасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_collect

Ставит в очередь сбор Reels по теме за период и их разбор. Ответ приходит сразу: collection_id, status, progress, eta_sec и остаток сборов.

Списание. Сбор резервируется при старте и списывается, только если найден хотя бы один ролик по теме и языку. Пустой сбор (empty) и сбор с ошибкой (failed) резерв возвращают. quota.used включает резервы идущих сборов.

Идемпотентность. Ключ повтора вычисляет сервер: аккаунт + нормализованная тема (NFKC, нижний регистр, слова без служебных, по алфавиту) + отсортированные языки + period_days. Пока сбор с этим ключом идёт или готов и не истёк (24 часа от готовности), повторный запрос возвращает прежний collection_id без списания и с заголовком Idempotent-Replayed: true. «Кроссовки для бега» и «бега кроссовки» — один ключ.

Время. Сбор длится минуты: по замеру Н7 холодный сбор Пульса на 30 роликов — 11 мин 8 с. Первый eta_sec — оценка ожидания: медиана длительности последних 20 готовых сборов тарифа, если готовых не меньше 5, иначе расчётная оценка тарифа по замерам; дальше оценку уточняет ход сбора. Предел сбора: в очереди — 60 мин, исполнение от старта — Пульс 120 мин, Разбор 150 мин, Студия 250 мин, Полный отчёт 250 мин. Сбор, не уложившийся в предел, закрывается как failed, резерв возвращается.

Тело запроса → CollectRequest

  • topicstringобязательное

    Тема поиска, 1–200 символов после обрезки пробелов.

  • languagesstring[]

    Коды ISO 639-1 (регистр не важен, повторы схлопываются). Пульс — один язык тарифа (plan_language); без параметра берётся он, другой язык — 403 PLAN_LANGUAGE_LIMIT. Разбор — от 1 до 3 языков, параметр обязателен. Студия и Полный отчёт — любое число языков; без параметра — все языки. Пустой массив и неизвестный код — 400 INVALID_PARAMS.

  • period_daysinteger

    Период поиска в днях. Пульс — до 7, остальные тарифы — до 30. Без параметра — максимум тарифа. Больше лимита — 403 PLAN_PERIOD_LIMIT.

Пример запроса

curl -sS -X POST "https://app.hooksis.ru/api/v1/collections" \
  -H "Authorization: Bearer hk_…" \
  -H "Content-Type: application/json" \
  -d '{"topic":"уход за кудрявыми волосами"}'

Ответы

  • 200

    Повтор запроса, сбор с этим ключом уже готов — прежний collection_id без списания.

    Тело → CollectAccepted · заголовки: Idempotent-Replayed

    Поля ответа 200
    • collection_idstring (uuid)обязательное
    • statusstringобязательное
      Значения: queued, running, ready
    • progressintegerобязательное
    • eta_secintegerобязательное

      Оценка времени до готовности, с; 0 у готового сбора.

    • quotaQuotaобязательное
    • noticeNotice
    Пример ответа 200: Повтор запроса: прежний готовый сбор без списания
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "status": "ready",
      "progress": 100,
      "eta_sec": 0,
      "quota": {
        "used": 1,
        "left": 2,
        "limit": 3,
        "resets_at": "2026-11-08"
      }
    }
  • 202

    Сбор поставлен или уже идёт (в том числе повтор того же запроса).

    Тело → CollectAccepted · заголовки: Idempotent-Replayed, Location

    Поля ответа 202
    • collection_idstring (uuid)обязательное
    • statusstringобязательное
      Значения: queued, running, ready
    • progressintegerобязательное
    • eta_secintegerобязательное

      Оценка времени до готовности, с; 0 у готового сбора.

    • quotaQuotaобязательное
    • noticeNotice
    Пример ответа 202: Новый сбор поставлен в очередь (Пульс)
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "status": "queued",
      "progress": 0,
      "eta_sec": 10800,
      "quota": {
        "used": 1,
        "left": 2,
        "limit": 3,
        "resets_at": "2026-11-08"
      },
      "notice": "Ожидание — около 3 часов"
    }

Ошибки

GET/collections/{collection_id}

Статус, прогресс и оценка времени сбораасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_account_status

Состояние одного сбора: та же строка, что в active_collections у GET /account, плюс завершённые состояния. Для опроса хода сбора; не тратит суточный лимит. Рекомендуемый интервал опроса — не чаще Retry-After.

Параметры

  • collection_idпуть · string (uuid)обязательный

    Идентификатор сбора (UUID). Чужой, несуществующий и неверного формата — одинаково 404 NOT_IN_SCOPE.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/collections/3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Состояние сбора.

    Тело → CollectionStatus · заголовки: Retry-After

    Поля ответа 200
    • collection_idstring (uuid)обязательное
    • topicstringобязательное
    • languagesstring[]обязательное

      Коды ISO 639-1 по алфавиту; ["*"] — все языки.

    • period_daysintegerобязательное
    • statusstringобязательное

      queued — в очереди; running — идёт; ready — готов, данные читаются 24 часа; empty — роликов по теме не найдено, сбор не списан; failed — сбор не удался, сбор не списан; expired — окно чтения истекло.

      Значения: queued, running, ready, empty, failed, expired
    • progressintegerобязательное
    • eta_secinteger

      Оценка оставшегося времени, с. Есть у идущего сбора.

    • expires_atstring (date-time)

      Конец окна чтения готового сбора.

    • noticeNotice
    Пример ответа 200: Сбор идёт
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "topic": "уход за кудрявыми волосами",
      "languages": [
        "ru"
      ],
      "period_days": 7,
      "status": "running",
      "progress": 40,
      "eta_sec": 400
    }

Ошибки

GET/collections/{collection_id}/videos

Ролики сбора постраничноасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_collection_videos

Ролики готового сбора без отрезков, до 20 на странице, в порядке сортировки по убыванию (ролики без значения — в конце). Следующая страница — по next_cursor; на последней странице его нет. Курсор привязан к сбору и сортировке. Один запрос — одно чтение суточного лимита.

Сбор младшего тарифа, прочитанный на старшем, отдаёт поля непосчитанных слоёв как null (author_norm_ratio — у сборов Пульса; hook_at_sec, product_at_sec, cuts_per_10s — у сборов Пульса и Разбора).

Параметры

  • collection_idпуть · string (uuid)обязательный

    Идентификатор сбора (UUID). Чужой, несуществующий и неверного формата — одинаково 404 NOT_IN_SCOPE.

  • sortquery · string

    Сортировка: play_count — просмотры (по умолчанию), outperformance — отрыв от аудитории автора (есть у авторов от 1000 подписчиков, остальные ролики — в конце), collect_count — сохранения, author_norm_ratio — отрыв от нормы автора (с тарифа Разбор; в Пульсе — 403 PLAN_FEATURE_UNAVAILABLE).

  • cursorquery · string

    next_cursor предыдущей страницы. Курсор чужого сбора, другой сортировки или повреждённый — 400 INVALID_PARAMS.

  • limitquery · integer

    Роликов на странице.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/collections/3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f/videos" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Страница роликов.

    Тело → VideosPage · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • collection_idstring (uuid)обязательное
    • videosVideo[]обязательное
    • next_cursorstring

      Курсор следующей страницы; на последней странице поля нет.

    • noticeNotice
    Пример ответа 200: Пульс: страница из 2 роликов (limit=2) — эталон Н7 через белый список тарифа
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "videos": [
        {
          "video_id": "DeExRMcsYG6",
          "web_video_url": "https://www.instagram.com/reel/DeExRMcsYG6/",
          "create_time_iso": "2026-10-04T13:44:41+00:00",
          "author_name": "irn.slv",
          "author_fans": 16,
          "play_count": 41514,
          "digg_count": 3042,
          "comment_count": 10,
          "collect_count": 231,
          "share_count": 983,
          "duration": 14.138999938964844,
          "music_id": "39856669243920256",
          "music_name": "Original audio",
          "music_original": true,
          "hashtags": [
            "кудрявыеволосы",
            "кудрявыйметод"
          ],
          "text": "гель для кудрявых волос @curl.rocknroll 🤍\n \n#кудрявыеволосы #кудрявыйметод",
          "text_language": "ru",
          "fetched_at": "2026-10-09T19:31:19+00:00",
          "outperformance": null,
          "save_rate": 0.005564387917329093,
          "share_rate": 0.02367875897287662,
          "comment_rate": 0.00024088259382377028,
          "summary": "Ролик представляет собой нарезку из известных личностей, которые критикуют внешность друг друга, с финальным кадром девушки с кудрявыми волосами.",
          "language": "ru",
          "format_hook_type": "question",
          "format_editing": [
            "jump_cut",
            "text_overlay"
          ],
          "format_label": "dialogue_montage"
        },
        {
          "video_id": "DeJhKRYIOn7",
          "web_video_url": "https://www.instagram.com/reel/DeJhKRYIOn7/",
          "create_time_iso": "2026-10-06T10:01:02+00:00",
          "author_name": "svetilo_ai",
          "author_fans": 37,
          "play_count": 8066,
          "digg_count": 328,
          "comment_count": 6,
          "collect_count": 16,
          "share_count": 8,
          "duration": 116.30000305175781,
          "music_id": "28690886587210174",
          "music_name": "Original audio",
          "music_original": true,
          "hashtags": [
            "лечениеволос",
            "трихология",
            "кудрявыйметод",
            "абьюз"
          ],
          "text": "Территория здоровых волос «ЖИЗНЬ НА ВОЛОСКЕ» 2 серия #лечениеволос #трихология #кудрявыйметод  #абьюз @nm_karamel",
          "text_language": "ru",
          "fetched_at": "2026-10-09T20:11:09+00:00",
          "outperformance": null,
          "save_rate": 0.001983635011157947,
          "share_rate": 0.0009918175055789735,
          "comment_rate": 0.0007438631291842301,
          "summary": "Девушка приходит в салон красоты, где ей делают процедуру для волос, после чего она преображается и обретает уверенность в себе.",
          "language": "ru",
          "format_hook_type": "statement",
          "format_editing": [
            "jump_cut",
            "zoom",
            "text_overlay",
            "slowmo"
          ],
          "format_label": "transformation_reveal"
        }
      ],
      "next_cursor": "eyJjIjoiM2Y2YzFkMmUtOGE0Yi00YzVkLTllN2YtMWEyYjNjNGQ1ZTZmIiwicyI6InBsYXlfY291bnQiLCJvIjoyfQ"
    }
  • 202

    Сбор ещё идёт; повторите через Retry-After. Суточный лимит не тратится.

    Тело → CollectionProgress · заголовки: Retry-After

    Поля ответа 202
    • collection_idstring (uuid)
    • status"running"обязательное

      Сбор в очереди или идёт.

    • progressintegerобязательное
    • eta_secinteger
    • noticeNotice
    Пример ответа 202: Сбор идёт
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "status": "running",
      "progress": 40,
      "eta_sec": 400,
      "notice": "Сбор идёт. Ожидание — около 7 минут"
    }

Ошибки

GET/collections/{collection_id}/summary

Сводки по всему сборуасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_collection_summary

Агрегаты по всем роликам сбора. Тариф получает агрегат, только если все его исходные поля видны тарифу: Пульс — 6 агрегатов (звуки, хуки, монтаж, шаблоны, длительность, медиана просмотров), Разбор — 10 (+ сюжетные схемы, доли типов сцен, предметы в кадре, ниши), Студия и Полный отчёт — 13 (+ момент появления продукта, темп смены планов, тайминг роликов-лидеров). Агрегат по слою, который у сбора не посчитан, не отдаётся. Один запрос — одно чтение суточного лимита.

Параметры

  • collection_idпуть · string (uuid)обязательный

    Идентификатор сбора (UUID). Чужой, несуществующий и неверного формата — одинаково 404 NOT_IN_SCOPE.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/collections/3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f/summary" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Сводка.

    Тело → Summary · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • collection_idstring (uuid)обязательное
    • videos_totalintegerобязательное

      Роликов в сборе.

    • aggregatesAggregatesобязательное
    • noticeNotice
    Пример ответа 200: Пульс: сводка; списки сокращены до 3 элементов — эталон Н7 через белый список тарифа
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "videos_total": 24,
      "aggregates": {
        "sounds": [
          {
            "music_id": "696410494583686",
            "music_name": "Ледяное сердце",
            "music_original": false,
            "videos": 2,
            "authors": 1,
            "video_ids": [
              "DeR1ovxK3Yb",
              "DeOKMw2Kluj"
            ]
          }
        ],
        "hooks": [
          {
            "value": "statement",
            "videos": 16,
            "share": 0.6666666666666666,
            "approximate": true
          },
          {
            "value": "before_after",
            "videos": 4,
            "share": 0.16666666666666666,
            "approximate": true
          },
          {
            "value": "question",
            "videos": 3,
            "share": 0.125,
            "approximate": true
          }
        ],
        "editing": [
          {
            "value": "text_overlay",
            "videos": 22,
            "share": 0.9166666666666666
          },
          {
            "value": "jump_cut",
            "videos": 20,
            "share": 0.8333333333333334
          },
          {
            "value": "slowmo",
            "videos": 7,
            "share": 0.2916666666666667
          }
        ],
        "templates": [
          {
            "format_label": "before_after_reveal",
            "videos": 4,
            "authors": 4,
            "video_ids": [
              "DeL6Q76okjp",
              "DeRKFtYIgJ7",
              "DePGXGxB9br"
            ]
          },
          {
            "format_label": "transformation_reveal",
            "videos": 4,
            "authors": 4,
            "video_ids": [
              "DeJhKRYIOn7",
              "DeMaWW6A19T",
              "DePnXgRspuC"
            ]
          },
          {
            "format_label": "hair_styling_tutorial",
            "videos": 2,
            "authors": 2,
            "video_ids": [
              "DePyA2xOPy8",
              "DeSMcnJs57J"
            ]
          }
        ],
        "duration": {
          "n": 24,
          "min": 5.232999801635742,
          "q1": 14.574750185012817,
          "median": 23.18299961090088,
          "q3": 45.235249519348145,
          "max": 116.30000305175781
        },
        "median_play_count": 347
      }
    }
  • 202

    Сбор ещё идёт; повторите через Retry-After. Суточный лимит не тратится.

    Тело → CollectionProgress · заголовки: Retry-After

    Поля ответа 202
    • collection_idstring (uuid)
    • status"running"обязательное

      Сбор в очереди или идёт.

    • progressintegerобязательное
    • eta_secinteger
    • noticeNotice
    Пример ответа 202: Сбор идёт
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "status": "running",
      "progress": 40,
      "eta_sec": 400,
      "notice": "Сбор идёт. Ожидание — около 7 минут"
    }

Ошибки

POST/collections/{collection_id}/report

HTML-отчёт по сборуасинхронно: 202 и Retry-After

Тарифы:Полный отчёт

Инструмент MCP: hooksis_report_html

Только тариф Полный отчёт, один отчёт на покупку. Отчёт из 11 блоков собирается асинхронно; ответ сразу несёт ссылку, страница по ней показывает отчёт по готовности. Ссылка живёт 7 дней.

Повтор, пока отчёт готовится, возвращает ту же ссылку. Повтор после готовности — 409 PLAN_REPORT_USED с прежней ссылкой в error.details.url. Сбой генерации отчёт не списывает. Пока сбор идёт — 202 с прогрессом сбора.

Параметры

  • collection_idпуть · string (uuid)обязательный

    Идентификатор сбора (UUID). Чужой, несуществующий и неверного формата — одинаково 404 NOT_IN_SCOPE.

Тело запроса → ReportRequest

  • briefstring

    Бриф пользователя.

  • conceptsConcept[]обязательное

    Ровно 5 концептов для блока 10 отчёта; ролики — только из этого сбора.

Пример запроса

curl -sS -X POST "https://app.hooksis.ru/api/v1/collections/3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f/report" \
  -H "Authorization: Bearer hk_…" \
  -H "Content-Type: application/json" \
  -d '{"brief":"Женские беговые кроссовки, аудитория — начинающие бегуньи, рынок — Россия.","concepts":[{"title":"Одобрено экспертом: бег без боли в стопах","hook":"«Модель одобрена подологом, и вот почему»","steps":["Текстовый хук и кроссовок в руках","Смена моделей на ногах под бит","Пробежка по асфальту"],"video_ids":["DeExRMcsYG6"]},{"title":"Карбон для новичка: развенчиваем мифы","hook":"«А что если мне взять карбон, но я только начинаю бегать?»","steps":["Вопрос у зеркала","Разрез подошвы с пластиной","Бег и вердикт текстом"],"video_ids":["DeJhKRYIOn7"]},{"title":"Батл на ногах: обычные против беговых","hook":"На одной ноге обычный кроссовок, на другой — беговой","steps":["Две разные пары сверху","Прыжок и отдача","Бег в беговой паре"],"video_ids":["DeL6Q76okjp"]},{"title":"Правильный размер","hook":"«Проверьте, в том ли размере вы бегаете»","steps":["Монолог о боли из-за обуви","Колодка и место для пальцев","Лёгкая пробежка"],"video_ids":["DeExRMcsYG6","DeJhKRYIOn7"]},{"title":"Распаковка года: пара, в которой влюбишься в бег","hook":"«Это не учебная тревога: пара у меня в руках»","steps":["Открытие коробки","ASMR подошвы","Утренний забег"],"video_ids":["DeL6Q76okjp"]}]}'

Ответы

  • 202

    Отчёт готовится (ссылка уже действует) или сбор ещё идёт.

    Тело → ReportAccepted | CollectionProgress

    Пример ответа 202: Отчёт готовится
    {
      "collection_id": "3f6c1d2e-8a4b-4c5d-9e7f-1a2b3c4d5e6f",
      "status": "generating",
      "url": "https://hookisis.ru/r/Qm9rLXJlcG9ydC10b2tlbi1leGFtcGxl",
      "expires_at": "2026-10-16T12:30:00+03:00",
      "notice": "Отчёт готовится"
    }

Ошибки

GET/videos/{video_id}

Карточка роликаасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_video_get

Ролик из своих живых сборов или выданный пример тренда. Ролик вне скоупа — 404 NOT_IN_SCOPE; при идущем сборе аккаунта ответ — 202 с прогрессом этого сбора. Одно чтение суточного лимита.

Параметры

  • video_idпуть · stringобязательный

    Shortcode ролика Instagram ([A-Za-z0-9_-]{1,64}) или URL-кодированная ссылка https://www.instagram.com/reel/<shortcode>/.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/videos/DeL6Q76okjp" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Карточка ролика по белому списку тарифа.

    Тело → Video · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • video_idstringобязательноевсе тарифы

      Shortcode ролика.

    • web_video_urlstring (uri)обязательноевсе тарифы

      Ссылка на ролик.

    • create_time_isostring (date-time)обязательноевсе тарифы

      Время публикации.

    • author_namestring | nullобязательноевсе тарифы

      Ник автора.

    • author_fansinteger | nullобязательноевсе тарифы

      Подписчики автора на момент fetched_at.

    • play_countinteger | nullобязательноевсе тарифы

      Просмотры на момент fetched_at.

    • digg_countinteger | nullобязательноевсе тарифы

      Лайки на момент fetched_at.

    • comment_countinteger | nullобязательноевсе тарифы

      Комментарии на момент fetched_at.

    • collect_countinteger | nullобязательноевсе тарифы

      Сохранения на момент fetched_at.

    • share_countinteger | nullобязательноевсе тарифы

      Репосты на момент fetched_at.

    • durationnumber | nullобязательноевсе тарифы

      Длительность, с.

    • music_idstring | nullобязательноевсе тарифы

      Идентификатор звука.

    • music_namestring | nullобязательноевсе тарифы

      Название звука.

    • music_originalboolean | nullобязательноевсе тарифы

      Оригинальный звук автора.

    • hashtagsstring[]обязательноевсе тарифы

      Хэштеги без #.

    • textstring | nullобязательноевсе тарифы

      Подпись к ролику.

    • text_languagestring | nullобязательноевсе тарифы

      Язык подписи (ISO 639-1).

    • fetched_atstring (date-time)обязательноевсе тарифы

      Момент, на который сняты цифры ролика.

    • outperformancenumber | nullобязательноевсе тарифы

      Отрыв от аудитории автора: play_count / author_fans — только у авторов от 1000 подписчиков. У автора меньше 1000 подписчиков или с неизвестным числом — null: при горстке подписчиков кратность случайна и о выходе ролика за аудиторию не говорит.

    • save_ratenumber | nullобязательноевсе тарифы

      Сохранения от просмотров.

    • share_ratenumber | nullобязательноевсе тарифы

      Репосты от просмотров.

    • comment_ratenumber | nullобязательноевсе тарифы

      Комментарии от просмотров.

    • summarystring | nullобязательноевсе тарифы

      Пересказ ролика.

    • languagestring | nullобязательноевсе тарифы

      Язык ролика (ISO 639-1): по речи, затем по надписям, затем по подписи.

    • format_hook_typestring | nullобязательноевсе тарифы

      Тип хука первых секунд.

    • format_editingstring[]обязательноевсе тарифы

      Монтажные приёмы.

    • format_labelstring | nullобязательноевсе тарифы

      Шаблон ролика.

    • author_norm_rationumber | nullРазбор · Студия · Полный отчёт

      Во сколько раз ролик быстрее обычных роликов автора; null — норма не посчитана.

    • format_structurestring | nullРазбор · Студия · Полный отчёт

      Сюжетная схема.

    • scene_typesstring[]Разбор · Студия · Полный отчёт

      Типы сцен ролика.

    • objectsstring[]Разбор · Студия · Полный отчёт

      Предметы в кадре.

    • nichesstring[]Разбор · Студия · Полный отчёт

      Ниши ролика.

    • hook_at_secnumber | nullСтудия · Полный отчёт

      Секунда, на которой звучит хук; null — не измерено.

    • product_at_secnumber | nullСтудия · Полный отчёт

      Секунда первого появления продукта (предмета темы); null — продукт не показан или отрезков нет.

    • cuts_per_10snumber | nullСтудия · Полный отчёт

      Темп смены планов: склеек на 10 с; null — не измерено.

    • noticeNotice
    Пример ответа 200: Пульс: ролик с речью — эталон Н7 через белый список тарифа
    {
      "video_id": "DeL6Q76okjp",
      "web_video_url": "https://www.instagram.com/reel/DeL6Q76okjp/",
      "create_time_iso": "2026-10-07T08:18:12+00:00",
      "author_name": "helenaast",
      "author_fans": 5792,
      "play_count": 2348,
      "digg_count": 3,
      "comment_count": 19,
      "collect_count": 6,
      "share_count": 2,
      "duration": 28.666000366210938,
      "music_id": "28474630298896067",
      "music_name": "Original audio",
      "music_original": true,
      "hashtags": [
        "WW1186340",
        "WW1194557",
        "кудрявыйметод",
        "укладкаволос",
        "ugccreator"
      ],
      "text": "Гель: #WW1186340 Спрей: #WW1194557\n⠀\nМой проверенный кудрявый метод🤍\n⠀\n⠀\n#кудрявыйметод #укладкаволос #ugccreator",
      "text_language": "ru",
      "fetched_at": "2026-10-09T20:11:09+00:00",
      "outperformance": 0.4053867403314917,
      "save_rate": 0.002555366269165247,
      "share_rate": 0.0008517887563884157,
      "comment_rate": 0.008091993185689948,
      "summary": "В этом ролике показан способ получения гладких кудрей без пуха с помощью специальных средств и фена.",
      "language": "ru",
      "format_hook_type": "statement",
      "format_editing": [
        "jump_cut",
        "text_overlay",
        "slowmo"
      ],
      "format_label": "before_after_reveal"
    }
  • 202

    Ролика пока нет в скоупе, но у аккаунта идёт сбор — ролик может прийти с ним. Суточный лимит не тратится.

    Тело → CollectionProgress · заголовки: Retry-After

    Поля ответа 202
    • collection_idstring (uuid)
    • status"running"обязательное

      Сбор в очереди или идёт.

    • progressintegerобязательное
    • eta_secinteger
    • noticeNotice
    Пример ответа 202: У аккаунта идёт сбор
    {
      "status": "running",
      "progress": 40,
      "eta_sec": 400,
      "notice": "Сбор идёт. Ожидание — около 7 минут"
    }

Ошибки

GET/videos/{video_id}/voiceover

Речь ролика по секундамасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_video_voiceover

Только отрезки с речью, по возрастанию start_sec. Текст приблизительный (approximate: true, полнота слов по сверке 0,40) — подавайте его как пересказ. Ролик без речи — пустой segments и notice. Ролик — из своего сбора или пример тренда, выданный за последние 24 часа. Ролик, не разобранный по кадрам, — пустой segments и notice с причиной (речь у него не проверялась). Отрезки ролика отдаются целиком, без страниц. Одно чтение суточного лимита.

Параметры

  • video_idпуть · stringобязательный

    Shortcode ролика Instagram ([A-Za-z0-9_-]{1,64}) или URL-кодированная ссылка https://www.instagram.com/reel/<shortcode>/.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/videos/DeL6Q76okjp/voiceover" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Речь по отрезкам.

    Тело → SegmentsResponse · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • video_idstringобязательное
    • segmentsSegment[]обязательное
    • noticeNotice
    Пример ответа 200: Пульс: речь ролика — эталон Н7 через белый список тарифа
    {
      "video_id": "DeL6Q76okjp",
      "segments": [
        {
          "start_sec": 1,
          "end_sec": 7,
          "spoken_text": "Это мои волосы без стайлинга, просто высохли естественным путём. Сейчас я покажу, как я из этого пуха делаю вот такие оформленные красивые кудри.",
          "approximate": true
        },
        {
          "start_sec": 7,
          "end_sec": 17,
          "spoken_text": "Сначала хорошо смачиваю волосы водой, надушу гель и хорошо распределяю его по волосам. Он помогает убрать пух, собрать завиток и делает фиксацию до 24 часов, при этом не утяжеляет волосы.",
          "approximate": true
        },
        {
          "start_sec": 17,
          "end_sec": 22,
          "spoken_text": "Когда корни подсохли, добавляю спрей для объёма. В нем на силиконов он не утяжеляет волосы и отлично наслаивается, усиливая предыдущий стайлинг.",
          "approximate": true
        },
        {
          "start_sec": 22,
          "end_sec": 28.766667,
          "spoken_text": "И в итоге оформлены объёмные кудри, без ощущения, что на волосах тона стайлинга и нет этого пуха.",
          "approximate": true
        }
      ]
    }
  • 202

    Ролика пока нет в скоупе, но у аккаунта идёт сбор — ролик может прийти с ним. Суточный лимит не тратится.

    Тело → CollectionProgress · заголовки: Retry-After

    Поля ответа 202
    • collection_idstring (uuid)
    • status"running"обязательное

      Сбор в очереди или идёт.

    • progressintegerобязательное
    • eta_secinteger
    • noticeNotice
    Пример ответа 202: У аккаунта идёт сбор
    {
      "status": "running",
      "progress": 40,
      "eta_sec": 400,
      "notice": "Сбор идёт. Ожидание — около 7 минут"
    }

Ошибки

GET/videos/{video_id}/segments

Покадровая раскладка видеорядаасинхронно: 202 и Retry-After

Тарифы:СтудияПолный отчёт

Инструмент MCP: hooksis_video_segments

Тарифы Студия и Полный отчёт. Все отрезки ролика: что в кадре, камера, действия, надписи, настроение, речь и её пересказ. Надписи и речь приблизительны (approximate: true; надписи распознаны неточно в 39,6% отрезков). Отрезки отдаются целиком, без страниц. Одно чтение суточного лимита. Ролик — из своего сбора или пример тренда, выданный за последние 24 часа: у примера тренда раскладка из разбора ролика при поиске трендов ниши. Ролик, не разобранный по кадрам, — пустой segments и notice с причиной.

Параметры

  • video_idпуть · stringобязательный

    Shortcode ролика Instagram ([A-Za-z0-9_-]{1,64}) или URL-кодированная ссылка https://www.instagram.com/reel/<shortcode>/.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/videos/DeL6Q76okjp/segments" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Все отрезки ролика.

    Тело → SegmentsResponse · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • video_idstringобязательное
    • segmentsSegment[]обязательное
    • noticeNotice
    Пример ответа 200: Студия: все отрезки ролика — эталон Н7 через белый список тарифа
    {
      "video_id": "DeL6Q76okjp",
      "segments": [
        {
          "start_sec": 0,
          "end_sec": 1,
          "spoken_text": "",
          "speech_summary": null,
          "visual_description": "Девушка с распушёнными кудрявыми волосами держит микрофон и улыбается, на экране текст \"Проверенный способ как получить гладкие кудри без пуха\".",
          "screen_text": [
            "Проверенный способ",
            "как получить",
            "гладкие кудри без пуха",
            "мои"
          ],
          "actions": [
            "держит микрофон",
            "улыбается"
          ],
          "scene_type": "talking_head",
          "camera_style": "static",
          "mood": "neutral",
          "objects": [
            "микрофон"
          ],
          "approximate": true
        },
        {
          "start_sec": 1,
          "end_sec": 7,
          "spoken_text": "Это мои волосы без стайлинга, просто высохли естественным путём. Сейчас я покажу, как я из этого пуха делаю вот такие оформленные красивые кудри.",
          "speech_summary": "Автор показывает свои волосы без укладки и обещает продемонстрировать, как превратить их в оформленные кудри.",
          "visual_description": "Девушка показывает свои волосы, затем говорит, что они просто высохли естественным путём, и обещает показать, как избавиться от пуха и получить красивые оформленные кудри.",
          "screen_text": [
            "стайлинга",
            "естественным",
            "пуха",
            "красивые"
          ],
          "actions": [
            "показывает волосы",
            "жестикулирует"
          ],
          "scene_type": "talking_head",
          "camera_style": "static",
          "mood": "neutral",
          "objects": [],
          "approximate": true
        },
        {
          "start_sec": 7,
          "end_sec": 17,
          "spoken_text": "Сначала хорошо смачиваю волосы водой, надушу гель и хорошо распределяю его по волосам. Он помогает убрать пух, собрать завиток и делает фиксацию до 24 часов, при этом не утяжеляет волосы.",
          "speech_summary": "Сначала автор смачивает волосы и наносит гель для устранения пушистости, формирования завитков и фиксации до 24 часов без утяжеления.",
          "visual_description": "Девушка в свитере мочит волосы, расчёсывает их, наносит гель, распределяет его по волосам, затем сушит феном с насадкой диффузор.",
          "screen_text": [
            "сначала",
            "волосы",
            "наношу",
            "распределяю",
            "делает",
            "24"
          ],
          "actions": [
            "мочит волосы",
            "расчёсывает волосы",
            "наносит гель",
            "распределяет гель",
            "сушит волосы феном"
          ],
          "scene_type": "tutorial",
          "camera_style": "static",
          "mood": "informative",
          "objects": [
            "гель для волос",
            "фен с диффузором"
          ],
          "approximate": true
        },
        {
          "start_sec": 17,
          "end_sec": 22,
          "spoken_text": "Когда корни подсохли, добавляю спрей для объёма. В нем на силиконов он не утяжеляет волосы и отлично наслаивается, усиливая предыдущий стайлинг.",
          "speech_summary": "Когда корни подсохли, добавляется спрей для объёма, который не утяжеляет волосы и усиливает предыдущую укладку.",
          "visual_description": "Девушка наносит спрей на корни волос, затем снова сушит волосы феном, наклонив голову.",
          "screen_text": [
            "подсохли",
            "объёма",
            "силиконов",
            "наслаивается"
          ],
          "actions": [
            "наносит спрей",
            "сушит волосы феном"
          ],
          "scene_type": "tutorial",
          "camera_style": "static",
          "mood": "informative",
          "objects": [
            "спрей для волос",
            "фен с диффузором"
          ],
          "approximate": true
        },
        {
          "start_sec": 22,
          "end_sec": 28.766667,
          "spoken_text": "И в итоге оформлены объёмные кудри, без ощущения, что на волосах тона стайлинга и нет этого пуха.",
          "speech_summary": "В результате получаются объёмные кудри без ощущения укладочных средств и пушистости.",
          "visual_description": "Девушка в коричневой майке трясёт головой, показывая свои гладкие, объёмные кудри. Она улыбается и показывает результат.",
          "screen_text": [
            "стайлинг",
            "оформленные",
            "кудри",
            "волосах",
            "стайлинга",
            "пуха"
          ],
          "actions": [
            "трясёт головой",
            "показывает кудри",
            "улыбается"
          ],
          "scene_type": "other",
          "camera_style": "static",
          "mood": "funny",
          "objects": [],
          "approximate": true
        }
      ]
    }
  • 202

    Ролика пока нет в скоупе, но у аккаунта идёт сбор — ролик может прийти с ним. Суточный лимит не тратится.

    Тело → CollectionProgress · заголовки: Retry-After

    Поля ответа 202
    • collection_idstring (uuid)
    • status"running"обязательное

      Сбор в очереди или идёт.

    • progressintegerобязательное
    • eta_secinteger
    • noticeNotice
    Пример ответа 202: У аккаунта идёт сбор
    {
      "status": "running",
      "progress": 40,
      "eta_sec": 400,
      "notice": "Сбор идёт. Ожидание — около 7 минут"
    }

Ошибки

GET/trends

Тренды нишиасинхронно: 202 и Retry-After

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_trends_list

Карточки трендов ниши: инструкция, что снять, и тип контента. Тренды не тратят сборы. Число карточек за запрос: Пульс до 10, Разбор до 20, Студия и Полный отчёт до 30. В выдачу попадают только тренды, прошедшие внутренний фильтр качества.

Тип контента тренда — код ContentType или null, если ни один тип не набрал большинства роликов тренда; фильтр content_type такие тренды не выбирает. Ответ с таким трендом несёт notice «content_type: null — у тренда ни один тип контента не набрал большинства».

Тренды считаются по нейтральному скану ниши (до 60 роликов за 7 дней), один результат на нишу и набор языков на 24 часа. Набор языков скана — язык тарифа у Пульса и все языки у Разбора, Студии и Полного отчёта; пользователи с одной нишей и одним набором языков получают один скан. Если скана ниши нет, запрос запускает его и отвечает 202 со status: scanning; по замеру Н7 холодный скан занимает около 15 минут. Новых ниш — не больше 3 в сутки на аккаунт. Готовый ответ — одно обращение к суточному лимиту трендов.

Параметры

  • nichequery · stringобязательный

    Ниша, например «беговая обувь». Пустая — 400 INVALID_PARAMS.

  • content_typequery · ContentType

    Фильтр по типу контента — код перечня ContentType, как в ответах API. Другое значение — 400 INVALID_PARAMS.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/trends?niche=%D0%B1%D0%B5%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%BE%D0%B1%D1%83%D0%B2%D1%8C" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Карточки трендов по белому списку тарифа.

    Тело → TrendsList · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    Пример ответа 200: Пульс: один тренд ниши — эталон Н7 через белый список тарифа
    {
      "trends": [
        {
          "trend_id": "b7e4a1c9-2d3f-4e5a-8b6c-0d1e2f3a4b5c",
          "recipe_title": "Пошаговый туториал укладки",
          "recipe_trigger": "Автор держит в руках уходовое средство (крем, гель, шампунь) или инструмент (диффузор, расчёска) и показывает его в камеру.",
          "recipe_action": "Автор пошагово наносит продукт на волосы, показывает технику (например, «жамкающие» движения), сушит волосы, объясняя процесс голосом или текстом на экране. В финале демонстрируется готовая укладка.",
          "recipe_caption": "На экране появляются пошаговые инструкции или комментарии: «Наносим крем», «Сушим диффузором», «Результат на третий день», «Мой набор для ухода за кудрями».",
          "recipe_camera": "Съёмка ведётся средними и крупными планами, чтобы детально показать руки, волосы и технику нанесения. Монтаж последовательно соединяет кадры каждого этапа. Может использоваться ускоренная съёмка (timelapse) для процесса сушки.",
          "recipe_mandatory": [
            "Пошаговая демонстрация процесса укладки или ухода.",
            "Использование конкретных продуктов или инструментов.",
            "Фокус на технике выполнения действий.",
            "Демонстрация финального результата на волосах."
          ],
          "recipe_variants": [
            "Туториал по обновлению укладки («рефреш») на второй или третий день.",
            "Обзор и способ применения одного конкретного продукта.",
            "Лайфхак по использованию диффузора для максимального объёма.",
            "Сравнение двух разных техник укладки на разных половинах головы.",
            "Создание причёски на кудрявых волосах (например, высокий хвост, пучок)."
          ],
          "content_type": "expert",
          "day_to": "2026-10-09",
          "member_video_ids": [
            "DeJRhiYtZzx",
            "DeQ_IXUysS-",
            "DeSMcnJs57J",
            "DeRk_F_I29n",
            "DeP1RF4IeYS"
          ]
        }
      ]
    }
  • 202

    Ниша сканируется; повторите запрос через Retry-After. Суточный лимит не тратится.

    Тело → ScanProgress · заголовки: Retry-After

    Поля ответа 202
    • status"scanning"обязательное
    • progressintegerобязательное
    • eta_secintegerобязательное
    • noticeNotice
    Пример ответа 202: Ниша сканируется
    {
      "status": "scanning",
      "progress": 15,
      "eta_sec": 780,
      "notice": "Ищем тренды ниши, сбор при этом не тратится. Ожидание — около 15 минут"
    }

Ошибки

GET/trends/{trend_id}

Карточка тренда

Тарифы:ПульсРазборСтудияПолный отчёт

Инструмент MCP: hooksis_trend_get

Карточка по trend_id из GET /trends. Пульс — инструкция, тип контента и до 5 роликов-примеров; Разбор — плюс охват и все ролики тренда; Студия и Полный отчёт — плюс проверка тренда (evidence). Ролики-примеры становятся доступны в GET /videos/{video_id}. Тренд живёт 24 часа, потом — 410 TREND_EXPIRED. Одно обращение к суточному лимиту трендов.

Параметры

  • trend_idпуть · string (uuid)обязательный

    Идентификатор тренда из GET /trends (UUID). Несуществующий и неверного формата — 404 NOT_IN_SCOPE.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/trends/b7e4a1c9-2d3f-4e5a-8b6c-0d1e2f3a4b5c" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Карточка тренда по белому списку тарифа.

    Тело → TrendCard · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • trend_idstring (uuid)обязательное

      Идентификатор тренда на 24 часа.

    • recipe_titlestringобязательноевсе тарифы

      Название тренда.

    • recipe_triggerstringобязательноевсе тарифы

      С чего начинается ролик.

    • recipe_actionstringобязательноевсе тарифы

      Что происходит в ролике.

    • recipe_captionstringобязательноевсе тарифы

      Надписи и подпись.

    • recipe_camerastringобязательноевсе тарифы

      Съёмка и монтаж.

    • recipe_mandatorystring[]обязательноевсе тарифы

      Обязательные элементы.

    • recipe_variantsstring[]обязательноевсе тарифы

      Варианты исполнения.

    • content_typeContentType | any | nullобязательноевсе тарифы

      Тип контента тренда; null — ни один тип не набрал большинства.

    • day_tostring (date)обязательноевсе тарифы

      Дата самого свежего ролика тренда (Москва).

    • member_video_idsstring[]обязательноевсе тарифы

      Ролики тренда: Пульс — до 5, остальные тарифы — все.

    • membersobject[]все тарифы

      Ролики-примеры тренда со ссылками — те же, что member_video_ids, в том же числе.

    • carrierstringРазбор · Студия · Полный отчёт

      На чём держится тренд: sound — звук, caption — надпись, phrase — фраза, theme — тема.

      Значения: sound, caption, phrase, theme
    • n_membersintegerРазбор · Студия · Полный отчёт

      Роликов в тренде.

    • authors_totalintegerРазбор · Студия · Полный отчёт

      Авторов тренда.

    • is_crossbooleanРазбор · Студия · Полный отчёт

      Общий формат нескольких ниш (true) или своя ниша.

    • niche_spanintegerРазбор · Студия · Полный отчёт

      Сколько ниш охватывает тренд.

    • noticeNotice
    Пример ответа 200: Пульс: карточка тренда — эталон Н7 через белый список тарифа
    {
      "trend_id": "b7e4a1c9-2d3f-4e5a-8b6c-0d1e2f3a4b5c",
      "recipe_title": "Пошаговый туториал укладки",
      "recipe_trigger": "Автор держит в руках уходовое средство (крем, гель, шампунь) или инструмент (диффузор, расчёска) и показывает его в камеру.",
      "recipe_action": "Автор пошагово наносит продукт на волосы, показывает технику (например, «жамкающие» движения), сушит волосы, объясняя процесс голосом или текстом на экране. В финале демонстрируется готовая укладка.",
      "recipe_caption": "На экране появляются пошаговые инструкции или комментарии: «Наносим крем», «Сушим диффузором», «Результат на третий день», «Мой набор для ухода за кудрями».",
      "recipe_camera": "Съёмка ведётся средними и крупными планами, чтобы детально показать руки, волосы и технику нанесения. Монтаж последовательно соединяет кадры каждого этапа. Может использоваться ускоренная съёмка (timelapse) для процесса сушки.",
      "recipe_mandatory": [
        "Пошаговая демонстрация процесса укладки или ухода.",
        "Использование конкретных продуктов или инструментов.",
        "Фокус на технике выполнения действий.",
        "Демонстрация финального результата на волосах."
      ],
      "recipe_variants": [
        "Туториал по обновлению укладки («рефреш») на второй или третий день.",
        "Обзор и способ применения одного конкретного продукта.",
        "Лайфхак по использованию диффузора для максимального объёма.",
        "Сравнение двух разных техник укладки на разных половинах головы.",
        "Создание причёски на кудрявых волосах (например, высокий хвост, пучок)."
      ],
      "content_type": "expert",
      "day_to": "2026-10-09",
      "member_video_ids": [
        "DeJRhiYtZzx",
        "DeQ_IXUysS-",
        "DeSMcnJs57J",
        "DeRk_F_I29n",
        "DeP1RF4IeYS"
      ]
    }

Ошибки

GET/trends/{trend_id}/evidence

Проверка тренда

Тарифы:СтудияПолный отчёт

Инструмент MCP: hooksis_trend_evidence

Тарифы Студия и Полный отчёт. Шесть показателей проверки тренда. Тренд без проверки (все показатели null) не подаётся клиенту как подтверждённый. Одно обращение к суточному лимиту трендов.

Параметры

  • trend_idпуть · string (uuid)обязательный

    Идентификатор тренда из GET /trends (UUID). Несуществующий и неверного формата — 404 NOT_IN_SCOPE.

Пример запроса

curl -sS -X GET "https://app.hooksis.ru/api/v1/trends/b7e4a1c9-2d3f-4e5a-8b6c-0d1e2f3a4b5c/evidence" \
  -H "Authorization: Bearer hk_…"

Ответы

  • 200

    Показатели проверки.

    Тело → TrendEvidenceResponse · заголовки: X-RateLimit-Bucket, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

    Поля ответа 200
    • trend_idstring (uuid)обязательное
    • confirm_sharenumber | nullобязательное

      Доля роликов тренда, подтверждающих рецепт.

    • anti_sharenumber | nullобязательное

      Доля роликов вне тренда, которые тоже подходят под рецепт. Чем ниже, тем точнее рецепт отличает тренд.

    • contrast_separationnumber | nullобязательное

      Контраст с роликами вне тренда.

    • niche_liftnumber | nullобязательное

      Во сколько раз ролики тренда опережают обычный ролик ниши по просмотрам.

    • niche_reasonstring | nullобязательное

      Пояснение к отрыву от ниши.

    • archive_coveragenumber | nullобязательное

      Покрытие периода архивом роликов.

    Пример ответа 200: Студия: проверка тренда — эталон Н7 через белый список тарифа
    {
      "trend_id": "b7e4a1c9-2d3f-4e5a-8b6c-0d1e2f3a4b5c",
      "confirm_share": 1,
      "anti_share": 0.4444444444444444,
      "contrast_separation": 0.5555555555555556,
      "niche_lift": 0.21707086017430846,
      "niche_reason": "Ролики тренда набирают слабее обычного ролика ниши. Признаки рецепта отличают тренд от остальной ниши.",
      "archive_coverage": 0.7142857142857143
    }

Ошибки

Коды ошибок

Тело ошибки — {"error": {"code", "message", "details"}}. Ветвление — по code; коды одинаковы в REST API и MCP.

  • PLAN_QUOTA_EXCEEDED402

    сборы периода закончились; в Полном отчёте — сбор уже использован

  • PLAN_LANGUAGE_LIMIT403

    языков больше лимита тарифа или в Пульсе язык не равен языку тарифа

  • PLAN_PERIOD_LIMIT403

    period_days больше лимита тарифа

  • PLAN_FEATURE_UNAVAILABLE403

    ресурс или параметр есть только в старшем тарифе; ближайший такой тариф — в details.nearest

  • PLAN_REPORT_USED409

    отчёт уже готов; ссылка — в details.url

  • PLAN_EXPIRED402

    тариф не подключён, истёк или доступ закрыт

  • NOT_IN_SCOPE404

    сбор, ролик или тренд не принадлежит аккаунту или не существует

  • COLLECTION_EXPIRED410

    данные сбора старше 24 часов; для свежих цифр нужен новый сбор

  • RATE_LIMITED429

    суточный лимит чтений или трендов, лимит новых ниш, общий суточный предел сканов; сброс — 00:00 по Москве

  • COLLECTION_EMPTY409

    роликов по теме не найдено, сбор не списан; можно запустить сбор с другой темой

  • COLLECTION_FAILED409

    сбор не удался, сбор не списан; его можно запустить заново тем же запросом

  • SERVICE_UNAVAILABLE503

    сервис не ответил при запуске; ничего не списано, тот же запрос повторяется через несколько минут

  • INVALID_PARAMS400

    параметр отсутствует, неверного типа или вне допустимых значений

  • TREND_EXPIRED410

    тренд старше 24 часов; запросите тренды заново

Схемы данных

Поле вне тарифа в ответ не попадает; поле тарифа есть всегда, отсутствие данных — null.

Plan

Код тарифа: pulse — Пульс, razbor — Разбор, studio — Студия, report — Полный отчёт.

Тип: string · значения: pulse, razbor, studio, report

ContentType

Тип контента: expert — экспертный, ad — рекламный, entertainment — развлекательный.

Тип: string · значения: expert, ad, entertainment

ErrorCode

Код бизнес-отказа. Совпадает с кодами MCP-сервера.

Тип: string · значения: PLAN_QUOTA_EXCEEDED, PLAN_LANGUAGE_LIMIT, PLAN_PERIOD_LIMIT, PLAN_FEATURE_UNAVAILABLE, PLAN_REPORT_USED, PLAN_EXPIRED, NOT_IN_SCOPE, COLLECTION_EXPIRED, RATE_LIMITED, COLLECTION_EMPTY, COLLECTION_FAILED, SERVICE_UNAVAILABLE, INVALID_PARAMS, TREND_EXPIRED

Error
  • errorobjectобязательное
  • error.codeErrorCodeобязательное
  • error.messagestringобязательное

    Текст для человека на русском. Формулировка не входит в контракт — ветвление только по code.

  • error.detailsErrorDetails
  • noticeNotice
ErrorDetails

Параметры отказа; набор ключей зависит от кода.

  • planPlan
  • limitinteger

    Лимит тарифа: языков в сборе (PLAN_LANGUAGE_LIMIT) или дней периода (PLAN_PERIOD_LIMIT).

  • languagestring

    Язык тарифа Пульс (ISO 639-1) при PLAN_LANGUAGE_LIMIT.

  • nearestPlan

    Ближайший тариф, где есть ресурс или параметр (PLAN_FEATURE_UNAVAILABLE).

  • whatstring

    Что именно закрыто (PLAN_FEATURE_UNAVAILABLE).

  • paramstring

    Имя неверного параметра (INVALID_PARAMS).

  • reasonstring

    Причина (INVALID_PARAMS).

    Значения: empty, too_long, unknown_code, not_positive_integer, type, unknown_value, out_of_range, required, malformed, foreign, count, empty_field, empty_step, video_id, video_out_of_scope, all_with_codes, unknown, not_positive, mixed_alphabet
  • video_idstring

    Ролик концепта не из этого сбора (INVALID_PARAMS, reason = video_out_of_scope).

  • wordstring

    Слово текста агента (brief, title, hook, steps) из букв кириллицы и латиницы, которое нельзя однозначно привести к одному алфавиту (INVALID_PARAMS, reason = mixed_alphabet). Слово с буквами-двойниками другого алфавита («гранoле» с латинской «o») приводится без отказа.

  • resets_atstring

    Дата сброса сборов (PLAN_QUOTA_EXCEEDED, YYYY-MM-DD) или момент сброса суточного лимита (RATE_LIMITED, date-time).

  • kindstring

    Какой лимит исчерпан (RATE_LIMITED): read, trend, new_niche — новые ниши за сутки, spend_ceiling — общий суточный предел сканов.

    Значения: read, trend, new_niche, spend_ceiling
  • expired_atstring (date)

    Дата окончания доступа (PLAN_EXPIRED).

  • urlstring (uri)

    Ссылка на готовый отчёт (PLAN_REPORT_USED) или на продление/докупку в кабинете (PLAN_QUOTA_EXCEEDED, PLAN_EXPIRED).

  • feedback_form_urlstring (uri)

    Ссылка анонимной формы отзыва (PLAN_EXPIRED закончившегося доступа — тариф или бета истекли). Та же ссылка, что в message; действует 30 суток.

AuthError
  • errorobjectобязательное
  • error.code"UNAUTHORIZED"обязательное
  • error.messagestringобязательное
Notice

Служебная пометка к ответу для человека, например «Остался один сбор», «Разобрано 50 из 100», «У 2 роликов нет отрыва от аудитории: у автора меньше 1000 подписчиков или их число неизвестно», «Норма посчитана у 22 из 25», «В ролике нет речи», «Ролик не разобран по кадрам: покадровой раскладки и речи по секундам у него нет…», «content_type: null — у тренда ни один тип контента не набрал большинства», «outperformance: null — у автора меньше 1000 подписчиков или их число неизвестно: кратность к горстке подписчиков не говорит о выходе ролика за аудиторию». Несколько пометок — одной строкой через «. ».

Тип: string

Quota
  • usedintegerобязательное

    Списано в текущем периоде вместе с резервами идущих сборов.

  • leftintegerобязательное

    Осталось сборов.

  • limitintegerобязательное

    Лимит периода с доначислениями.

  • resets_atstring (date)

    Дата сброса сборов (Москва). Только подписки: Пульс, Разбор, Студия.

  • access_untilstring (date-time)

    Конец доступа. Только Полный отчёт.

RecentFailure
  • kindstringобязательное

    collection — сбор, trends — поиск трендов ниши.

    Значения: collection, trends
  • collection_idstring (uuid)

    Упавший сбор. Есть у collection.

  • topicstring

    Тема упавшего сбора, как её передали. Есть у collection.

  • nichestring

    Ниша упавшего поиска трендов, как её передали. Есть у trends.

  • failed_atstring (date-time)обязательное

    Момент провала (Москва).

  • reasonstringобязательное

    Причина провала словами, например «источник роликов не отвечал».

CollectionBrief
  • collection_idstring (uuid)обязательное
  • topicstringобязательное

    Тема сбора, как её передали.

  • languagesstring[]обязательное

    Коды ISO 639-1 по алфавиту; ["*"] — все языки.

  • period_daysintegerобязательное
  • statusstringобязательное

    queued — в очереди, running — идёт, ready — готов.

    Значения: queued, running, ready
  • progressintegerобязательное
  • eta_secinteger

    Оценка оставшегося времени, с. Есть у идущего сбора.

  • expires_atstring (date-time)

    Конец 24-часового окна чтения готового сбора.

CollectionStatus
  • collection_idstring (uuid)обязательное
  • topicstringобязательное
  • languagesstring[]обязательное

    Коды ISO 639-1 по алфавиту; ["*"] — все языки.

  • period_daysintegerобязательное
  • statusstringобязательное

    queued — в очереди; running — идёт; ready — готов, данные читаются 24 часа; empty — роликов по теме не найдено, сбор не списан; failed — сбор не удался, сбор не списан; expired — окно чтения истекло.

    Значения: queued, running, ready, empty, failed, expired
  • progressintegerобязательное
  • eta_secinteger

    Оценка оставшегося времени, с. Есть у идущего сбора.

  • expires_atstring (date-time)

    Конец окна чтения готового сбора.

  • noticeNotice
Account

Без тарифа — только notice; с закончившимся доступом — notice и feedback_form_url.

  • planPlan
  • plan_languagestring

    Язык тарифа Пульс (ISO 639-1), по умолчанию ru; закреплён за аккаунтом.

  • quotaQuota
  • resets_atstring (date)

    Дата сброса сборов (Москва). Только подписки.

  • expires_atstring (date-time)

    Конец доступа: подписка — месяц от оплаты, Полный отчёт — 7 дней от оплаты.

  • active_collectionsCollectionBrief[]

    Идущие сборы и готовые в пределах 24 часов.

  • recent_failuresRecentFailure[]

    Упавшие за последние 24 часа сборы и поиски трендов ниш аккаунта, свежие первыми (до пяти каждого вида). Провал, после которого по той же теме или нише запускался новый сбор или поиск, не показывается: его заменил новый запуск. Упавший сбор не списан, упавший поиск трендов не засчитан в лимит новых ниш; оба запускаются заново сразу. Поле есть, когда такие провалы есть; notice называет их словами.

  • feedback_form_urlstring (uri)

    Ссылка анонимной формы отзыва (4 вопроса, без имени и почты) — только когда доступ закончился, то есть тариф или бета истекли. Та же ссылка, что в notice; действует 30 суток.

  • other_plansOtherPlan[]

    Возможности, которых нет в тарифе, и тариф, где каждая есть. Строка называет только тариф, который сохраняет всё из текущего: каждый инструмент и поле ответа, квоты одного сбора (языки, период, ролики, примеры тренда) не ниже. Возможность — первый по старшинству такой тариф; квота — каждый такой тариф, поднимающий её выше. Число сборов сравнивается внутри одной модели покупки: подписки — «в месяц», Полный отчёт — «на покупку». Выводится из тех же правил, что решают доступ; строка возможности инструмента начинается текстом details.what отказа PLAN_FEATURE_UNAVAILABLE и называет тот же тариф, что details.nearest. У Полного отчёта массив пустой: HTML-отчёт есть только в нём.

  • noticeNotice
OtherPlan
  • featurestringобязательное

    Возможность по-русски, например «покадровая раскладка видеоряда» или «до 3 языков в одном сборе».

  • planPlanобязательное
  • plan_titlestringобязательное

    Название тарифа по-русски — Пульс, Разбор, Студия, Полный отчёт.

CollectRequest
  • topicstringобязательное

    Тема поиска, 1–200 символов после обрезки пробелов.

  • languagesstring[]

    Коды ISO 639-1 (регистр не важен, повторы схлопываются). Пульс — один язык тарифа (plan_language); без параметра берётся он, другой язык — 403 PLAN_LANGUAGE_LIMIT. Разбор — от 1 до 3 языков, параметр обязателен. Студия и Полный отчёт — любое число языков; без параметра — все языки. Пустой массив и неизвестный код — 400 INVALID_PARAMS.

  • period_daysinteger

    Период поиска в днях. Пульс — до 7, остальные тарифы — до 30. Без параметра — максимум тарифа. Больше лимита — 403 PLAN_PERIOD_LIMIT.

CollectAccepted
  • collection_idstring (uuid)обязательное
  • statusstringобязательное
    Значения: queued, running, ready
  • progressintegerобязательное
  • eta_secintegerобязательное

    Оценка времени до готовности, с; 0 у готового сбора.

  • quotaQuotaобязательное
  • noticeNotice
CollectionProgress
  • collection_idstring (uuid)
  • status"running"обязательное

    Сбор в очереди или идёт.

  • progressintegerобязательное
  • eta_secinteger
  • noticeNotice
ScanProgress
  • status"scanning"обязательное
  • progressintegerобязательное
  • eta_secintegerобязательное
  • noticeNotice
Video

Ролик в именах полей ТЗ. Набор полей задаёт тариф (x-plans): Пульс — 27 полей, Разбор — 32, Студия и Полный отчёт — 35. Поля тарифа присутствуют всегда; null — данных нет или слой не посчитан.

  • video_idstringобязательноевсе тарифы

    Shortcode ролика.

  • web_video_urlstring (uri)обязательноевсе тарифы

    Ссылка на ролик.

  • create_time_isostring (date-time)обязательноевсе тарифы

    Время публикации.

  • author_namestring | nullобязательноевсе тарифы

    Ник автора.

  • author_fansinteger | nullобязательноевсе тарифы

    Подписчики автора на момент fetched_at.

  • play_countinteger | nullобязательноевсе тарифы

    Просмотры на момент fetched_at.

  • digg_countinteger | nullобязательноевсе тарифы

    Лайки на момент fetched_at.

  • comment_countinteger | nullобязательноевсе тарифы

    Комментарии на момент fetched_at.

  • collect_countinteger | nullобязательноевсе тарифы

    Сохранения на момент fetched_at.

  • share_countinteger | nullобязательноевсе тарифы

    Репосты на момент fetched_at.

  • durationnumber | nullобязательноевсе тарифы

    Длительность, с.

  • music_idstring | nullобязательноевсе тарифы

    Идентификатор звука.

  • music_namestring | nullобязательноевсе тарифы

    Название звука.

  • music_originalboolean | nullобязательноевсе тарифы

    Оригинальный звук автора.

  • hashtagsstring[]обязательноевсе тарифы

    Хэштеги без #.

  • textstring | nullобязательноевсе тарифы

    Подпись к ролику.

  • text_languagestring | nullобязательноевсе тарифы

    Язык подписи (ISO 639-1).

  • fetched_atstring (date-time)обязательноевсе тарифы

    Момент, на который сняты цифры ролика.

  • outperformancenumber | nullобязательноевсе тарифы

    Отрыв от аудитории автора: play_count / author_fans — только у авторов от 1000 подписчиков. У автора меньше 1000 подписчиков или с неизвестным числом — null: при горстке подписчиков кратность случайна и о выходе ролика за аудиторию не говорит.

  • save_ratenumber | nullобязательноевсе тарифы

    Сохранения от просмотров.

  • share_ratenumber | nullобязательноевсе тарифы

    Репосты от просмотров.

  • comment_ratenumber | nullобязательноевсе тарифы

    Комментарии от просмотров.

  • summarystring | nullобязательноевсе тарифы

    Пересказ ролика.

  • languagestring | nullобязательноевсе тарифы

    Язык ролика (ISO 639-1): по речи, затем по надписям, затем по подписи.

  • format_hook_typestring | nullобязательноевсе тарифы

    Тип хука первых секунд.

  • format_editingstring[]обязательноевсе тарифы

    Монтажные приёмы.

  • format_labelstring | nullобязательноевсе тарифы

    Шаблон ролика.

  • author_norm_rationumber | nullРазбор · Студия · Полный отчёт

    Во сколько раз ролик быстрее обычных роликов автора; null — норма не посчитана.

  • format_structurestring | nullРазбор · Студия · Полный отчёт

    Сюжетная схема.

  • scene_typesstring[]Разбор · Студия · Полный отчёт

    Типы сцен ролика.

  • objectsstring[]Разбор · Студия · Полный отчёт

    Предметы в кадре.

  • nichesstring[]Разбор · Студия · Полный отчёт

    Ниши ролика.

  • hook_at_secnumber | nullСтудия · Полный отчёт

    Секунда, на которой звучит хук; null — не измерено.

  • product_at_secnumber | nullСтудия · Полный отчёт

    Секунда первого появления продукта (предмета темы); null — продукт не показан или отрезков нет.

  • cuts_per_10snumber | nullСтудия · Полный отчёт

    Темп смены планов: склеек на 10 с; null — не измерено.

  • noticeNotice
VideosPage
  • collection_idstring (uuid)обязательное
  • videosVideo[]обязательное
  • next_cursorstring

    Курсор следующей страницы; на последней странице поля нет.

  • noticeNotice
Segment

Отрезок ролика. GET /videos/{video_id}/voiceover — поля речи всем тарифам (только отрезки с речью); GET /videos/{video_id}/segments — все поля, тарифы Студия и Полный отчёт.

  • start_secnumberобязательноевсе тарифы

    Начало отрезка, с.

  • end_secnumberобязательноевсе тарифы

    Конец отрезка, с; всегда больше start_sec.

  • spoken_textstringобязательноевсе тарифы

    Речь отрезка, приблизительно; пустая строка — речи нет.

  • speech_summarystring | nullСтудия · Полный отчёт

    Пересказ речи отрезка; null — речи нет.

  • visual_descriptionstringСтудия · Полный отчёт

    Что в кадре.

  • screen_textstring[]Студия · Полный отчёт

    Надписи в кадре, приблизительно.

  • actionsstring[]Студия · Полный отчёт

    Действия в кадре.

  • scene_typestring | nullСтудия · Полный отчёт

    Тип сцены.

  • camera_stylestring | nullСтудия · Полный отчёт

    Работа камеры.

  • moodstring | nullСтудия · Полный отчёт

    Настроение.

  • objectsstring[]Студия · Полный отчёт

    Предметы в кадре отрезка.

  • approximatetrueобязательное

    Текст приблизительный: подаётся как пересказ.

SegmentsResponse
  • video_idstringобязательное
  • segmentsSegment[]обязательное
  • noticeNotice
ValueShare
  • valuestringобязательное

    Значение признака.

  • videosintegerобязательное

    Роликов с этим значением.

  • sharenumberобязательное

    Доля роликов сбора.

  • video_idsstring[]

    Ролики с этим значением.

  • approximatetrue

    Есть у хуков: значение подаётся как пересказ.

Distribution
  • nintegerобязательное

    Роликов с измерением.

  • minnumber | nullобязательное
  • q1number | nullобязательное
  • mediannumber | nullобязательное
  • q3number | nullобязательное
  • maxnumber | nullобязательное
  • not_measuredinteger

    Роликов без замера (только cuts_per_10s).

Aggregates

Агрегаты сводки; ключ есть, только если агрегат положен тарифу и его слой посчитан у сбора.

  • soundsobject[]все тарифы

    Звуки, повторяющиеся у ≥ 2 роликов.

  • hooksValueShare[]все тарифы

    Типы хука: число и доля роликов.

  • editingValueShare[]все тарифы

    Монтажные приёмы: число и доля роликов.

  • templatesobject[]все тарифы

    Шаблоны, повторённые ≥ 2 авторами.

  • durationDistributionвсе тарифы

    Распределение длительности, с.

  • median_play_countnumber | nullвсе тарифы

    Медиана просмотров сбора.

  • structuresValueShare[]Разбор · Студия · Полный отчёт

    Сюжетные схемы.

  • scene_type_sharesValueShare[]Разбор · Студия · Полный отчёт

    Доли типов сцен по роликам; ролик с несколькими типами входит в каждый, сумма долей может быть больше 1.

  • objects_topValueShare[]Разбор · Студия · Полный отчёт

    Частые предметы в кадре.

  • niches_topValueShare[]Разбор · Студия · Полный отчёт

    Ниши роликов (первая ниша ролика).

  • hook_product_timingValueShare[]Студия · Полный отчёт

    Когда появляется продукт: корзины секунд и «не показан».

  • cuts_per_10sDistributionСтудия · Полный отчёт

    Темп смены планов: распределение склеек на 10 с.

  • leaders_timingobject[]Студия · Полный отчёт

    Момент хука, первого появления продукта и темп у 10 роликов-лидеров по просмотрам.

Summary
  • collection_idstring (uuid)обязательное
  • videos_totalintegerобязательное

    Роликов в сборе.

  • aggregatesAggregatesобязательное
  • noticeNotice
TrendEvidence Студия · Полный отчёт

Проверка тренда. Все поля null — проверка не проводилась. Тарифы: Студия, Полный отчёт.

  • confirm_sharenumber | nullобязательноеСтудия · Полный отчёт

    Доля роликов тренда, подтверждающих рецепт.

  • anti_sharenumber | nullобязательноеСтудия · Полный отчёт

    Доля роликов вне тренда, которые тоже подходят под рецепт. Чем ниже, тем точнее рецепт отличает тренд.

  • contrast_separationnumber | nullобязательноеСтудия · Полный отчёт

    Контраст с роликами вне тренда.

  • niche_liftnumber | nullобязательноеСтудия · Полный отчёт

    Во сколько раз ролики тренда опережают обычный ролик ниши по просмотрам.

  • niche_reasonstring | nullобязательноеСтудия · Полный отчёт

    Пояснение к отрыву от ниши.

  • archive_coveragenumber | nullобязательноеСтудия · Полный отчёт

    Покрытие периода архивом роликов.

TrendEvidenceResponse

Проверка тренда с его идентификатором. Тарифы: Студия, Полный отчёт.

  • trend_idstring (uuid)обязательное
  • confirm_sharenumber | nullобязательное

    Доля роликов тренда, подтверждающих рецепт.

  • anti_sharenumber | nullобязательное

    Доля роликов вне тренда, которые тоже подходят под рецепт. Чем ниже, тем точнее рецепт отличает тренд.

  • contrast_separationnumber | nullобязательное

    Контраст с роликами вне тренда.

  • niche_liftnumber | nullобязательное

    Во сколько раз ролики тренда опережают обычный ролик ниши по просмотрам.

  • niche_reasonstring | nullобязательное

    Пояснение к отрыву от ниши.

  • archive_coveragenumber | nullобязательное

    Покрытие периода архивом роликов.

TrendCard
  • trend_idstring (uuid)обязательное

    Идентификатор тренда на 24 часа.

  • recipe_titlestringобязательноевсе тарифы

    Название тренда.

  • recipe_triggerstringобязательноевсе тарифы

    С чего начинается ролик.

  • recipe_actionstringобязательноевсе тарифы

    Что происходит в ролике.

  • recipe_captionstringобязательноевсе тарифы

    Надписи и подпись.

  • recipe_camerastringобязательноевсе тарифы

    Съёмка и монтаж.

  • recipe_mandatorystring[]обязательноевсе тарифы

    Обязательные элементы.

  • recipe_variantsstring[]обязательноевсе тарифы

    Варианты исполнения.

  • content_typeContentType | any | nullобязательноевсе тарифы

    Тип контента тренда; null — ни один тип не набрал большинства.

  • day_tostring (date)обязательноевсе тарифы

    Дата самого свежего ролика тренда (Москва).

  • member_video_idsstring[]обязательноевсе тарифы

    Ролики тренда: Пульс — до 5, остальные тарифы — все.

  • membersobject[]все тарифы

    Ролики-примеры тренда со ссылками — те же, что member_video_ids, в том же числе.

  • carrierstringРазбор · Студия · Полный отчёт

    На чём держится тренд: sound — звук, caption — надпись, phrase — фраза, theme — тема.

    Значения: sound, caption, phrase, theme
  • n_membersintegerРазбор · Студия · Полный отчёт

    Роликов в тренде.

  • authors_totalintegerРазбор · Студия · Полный отчёт

    Авторов тренда.

  • is_crossbooleanРазбор · Студия · Полный отчёт

    Общий формат нескольких ниш (true) или своя ниша.

  • niche_spanintegerРазбор · Студия · Полный отчёт

    Сколько ниш охватывает тренд.

  • noticeNotice
TrendsList
Concept
  • titlestringобязательное
  • hookstringобязательное
  • stepsstring[]обязательное
  • video_idsstring[]обязательное

    Shortcode или ссылки роликов этого сбора.

ReportRequest
  • briefstring

    Бриф пользователя.

  • conceptsConcept[]обязательное

    Ровно 5 концептов для блока 10 отчёта; ролики — только из этого сбора.

ReportAccepted
  • collection_idstring (uuid)обязательное
  • status"generating"обязательное

    Отчёт готовится; ссылка уже действует.

  • urlstring (uri)обязательное

    Ссылка на HTML-отчёт.

  • expires_atstring (date-time)

    Срок жизни ссылки (7 дней).

  • noticeNotice