Reelora API

REST API для програмної інтеграції субтитрів, озвучки, транскрипції, дублювання і видалення пауз. Ті самі можливості що й у Telegram-боті — через HTTP. Доступний на всіх тарифах, включно з Free.

Ендпоінти

МетодШляхОпис
GET/healthПеревірка сервісу
GET/v1/meПрофіль, ліміти, використання
POST/v1/uploadsЗавантажити файл
POST/v1/tasksСтворити задачу
GET/v1/tasksСписок задач
GET/v1/tasks/{id}Статус задачі + результат

Швидкий старт

1

Отримай API ключ

У боті @reelora_ai_bot надішли /apikey або відкрий Налаштування → 🔑 API доступ. Ключ показується лише один раз.

2

Завантаж файл

POST /v1/uploads → отримай upload_id

3

Створи задачу

POST /v1/tasks з типом і параметрами

4

Отримай результат

Опитуй GET /v1/tasks/{id} або вкажи webhook_url

Автентифікація

Всі запити (крім /health) потребують заголовка:

X-API-Key: reel_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
⚠️Ключ показується лише один раз. Якщо втратив — /revokekey в боті і згенеруй новий через /apikey.
ℹ️API доступний на всіх тарифах. Ліміти ті самі що й у боті — Free, Standard, Pro, Pro+.

Base URL

https://api.reelora.cc

Інтерактивна Swagger документація: https://api.reelora.cc/docs

Перевірка статусу

GET/healthбез авторизації
curl https://api.reelora.cc/health
# {"status":"ok","service":"reelora-api"}

Профіль і ліміти

GET/v1/me
curl https://api.reelora.cc/v1/me -H "X-API-Key: reel_..."
{
  "user_id": 618899534, "tariff": "pro_plus",
  "tariff_expires_at": "2026-07-17T07:20:20",
  "limits": {
    "seconds_per_month": 36000, "tts_chars_limit": 1000000,
    "elevenlabs_chars_limit": 25000, "transcription_seconds": 72000,
    "max_photos": 30, "max_video_duration": 600, "max_file_size_mb": 500,
    "can_translate": true, "can_dub": true, "premium_voices": true
  },
  "usage": {
    "used_seconds_this_month": 705, "used_chars_this_month": 12674,
    "used_eleven_chars_this_month": 0, "used_transcription_seconds": 0,
    "limit_reset_date": "2026-07-17T07:18:07"
  },
  "api_key_prefix": "xxxxxxxx", "api_key_created_at": "2026-06-19T22:43:23"
}

Завантаження файлу

POST/v1/uploads

Завантажує файл і повертає upload_id. Файли живуть 2 години. Ліміт: 20 завантажень/хв.

curl -X POST https://api.reelora.cc/v1/uploads \
  -H "X-API-Key: reel_..." -F "[email protected]"
# {"upload_id":"550e8400-...","filename":"photo.jpg","size_bytes":245891}
ТипФорматиМакс.
ЗображенняJPEG, PNG, WebP500 MB
ВідеоMP4, MOV, AVI500 MB
АудіоMP3, WAV, M4A500 MB
СубтитриSRT

Використовуй upload_id у полях photos, file, srt_file, bgm_file. Або передавай прямі https:// URL замість завантаження.

Створення задачі

POST/v1/tasks202 Accepted

Тип задачі — поле "type". Виконується асинхронно. Всі типи підтримують webhook_url і send_to_telegram.

{ "task_id": 744, "status": "pending" }

Тип: video — створення відео

Фото або відео-кліпи + войсовер + karaoke-субтитри + музика → MP4.

