API для разработчиков
REST API для интеграции neurodynamica в ваши скрипты, серверы и боты. Базовый URL — https://api.neurodynamica.ru. Все запросы возвращают JSON.
Введение
API позволяет:
- Запускать транскрибацию аудио/видео-файлов и ссылок (YouTube, RuTube, Vimeo, VK и др.)
- Опрашивать статус задач и получать готовые транскрипции
- Читать список проектов и баланс квантов
- Узнавать актуальные цены
Версионирование. Текущая версия —
v1. Все эндпоинты под префиксом /v1/. Breaking changes выйдут под /v2/; /v1/ останется обратно совместимым.
Аутентификация
Все запросы должны передавать API-ключ. Создать его можно в личном кабинете. Ключ имеет формат nd_live_ + 48 hex-символов и показывается ОДИН раз в момент создания.
Передавать ключ можно в одном из двух заголовков:
Authorization: Bearer nd_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
или
X-Api-Key: nd_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Никогда не публикуйте ключ в клиентском коде (браузер, мобильное приложение). Если ключ скомпрометирован — отзовите его в кабинете и создайте новый.
Скоупы (разрешения)
Каждый ключ имеет набор разрешений. Если ключ не содержит нужного скоупа — API вернёт 403 insufficient_scope.
| Скоуп | Назначение |
|---|---|
* | Полный доступ — все операции |
read | Чтение: /me, /balance, /pricing, /jobs/:id, /projects |
transcribe | Создание задач транскрибации (POST /transcribe, POST /transcribe-url) |
Формат ошибок
Все ошибки возвращают JSON вида:
{
"error": "insufficient_credits",
"message": "Недостаточно квантов: нужно 5, у вас 2.",
"required": 5,
"available": 2
}
| Код | error | Когда |
|---|---|---|
| 400 | bad_request | Невалидные параметры |
| 401 | unauthorized | Ключ отсутствует / невалиден |
| 401 | key_revoked / key_expired | Ключ отозван или просрочен |
| 402 | insufficient_credits | Не хватает квантов |
| 403 | insufficient_scope | У ключа нет нужного скоупа |
| 403 | account_blocked | Аккаунт заблокирован |
| 413 | file_too_large / duration_too_long | Превышены лимиты |
| 415 | unsupported_media_type | Неподдерживаемый формат файла |
| 429 | rate_limited | Слишком много запросов |
| 502 | upstream_failed | Внешний сервис ответил ошибкой |
| 500 | internal_error | Внутренняя ошибка |
Лимиты
- Запросов: 60/минуту на ключ (общий) + 10/минуту на создание задач (POST /transcribe*)
- Размер файла: до 100 МБ для
POST /transcribe - Длительность: до 60 минут аудио (настраивается администратором)
- Active ключи: до 5 на пользователя
Аккаунт
GET
/v1/me
scope: read
Возвращает информацию о владельце ключа.
curl -H "Authorization: Bearer nd_live_…" \
https://api.neurodynamica.ru/v1/meconst r = await fetch('https://api.neurodynamica.ru/v1/me', {
headers: { Authorization: 'Bearer ' + process.env.ND_API_KEY }
})
console.log(await r.json())import os, requests
r = requests.get('https://api.neurodynamica.ru/v1/me',
headers={'Authorization': f'Bearer {os.environ["ND_API_KEY"]}'})
print(r.json()){
"id": "uuid",
"email": "you@example.com",
"name": "Ваше имя",
"role": "user",
"credits": 42,
"createdAt": "2026-01-15T10:23:00.000Z",
"apiKey": { "id":"…", "name":"Production", "scopes":["*"] }
}
GET
/v1/balance
scope: read
Только баланс — для лёгких health-check запросов.
curl -H "Authorization: Bearer nd_live_…" \
https://api.neurodynamica.ru/v1/balance
# → { "credits": 42 }
GET
/v1/pricing
scope: read
Актуальные цены — стоимость операций, бонусы, пакеты пополнения.
{
"costs": {
"photo": 2, "tryon": 3, "video": 5, "mix": 3,
"idea": 1, "infographic": 1, "summary": 1,
"transcribe": { "perUnit": 1, "unitMinutes": 5, "maxMinutes": 60 }
},
"bonuses": { "welcomeCredits": 10, "referralInviterBonus": 5, "referralInviteeBonus": 5 },
"packages": [ /* … */ ]
}
Транскрибация
POST
/v1/transcribe
scope: transcribe
Запускает транскрибацию аудио/видео-файла. Возвращает
jobId сразу — результат опрашивайте через GET /v1/jobs/:id.| Поле | Тип | Описание |
|---|---|---|
file* | multipart | Аудио/видео файл (mp3, wav, m4a, ogg, opus, webm, mp4, mov, до 100 МБ) |
language | string | ISO-код языка (ru, en…). Если не указан — авто-определение |
durationSeconds | int | Подсказка длительности в сек. для предварительной оценки стоимости |
curl -X POST https://api.neurodynamica.ru/v1/transcribe \
-H "Authorization: Bearer nd_live_…" \
-F "file=@meeting.mp3" \
-F "language=ru"import fs from 'node:fs'
const form = new FormData()
form.append('file', new Blob([fs.readFileSync('meeting.mp3')]), 'meeting.mp3')
form.append('language', 'ru')
const r = await fetch('https://api.neurodynamica.ru/v1/transcribe', {
method: 'POST',
headers: { Authorization: 'Bearer ' + process.env.ND_API_KEY },
body: form,
})
const { id } = await r.json()
console.log('jobId:', id)import os, requests
r = requests.post(
'https://api.neurodynamica.ru/v1/transcribe',
headers={'Authorization': f'Bearer {os.environ["ND_API_KEY"]}'},
files={'file': open('meeting.mp3', 'rb')},
data={'language': 'ru'},
)
print(r.json()){
"id": "8a3e…uuid",
"status": "processing",
"estimatedCost": 3,
"estimatedSeconds": 720,
"pollUrl": "/v1/jobs/8a3e…uuid"
}
POST
/v1/transcribe-url
scope: transcribe
Транскрибация по ссылке на видео/аудио. Поддерживаются: YouTube, RuTube, Vimeo, VK, Dzen, TikTok, Twitch, SoundCloud, Mixcloud, Pinterest video.
| Поле | Тип | Описание |
|---|---|---|
url* | string | Полная ссылка на ролик |
language | string | ISO-код языка (опционально) |
curl -X POST https://api.neurodynamica.ru/v1/transcribe-url \
-H "Authorization: Bearer nd_live_…" \
-H "Content-Type: application/json" \
-d '{"url":"https://youtu.be/dQw4w9WgXcQ", "language":"en"}'
GET
/v1/jobs/:id
scope: read
Опрашивает статус задачи. Рекомендуем интервал — 2–4 секунды.
{
"id": "8a3e…uuid",
"type": "transcribe",
"status": "processing", // processing | done | error
"progress": 47, // 0..100
"progressStage": "Распознаём речь",
"results": null, // заполнено когда status === "done"
"errorMsg": null,
"createdAt": "…",
"completedAt": null
}
Когда status === "done", поле results для транскрибации содержит:
{
"text": "Полный текст без таймкодов",
"textWithStamps": "[00:00] Привет\n[00:03] Меня зовут…",
"srt": "1\n00:00:00,000 --> 00:00:03,200\nПривет\n…",
"segments": [ /* sec/start/end/text объекты */ ],
"words": [ /* word-level timestamps */ ],
"language": "ru",
"durationSeconds": 720
}
Проекты
GET
/v1/projects
scope: read
Список ваших проектов с пагинацией.
| Параметр | Тип | Default | Описание |
|---|---|---|---|
limit | int (1..100) | 25 | Количество элементов |
offset | int | 0 | Смещение |
type | string | — | Фильтр по типу: photo, tryon, video, mix, transcribe |
curl -H "Authorization: Bearer nd_live_…" \
"https://api.neurodynamica.ru/v1/projects?type=transcribe&limit=10"
GET
/v1/projects/:id
scope: read
Полная информация о проекте — то же, что
/v1/jobs/:id (это один и тот же объект).Пример: полный цикл транскрибации
// 1. Запускаем
const start = await fetch('https://api.neurodynamica.ru/v1/transcribe-url', {
method: 'POST',
headers: { Authorization: 'Bearer ' + key, 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://youtu.be/abc123', language: 'ru' }),
}).then(r => r.json())
const jobId = start.id
// 2. Опрашиваем
let job
while (true) {
await new Promise(r => setTimeout(r, 3000))
job = await fetch(`https://api.neurodynamica.ru/v1/jobs/${jobId}`, {
headers: { Authorization: 'Bearer ' + key }
}).then(r => r.json())
console.log(`${job.progress}% · ${job.progressStage}`)
if (job.status === 'done' || job.status === 'error') break
}
// 3. Используем результат
if (job.status === 'done') {
console.log('Текст:', job.results.text)
console.log('SRT:', job.results.srt)
}
Вопросы и предложения — обратная связь или поддержка@neurodynamica.ru