SONA НАЛАШТУВАННЯ Голоси Telegram-бот EN
Довідник SONA

Налаштування

Усе, що потрібно для бота та API: від ключа і вибору голосу до наголосів, субтитрів і завантаження файлу.

Ключ і швидкий старт

Бот і API працюють з одного балансу кредитів.

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

  1. Відкрий @sonapro_bot.
  2. Обери 🔌 API → Створити ключ.
  3. Додавай sk_user_… у заголовок кожного запиту.
X-API-Key: sk_user_…

Важливо: не вставляй ключ у frontend-код, публічний GitHub або переписку. Створення нового ключа в боті відразу вимикає попередній.

Перша озвучка

Процес асинхронний: створи job_id, перевіряй статус і після done забери аудіо.

API="https://api.sonapro.app"
KEY="sk_user_…"

# 1. Створити задачу
curl -X POST "$API/v1/tts" \
  -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Привіт, світе!","voice":"vc_xxxxxxxxxx","language":"uk","model":"sona-3.6"}'

# 2. Перевірити статус
curl "$API/v1/tts/JOB_ID" -H "X-API-Key: $KEY"

# 3. Забрати файл
curl "$API/v1/tts/JOB_ID/audio" -H "X-API-Key: $KEY" -o out.mp3

Ендпоінти

Базова адреса: https://api.sonapro.app.

МетодШляхОпис
POST/v1/ttsСтворити озвучку → job_id
GET/v1/tts/{job_id}Статус задачі
GET/v1/tts/{job_id}/audioЗавантажити аудіо
GET/v1/tts/{job_id}/linkКоротке публічне посилання
GET/v1/tts/{job_id}/subtitles?format=srt|vtt|ass|json|zipСубтитри; потрібно subtitles:true
GET/v1/voices?language=uk&collection=sona_v1Каталог; collection: library або sona_v1
POST/v1/voices/cloneКлонувати голос → tmpl:N
GET/POST/v1/voices/templatesСписок або створення шаблону
PATCH/DEL/v1/voices/templates/{num}Змінити або видалити шаблон
GET/v1/emotionsАктуальний список емоцій
GET/POST/v1/pronunciationСписок або збереження правила вимови
DEL/v1/pronunciation/{term}Видалити правило
GET/v1/meАкаунт, тариф і баланс
POST/v1/imagesЗгенерувати зображення
POST/v1/images/editЗгенерувати з фото-референсом
GET/v1/images/{image_id}Статус задачі
GET/v1/images/{image_id}/fileЗавантажити PNG/JPEG/WebP
POST/v1/videosСтворити відео Veo 3.1 — з тексту або з 1–3 фото → video_id
GET/v1/videos/{video_id}Статус відео
GET/v1/videos/{video_id}/fileЗавантажити MP4
GET/v1/videos?limit=20Історія відео акаунта

Баланс і термін дії — GET /v1/me

Відповідь стосується лише акаунта, якому належить ключ. «Профіль» у боті показує ті самі числа. Дати — ISO 8601 в UTC.

ПолеКредити на озвучку й тариф
credits_remainingСкільки можна витратити зараз: усі чинні пакети разом зі стартовими кредитами. Поруч — credits_total і credits_used.
credits_expiring
credits_expires_at
Скільки кредитів згорить найближчим терміном і коли. Це лише найближча дата: у кожного пакета свій термін. Коли в пакетах кредитів не лишилось — 0 і null.
tariffПоточний тариф: start, pro, business, ultra або null.
tariff_expires_atКоли цей тариф закінчиться. Витрачений пакет тримає тариф до кінця свого терміну, тому дата буває пізніша за credits_expires_at і є навіть тоді, коли та — null. Після неї tariff знижується до меншого чинного пакета або стає null.
jobs_limitСкільки озвучок акаунт може виконувати одночасно.
sub_active
sub_expires_at
Підписка Ультра і дата її кінця; для інших тарифів — false і null.
unlimitedtrue — безлімітний акаунт: кредити не списуються, тож баланс не рухається, а tariff_expires_at — null.

Пакети Nano і Veo — у product_billing.products.nano.plan і product_billing.products.video.plan; null, якщо пакета немає.

ПолеПакет Nano / Veo
daily_limitГенерацій на добу; у Veo — null, без ліміту.
used_today
remaining_today
Використано й лишилось у поточній добі.
resets_atКоли почнеться нова доба. Відлік іде від початку пакета, а не з півночі.
expires_atКінець поточного терміну пакета.
active_untilКінець разом із уже купленим продовженням. Без продовження дорівнює expires_at.

product_billing.legacy_image_credits — раніше придбані кредити, якими можна платити за Nano. Вони вже входять у credits_remaining, тож не додавай їх удруге. payg — гаманець оплати за фактом: balance_usd доступно, reserved_usd зарезервовано під задачі, що виконуються; кошти не згорають. Поля payg немає, якщо PAYG для акаунта вимкнений.

curl https://api.sonapro.app/v1/me -H "X-API-Key: $SONA_API_KEY"

Відповідь, скорочено:

{
  "credits_remaining": 400000,
  "credits_expiring": 400000,
  "credits_expires_at": "2026-10-27T11:37:49+00:00",
  "tariff": "pro",
  "tariff_expires_at": "2026-10-27T11:37:49+00:00",
  "jobs_limit": 4,
  "product_billing": {"products": {"nano": {"plan": {
    "daily_limit": 600, "used_today": 2, "remaining_today": 598,
    "resets_at": "2026-09-28T11:37:49+00:00",
    "expires_at": "2026-10-27T11:37:49+00:00",
    "active_until": "2026-11-26T11:37:49+00:00"}}}},
  "payg": {"balance_usd": "5.000000", "reserved_usd": "0.000000"}
}

Голоси й шаблони

Параметри зберігаються для кожного шаблону окремо.

Формати ID і тариф

vc_…Бібліотечний голос1 кредит / символ
sona_…SONA Voice v11,5 кредита / символ
tmpl:NОсобистий шаблон/клон1,5 кредита / символ

Щоб побудувати окремий список наших голосів, запитай GET /v1/voices?collection=sona_v1. У загальному каталозі кожен елемент має поле collection: sona_v1 або library. Фільтри поєднуються, наприклад ?collection=sona_v1&language=uk.

Отримати каталог голосів

Один запит повертає весь каталог обраної мови — зручно зібрати свою таблицю id + name + description.

curl "$API/v1/voices?language=uk" \
  -H "X-API-Key: $KEY"

# відповідь (скорочено)
{
  "count": 1,
  "voices": [
    {
      "id": "vc_04d73ccf5c",
      "name": "Weston A.",
      "language": "uk",
      "gender": "masculine",
      "tags": ["Conversational"],
      "description": "Approachable adult male voice with a professional tone for casual conversations and everyday interactions",
      "is_pro": false,
      "has_preview": true,
      "collection": "library"
    }
  ]
}

Один голос — різні шаблони

Шаблон зберігає власні speed, volume і emotion. Тому один голос може мати «Нейтральний», «Злий» і «Спокійний» варіанти. Бот запитує ці поля під час створення; у картці шаблону їх можна змінити.

POST /v1/voices/templates
{
  "engine": "sona",
  "voice": "sona_xxxxxxxxxxxx",
  "name": "Taras · angry",
  "speed": 1.05,
  "volume": 1.0,
  "emotion": "angry"
}

# Змінити пресет пізніше
PATCH /v1/voices/templates/7
{"emotion":"neutral","speed":1.0}

Якщо під час генерації передати параметр явно, він перекриє значення шаблону лише для цієї озвучки.

Клонування

POST /v1/voices/clone — multipart з полями clip, name, language і необов’язковими speed, volume, emotion. Рекомендований зразок — 3–10 секунд чистої мови без фонової музики.

Параметри озвучення

Поля POST /v1/tts. Зірочкою позначені обов’язкові.