{
  "type": "video",
  "photos": ["upload_id_1", "upload_id_2", "https://example.com/img.jpg"],
  "text": "Перша сцена {scene:slide} Друга сцена {scene:zoom:0.8} Третя сцена",
  "scene_durations": null, "scene_transitions": null, "target_duration": 30,
  "format": "9_16", "animation": "ken_burns", "transition": "random", "transition_duration": 0.5,
  "tts_provider": "google", "tts_voice": "Chirp3-HD-Aoede", "language": "uk",
  "tts_scene": "Speak like a news anchor.",
  "subtitles": true, "sub_style": "yellow_basic", "sub_position": "bottom",
  "bgm_track": "chill_background-lofi-vibes-113884.mp3", "bgm_volume": 0.2
}
ПолеЗа замовч.Опис
photosобов'язк.upload_id або https:// (зображення або відео-кліпи, макс. 30)
textопц.nullТекст озвучки. Без тексту — відео без звуку. Встав маркери сцен між абзацами, щоб змінювати кадр (і за бажанням обрати перехід): {scene} · {scene:slide} · {scene:zoom:0.8} · {scene:0.8}
scene_durationsопц.nullЯвні тривалості кадрів у секундах, напр. [10, 15, 5]. Довжина = кількості media. Перекриває авто-таймінг {scene}, працює навіть без озвучки
scene_transitionsопц.nullЯвний перехід на кожному стику (довжина = photos − 1), напр. ["slide","zoom"]. Альтернатива маркерам {scene:type}
target_durationопц.nullЦільова довжина ролика в секундах. Якщо готове відео довше — його пришвидшують (відео+звук+субтитри синхронно), щоб вкластися. Коротше — не чіпають. Пришвидшення обмежене ×2. Має бути ≤ ліміту тарифу
formatопц."9_16""9_16" · "16_9" · "1_1" · "original"
animationопц."none""none" · "ken_burns"
transitionопц."crossfade"Глобальний перехід для немаркованих стиків: none · random · fade · dissolve · slide · cover · reveal · zoom · squeeze · wind · pixel · circle (crossfade = аліас dissolve). Діє лише коли animation ≠ none
transition_durationопц.0.5Тривалість переходу в секундах. Окрему тривалість на стик можна задати через {scene:type:сек}
tts_providerопц."google"TTS провайдер (дивись розділ Провайдери)
tts_voiceопц.з профілюНазва голосу (дивись розділ Голоси)
tts_speedопц.1.00.8 · 1.0 · 1.2 · 1.5
languageопц.з акаунтуМова озвучки — будь-який код з розділу Мови ("ar", "fa"…) або повна локаль "ru-RU". Для рідкісних мов — tts_provider:"edge"
tts_sceneопц.nullІнструкція стилю мовлення (для Gemini TTS)
tts_styleопц.nullПресет стилю: standard · calm · expressive · energetic · dramatic · cheerful (Gemini та ElevenLabs)
subtitlesопц.trueKaraoke субтитри
sub_styleопц."yellow_basic"Стиль субтитрів
sub_positionопц."bottom""top" · "center" · "bottom"
sub_sizeопц."medium""small" · "medium" · "large"
sub_colorопц.nullASS колір: "&H0000E6FF" (жовтий)
text_overlaysопц.nullСтатичні написи-титри поверх кадру, незалежні від озвучки (див. «Текст на відео» нижче)
text_overlays_rawопц.nullТе саме компактним рядком-кодами, парситься на сервері (див. нижче). Використовується лише якщо немає text_overlays
auto_textопц.false⚡ Авто-текст. LLM обирає найсильніші слова озвучки й додає їх як анімовані написи, синхронно з таймкодами слів TTS (див. «Авто-текст» нижче). Потребує text. Рахується з місячної квоти авто-тексту
bgm_trackопц.nullНазва файлу з бібліотеки музики (дивись розділ BGM)
bgm_fileопц.nullupload_id свого MP3 файлу (взаємовиключне з bgm_track)
bgm_volumeопц.0.2Гучність музики 0.0–1.0
audio_mix_typeопц."replace"Мікшування для відео-кліпів: "replace" · "add" · "overlay"

audio_mix_type — для кліпів з оригінальним звуком

ЗначенняПоведінка
replaceТільки TTS/BGM — звук кліпу видаляється
addTTS поверх оригіналу (обидва на повній гучності)
overlayTTS на повній гучності + оригінал приглушено

🎬 Динамічні сцени — коли змінювати кадр

  • З озвучкою: встав маркери {scene} у text між абзацами. Кожен сегмент таймиться за озвучкою і мапиться на media по порядку. Маркери прибираються перед TTS — голос їх не читає.
  • Без озвучки / явно: передай scene_durations (напр. [10, 15, 5]) — по одному значенню на media. Відео-кліпи обрізаються/зациклюються під сцену, фото показуються задану тривалість.
  • Мапінг сцен ↔ media: порівну → 1:1; менше сцен → остання ділиться на решту media; більше → останнє media тримає залишок.

✨ Переходи між кадрами — як змінювати кадр

  • У тексті: розшир маркер типом і/або тривалістю: {scene:slide}, {scene:zoom:0.8}, {scene:0.8} (лише тривалість). Перехід застосовується до стику в цю сцену.
  • Явний масив: scene_transitions (довжина = photos − 1), напр. ["slide","zoom","fade"] — по одному переходу на стик. Зручно для відео без тексту з явними тривалостями.
  • Типи: fade · dissolve · slide · cover · reveal · zoom · squeeze · wind · pixel · circle · random. Напрямлені (slide/cover/reveal/wind) обирають випадковий напрямок на кожному стику.
ℹ️Переходи рендеряться тільки коли animationnone. Перехід none на окремому стику не підтримується — він відкочується до глобального transition.

🅰️ Текст на відео — статичні написи

Додай довільні написи/титри поверх відео, незалежно від субтитрів. Працює з озвучкою або без. Кожен напис має свій стиль, позицію, тайминг і плавну появу/зникнення. Два способи передати:

Структуровано — text_overlays (масив, макс. 10):

"text_overlays": [
  { "text": "BIG TITLE", "style": "bold_yellow", "size": "large",
    "position": "top_center", "start": 0.0, "end": 3.0, "fade": true, "anim": "pop" },
  { "text": "the end", "style": "soft_pink", "position": "bottom_center", "start": 3.0 }
]
Поле
textобов'язк.обов'язкове, макс. 200 символів
startопц.сек. null → з 0
endопц.сек. null → до кінця відео
styleопц.стиль титру (нижче)
sizeопц.small · medium · large
positionопц.9-сітка: top_left · top_center · top_right · middle_left · center · middle_right · bottom_left · bottom_center · bottom_right
bold / italicопц.перекриває вагу/нахил стилю
colorопц.ASS hex &HAABBGGRR, напр. "&H00B469FF" (рожевий)
fadeопц.плавна поява/зникнення (300 мс)
animопц.Анімація появи: pop · slide_left · slide_right · type (друкарська машинка). Має пріоритет над fade

Стилі титрів (style): clean_white · bold_yellow · outline_black · soft_pink · elegant_script · news_bar · impact_red.

Коди — text_overlays_raw (рядок). Універсальний англомовний синтаксис (однаковий у будь-якій мові інтерфейсу), парситься на сервері. Один напис на рядок (або через /); поля всередині напису — через |:

TEXT | attributes | start-end
"text_overlays_raw": "Hello | large italic center | 0-3 / Subscribe | bottom pink pop | 3-end"
  • розмір — small · medium · large
  • вага/нахил — bold · thin · italic
  • вертикаль — top · middle · bottom; горизонталь — left · center · right
  • колір — white · yellow · red · green · blue · pink · orange · purple · black · cyan
  • час — 0-3, 2.5-8, 5-end (сек, крапка/кома). Без часу → напис видно весь ролик
  • анімація — pop · slide · type (друкарська машинка) · fade · none
📋Приклад: перший напис — «Привіт» великим курсивом по центру 0–3 с; другий — «Підписуйся» знизу рожевим з 3-ї секунди до кінця. Атрибути й час не обов'язкові й не залежать від порядку. Невідомі токени ігноруються (запит не падає).

⚡ Авто-текст — автоматичні написи ключових слів

auto_text: true вмикає ⚡ Авто-текст. Замість того щоб розставляти написи вручну, LLM читає розпізнані слова озвучки, сам обирає найсильніші (імена, числа, гучні твердження) і рендерить їх як анімовані написи, точно по таймкодах слів TTS. Обирає сучасний стиль, колір і анімацію появи (pop / slide / typewriter) для кожного слова, складає слова, що звучать разом, у стек і не лізе в зону субтитрів.

  • Потрібна озвучка (text не порожній). Без озвучки таймкодів слів немає — auto_text ігнорується.
  • Додаткове: згенеровані написи додаються до твоїх text_overlays / text_overlays_raw, а не заміняють їх.
  • Повністю автоматично: параметрів на слово немає. Якщо LLM нічого не підібрав — рендер просто йде без додаткових написів (запит не падає).
  • Квота: кожен успішний рендер з авто-текстом списує одиницю місячної квоти (auto_text_limit; на Free — обмежено, на платних — безліміт). Перевищення → 429.
  • Авто-текст працює в усіх таск-типах API: video, dubbing і subtitles. Переклад по API робиться через subtitles з translate_to (окремого типу translation немає), тож auto_text охоплює й перекладені субтитри.

Тип: transcription — транскрипція

Аудіо або відео → текст + .SRT з таймкодами.

{
  "type": "transcription", "file": "upload_id_або_https_url",
  "language": "uk", "ai_prompt": "Медичний подкаст. Виправляй термінологію.",
  "output_format": "both"
}
ПолеОпис
fileобов'язк.upload_id або https:// URL
languageопц."uk" · "en" · "de" · "fr" і т.д. null = авто
ai_promptопц.Контекст для Whisper (підвищує точність)
output_formatопц."txt" · "srt" · "both" (за замовч.)
// result_urls для транскрипції
{ "txt_url": "https://cdn.reelora.cc/.../transcript.txt",
  "srt_url": "https://cdn.reelora.cc/.../transcript.srt" }

Тип: audio — озвучка (TTS)

Текст → MP3 файл без відео.

{
  "type": "audio", "text": "Привіт! Це тест Reelora API.",
  "tts_provider": "gemini", "tts_voice": "Puck",
  "tts_speed": 1.0, "tts_scene": "Warm and friendly tone",
  "tts_style": "expressive"
}
ПолеЗа замовч.Опис
textобов'язк.Текст для озвучки
tts_providerопц."google"TTS провайдер (дивись розділ Провайдери)
tts_voiceопц.з профілюНазва голосу (дивись розділ Голоси)
tts_speedопц.1.00.8 · 1.0 · 1.2 · 1.5
tts_sceneопц.nullІнструкція стилю мовлення (для Gemini TTS)
tts_styleопц.nullПресет стилю: standard · calm · expressive · energetic · dramatic · cheerful (Gemini та ElevenLabs)

Тип: subtitles — субтитри на відео

Накладає karaoke-субтитри на готове відео через Whisper + FFmpeg. Тариф Standard+.

{
  "type": "subtitles", "file": "upload_id_або_https_url",
  "language": "uk", "sub_style": "yellow_basic",
  "sub_position": "bottom", "sub_size": "medium"
}

Результат: MP4 з субтитрами у result_url. Секунди рахуються з місячного ліміту.

Поле
translate_toопц.ISO-код цільової мови. Задано → субтитри перекладаються на неї (тайминг зберігається, звук лишається оригінальний). Пропущено → мовою оригіналу
auto_textопц.⚡ Авто-текст — написи ключових слів із таймінгів (перекладених) субтитрів. Рахується з квоти авто-тексту

Тип: pause_removal — видалення пауз

Автоматично вирізає тишу і паузи з відео. Тариф Standard+. Поріг тиші визначається автоматично.

{ "type": "pause_removal", "file": "upload_id_або_https_url" }

Результат: оброблений MP4 у result_url.

Тип: dubbing — AI дублювання

Транскрибує відео, перекладає, синтезує новий голос, мікшує аудіо. Три режими. Доступний на всіх тарифах у межах місячного ліміту.

Режим A: auto — повністю автоматично

{
  "type": "dubbing", "mode": "auto",
  "file": "upload_id_або_https_url",
  "source_lang": "auto", "target_lang": "en",
  "tts_provider": "edge", "tts_voice": "en-US-GuyNeural",
  "mix_mode": "overlay", "overlay_volume": 20,
  "sub_lang": "dubbed", "sub_style": "yellow_basic"
}
ПолеЗа замовч.Опис
fileобов'язк.upload_id або URL відео для дублювання
source_langопц."auto""auto" або будь-який код з розділу Мови ("ar", "fa", "tr"…). Whisper авто-визначає при "auto"
target_langобов'язк.Мова дублювання — будь-який код з розділу Мови. Якщо провайдер її не озвучує — авто-фолбек на Edge
tts_providerопц."edge"TTS провайдер для нового голосу
tts_voiceопц.автоГолос для цільової мови
mix_modeопц."overlay""overlay" (оригінал приглушено) · "replace" (повна заміна)
overlay_volumeопц.20Гучність оригіналу % при mix_mode=overlay (0–100)
sub_langопц."dubbed""dubbed" · "original" · "none" · або ISO код мови
sub_styleопц."yellow_basic"Стиль субтитрів
sub_positionопц."bottom""top" · "center" · "bottom"
tts_styleопц.nullПресет стилю: standard · calm · expressive · energetic · dramatic · cheerful (Gemini та ElevenLabs)
auto_textопц.false⚡ Авто-текст поверх дубльованої мови — анімовані написи ключових слів, обрані LLM. Рахується з квоти авто-тексту

Режим B: semi_auto — з перевіркою (2 кроки)

// Крок 1: транскрипція
{ "type": "dubbing", "mode": "semi_auto", "step": "transcribe",
  "file": "upload_id_відео", "source_lang": "uk", "target_lang": "en" }
// → srt_url: скачай, відредагуй, завантаж через /v1/uploads

// Крок 2: рендер з відредагованим SRT
{ "type": "dubbing", "mode": "semi_auto", "step": "render",
  "file": "upload_id_відео", "srt_file": "upload_id_твого_srt",
  "target_lang": "en", "tts_provider": "edge",
  "tts_voice": "en-US-GuyNeural", "mix_mode": "overlay", "overlay_volume": 20 }

Режим C: manual — свій SRT файл

Пропускає транскрипцію. Надаєш власний SRT файл з текстом цільової мови.

{ "type": "dubbing", "mode": "manual",
  "file": "upload_id_відео", "srt_file": "upload_id_srt_файлу",
  "target_lang": "uk", "tts_voice": "uk-UA-Wavenet-A", "mix_mode": "replace" }
📋Формат SRT: 1\n00:00:00,000 --> 00:00:03,500\nТекст рядка\n\n2\n... Таймкоди не повинні перевищувати тривалість відео.
ℹ️На тарифі Free дублювання доступне тільки з провайдерами "edge" та "google". Місячний ліміт: Free 120с · Standard 1800с · Pro 3600с · Pro+ 18000с.

Список задач

GET/v1/tasks
curl "https://api.reelora.cc/v1/tasks?limit=10&offset=0" -H "X-API-Key: reel_..."

Параметри: limit (за замовч. 20, макс. 100), offset (за замовч. 0).

Статус задачі

GET/v1/tasks/{task_id}
{
  "task_id": 744, "type": "voiceover", "status": "completed", "progress": 100,
  "result_url": "https://cdn.reelora.cc/audio/.../744_a3f.mp3",
  "result_url_expires_at": "2026-06-21T23:03:19",
  "result_urls": null, "error_message": null,
  "created_at": "2026-06-19T23:03:17", "updated_at": "2026-06-19T23:03:19"
}
⏱️result_url дійсний 48 годин. Для транскрипції result_urls містить обидва: txt_url і srt_url.

Async Flow

POST /v1/tasks │ ▼ {"task_id": 744, "status": "pending"} │ ▼ Опитуй кожні 3–5 сек: GET /v1/tasks/744 │ ├── status: "pending" → чекай ├── status: "processing" → чекай (progress 0–100) ├── status: "completed" → завантажуй result_url ✅ └── status: "failed" → читай error_message ❌

Статуси задач

pending
В черзі, ще не почалась
processing
Виконується. progress: 0–99
completed
Готово. Файл у result_url
failed
Помилка в error_message

Webhooks

Вкажи webhook_url — отримаєш POST коли задача завершиться.

// POST на твій webhook_url
{ "task_id": 744, "status": "completed", "result_url": "https://cdn.reelora.cc/..." }
ℹ️Webhook повторюється до 3 разів (15с, 30с) якщо сервер повернув 5xx. Рекомендуємо дублювати через polling.

Мови

Поля language (озвучка/TTS), source_lang і target_lang (дублювання) приймають короткий ISO-код ("fa") або повну локаль ("fa-IR"). Для транскрипції/перекладу Whisper + LLM розуміють ~99 мов — нижче ті, що мають готовий TTS-голос.

31 мова з TTS-голосами:

кодмовалокальTTS-движки
ukУкраїнськаuk-UAEdge, Gemini, 11Labs, Google
enEnglishen-USEdge, Gemini, 11Labs, Google
ruРусскийru-RUEdge, Gemini, 11Labs, Google
esEspañoles-ESEdge, Gemini, 11Labs, Google
deDeutschde-DEEdge, Gemini, 11Labs, Google
frFrançaisfr-FREdge, Gemini, 11Labs, Google
plPolskipl-PLEdge, Gemini, 11Labs, Google
itItalianoit-ITEdge, Gemini, 11Labs, Google
ptPortuguêspt-BREdge, Gemini, 11Labs, Google
zh中文zh-CNEdge, Gemini, 11Labs, Google
ja日本語ja-JPEdge, Gemini, 11Labs, Google
arАрабська (RTL)ar-SAEdge, Gemini, 11Labs, Google
faПерська (RTL)fa-IRтільки Edge
heІврит (RTL)he-ILEdge, Google
urУрду (RTL)ur-PKтільки Edge
trTürkçetr-TREdge, Gemini, 11Labs, Google
hiHindihi-INEdge, Gemini, 11Labs, Google
bnBengalibn-BDEdge, Gemini, Google
idIndonesianid-IDEdge, Gemini, 11Labs, Google
msMalayms-MYEdge, 11Labs, Google
viVietnamesevi-VNEdge, Gemini, Google
thThaith-THEdge, Gemini, Google
ko한국어ko-KREdge, Gemini, 11Labs, Google
nlNederlandsnl-NLEdge, Gemini, 11Labs, Google
roRomânăro-ROEdge, Gemini, 11Labs, Google
elΕλληνικάel-GREdge, 11Labs, Google
csČeštinacs-CZEdge, 11Labs, Google
svSvenskasv-SEEdge, 11Labs, Google
azAzərbaycanaz-AZтільки Edge
kkҚазақkk-KZтільки Edge
uzOʻzbekuz-UZтільки Edge
💡tts_provider: "edge" працює для всіх 31 мови й безкоштовний — безпечний дефолт для рідкісних мов (fa, ur, az, kk, uz мають лише Edge). Якщо не вказати tts_voice, правильний голос підбирається з language автоматично.
🌐RTL-мови (ar, fa, he, ur): субтитри рендеряться справа-наліво з арабським шрифтом. Анімовані karaoke-стилі для RTL відкочуються до простого тексту.

TTS Провайдери

ПровайдерЗначенняЯкістьЛіміт
Google (Standard/Wavenet/Chirp)"google"Добра1M символів/міс
Gemini 2.5 TTS"gemini"Відмінналіміт тарифу
Azure Neural"azure"Добраліміт тарифу
Edge TTS (Microsoft)"edge"Добранеобмежено
HuggingFace"hf"Базоваліміт тарифу
ElevenLabs"elevenlabs"ПреміумPro та Pro+

Голоси

Google ("google")

Локаль береться з налаштувань акаунту. Змінити: Налаштування → 🌍 Мова.

tts_voiceОпис
Standard-AЖіночий, базова якість
Standard-BЧоловічий, базова якість
Wavenet-AЖіночий, нейронна якість
Wavenet-BЧоловічий, нейронна якість
Journey-FЖіночий, тільки EN, природній
Chirp3-HD-AoedeЖіночий, мультимовний, HD
Chirp3-HD-PuckЧоловічий, мультимовний, HD

Gemini 2.5 / 3.1 TTS ("gemini")

Підтримує tts_scene (вільний текст-директива) та tts_style (пресет: standard/calm/expressive/energetic/dramatic/cheerful). Додай -3.1 для варіанту 3.1 (напр. Puck-3.1).

tts_voiceХарактер
ZephyrBright 🌤
PuckUpbeat 🎉
CharonInformative 📚
KoreFirm 💪
FenrirExcitable ⚡
LedaYouthful 🌱
AoedeBreezy 🍃
CallirrhoeEasy-going 😌
SadachbiaLively 🎵
SulafatWarm 🔥
AchirdFriendly 🤝
EnceladusBreathy 🌬
GacruxMature 🍷

Edge TTS ("edge") — необмежено

