Мои ключи В кабинет

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Когда
400bad_requestНевалидные параметры
401unauthorizedКлюч отсутствует / невалиден
401key_revoked / key_expiredКлюч отозван или просрочен
402insufficient_creditsНе хватает квантов
403insufficient_scopeУ ключа нет нужного скоупа
403account_blockedАккаунт заблокирован
413file_too_large / duration_too_longПревышены лимиты
415unsupported_media_typeНеподдерживаемый формат файла
429rate_limitedСлишком много запросов
502upstream_failedВнешний сервис ответил ошибкой
500internal_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/me
const 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 МБ)
languagestringISO-код языка (ru, en…). Если не указан — авто-определение
durationSecondsintПодсказка длительности в сек. для предварительной оценки стоимости
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Полная ссылка на ролик
languagestringISO-код языка (опционально)
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Описание
limitint (1..100)25Количество элементов
offsetint0Смещение
typestringФильтр по типу: 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