ПолеТип / межіОпис
text *stringТекст для озвучення
voice *vc_…, sona_…, tmpl:NГолос або шаблон
languageauto, uk, en, pl…auto бере мову голосу; явний код дозволяє іншу мову
modelsona-3.5 / sona-3.6Типово sona-3.6. sona-3.5 працює, лише коли її передано в запиті; старі назви sona-pro, sona-fast і sona-hd теж ідуть на sona-3.6. Модель, вибрана в боті, на API не впливає
normalizationauto / off / localeSona 3.6: читання чисел, дат, часу, валют і скорочень; напр. en-IN
formatmp3Формат файлу
bitrate32000–192000Бітрейт MP3; типово 96000
sample_rate8000–48000Частота дискретизації; типово 44100
speed0.6–1.5Швидкість SONA/клону
volume0.5–2.0Гучність SONA/клону
emotionstringОдна вокальна манера на весь запит
billing_sourcecredits / paygТипово — кредити тарифу. Передай payg явно для оплати з грошового балансу. Автоматичного перемикання немає.
auto_stressbool, типово trueВелика голосна всередині кириличного слова → U+0301
subtitlesboolSRT/VTT/ASS і JSON-таймкоди
namestringНазва файлу без розширення

Емоція шаблону і емоція запиту

Якщо використовуєш tmpl:N без emotion, SONA бере збережену емоцію шаблону. Якщо передати emotion:"angry" в цьому запиті, вона перекриє preset лише один раз.

Оплата за фактом (PAYG)

Поповни баланс від $5 та оплачуй озвучку в міру використання. Sona — $8 за мільйон оплачуваних символів; клони та PRO — $12 (×1,5). 10 паралельних задач; кошти не згорають. Наприклад, $16 вистачить на 2 000 000 звичайних символів.

Відкрий /payg у Telegram: баланс, поповнення та вибір оплати озвучки. В API працює той самий ключ: передавай billing_source:"payg" у кожному запиті. Вибір у боті не змінює типовий режим API. Зображення й відео мають власні пакети і той самий PAYG-баланс: $0.015 за зображення, $0.02 за відео; деталі у вкладках «Генерація зображень» і «Генерація відео».

GET /v1/billing/payg повертає доступні/зарезервовані USD та історію. Поповнення: POST /v1/billing/checkout з {"product":"payg","amount_usd":"16.25","method":"mono"} (або crypto). Кошти зараховуються після перевірки провайдером. Порожній гаманець повертає 402; помилка чи скасування озвучки повертає кошти на той самий баланс. Квитанція billing задачі показує суму й статус списання.

Наголоси, вимова й емоції

Клон передає тембр, а читає текст модель. Тому наголос і вимова налаштовуються через текст.

Три рівні роботи з наголосом

РівеньПрикладКоли застосовувати
1. Знак U+0301за́мок / замо́кПерша підказка для неоднозначного слова
2. Велика голосназАмок / замОкЛише зручний запис: SONA перетворить його на той самий U+0301
3. Фонетична замінаТарас → та-РАСТільки якщо модель проігнорувала обидві підказки і заміну перевірено на слух

U+0301 і велика літера — не два різні методи. Велика голосна всередині кириличного слова лише конвертується в U+0301. Якщо модель ігнорує знак, вона може ігнорувати обидва варіанти.

Персональний словник SONA: як він працює з кирилицею

Це не готовий орфоепічний словник усієї мови й не автоматичний пошук наголосів. Це список власних винятків акаунта: перед озвученням SONA знаходить term у тексті й буквально підставляє replacement. Ідентифікатор словника в POST /v1/tts передавати не потрібно — збережені правила застосовуються автоматично.

ВластивістьПоведінка SONA
КирилицяПідтримується і в term, і в replacement. Фонетичну підказку можна записати звичайними українськими/російськими літерами.
РегістрТипово case_sensitive: false: Тарас знаходить Тарас, тарас і ТАРАС. З case_sensitive: true правило US не змінює us, а LaTeX не змінює latex. Ключ малими літерами також приймає початкову велику: cat → cat / Cat, але не CAT. Діє в Sona 3.5 і 3.6.
МежіЗбіг лише за цілим словом або цілою фразою. Правило Тарас не змінює Тараса чи Тарасові.
ВідмінкиКожну потрібну словоформу зберігай окремо: Тараса → та-РА-са, Тарасові → та-РА-со-ві. Це приклади формату — кожну заміну перевір на слух.
Область діїПравила належать акаунту, а не одному голосу: вони діють у боті та API для всіх його голосів і шаблонів.
ПорядокДовші фрази застосовуються раніше за коротші слова. Ліміт — 50 правил; term до 60, replacement до 160 символів.

Для слова зі словника пиши в сценарії звичайне написання. Не додавай одночасно U+0301 або велику голосну: словник застосовується після нормалізації наголосу, тому змінене написання вже не дорівнюватиме збереженому term. Після підміни саме фінальний текст іде в озвучення, субтитри та підрахунок символів.

Приклад правила з урахуванням регістру для POST /v1/pronunciation: {"term":"US","replacement":"United States","case_sensitive":true}. Старі правила зберігають попередню поведінку. Правила з перетином написань повертають 422: спочатку зміни або видали попереднє правило. Для оновлення чи видалення конкретного варіанта передавай точний term зі списку правил.

# додати або оновити одне правило
curl -X POST https://api.sonapro.app/v1/pronunciation \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"term":"Тарас","replacement":"та-РАС"}'

# окремі правила для відмінюваних форм
curl -X POST https://api.sonapro.app/v1/pronunciation \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"term":"Тараса","replacement":"та-РА-са"}'

# переглянути всі правила акаунта
curl https://api.sonapro.app/v1/pronunciation \
  -H "X-API-Key: $SONA_API_KEY"

# видалити правило; кирилицю в URL треба percent-encode
curl -X DELETE https://api.sonapro.app/v1/pronunciation/%D0%A2%D0%B0%D1%80%D0%B0%D1%81 \
  -H "X-API-Key: $SONA_API_KEY"

Коли використовувати: для імен, брендів, абревіатур і термінів, які стабільно читаються неправильно. Якщо проблема лише в наголосі й U+0301 спрацьовує, словник не потрібен. Фонетична підміна — sounds-like підказка, а не гарантія, тому тестуй короткою озвучкою на потрібній мові.

Перевірене правило: Тарас

Для українського голосу Taras модель читала ТАрас і ігнорувала знак наголосу. Прослухана заміна та-РАС дала правильне ТарАс.

curl -X POST https://api.sonapro.app/v1/pronunciation \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"term":"Тарас","replacement":"та-РАС"}'

Правило діє лише на ціле слово, незалежно від регістру, і автоматично застосовується до всіх озвучок цього API-акаунта. Не розбивай весь текст на склади і не вигадуй IPA: кожну фонетичну заміну спочатку треба прослухати.

Промпт для Claude / ChatGPT

Встав промпт перед сценарієм. AI проаналізує весь текст, а не лише слово «Тарас», і поверне готовий варіант для SONA.

Ти — редактор тексту для озвучення SONA.

Проаналізуй увесь текст у контексті та підготуй його до природної машинної озвучки.

Правила:
1. Не змінюй зміст, стиль, факти та мову.
2. Збережи природну пунктуацію і абзаци — вони керують паузами.
3. Знайди слова, які TTS може прочитати неправильно. Особливо перевір:
   - імена та прізвища;
   - географічні назви;
   - бренди, назви продуктів і компаній;
   - абревіатури;
   - іншомовні вставки й запозичення;
   - рідкісні терміни та омографи.
4. Якщо неоднозначний лише наголос, постав U+0301 після наголошеної голосної:
   за́мок / замо́к, му́ка / мука́.
5. Якщо знака наголосу може бути недостатньо і правильна вимова тобі достовірно
   відома, перепиши ЛИШЕ проблемне слово фонетично:
   - розділи його на зручні для читання частини дефісами;
   - наголошений склад напиши ВЕЛИКИМИ літерами;
   - збережи відмінкове закінчення конкретної форми слова.
6. Не обмежуйся словом «Тарас». Самостійно знаходь інші проблемні слова за
   контекстом, але не вигадуй вимову, якщо не впевнений.
7. Орієнтири формату:
   - Тарас → та-РАС
   - OpenAI → оупен-ей-АЙ
   - ChatGPT → чат-джі-пі-ТІ
   - Renault → ре-НО
8. Не розбивай звичайні слова на склади, не вставляй IPA і не переписуй увесь текст
   фонетично. Уже наявні теги <emotion value="..."/> збережи без змін.
9. Поверни лише готовий текст для озвучення без пояснень, списків і коментарів.

