hubris

POST /v1/video/transcriptions

Расшифровка или пересказ ролика YouTube по ссылке. Проверка ролика до запроса к модели, оплата по токенам.

Принимает ссылку на публичный ролик YouTube и возвращает дословную расшифровку с таймкодами или короткий пересказ. Скачивать видео не нужно: ролик по ссылке смотрит модель google/gemini-3.8-flash.

До запроса к модели Hubris проверяет ролик: удалённый, приватный, открытый только по ссылке, прямой эфир и ролик длиннее четырёх часов отклоняются сразу, и за них ничего не списывается.

Тот же сценарий без кода — инструмент «Видео по ссылке» с фиксированной ценой за ролик. У метода API цена другая: оплата по токенам, как у любого запроса к модели.

Эндпоинт

POSThttps://api.hubris.pw/v1/video/transcriptions
ЗаголовокЗначение
AuthorizationBearer sk-gw-... (обязательно), ключ с правом chat:write
Content-Typeapplication/json

Тело запроса

ПолеТипПо умолчаниюОписание
urlstringСсылка на ролик: youtube.com/watch?v=…, youtu.be/…, youtube.com/shorts/…, youtube.com/live/….
modestringexactexact — дословная расшифровка, каждая реплика с новой строки и таймкодом [HH:MM:SS]. fast — пересказ и ключевые мысли с таймкодами: быстрее и в несколько раз дешевле на длинном ролике, но таймкоды приблизительные.
diarizebooleanfalseТолько для exact: помечать реплики говорящими («Говорящий 1:», или по имени, если оно звучит в ролике).

Пример

curl -s https://api.hubris.pw/v1/video/transcriptions \-H "Authorization: Bearer sk-gw-..." \-H "Content-Type: application/json" \-d '{"url": "https://youtu.be/ITL6WqcV6sE", "mode": "exact", "diarize": true}'
import requestsr = requests.post(  "https://api.hubris.pw/v1/video/transcriptions",  headers={"Authorization": "Bearer sk-gw-..."},  json={"url": "https://youtu.be/ITL6WqcV6sE", "mode": "fast"},  timeout=900,)r.raise_for_status()print(r.json()["text"])
const r = await fetch("https://api.hubris.pw/v1/video/transcriptions", {method: "POST",headers: {  Authorization: "Bearer sk-gw-...",  "Content-Type": "application/json",},body: JSON.stringify({ url: "https://youtu.be/ITL6WqcV6sE", mode: "fast" }),});const body = await r.json();if (!r.ok) throw new Error(body.error.message);console.log(body.text);

Ответ приходит целиком, без стрима. Часовой ролик в режиме exact обрабатывается несколько минут, поэтому поставьте таймаут клиента не меньше 15 минут.

Ответ

{
  "id": "vtr-3f9c1a7b2d4e5f60",
  "object": "video.transcription",
  "created": 1789550000,
  "model": "google/gemini-3.8-flash",
  "video": { "id": "ITL6WqcV6sE", "title": "Как подключить оплату через n8n", "duration_sec": 4375 },
  "mode": "exact",
  "diarize": true,
  "text": "[00:00:07] Константин: Всем привет…\n[00:00:19] Константин: Сегодня…",
  "truncated": false,
  "usage": {
    "prompt_tokens": 78120,
    "completion_tokens": 16210,
    "total_tokens": 94330,
    "cost": 1840,
    "requests": 1
  }
}
ПолеТипОписание
textstringРасшифровка или пересказ.
videoobjectИдентификатор, название и длительность ролика в секундах.
truncatedbooleantrue — текст оборвался по лимиту длины ответа даже после продолжений. Бывает на очень длинных и плотных по речи роликах.
usage.costintegerСтоимость в копейках — сумма всех запросов к модели.
usage.requestsintegerСколько запросов к модели понадобилось. Если ответ упирается в лимит длины, Hubris сам запрашивает продолжение с последнего таймкода и склеивает куски, всего до пяти запросов.

HTTP-коды

Кодerror.codeКогда
200Готово.
400invalid_video_urlСсылка не на ролик YouTube.
400video_is_liveИдёт прямой эфир или премьера.
400video_too_longРолик длиннее четырёх часов.
401Ключ отсутствует, отозван или без права chat:write.
402Недостаточно средств на балансе.
404video_unavailableРолик удалён, приватный или открывается только по ссылке.
429Превышен лимит расхода ключа.
502 / 503Временный сбой модели или проверки ролика — повторите позже.

Формат тела ошибки — Ошибки.

Видео в chat/completions

Если нужен свой промпт — например, вопросы по ролику, — передайте ссылку частью сообщения video_url в /v1/chat/completions с моделью Gemini:

{
  "model": "google/gemini-3.8-flash",
  "messages": [{
    "role": "user",
    "content": [
      { "type": "text", "text": "Какие платёжные системы подключают в ролике?" },
      { "type": "video_url", "video_url": { "url": "https://youtu.be/ITL6WqcV6sE" } }
    ]
  }]
}

Поле video_url.processing: "agentic" включает быструю обработку, как в режиме fast. В отличие от /v1/video/transcriptions, здесь ролик заранее не проверяется: за недоступную ссылку модель ответит текстом, и запрос будет оплачен.

Обновлено: