REST API · v1

API bloknot

Отправьте файл или ссылку в наш конвейер и получите расшифровку: с метками спикеров, AI-саммари, переводом на другие языки и семью форматами для скачивания. Тот же движок, что и в кабинете, — только под ваши скрипты и приложения.

Доступ по тарифу. API входит в тарифы Pro и Business. На бесплатном аккаунте можно зарегистрироваться и посмотреть кабинет, но POST /api-keys вернёт 403, пока вы не перейдёте на платный тариф.

Введение

Все эндпоинты живут под одним базовым URL. Ответ всегда в JSON, если вы явно не запросили другой формат (экспорт расшифровки отдаёт TXT, SRT, VTT, DOCX, MD или PDF).

Базовый URL
https://api.bloknot.ai/api/v1

Запросы используют обычные HTTP-методы и коды состояния. Успешный вызов возвращает 2xx с телом в JSON; ошибка — 4xx или 5xx в форме { "detail": { "code": "...", "message": "..." } }. Полный список кодов — в разделе Ошибки.

Авторизация

Войдите в app.bloknot.ai/settings API-ключи, нажмите Создать, задайте имя ключа и скопируйте значение. Мы храним только SHA-256-хеш, поэтому сырой токен ts_... показывается ровно один раз. Потеряли — создаёте новый: восстановления нет, и это сделано намеренно.

Передавайте ключ в заголовке X-API-Key в каждом запросе:

curl
curl https://api.bloknot.ai/api/v1/jobs \
  -H "X-API-Key: ts_••••••••••••••••••••••••••••••••"
Ключ — это как пароль. Не коммитьте его, не зашивайте в мобильную сборку, не кладите в бандл фронтенда. Если ключ утёк — удалите его в Настройки → API-ключи: следующий запрос с этим хешем получит 401.

Быстрый старт

Три вызова от начала до конца: загрузить файл, дождаться статуса done, скачать расшифровку.

bash
# 1) Загрузка — вернёт { id, status }
JOB=$(curl -sS -X POST https://api.bloknot.ai/api/v1/jobs \
  -H "X-API-Key: $TS_KEY" \
  -F "file=@meeting.mp3" \
  -F "diarize=true" | jq -r .id)

# 2) Опрос — каждые несколько секунд, либо используйте WebSocket
while true; do
  STATUS=$(curl -sS https://api.bloknot.ai/api/v1/jobs/$JOB \
    -H "X-API-Key: $TS_KEY" | jq -r .status)
  [ "$STATUS" = "done" ] && break
  [ "$STATUS" = "failed" ] && echo "failed" && exit 1
  sleep 3
done

# 3) Скачивание — TXT, SRT, VTT, DOCX, MD, JSON, PDF
curl -sS "https://api.bloknot.ai/api/v1/jobs/$JOB/export?format=md" \
  -H "X-API-Key: $TS_KEY" -o meeting.md

Тарифы и лимиты

Лимиты считаются на пользователя, а не на ключ. Все ключи Pro-аккаунта делят общий месячный запас минут этого аккаунта.

ВозможностьFreeProBusiness
Доступ к API
Минут в месяц306002 500
Макс. длительность файла30 мин10 ч10 ч
Макс. размер файла100 МБ2 ГБ5 ГБ
Параллельных задач12050
Разметка по спикерам
AI-саммари и полировка
Переводов в месяц1050
Приоритет в очередиНизкийОбычныйВысокий

Нужно больше? Напишите нам — посчитаем корпоративный тариф: свой объём минут, SLA, выделенная очередь и вариант установки on-premise.

Загрузить файл

POST/api/v1/jobs

Multipart-загрузка. Файл стримится сразу в S3 — не буферизуется в памяти, — а проверка первых 16 КБ по сигнатуре отсекает подделки формата ещё до того, как файл дойдёт до ffmpeg.

Поля формы