Мій текст:
"""
[ВСТАВ ТЕКСТ]
"""

Теги в тексті

Поля speed, volume і emotion задають одну манеру на всю озвучку. Ті самі три контролі можна поставити прямо в текст — і додати паузу, вимову по літерах та смішок. Теги працюють на sona-3.5 і sona-3.6; [laughter] рушій документує для sona-3.6, типової моделі; з "model":"sona-3.5" на нього не розраховуй.

<speed ratio="0.8"/>0.6–1.5від цього місця й далі
<volume ratio="0.5"/>0.5–2.0від цього місця й далі
<emotion value="sad"/>список нижчевід цього місця й далі
<break time="700ms"/>ms або s, до 10 содна пауза тут
<spell>Bob</spell>—вимовити по літерах
[laughter]—один смішок тут
<volume ratio="0.6"/><speed ratio="0.8"/>Тут подаю тихіше й повільніше.<break time="1s"/>
<volume ratio="1"/><speed ratio="1"/>А тут уже як завжди.
<emotion value="excited"/> Не повіриш, що я дізнався! [laughter]
<emotion value="sad"/> Але потім усе пішло не так…

Великі літери, кому замість точки й забутий слеш ми виправляємо самі (<SPEED RATIO="0,8"> → <speed ratio="0.8"/>), а поламаний тег повертає 422 з поясненням — щоб він не «не спрацював» тихо. Невідомі теги (<b>, 5 < 10 > 3) лишаються звичайним текстом. Довгий текст ми ріжемо на частини й самі перевідкриваємо активні speed/volume/emotion у кожній наступній, тому їхня дія не обривається посеред озвучки.

emotion у рушія в стані beta й описаний для англійської — на інших мовах різниця може бути не чутна; speed і volume — підказка, а не точний множник. <break> розриває генерацію в цьому місці, тому кілька пауз поспіль звучать неприродно. Символи тегів входять у chars, а в субтитри не потрапляють: там лишається тільки те, що звучить.

Повний список · 58 емоцій

neutral, happy, excited, enthusiastic, elated, euphoric, triumphant, amazed, surprised, flirtatious, curious, content, peaceful, serene, calm, grateful, affectionate, trust, sympathetic, anticipation, mysterious, angry, mad, outraged, frustrated, agitated, threatened, disgusted, contempt, envious, sarcastic, ironic, sad, dejected, melancholic, disappointed, hurt, guilty, bored, tired, rejected, nostalgic, wistful, apologetic, hesitant, insecure, confused, resigned, anxious, panicked, alarmed, scared, proud, confident, distant, skeptical, contemplative, determined

Генерація зображень

Генерація з тексту та з фото-референсом.

POST /v1/imagesJSON: prompt, model, size → image_id. Prefer: respond-async повертає 202 одразу.
POST /v1/images/editmultipart із повторюваним полем images: Nano Banana 2 / Pro і GPT Image 2.5 — до 10 файлів
GET /v1/images/{image_id}Статус задачі
GET /v1/images/{image_id}/fileЗавантажити файл
GET /v1/images?limit=20Історія акаунта

Приклад

# пакет Nano або раніше придбані кредити: billing_source можна не вказувати (auto)
curl -X POST https://api.sonapro.app/v1/images \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: respond-async" \
  -d '{"prompt":"Cinematic portrait in soft blue light","model":"nano-banana-2","size":"1024x1024"}'

# PAYG-баланс ($0.015): billing_source:"payg" обов’язковий, без нього auto поверне 402
curl -X POST https://api.sonapro.app/v1/images \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: respond-async" \
  -d '{"prompt":"Cinematic portrait in soft blue light","model":"nano-banana-2","size":"1024x1024","billing_source":"payg","max_amount_microusd":15000}'

# edit із кількома референсами (повторюй -F images=@... до ліміту моделі; для PAYG додай -F billing_source=payg)
curl -X POST https://api.sonapro.app/v1/images/edit \
  -H "X-API-Key: $SONA_API_KEY" -H "Prefer: respond-async" \
  -F 'prompt=Збережи людей і обʼєднай композицію' \
  -F 'model=nano-banana-pro' \
  -F 'images=@reference-1.jpg' -F 'images=@reference-2.png'

