Ключ і швидкий старт
Бот і API працюють з одного балансу кредитів.
Отримати API-ключ
- Відкрий @sonapro_bot.
- Обери 🔌 API → Створити ключ.
- Додавай
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_expiringcredits_expires_at | Скільки кредитів згорить найближчим терміном і коли. Це лише найближча дата: у кожного пакета свій термін. Коли в пакетах кредитів не лишилось — 0 і null. |
tariff | Поточний тариф: start, pro, business, ultra або null. |
tariff_expires_at | Коли цей тариф закінчиться. Витрачений пакет тримає тариф до кінця свого терміну, тому дата буває пізніша за credits_expires_at і є навіть тоді, коли та — null. Після неї tariff знижується до меншого чинного пакета або стає null. |
jobs_limit | Скільки озвучок акаунт може виконувати одночасно. |
sub_activesub_expires_at | Підписка Ультра і дата її кінця; для інших тарифів — false і null. |
unlimited | true — безлімітний акаунт: кредити не списуються, тож баланс не рухається, а tariff_expires_at — null. |
Пакети Nano і Veo — у product_billing. і product_billing.; null, якщо пакета немає.
| Поле | Пакет Nano / Veo |
|---|---|
daily_limit | Генерацій на добу; у Veo — null, без ліміту. |
used_todayremaining_today | Використано й лишилось у поточній добі. |
resets_at | Коли почнеться нова доба. Відлік іде від початку пакета, а не з півночі. |
expires_at | Кінець поточного терміну пакета. |
active_until | Кінець разом із уже купленим продовженням. Без продовження дорівнює expires_at. |
product_billing. — раніше придбані кредити, якими можна платити за 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 | Голос або шаблон |
language | auto, uk, en, pl… | auto бере мову голосу; явний код дозволяє іншу мову |
model | sona-3.5 / sona-3.6 | Типово sona-3.6. sona-3.5 працює, лише коли її передано в запиті; старі назви sona-pro, sona-fast і sona-hd теж ідуть на sona-3.6. Модель, вибрана в боті, на API не впливає |
normalization | auto / off / locale | Sona 3.6: читання чисел, дат, часу, валют і скорочень; напр. en-IN |
format | mp3 | Формат файлу |
bitrate | 32000–192000 | Бітрейт MP3; типово 96000 |
sample_rate | 8000–48000 | Частота дискретизації; типово 44100 |
speed | 0.6–1.5 | Швидкість SONA/клону |
volume | 0.5–2.0 | Гучність SONA/клону |
emotion | string | Одна вокальна манера на весь запит |
billing_source | credits / payg | Типово — кредити тарифу. Передай payg явно для оплати з грошового балансу. Автоматичного перемикання немає. |
auto_stress | bool, типово true | Велика голосна всередині кириличного слова → U+0301 |
subtitles | bool | SRT/VTT/ASS і JSON-таймкоди |
name | string | Назва файлу без розширення |
Емоція шаблону і емоція запиту
Якщо використовуєш 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/images | JSON: prompt, model, size → image_id. Prefer: respond-async повертає 202 одразу. |
POST /v1/images/edit | multipart із повторюваним полем 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 / Pro | GPT Image 2.5 |
|---|---|---|---|
1024x1024 | 1:1, квадрат | 1024×1024 | ≈1254×1254 |
2048x1152 | 16:9, широкий | 2048×1152 | ≈1672×941 |
1152x2048 | 9:16, вертикальний | 1152×2048 | ≈941×1672 |
1536x1152 | 4:3, альбомний | 1536×1152 | ≈1448×1086 |
1152x1536 | 3:4, портретний | 1152×1536 | ≈1086×1448 |
За замовчуванням — 1024x1024; інші значення повертають 422. Nano Banana віддає файл рівно запитаного розміру. Для GPT Image 2.5 size обирає лише пропорцію: файл приходить у власній роздільності моделі (~1,5 Мп), без апскейлу. Той самий size приймає POST /v1/images/edit.
Моделі
| Модель | model | Референси | Оплата |
|---|---|---|---|
| Nano Banana 2 | nano-banana-2 | до 10 | пакет Nano, PAYG або раніше придбані кредити |
| Nano Banana Pro | nano-banana-pro | до 10 | те саме, що й Nano Banana 2: спільний денний ліміт пакета |
| GPT Image 2.5 | gpt-image-2.5 | до 10 | PAYG — $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). Старі IDgpt-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 символів |
model | veo-3.1 | Єдина модель відео |
aspect_ratio | 16:9 | 16:9 (горизонтальне) або 9:16 (вертикальне) |
images | — | Лише multipart, повторюване поле, PNG/JPEG/WEBP до 10 МБ. 1 фото — перший кадр; 2 — перший і останній кадри; 3 — референси (персонаж, предмет, стиль). Більше трьох — 422 |
billing_source | auto | auto, 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 |