ПолеТипОписание
filefileАудио или видео: mp3, m4a, wav, ogg, opus, flac, webm, mp4, mov, mkv, avi.
diarizebooleanМетки спикеров. По умолчанию false. Только Pro и выше.
curl
curl -X POST https://api.bloknot.ai/api/v1/jobs \
  -H "X-API-Key: $TS_KEY" \
  -F "file=@meeting.mp3" \
  -F "diarize=true"
json · 200
{
  "id": "5d3f2c80-9a4f-4f3a-9ab1-5d7c3a1e0b91",
  "status": "queued"
}

Отправить ссылку

POST/api/v1/jobs/from-url

Дайте нам любую ссылку, которую понимает наш универсальный экстрактор — YouTube, TikTok, Instagram, Twitter/X, Facebook, Reddit, Vimeo, SoundCloud, Twitch, подкаст-ленты и ещё ~1500 сайтов, — либо прямой URL на аудио- или видеофайл. Мы скачаем, перекодируем и поставим в очередь.

curl
curl -X POST https://api.bloknot.ai/api/v1/jobs/from-url \
  -H "X-API-Key: $TS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "language": "auto",
    "diarize": false
  }'
json · 200
{
  "id": "5d3f2c80-9a4f-4f3a-9ab1-5d7c3a1e0b91",
  "status": "queued"
}
Умная маршрутизация. Для YouTube мы используем платный бэкенд Apify — так надёжнее; всё остальное идёт сначала через yt-dlp с откатом на прямой GET. Вы платите только за расшифрованные минуты — скачивание за наш счёт.

Список задач

GET/api/v1/jobs

Постраничный список задач вызывающего пользователя, новые сверху. Необязательный фильтр status принимает любое из queued, downloading, extracting, transcribing, diarizing, analyzing, done, failed.

curl
curl "https://api.bloknot.ai/api/v1/jobs?page=1&limit=20&status=done" \
  -H "X-API-Key: $TS_KEY"
json · 200
{
  "jobs": [
    {
      "id": "5d3f2c80-...",
      "status": "done",
      "stage": 6,
      "progress": 100,
      "duration_sec": 312.4,
      "language_detected": "ru",
      "created_at": "2026-05-04T08:12:31Z"
    }
  ],
  "total": 47,
  "page": 1,
  "limit": 20
}

Получить задачу

GET/api/v1/jobs/{id}

Полная запись задачи: текст расшифровки, при наличии — сегменты разметки по спикерам, саммари и все закешированные переводы. Опрашивайте раз в 2–5 секунд или, что гораздо лучше, подпишитесь на обновления по WebSocket.

curl
curl https://api.bloknot.ai/api/v1/jobs/$JOB_ID \
  -H "X-API-Key: $TS_KEY"
json · 200
{
  "id": "5d3f2c80-...",
  "status": "done",
  "stage": 6,
  "progress": 100,
  "duration_sec": 312.4,
  "transcription": {
    "id": "...",
    "full_text": "Здравствуйте, добро пожаловать в эфир...",
    "language_detected": "ru"
  },
  "diarization": {
    "segments": [
      { "speaker": "speaker_0", "start": 0.0, "end": 4.2,
        "text": "Здравствуйте, добро пожаловать в эфир." }
    ],
    "num_speakers": 2
  },
  "summary": null,
  "translations": []
}

Экспорт расшифровки

GET/api/v1/jobs/{id}/export?format=...

Семь форматов. JSON отдаёт версионированный payload TranscriptionExportV1 (стабилен между минорными релизами — ломающие изменения повышают версию).

ФорматКогда использовать
txtЧистый текст без метаданных.
mdАбзацы с метками спикеров, саммари, задачи.
srtСубтитры для монтажа видео.
vttВеб-субтитры для HTML5-видео.
docxWord — протокол встречи, реплики по спикерам.
pdfГотовый к печати отчёт с блоком саммари.
jsonСтруктурированный payload для ваших инструментов.
curl
curl "https://api.bloknot.ai/api/v1/jobs/$JOB_ID/export?format=docx" \
  -H "X-API-Key: $TS_KEY" \
  -o meeting.docx

