API завантаження й каверу в один крок

Оновлено 2026-09-18 · команда Suno-API

Опис кінцевої точки

Завантаження й кавер в один крок надсилає аудіофайл або URL аудіо та створює з цього вихідного аудіо нову версію каверу.

Кінцева точка: POST /api/music/upload-cover

Оплата: платно, наразі типово 0,6 ¥ за виклик. Ця кінцева точка — «завантажити й зробити кавер», ідеться не про завантаження зображення обкладинки. Фактично списана сума відповідає поточній конфігурації цін у бек-офісі.

Max Mode / Variety: ця кінцева точка підтримує необов'язкові параметри max_mode і variety (0-4). Коли max_mode увімкнено, цей виклик тарифікується за подвійною ціною (0,6 → 1,2 ¥ за виклик); variety не коштує нічого додатково. Що вони означають і як їх надсилати — у розділі «Розширені параметри» Огляду нового API.

Час очікування та тайм-аути (важливо): це синхронна кінцева точка — замовлення приймають і передають у генерацію лише коли надходить відповідь. За вимірами більшість запитів відповідають за 1-3 секунди, близько 10% тривають понад 30 секунд, а найдовший — близько 230 секунд. Установіть тайм-аут клієнта 300 секунд або більше; відсутність відповіді не означає, що нічого не згенеровано, і не повторюйте запит одразу після тайм-ауту (це дублює замовлення й списує кошти вдруге). Якщо з'єднання обірвалося, перевірте пізніше через GET /api/music/songs. Див. «Час очікування та налаштування тайм-ауту» в Огляді нового API.

Якщо аудіо велике, «завантаження» й «кавер» краще розділити на два кроки (рекомендовано)

Ця кінцева точка вимагає покласти все аудіо в тіло запиту: чим більше аудіо, тим більше тіло, і одна заминка мережі чи тайм-аут обривають передавання на півдорозі, після чого сервер повертає unexpected end of JSON input (HTTP 400, без списання).

Коли аудіо перевищує приблизно 8 МБ, мережа нестабільна або той самий вихідний матеріал використовуватиметься кілька разів, переходьте на двоетапну форму:

  1. POST /api/music/upload-source спершу завантажує вихідне аудіо — безкоштовно, можна повторювати будь-коли — і віддає clip_id;
  2. POST /api/music/generate-from-source запускає кавер із цим clip_id — тіло платного кроку становить лише близько 250 байтів.

Див. API завантаження вихідного аудіо, API каверу з вихідного кліпу та «Великі файли й обрізані запити» в кінці цієї сторінки.

Параметри запиту

Headers

Параметр Тип Обов'язково Примітки
Authorization string так Bearer YOUR_API_KEY
Content-Type string так application/json

Параметри тіла

Параметр Тип Обов'язково Типово Примітки
model string ні suno-v6 Назва моделі для клієнта: suno-v6, suno-v6-wild або suno-v6-mini
file_url string ні - URL вихідного аудіо
file_base64 string ні - Аудіо в Base64
file_name string ні - Ім'я файлу
prompt string ні - Новий текст або напрям адаптації
style string ні - Теги стилю
title string ні - Назва
negativeTags string ні - Негативний стиль
instrumental boolean ні false Чи композиція інструментальна
waitAudio boolean ні false Чи чекати на завершення аудіо
cover_start_s number ні - Секунда початку фрагмента, який переробляють
cover_end_s number ні - Секунда кінця фрагмента, який переробляють
audio_weight number ні - Залежність від референсного аудіо, діапазон 0.0-1.0; можна передавати лише коли вказано референсне аудіо

cover_start_s і cover_end_s задаються в секундах і можуть бути дробовими; час початку має бути меншим за час кінця й не перевищувати тривалість вихідного аудіо. Якщо обидва поля пропущено, використовується все аудіо. audio_weight відображається на metadata.control_sliders.audio_weight у Suno й керує тим, наскільки результат спирається на референсне аудіо; набуває значень 0.0-1.0 і може бути додане лише коли запит містить чинне референсне аудіо в file_url або file_base64. 0 є допустимим значенням; пропуск поля означає «не вказано» й зберігає типову поведінку Suno. instrumental і waitAudio мають бути логічними значеннями JSON, а не рядками.

Кінцева точка завантаження типово відповідає асинхронно. Поки clips[].status у відповіді дорівнює pending, порожній audio_url є нормальним і не означає, що завантаження чи кавер не вдалися; збережіть отриманий справжній song_id і опитуйте кінцеву точку пошуку пісень до завершення, перш ніж читати адресу аудіо.