# GPT Image 2.5 через PAYG ($0.03); із раніше придбаними кредитами billing_source можна не вказувати
curl -X POST https://api.sonapro.app/v1/images \
  -H "X-API-Key: $SONA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: respond-async" \
  -d '{"prompt":"Cinematic portrait in soft blue light","model":"gpt-image-2.5","size":"2048x1152","billing_source":"payg","max_amount_microusd":30000}'

# опитуй GET /v1/images/IMAGE_ID до status=done, потім завантаж download_url

Розміри (size)

sizeФорматNano Banana 2 / ProGPT Image 2.5
1024x10241:1, квадрат1024×1024≈1254×1254
2048x115216:9, широкий2048×1152≈1672×941
1152x20489:16, вертикальний1152×2048≈941×1672
1536x11524:3, альбомний1536×1152≈1448×1086
1152x15363:4, портретний1152×1536≈1086×1448

За замовчуванням — 1024x1024; інші значення повертають 422. Nano Banana віддає файл рівно запитаного розміру. Для GPT Image 2.5 size обирає лише пропорцію: файл приходить у власній роздільності моделі (~1,5 Мп), без апскейлу. Той самий size приймає POST /v1/images/edit.

Моделі

МодельmodelРеференсиОплата
Nano Banana 2nano-banana-2до 10пакет Nano, PAYG або раніше придбані кредити
Nano Banana Pronano-banana-proдо 10те саме, що й Nano Banana 2: спільний денний ліміт пакета
GPT Image 2.5gpt-image-2.5до 10PAYG — $0.03 або раніше придбані кредити (за тарифом покупки)

Не хардкодь список: GET /v1/me повертає в image.model_options лише моделі, доступні саме цьому акаунту, разом із ціною (billing_options). Поле model обов’язкове — моделі за замовчуванням немає.

Як оплачується зображення

  • Пакет Nano на 30 днів: Старт $27 — 600 зображень на день, 5 одночасно; Про $45 — 1 200 на день, 7 одночасно; Ультра $90 — 3 500 на день, 14 одночасно. Nano Banana 2 і Pro рахуються в один денний ліміт; невикористаний ліміт не переноситься.
  • PAYG — $0.015 за генерацію з грошового балансу. Лише явно: передай billing_source:"payg" (у multipart — поле billing_source=payg). Щоб зафіксувати ціну, додай max_amount_microusd.
  • Раніше придбані кредити — 1 000 за Nano Banana 2 або Pro.
  • GPT Image 2.5 — PAYG, $0.03 за зображення (billing_source:"payg"), або кредити, придбані до переходу на пакети, — за тарифом покупки (Start 2 500 · Pro 3 333 · Business 6 000 · Ultra 9 000), auto бере їх першими. Пакети й кредити, куплені після переходу, її не оплачують: без старих кредитів auto повертає 402. size задає тільки пропорцію — файл приходить у власній роздільності моделі (~1,5 Мп, напр. 1672×941 для 16:9). Старі ID gpt-image-2 і sona-image приймаються.

Типове billing_source:"auto" бере пакет, а без пакета — раніше придбані кредити. Гроші з PAYG воно не витрачає ніколи: якщо ні пакета, ні кредитів немає, прийде 402. Якщо генерація не вдалася, оплата повертається автоматично. Зображення віддаються в оригіналі 1080 так, як їх генерує Flow, без апскейлу. quality=2k вимкнено, воно повертає 422.

Генерація відео

Veo 3.1 · 720p · з тексту й з референсами — 8 с, від першого кадру — зараз 6 с · один ендпоінт для тексту й фото.

POST /v1/videosСтворити відео → 202 + video_id. JSON — відео з тексту; multipart/form-data — відео з 1–3 фото
GET /v1/videos/{video_id}Статус: queued → processing → done або error
GET /v1/videos/{video_id}/fileЗавантажити MP4 (H.264 + AAC)
GET /v1/videos?limit=20Історія відео акаунта

Параметри