tts_voiceМова
uk-UA-OstapNeuralУкраїнська, чоловічий
uk-UA-PolinaNeuralУкраїнська, жіночий
en-US-GuyNeuralEnglish US, чоловічий
en-US-JennyNeuralEnglish US, жіночий
en-GB-RyanNeuralEnglish GB, чоловічий
de-DE-ConradNeuralНімецька, чоловічий
fr-FR-HenriNeuralФранцузька, чоловічий
es-ES-AlvaroNeuralІспанська, чоловічий
pl-PL-MarekNeuralПольська, чоловічий
it-IT-DiegoNeuralІталійська, чоловічий
tr-TR-AhmetNeuralТурецька, чоловічий
cs-CZ-AntoninNeuralЧеська, чоловічий
ru-RU-DmitryNeuralРосійська, чоловічий

ElevenLabs ("elevenlabs") — Pro та Pro+

tts_voice (ID)Назва
pNInz6obpgDQGcFmaJgBAdam (чоловічий, мультимовний)
21m00Tcm4TlvDq8ikWAMRachel (жіночий, мультимовний)
AZnzlk1XvdvUeBnXmlldDomi (жіночий, мультимовний)

Фонова музика

Передай точну назву файлу у полі bgm_track. Або завантаж свій MP3 через /v1/uploads і передай bgm_file.

bgm_track (назва файлу)Стиль
chill_background-lofi-vibes-113884.mp3Lofi chill
chill_background-the-weekend-117427.mp3Lofi weekend
bodleasons-lofi-chill-smooth-chill-lofi-for-vlogs-and-background-music-159456.mp3Lofi smooth
alexgrohl-phonk-505963.mp3Phonk
white_records-neon-drift-phonk-house-background-music-for-video-27-second-496492.mp3Phonk house (27с)
white_records-toxic-drift-slap-house-background-music-for-video-stories-37-second-503887.mp3Slap house (37с)
diamond_tunes-majestic-tides-60sec-286729.mp3Cinematic majestic (60с)
raspberrymusic-relic-of-honor-cinematic-video-game-epic-478243.mp3Cinematic epic
raspberrymusic-be-the-change-epic-documentary-corporate-394293.mp3Documentary
raspberrymusic-triumph-adventure-news-cinematic-394333.mp3News cinematic
Under_the_Clock.mp3Dramatic
The_Approaching_Hour.mp3Dramatic ambient

bgm_volume: 0.1 (тихий фон) → 1.0 (повна гучність). За замовчуванням 0.2.

Стилі субтитрів

sub_styleОпис
yellow_basicСтиль MrBeast — жовті жирні слова
purple_greenNeon — фіолетовий + зелений хайлайт
minimal_whiteМінімальний білий, чистий
news_styleНовинна рядкова стрічка
fire_orangeВогняний помаранчевий хайлайт
pop_greenЯскраво-зелений
word_box_orangeПомаранчева рамка на слові
karaoke_cyanKaraoke бірюзовий
cursor_selectionВиділення курсором
single_green_boxЗелена рамка на одному слові
business_newsДіловий новинний стиль
dynamic_colorsДинамічні кольори

Формати відео

formatСпіввідношенняПлатформи
9_169:16 (вертикальне)TikTok, Instagram Reels, YouTube Shorts
16_916:9 (горизонтальне)YouTube, Desktop
1_11:1 (квадрат)Instagram Feed, Facebook
originalоригіналЗберегти розміри джерела

Вимоги тарифів

ФункціяFreeStandardProPro+
video
transcription
audio (TTS)
subtitles
pause_removal
dubbing
ElevenLabs голоси
API доступ

Коди помилок

HTTPПричина
401Відсутній або невірний X-API-Key
403Функція недоступна на поточному тарифі
404Задача або файл не знайдені (upload_id міг протухнути після 2 год)
413Файл перевищує 500 MB
415Непідтримуваний тип файлу
429Перевищено місячний ліміт або 30 запитів/хв
500Внутрішня помилка сервера
{ "detail": "Monthly video render limit exceeded" }

Приклад: Python — повний пайплайн відео

import httpx, time

API_KEY = "reel_xxxxxxxx_..."
BASE    = "https://api.reelora.cc"
H       = {"X-API-Key": API_KEY}