Приклад запиту

curl -X POST https://www.suno-api.io/api/music/upload-cover \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "file_url": "https://example.com/source.mp3",
    "file_name": "source.mp3",
    "prompt": "Новий текст або напрям адаптації",
    "style": "Mandopop, acoustic guitar",
    "title": "Версія каверу",
    "negativeTags": "noise, low quality",
    "audio_weight": 0.5,
    "instrumental": false,
    "waitAudio": false,
    "cover_start_s": 0,
    "cover_end_s": 60
  }'

Відповідь

{
  "code": 200,
  "message": "success",
  "data": {
    "upload": {
      "clip_id": "uploaded_clip_id",
      "status": "complete"
    },
    "clips": [
      {
        "song_id": "new_clip_id",
        "song_title": "Версія каверу",
        "status": "pending"
      }
    ]
  }
}

Великі файли й обрізані запити

Рекомендовано: розділити завантаження й кавер на два кроки

Одноразова кінцева точка (ця) об'єднує завантаження й генерацію в один крок: велике тіло перебуває саме в цьому єдиному кроці, тож при обриві незрозуміло ні чи щось згенеровано, ні чи було списання.

Крок 1 завантаження Крок 2 кавер
Кінцева точка POST /api/music/upload-source POST /api/music/generate-from-source
Оплата Безкоштовно (лише завантаження, без генерації) 0,6 ¥ за виклик; 1,2 ¥ за виклик із Max Mode
Тіло запиту Саме аудіо (base64 / multipart) або лише посилання через file_url Близько 250 байтів (лише один sourceClipId)
Повертає clip_id (ID кліпу вихідного аудіо) data.clips[].song_id (згенерований результат)
Якщо не вдалося Просто повторіть, без списання й без задачі генерації Установіть тайм-аут клієнта ≥300 с; при тайм-ауті спершу перевірте через /api/music/songs і не повторюйте одразу
Повторне використання вихідного матеріалу Той самий clip_id працює також для продовження / заміни / розділення Аудіо доведеться завантажувати щоразу

Висновок: аудіо понад приблизно 8 МБ, нестабільна мережа або той самий матеріал кілька разів → двоетапна форма; крихітне аудіо в стабільній мережі → ця кінцева точка простіша.

Що означає 400 unexpected end of JSON input

Це означає, що JSON, який отримав сервер, неповний (це не помилка в параметрах, не проблема прав чи балансу). Типові причини, від найімовірнішої:

  1. Велике тіло обрізане посеред передавання: вхідний шар фіксує і «скільки байтів заявив клієнт», і «скільки фактично надійшло». Виміряний випадок: клієнт заявив 14,17 МБ, а надійшло лише 11,8–12,4 МБ, і всі три запити зупинилися приблизно на 1,6–1,7 с; кількість відсутніх байтів щоразу була різною, що вказує на обрив передавання, а не на фіксовану межу (сервер не обмежує розмір тіла запиту).
  2. Content-Length не збігається з фактично надісланими байтами: у Node.js використання .length рядка (кількість символів UTF-16) як довжини дає помилку, щойно вміст містить китайську або інший багатобайтовий текст.
  3. Тіло записано рядком, а не Buffer, тому записані байти не збігаються з заявленими.

Усі три випадки трапляються до списання, тож витрат не виникає.

Самоперевірка на боці клієнта

Поширені помилки

Помилка Значення Що робити
unexpected end of JSON input Тіло запиту неповне (обрізане) Пройдіть самоперевірку вище або переходьте на двоетапну форму
invalid character '-' in numeric literal Тіло multipart надіслано на JSON-кінцеву точку Не використовуйте multipart на JSON-кінцевих точках і не задавайте Content-Type вручну
one of file_path, file_base64, file_url, or multipart file is required Аудіо не додано Додайте file_base64 / file_url / multipart-file
model is required Тіло — порожній коректний JSON (наприклад {}) Надішліть принаймні model
Invalid request: Invalid request, ... Обгортка про невдалий розбір тіла Прочитайте другу половину з конкретною причиною (зазвичай одна з наведених)

Пов'язані кінцеві точки: API завантаження вихідного аудіо (крок 1), API каверу з вихідного кліпу (крок 2).

ДаліAPI каверу з вихідного кліпу

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

Створіть API-ключ у консолі після реєстрації. Одна генерація коштує 0,6 ¥ і повертає 2 треки, завантаження необмежені, номер телефону не потрібен.

Отримати API-ключ Повернутися до огляду