ПолеЗа замовч.Опис
prompt *—Що відбувається в кадрі, до 4000 символів
modelveo-3.1Єдина модель відео
aspect_ratio16:916:9 (горизонтальне) або 9:16 (вертикальне)
images—Лише multipart, повторюване поле, PNG/JPEG/WEBP до 10 МБ. 1 фото — перший кадр; 2 — перший і останній кадри; 3 — референси (персонаж, предмет, стиль). Більше трьох — 422
billing_sourceautoauto, plan або payg — як і для зображень
max_amount_microusd—Стеля ціни для PAYG; дорожче — 409 без списання

Відповідь завжди асинхронна: відео рендериться від 1 до кількох хвилин, тож POST одразу повертає 202, а готовий файл забираєш за download_url зі статусу. Відео з тексту — 8 с. Тривалість відео з фото задає сервіс рендеру: від першого кадру (1–2 фото) зараз 6 с, з трьома референсами — 8 с. Тому до завершення duration_s для нього дорівнює null. У готовому відео duration_s — справжня тривалість файлу.

Приклад

# 1. Відео з тексту
curl -X POST https://api.sonapro.app/v1/videos \
  -H "X-API-Key: $SONA_API_KEY" -H "Content-Type: application/json" \
  -d '{"prompt":"Паперовий кораблик пливе ставком на світанку","aspect_ratio":"16:9"}'
# → 202 {"video_id":"...","status":"queued","model":"veo-3.1","status_url":"/v1/videos/..."}

# 2. Відео з фото: перший кадр — твоє зображення
curl -X POST https://api.sonapro.app/v1/videos \
  -H "X-API-Key: $SONA_API_KEY" \
  -F 'prompt=Камера повільно наближається, листя ворушить вітер' \
  -F 'aspect_ratio=9:16' \
  -F 'images=@first-frame.jpg'

# 3. Опитуй статус до done і забери MP4
curl https://api.sonapro.app/v1/videos/VIDEO_ID -H "X-API-Key: $SONA_API_KEY"
curl https://api.sonapro.app/v1/videos/VIDEO_ID/file -H "X-API-Key: $SONA_API_KEY" -o clip.mp4

Доступ і оплата

  • Відео доступне кожному акаунту. Якщо менеджер вимкнув Veo для акаунта, POST /v1/videos повертає 403, а GET /v1/me показує video.allowed:false.
  • Пакет Veo на 30 днів, кількість відео необмежена: Старт $45 — 2 відео одночасно; Про $95 — 6; Ультра $140 — 10. Пакет підключає менеджер.
  • PAYG — $0.02 за відео з грошового балансу, лише явно: передай billing_source:"payg". Щоб зафіксувати ціну, додай max_amount_microusd (20000).

GET /v1/me → video: allowed, models, aspect_ratios, duration_s, max_references і billing_options — ціна для цього акаунта. Якщо рендер не вдався, статус повертає error із поясненням у detail, і оплата повертається сама. Поле error_code: content_refused — Google відхилив сам запит за своїми правилами (refusal_reason: real_person, intellectual_property, minor, audio, sexual, violence, unsafe, prohibited, prompt або policy; retryable:false — змініть промпт або зображення), або generation_failed (retryable:true). Той самий запит (промпт + зображення), відхилений двічі (через звук — тричі), 24 год не приймається: POST одразу відповідає 422, нічого не списується.

Результат і помилки

Статуси задачі, файли, субтитри і HTTP-коди.

Життєвий цикл

queued→processing→done

Також можливі error і canceled. Аудіо, зображення й відео зберігаються обмежений час; після видалення endpoint поверне 410.

Субтитри

Передай subtitles:true під час створення. Потім забери srt, vtt, ass, json або zip; ZIP містить аудіо і всі формати разом.

HTTP-коди

400Некоректний формат запиту
401Відсутній або невірний API-ключ
402Недостатньо кредитів, немає активного пакета або порожній PAYG-баланс
403Модель або продукт не підключені цьому акаунту (напр. відео, поки його не увімкнув менеджер)
404Ресурс не знайдено
409Ціна вища за передану стелю (max_credits / max_amount_microusd) — нічого не списано
410Файл уже видалено за строком зберігання
422Невірне поле, ID голосу або межа параметра
429Забагато запитів, зайняті всі одночасні задачі або вичерпано денний ліміт пакета
503Сервіс/голос тимчасово недоступний; враховуй Retry-After