def poll(task_id):
    while True:
        r = httpx.get(f"{BASE}/v1/tasks/{task_id}", headers=H).json()
        print(f"  status={r['status']} progress={r.get('progress')}%")
        if r["status"] == "completed": return r["result_url"]
        if r["status"] == "failed":    raise RuntimeError(r["error_message"])
        time.sleep(3)

with open("photo.jpg", "rb") as f:
    upload = httpx.post(f"{BASE}/v1/uploads", headers=H, files={"file": f}).json()

task = httpx.post(f"{BASE}/v1/tasks", headers=H, json={
    "type":         "video",
    "photos":       [upload["upload_id"]],
    "text":         "Breaking news from our channel.",
    "format":       "9_16",
    "tts_provider": "google",
    "tts_voice":    "Chirp3-HD-Aoede",
    "subtitles":    True,
    "sub_style":    "news_style",
    "bgm_track":    "raspberrymusic-triumph-adventure-news-cinematic-394333.mp3",
    "bgm_volume":   0.15,
}).json()

print("Завантажити:", poll(task["task_id"]))

Приклад: Python — дублювання semi_auto

# Крок 1: транскрипція
with open("video.mp4", "rb") as f:
    vid = httpx.post(f"{BASE}/v1/uploads", headers=H, files={"file": f}).json()

t1 = httpx.post(f"{BASE}/v1/tasks", headers=H, json={
    "type": "dubbing", "mode": "semi_auto", "step": "transcribe",
    "file": vid["upload_id"], "source_lang": "uk", "target_lang": "en",
}).json()
srt_url = poll(t1["task_id"])
# скачай srt_url → відредагуй → збережи як edited.srt

# Крок 2: рендер з відредагованим SRT
with open("edited.srt", "rb") as f:
    srt = httpx.post(f"{BASE}/v1/uploads", headers=H, files={"file": f}).json()

t2 = httpx.post(f"{BASE}/v1/tasks", headers=H, json={
    "type": "dubbing", "mode": "semi_auto", "step": "render",
    "file": vid["upload_id"], "srt_file": srt["upload_id"],
    "target_lang": "en", "tts_provider": "edge",
    "tts_voice": "en-US-GuyNeural",
    "mix_mode": "overlay", "overlay_volume": 20,
}).json()
print("Дубльоване відео:", poll(t2["task_id"]))

Приклад: JavaScript / Node.js

const API_KEY = "reel_xxxxxxxx_...";
const BASE    = "https://api.reelora.cc";
const H       = { "X-API-Key": API_KEY, "Content-Type": "application/json" };

async function poll(taskId) {
  while (true) {
    await new Promise(r => setTimeout(r, 3000));
    const d = await fetch(`${BASE}/v1/tasks/${taskId}`, { headers: H }).then(r => r.json());
    if (d.status === "completed") return d.result_url;
    if (d.status === "failed")    throw new Error(d.error_message);
  }
}

const { task_id } = await fetch(`${BASE}/v1/tasks`, {
  method: "POST", headers: H,
  body:   JSON.stringify({ type: "audio", text: "Привіт з JS!", tts_provider: "google", tts_voice: "Chirp3-HD-Puck" }),
}).then(r => r.json());

console.log("MP3:", await poll(task_id));

Приклад: curl — транскрипція

# Завантажуємо файл
UPLOAD=$(curl -s -X POST https://api.reelora.cc/v1/uploads \
  -H "X-API-Key: reel_..." -F "[email protected]" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['upload_id'])")

# Задача транскрипції
TASK=$(curl -s -X POST https://api.reelora.cc/v1/tasks \
  -H "X-API-Key: reel_..." -H "Content-Type: application/json" \
  -d "{\"type\":\"transcription\",\"file\":\"$UPLOAD\",\"language\":\"uk\",\"output_format\":\"both\"}" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['task_id'])")

# Polling
while true; do
  RESP=$(curl -s https://api.reelora.cc/v1/tasks/$TASK -H "X-API-Key: reel_...")
  STATUS=$(echo $RESP | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
  echo "Status: $STATUS"
  [ "$STATUS" = "completed" ] && echo $RESP | python3 -m json.tool && break
  [ "$STATUS" = "failed"    ] && echo "Failed!" && break
  sleep 3
done