Заголовок Content-Disposition использует кодировку RFC 5987, поэтому не-ASCII-имена файлов (кириллица, иероглифы, эмодзи) переживают curl -OJ без кракозябр.

Удалить задачу

DELETE/api/v1/jobs/{id}

Удаляет исходный файл из S3 и строку из Postgres. Если задача ещё в работе, мы отзываем Celery-таск — провайдер речь-в-текст останавливается на полуслове. Уже списанные минуты возвращаются отрицательной записью UsageRecord, чтобы журнал учёта оставался append-only.

curl
curl -X DELETE https://api.bloknot.ai/api/v1/jobs/$JOB_ID \
  -H "X-API-Key: $TS_KEY"

Полировка — абзацы и пунктуация

POST/api/v1/jobs/{id}/polish

Сырая расшифровка — это одна сплошная стена текста. /polish перекладывает её в читаемые абзацы и расставляет пунктуацию, не переписывая слова. Защита от дрейфа отклоняет любой ответ модели, у которого число символов уходит больше чем на ±15 % от исходника, — так ваш текст остаётся вашим.

Идемпотентно: если в расшифровке уже есть разбивка на абзацы, возвращается закешированная версия без нового вызова модели.

curl
curl -X POST https://api.bloknot.ai/api/v1/jobs/$JOB_ID/polish \
  -H "X-API-Key: $TS_KEY"
json · 200
{ "polished": true, "cached": false, "paragraphs": 8, "chars": 2147 }

Саммари

POST/api/v1/jobs/{id}/summarize

Собирает из готовой расшифровки краткое резюме, ключевые тезисы и список задач. Один вызов модели; идемпотентно — повтор возвращает закешированный объект summary без повторного списания.

curl
curl -X POST https://api.bloknot.ai/api/v1/jobs/$JOB_ID/summarize \
  -H "X-API-Key: $TS_KEY"
json · 200
{
  "summarized": true,
  "cached": false,
  "summary": "Квартальный обзор: запуск в Q3, структура каналов и план найма на Q4...",
  "key_points": [
    "Q3 закрыли на 18% выше плана",
    "CAC в платном соцтрафике упал с $42 до $31"
  ],
  "action_items": [
    "Маркетинг — свести бюджет Q4 к пятнице",
    "Разработка — открыть вакансию в бэкенд к понедельнику"
  ]
}

Перевод расшифровки

POST/api/v1/transcriptions/{id}/translate

Передайте transcription.id из GET /jobs/{id} и код целевого языка по ISO 639-1. Перевод идемпотентен по паре (transcription, target_lang) — повтор возвращает закешированную строку и не увеличивает счётчик переводов.

curl
curl -X POST https://api.bloknot.ai/api/v1/transcriptions/$TR_ID/translate \
  -H "X-API-Key: $TS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "target_lang": "en" }'
json · 200
{
  "id": "...",
  "transcription_id": "...",
  "target_lang": "en",
  "text": "Hello, welcome to the show...",
  "llm_model": "gpt-5-mini",
  "created_at": "2026-05-04T08:14:09Z"
}

Список всех закешированных переводов расшифровки — GET /transcriptions/{id}/translations.

WebSocket — прогресс в реальном времени

GETwss://api.bloknot.ai/api/v1/ws

Обойдитесь без цикла опроса. Подключитесь, отправьте кадр авторизации с вашим Supabase JWT (сессионный токен кабинета — API-ключи по задумке работают только по HTTP), затем подпишитесь на ID задачи и получайте обновления стадий по мере того, как воркер двигает прогресс.

js
const ws = new WebSocket("wss://api.bloknot.ai/api/v1/ws");

ws.onopen = () => {
  ws.send(JSON.stringify({ type: "auth", token: SUPABASE_JWT }));
  ws.send(JSON.stringify({ subscribe: jobId }));
};

ws.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  // { stage, progress, status }
  if (msg.status === "done") fetchJob(jobId);
};

Вебхуки

