API для разработчиков
Обновлено: 16 июля 2026 г.
Публичное REST-API Svitok встраивает расшифровку аудио и видео в ваш продукт: сервис принимает файл, распознаёт речь и возвращает текст с тайм-кодами и разделением по спикерам. Аутентификация — по API-ключу вида sk_live_…, оплата — из баланса аккаунта Svitok по 6 ₽ за минуту записи.
За Svitok API стоит одна из самых мощных инфраструктур транскрибации в СНГ и одно из лучших качеств распознавания русской речи в СНГ: задачи обрабатываются очередью параллельно, поэтому пакет записей не выстраивается в один хвост, на вход принимаются файлы до 10 ГБ и записи до 6 часов, а в ответ Svitok API отдаёт текст с тайм-кодами по сегментам и разделением реплик метками «Спикер 1», «Спикер 2».
Как начать
- Создайте API-ключ Svitok в личном кабинете, раздел «API-ключи». При создании один раз показываются два значения: сам ключ (
sk_live_…) и секрет для проверки подписи вебхуков — сохраните оба. Восстановить их нельзя: если потеряли, создайте новый ключ (отдельной ротации секрета нет). - Пополните баланс аккаунта Svitok — расшифровка списывается с него.
- Передавайте ключ в каждом запросе заголовком
Authorization: Bearer sk_live_….
Базовый URL и версия
Все эндпоинты Svitok API живут под префиксом https://svitok.io/api/v1. Ломающие изменения выйдут отдельной версией /api/v2, а текущая версия /api/v1 продолжит работать.
https://svitok.io/api/v1Отправить файл на расшифровку
Интегратор отправляет файл на POST https://svitok.io/api/v1/transcriptions как multipart/form-data с заголовком Authorization: Bearer sk_live_…; Svitok API отвечает 202 Accepted и идентификатором задачи. Поля формы: file (обязательное), diarization (true/false, по умолчанию включено) и webhook_url (необязательное).
curl -X POST https://svitok.io/api/v1/transcriptions \
-H "Authorization: Bearer sk_live_ВАШ_КЛЮЧ" \
-F "file=@meeting.mp3" \
-F "diarization=true" \
-F "webhook_url=https://your-app.example/webhooks/svitok"
# Ответ 202:
{ "id": "…", "status": "queued", "duration_sec": 372, "cost_kopecks": 4200 }В ответе 202 поле duration_sec — измеренная длительность записи, cost_kopecks — сумма, списанная с баланса при отправке (в примере 372 с = 7 тарифицируемых минут). Расшифровка идёт в фоне: результат забирают поллингом или вебхуком.
Узнать статус и получить результат
Готовность задачи проверяют запросом GET https://svitok.io/api/v1/transcriptions/{id} с тем же Bearer-ключом: опрашивайте его, пока поле status не станет done или failed. Пока задача не готова, полей с транскриптом в ответе нет.
curl https://svitok.io/api/v1/transcriptions/ID \
-H "Authorization: Bearer sk_live_ВАШ_КЛЮЧ"
# Когда готово:
{
"id": "…",
"status": "done",
"duration_sec": 372,
"language": "ru",
"text": "Полный текст расшифровки…",
"segments": [ { "start": 0.0, "end": 3.2, "text": "…" } ],
"speakers": [ { "start": 0.0, "end": 3.2, "speaker": "Спикер 1", "text": "…" } ]
}Разделение по спикерам Svitok API обозначает метками «Спикер 1», «Спикер 2» внутри одной записи — без сопоставления с реальными людьми и без опознания говорящего по голосу.
Список задач
Запрос GET https://svitok.io/api/v1/transcriptions?limit=&cursor= возвращает задачи аккаунта, новые сверху. Постраничная выборка идёт по курсору: передайте next_cursor из ответа в параметр cursor следующего запроса.
Скачать в файл
Готовую расшифровку Svitok API отдаёт файлом по GET https://svitok.io/api/v1/transcriptions/{id}/export?format=docx. Доступные форматы выгрузки — docx, srt, txt и xlsx; эндпоинт работает только для задач в статусе done.
Вебхуки
Если при отправке файла указан webhook_url, Svitok по завершении задачи присылает на него POST с тем же телом, что отдаёт статус-эндпоинт. Заголовки callback'а: X-Svitok-Event (transcription.completed или transcription.failed) и X-Svitok-Signature: sha256=<HMAC> — подпись тела секретом вебхука, который вы получили один раз при создании ключа.
Всегда проверяйте подпись перед тем, как доверять содержимому callback'а: посчитайте HMAC-SHA256 от сырого тела запроса (не от повторно сериализованного JSON) вашим секретом и сравните с заголовком X-Svitok-Signature в постоянном времени (constant-time) — обычное === уязвимо к timing-атаке.
import crypto from "node:crypto";
// rawBody — СЫРОЕ тело запроса (Buffer/string), не JSON.parse → JSON.stringify.
function verifySvitokSignature(secret, rawBody, signatureHeader) {
const expected =
"sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(signatureHeader ?? "");
const b = Buffer.from(expected);
// Длины обязаны совпасть — timingSafeEqual бросает на разной длине.
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
// Express-пример: тело как Buffer + ответ 2xx = подтверждение доставки.
app.post("/webhooks/svitok",
express.raw({ type: "application/json" }),
(req, res) => {
const ok = verifySvitokSignature(
process.env.SVITOK_WEBHOOK_SECRET,
req.body,
req.get("X-Svitok-Signature"),
);
if (!ok) return res.sendStatus(401);
const event = JSON.parse(req.body.toString("utf8"));
// event.id — дедуплицируйте по нему; event.status: done | failed
res.sendStatus(200);
});Доставка вебхука идемпотентна (одно успешное вручение на задачу) и повторяется с нарастающей паузой при ошибках. Svitok шлёт callback только на публичные адреса — внутренние и локальные URL отклоняются при отправке файла. Дедуплицируйте входящие события по полю id.
Коды ошибок
Ошибки Svitok API возвращает единым видом: { "error": { "code": "…", "message": "…" } } с соответствующим HTTP-статусом.
401— ключ отсутствует, некорректен или отозван.402— недостаточно средств на балансе.404— задача не найдена или принадлежит другому аккаунту.413— файл слишком большой или запись длиннее 6 часов.415— в файле нет аудио-дорожки.422— некорректный запрос (нет файла, плохой формат, недопустимыйwebhook_url).429— превышен лимит запросов.503— сервис временно перегружен, повторите позже.
Лимиты
- Файл — до 10 ГБ, запись — до 6 часов.
- До 60 отправок в час на один API-ключ.
- Форматы: mp3, wav, m4a, mp4, ogg, а также записи встреч (webm, mkv).
Превышение лимита размера или длительности Svitok API отклоняет кодом 413, превышение частоты отправок — кодом 429; деньги за отклонённый запрос не списываются.
Оплата
Расшифровка через Svitok API стоит 6 ₽ за минуту записи, разделение по спикерам входит в цену. Сумма списывается из баланса аккаунта в момент отправки файла, минуты округляются вверх (неполная минута тарифицируется как полная). Если задача завершилась ошибкой, списанная сумма автоматически возвращается на баланс.
Отправка с diarization=false (без разделения по спикерам) стоит 5 ₽ за минуту — на 1 ₽ дешевле базового тарифа.
Машиночитаемое описание Svitok API — OpenAPI 3.1. Данные пользователей хранятся на серверах в России.
Частые вопросы
Какое качество распознавания у Svitok API и на какой инфраструктуре он работает?
За Svitok API стоит одна из самых мощных инфраструктур транскрибации в СНГ и одно из лучших качеств распознавания русской речи в СНГ. Svitok API распознаёт русскую речь, ставит тайм-коды по сегментам и разделяет реплики метками «Спикер 1», «Спикер 2»; принимает файл до 10 ГБ и запись до 6 часов, обрабатывает задачи очередью параллельно и выгружает результат в docx, srt, txt или xlsx.
Как получить API-ключ Svitok?
API-ключ создаётся самостоятельно в личном кабинете svitok.io/app, раздел «API-ключи». При создании один раз показываются два значения — сам ключ (sk_live_…) и секрет для проверки подписи вебхуков; сохраните оба, повторно они не отображаются. Ключ передаётся заголовком Authorization: Bearer sk_live_… .
Svitok API работает синхронно или асинхронно?
Асинхронно. Запрос POST https://svitok.io/api/v1/transcriptions сразу отвечает 202 Accepted и идентификатором задачи, а готовый текст забирают опросом GET https://svitok.io/api/v1/transcriptions/{id} или получают вебхуком на указанный webhook_url.
Как проверить подпись вебхука Svitok?
Посчитайте HMAC-SHA256 от сырого тела запроса секретом вебхука (он выдаётся один раз при создании API-ключа) и сравните результат с заголовком X-Svitok-Signature формата sha256=<hex> в постоянном времени. Подписывается именно сырое тело, а не повторно сериализованный JSON.
Сколько стоит расшифровка через Svitok API?
6 ₽ за минуту записи, разделение по спикерам входит в цену; минуты округляются вверх. Отправка с diarization=false стоит 5 ₽ за минуту. Деньги списываются из баланса аккаунта при отправке файла и автоматически возвращаются, если задача завершилась ошибкой.
Какие форматы и лимиты у Svitok API?
Svitok API принимает mp3, wav, m4a, mp4, ogg, webm и mkv — файл до 10 ГБ и запись до 6 часов, до 60 отправок в час на один ключ. Готовую расшифровку можно выгрузить в docx, srt, txt или xlsx.
Где хранятся данные, отправленные в Svitok API?
Данные пользователей Svitok хранятся на серверах в России. Разделение по спикерам возвращается метками «Спикер 1», «Спикер 2» внутри одной записи и не сопоставляется с личностью говорящего.
Что происходит, если задача Svitok API не удалась?
Задача переходит в status=failed, поле error содержит человекочитаемую причину, а списанная за неё сумма автоматически возвращается на баланс аккаунта. Если при отправке был указан webhook_url, Svitok присылает на него событие transcription.failed.