Мы сами сделаем POST на ваш эндпоинт, когда задача завершится, — без опроса и без сокетов. URL доставки настраиваются в Настройки → Вебхуки. Каждое событие подписано: X-Webhook-Signature — это HMAC-SHA-256 по сырому телу с секретом, показанным в кабинете.

json · payload
{
  "event": "job.done",
  "data": {
    "job_id": "5d3f2c80-...",
    "status": "done",
    "duration_sec": 312.4
  },
  "timestamp": 1746345210
}

Проверяйте подпись в обработчике, прежде чем доверять чему-либо в теле:

node
import crypto from "node:crypto";

function verify(req, secret) {
  const sig = req.headers["x-webhook-signature"];
  const expected = crypto
    .createHmac("sha256", secret)
    .update(req.rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(sig, "hex"),
    Buffer.from(expected, "hex")
  );
}

Неудачные доставки повторяются по нарастающему интервалу — 30 с → 5 мин → 30 мин → 1 ч → 4 ч — и затем отменяются. Историю попыток смотрите в GET /integrations/webhooks/deliveries.

Ошибки

Каждый ответ с ошибкой устроен одинаково:

json
{
  "detail": {
    "code": "quota_exceeded",
    "message": "Вы израсходовали 600.0 из 600 минут за период. Обновится 14 мая. Перейдите на тариф выше, чтобы продолжить.",
    "minutes_used": 600.0,
    "minutes_limit": 600,
    "plan": "pro"
  }
}
HTTPКодЧто значит
401invalid_api_keyЗаголовок X-API-Key отсутствует или неизвестен.
403email_not_verifiedБесплатный аккаунт ещё не подтвердил почту.
403polish_requires_paid_plan/polish на бесплатном тарифе.
403summarize_requires_paid_plan/summarize на бесплатном тарифе.
403translation_not_in_planПеревод доступен с тарифа Pro и выше.
402quota_exceededМесячный запас минут исчерпан до reset_at.
402translation_quota_exceededДостигнут месячный лимит переводов.
413file_too_largeФайл больше max_file_size_mb для тарифа.
413file_too_longДлительность превышает max_file_minutes.
400unsupported_formatРасширение или сигнатура не совпадают с известным типом медиа.
400unsupported_languageЯзык перевода вне поддерживаемого набора.
404not_foundЗадача или расшифровка не существует (или не ваша).
409job_not_readyПолировка или саммари вызваны до завершения расшифровки.
429rate_limitedЛимит всплеска по IP. Соблюдайте заголовок Retry-After.
503asr_quota_exceededПровайдер речь-в-текст вернул insufficient_quota. Временная — где возможно, мы автоматически откатываемся на резервного провайдера.
503translation_unavailableКлюч модели отсутствует или ротируется. Временная.

Лимиты запросов

Лимиты всплеска на ключ зависят от тарифа. При достижении потолка вернётся 429 с заголовком Retry-After (в секундах). Для высоконагруженных интеграций напишите в поддержку — подключим расширенный тариф extended.

ЭндпоинтFreePro / Business
POST /jobs и POST /jobs/from-url3 / мин10 / мин
GET /jobs/{id}60 / мин120 / мин
POST /jobs/{id}/polish и /summarize20 / мин

Версионирование

Текущая версия API — v1. Ломающие изменения выйдут как v2 по другому пути — интеграции на v1продолжат работать. Совместимые изменения (новые поля в ответах, новые необязательные параметры, новые коды ошибок) выкатываются без смены версии. Чтобы застраховаться, парсите только те поля, которые вам нужны.

О снятии с поддержки мы предупреждаем письмом на интегрированные аккаунты минимум за 90 дней и ставим sunset-заголовок в ответах.

Поддержка

Баг-репорты, помощь с интеграцией, идеи по фичам: support@bloknot.ai. Отвечаем на каждое письмо; если вы строите что-то, чего у нас пока нет, — расскажите, очевидные вещи выкатываем быстро.

Готовы подключаться?

Зарегистрируйтесь, перейдите на Pro и создайте первый ключ в Настройки → API-ключи.

Создать аккаунт →