【Рекомендуется】 API голосового профиля
✅ Для новых интеграций рекомендуем именно эту цепочку. По результатам реальных оценок многих пользователей песни, созданные этим путём, очень хорошо сохраняют исходный голос: вокал в готовой записи ближе к тому человеку, чей образец вы загрузили, поэтому сейчас это основной путь, который мы рекомендуем клиентам.
Для сравнения: прежний API клонирования голоса и генерации с заданным голосом тоже работает, но в навигации он помечен как «не рекомендуется» и для новых интеграций не советуется.
- Дата документа: 2026-09-26
- Охват: создать свой голос → сделать кавер выбранной песни / спеть новую песню этим голосом → следить за прогрессом → скачать готовое
- Все эндпоинты, поля и ответы проверены реальными вызовами (пункты с пометкой «измерено» проверены подробно)
Примечание: этот документ описывает только те эндпоинты, которые вызываете вы. Обработку материалов, планирование задач и проверку контента сервер делает автоматически; клиент их не реализует.
0. Начало за пять минут
Четырёх шагов достаточно, чтобы из одного образца голоса получить две готовые песни.
① Создать голос POST /api/music/voice-profile/create → получить voice_id (status=ready)
② Сделать кавер POST /api/music/voice-profile/cover → сразу получить 2 song_id
③ Следить POST /api/music/query → опрашивать до status=completed
④ Скачать GET /api/music/download?song_id=…&kind=mp3
Минимальный рабочий пример (curl):
API_KEY="sk-ваш-ключ"
BASE="https://www.suno-api.io"
# ① Создать голос (загрузить образец вокала; рекомендуем 10 с и больше, до 10 МБ)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=Мой голос" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② Сделать кавер на песню этим голосом (song_clip_id = clip id песни для кавера)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
-H "Authorization: Bearer $API_KEY" \
-H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"voice_id": "vp_2026…",
"song_clip_id": "5b773e9a-…",
"lyrics": "[Verse 1]\nтекст песни…",
"style_requirements": "медленный фолк, акустическая гитара",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ Опрос (несколько id сразу, через запятую)
curl -sS -X POST "$BASE/api/music/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"suno-v6","song_ids":"id1,id2"}'
# ④ Скачать mp3 после завершения (файл появляется только при status=completed)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. Общие соглашения
1.1 Домен и окружение
| Окружение | Base URL | Назначение |
|---|---|---|
| Продакшен | https://www.suno-api.io |
Реальный клиентский трафик |
Все пути ниже указаны относительно Base URL; например, полный адрес POST /api/music/voice-profile/create —
https://www.suno-api.io/api/music/voice-profile/create.
1.2 Аутентификация
Все эндпоинты используют один и тот же заголовок запроса, значение которого — созданный вами в консоли API-ключ:
Authorization: Bearer sk-xxxxxxxx
- Префикс
Bearerнеобязателен; префиксsk-тоже (Authorization: sk-xxxработает так же). - Ключ отсутствует или недействителен → HTTP 401, тело вида
{"success":false,"message":"…"}(текст зависит от языка запроса). - Каждый ключ видит и может изменять только песни и голоса своего аккаунта.
1.3 Форматы тела запроса
- Создание голоса: рекомендуется
multipart/form-data(загрузка файла); также поддерживаетсяapplication/json(URL или base64). - Остальные эндпоинты:
application/json.
1.4 Две оболочки ответа (клиенту нужно знать только эти две)
Эндпоинты «управления голосами» (create / create-from-clip / list / detail / delete) используют бизнес-оболочку:
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
«Кавер с голосом» идёт по каналу генерации и использует оболочку генерации: успех — это code/message/data, ошибка — объект error:
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
Как определять: сначала код состояния HTTP, затем success === false, затем code !== 200 или наличие error.
Бизнес-ошибка не гарантирует HTTP, отличный от 200 (эндпоинты управления голосами возвращают HTTP 200 даже при ошибке), поэтому ориентироваться только на код состояния нельзя.
1.5 Идемпотентность
Создание голоса (включая «создать из существующего аудио») действительно идемпотентно: под одним и тем же ключом повторная отправка того же client_request_id создаёт только один голос, а вторая попытка сразу возвращает первый результат (success=true, тот же voice_id). Смысл в том, что клиент сам генерирует id (например, UUID) и при повторе после тайм-аута использует то же значение.
Отправка кавера не дедуплицируется на уровне запроса (это платная генерация), поэтому учтите два момента:
- Идентификатор отправки лежит в заголовке
X-Create-Ui-Client-Request-Id: <ваш id отправки>. Он записывается в серверную запись задачи и упрощает разбор позже; он не предотвращает повторное списание. - Тайм-аут ≠ неудача: запрос мог уже быть принят и генерироваться. Перед повтором проверьте через
GET /api/music/songs?p=1&page_size=20(параметры пагинации —p/page_size, совместимое написаниеpsтоже работает), не появилась ли уже новая песня сgeneration_type=voice_profile_cover, и повторяйте тот же запрос, только если её нет.
Тела create и create-from-clip тоже принимают поле client_request_id (см. §3 и §4).
1.6 Обзор оплаты
| Действие | Эндпоинт | Цена | Комментарий |
|---|---|---|---|
| Создание голоса (обычное) | POST /api/music/voice-profile/create |
Бесплатно | Загрузка образца не расходует лимиты Suno |
| Создание голоса (из существующего аудио) | POST /api/music/voice-profile/create-from-clip |
Бесплатно | Сервер только регистрирует ссылку на материал; повторной загрузки нет |
| Усиленное клонирование | То же, enhanced=true |
По «цене усиленной загрузки» (по умолчанию 10 ¥ за вызов) | Асинхронно; при неудаче возврат автоматически |
| Кавер с голосом | POST /api/music/voice-profile/cover |
1,2 ¥ за вызов; при max_mode=true — 2,4 ¥ за вызов |
За вызов возвращается 2 песни |
| Запрос / список / детали / удаление | — | Бесплатно | |
| Скачивание (взяли прямую ссылку сами) | audio_url из ответа |
Бесплатно | Воспроизведение по выданному адресу |
| Скачивание (конвертация в wav / текст песни и т. п.) | POST /api/music/free2 |
0,2 ¥ за удачную песню | См. §8 |
Цены в любой момент читаются через публичный эндпоинт, поэтому не хардкодьте их (см. §9):
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← базовая цена кавера с голосом
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← цена усиленного клонирования
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
Кавер работает по схеме предоплата + возврат при неудаче:
- Отклонённый запрос (неверные параметры, 4xx/5xx платформы, сам факт нехватки баланса) не списывается — при отправке с несуществующим голосом баланс в измерениях вообще не изменился (delta = 0);
- Принятая задача, которая в итоге провалилась (включая сбой сервиса платформы), проходит по серверному пути возврата и возвращает предоплаченную сумму.
1.7 Словарь состояний
status голоса:
| Значение | Смысл | Годен для кавера |
|---|---|---|
ready |
Готов | ✅ |
processing |
Появляется только при усиленном клонировании (enhanced=true); в обработке |
❌ (ждать ready) |
failed |
Создание не удалось; смотрите error_message; при усиленном клонировании деньги уже возвращены |
❌ |
status песни (значение, которое возвращают эндпоинты запроса):
| Значение | Смысл | Можно скачать |
|---|---|---|
submitted / queued / processing |
Генерируется (поток предпрослушивания может уже быть) | ❌ |
completed |
Готово | ✅ |
failed |
Не удалось; списание возвращено | ❌ |
2. Обзор эндпоинтов
| # | Метод | Путь | Назначение | Оплата |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
Создать голос (загрузка / URL / base64) | Бесплатно (кроме enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
Создать голос из имеющегося аудио | Бесплатно |
| 3 | GET | /api/music/voice-profile/list |
Список голосов | Бесплатно |
| 4 | GET | /api/music/voice-profile/{voice_id} |
Детали голоса (включая прогресс усиленного клонирования) | Бесплатно |
| 5 | POST | /api/music/voice-profile/delete |
Удалить голос | Бесплатно |
| 6 | POST | /api/music/voice-profile/cover |
Кавер этим голосом / спеть новую песню | 1,2 ¥ (MAX 2,4) |
| 7 | POST | /api/music/query |
Пакетный запрос статуса песен | Бесплатно |
| 8 | GET | /api/music/songs/{song_id} |
Детали одной песни | Бесплатно |
| 9 | GET | /api/music/download |
Скачать готовый файл | Бесплатно (mp3/ссылка для воспроизведения) |
| 10 | POST | /api/music/free2 |
Конвертация в wav / получить текст песни и т. п. | 0,2 ¥ за удачную песню |
| 11 | POST | /api/music/free2/cached |
Получить уже заархивированный адрес скачивания | Бесплатно |
| 12 | GET | /api/music/songs |
Мои работы, с пагинацией | Бесплатно |
3. Создание голоса
POST /api/music/voice-profile/create
Зарегистрируйте фрагмент вокального аудио как «голос» и получите voice_id. Для платформы голос — это просто «аудио + его клип в каталоге», поэтому после успешного создания это исходное аудио сохраняется навсегда (для последующих каверов).
3.1 Три формы ввода (выберите одну)
Форма A: загрузка файла multipart (рекомендуется)
Content-Type: multipart/form-data
file=<двоичные данные аудио> # обязательно
title=<название голоса> # необязательно; если пусто, имя файла без расширения
file_name=<исходное имя файла>
source_file_name=<исходное имя файла>
source_kind=upload|record # необязательно, метка источника (загрузка / запись); по умолчанию upload
enhanced=false|true # необязательно, true = усиленное клонирование (см. §3.5)
client_request_id=<ключ идемпотентности> # необязательно
voice_id=<свой ID> # необязательно, обычно не используется
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3;type=audio/mpeg" \
-F "file_name=my-voice.mp3" \
-F "source_file_name=my-voice.mp3" \
-F "title=Мой голос" \
-F "source_kind=upload"
Форма B: JSON + публичный URL аудио
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
"file_name": "my-voice.mp3",
"title": "Мой голос"
}'
- URL должен быть публично доступной прямой HTTPS-ссылкой; сервер один раз скачивает её и перекладывает в наше объектное хранилище.
- Адрес можно положить и в поле
audio_url, эффект тот же (если отправлены оба, приоритет уfile_url). - Если адрес уже в объектном хранилище этой платформы (
*.myqcloud.com/create-ui/voice-source/...), повторного скачивания не будет: он регистрируется напрямую.
Форма C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "Мой голос"
}
- Поддерживается и префикс
data:audio/xxx;base64,, и чистый base64. - Размер ограничен (base64 увеличивает объём в 1,33 раза), для больших файлов используйте форму A.
3.2 Требования к аудио
| Пункт | Требование | Комментарий |
|---|---|---|
| Размер | ≤ 10 МБ | Выше лимита шлюз обрезает тело, что выглядит как «отклонено Suno»; сначала сожмите или укоротите |
| Длительность | Не менее 6 с; рекомендуется 10–60 с | Меньше 6 с платформа отклоняет: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| Формат | mp3 / wav / m4a / aac / flac / ogg | Определяется по расширению файла |
| Содержимое | Чистый вокал; избегайте готовых каверов или оригиналов с аккомпанементом | Аудио, очень похожее на существующую запись в каталоге, отклоняется: This audio matches an existing recording in our catalog. (измерено) |
3.3 Ответ
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_20260926080618509168500DXXrxe",
"clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"account_id": "acc_1790085275308",
"title": "Мой голос",
"source_file_name": "my-voice.mp3",
"audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
"image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
"duration_s": 29.18,
"enhanced": false,
"source_kind": "upload",
"status": "ready",
"client_request_id": "",
"created_at": 1790409978,
"updated_at": 1790409998
}
}
Описание полей (create / list / detail используют один и тот же набор):
| Поле | Тип | Комментарий |
|---|---|---|
voice_id |
string | ID голоса; дальше его используют каверы |
clip_id / song_id |
string | clip id этого голосового аудио на стороне Suno (оба одинаковы); для диагностики |
account_id |
string | Аккаунт-носитель (для диагностики; клиенту не нужен) |
title |
string | Название голоса |
source_file_name |
string | Исходное имя файла |
audio_url |
string | Долгосрочная прямая ссылка на исходное аудио, годится для предпрослушивания; сохраняется навсегда |
image_url |
string | Обложка голоса (её Suno генерирует для вокального аудио); если обложки нет, ключ вообще отсутствует |
duration_s |
number | Длительность образца голоса в секундах |
enhanced |
bool | Создан ли усиленным клонированием |
source_kind |
string | upload / record / clip (взят из имеющегося аудио) |
status |
string | ready / processing / failed |
error_message |
string | Причина неудачи; присутствует только при failed |
task_id |
number | Номер нижележащей задачи усиленного клонирования; только при enhanced=true |
pre_consumed_quota |
number | Предоплаченный лимит (только при усиленном клонировании) |
created_at / updated_at |
number | Unix-секунды |
created_at/updated_at— метки времени в секундах (10 цифр), не в миллисекундах.
3.4 Частые ошибки
| HTTP | message | Причина и что делать |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
Аудиосодержимое не приложено |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
Образец слишком короткий; возьмите ≥6 с (рекомендуется ≥10 с) |
| 200 | This audio matches an existing recording in our catalog. |
Образец очень похож на существующую запись в каталоге; возьмите другой чистый сухой вокал |
| 200 | upload succeeded without clip or account identity |
Аномальный ответ платформы; повторите |
| 200 | audio file exceeds 30 MB limit |
Превышен лимит сервера (для клиента держитесь 10 МБ) |
| 401 | invalid token |
Неверный API-ключ |
3.5 Усиленное клонирование (enhanced=true)
Для случаев, когда «сам образец голоса содержит защищённые авторским правом слова / нужна усиленная загрузка». Цена — как за усиленную загрузку (по умолчанию 10 ¥ за вызов, при неудаче автоматический возврат):
- Ответ сразу
status=processing+task_id(на этом этапеclip_idещё нет), выполнение асинхронное; - Во время обработки прогресс смотрите через
GET /api/music/voice-profile/{voice_id}: возвращаютсяprogress_percent/progress_stage/progress_message; - По завершении
statusстановитсяready, аclip_id,audio_url,image_urlзаполняются; - При неудаче
status=failed, аerror_messageвыглядит как «усиленная загрузка не удалась, средства возвращены автоматически, попробуйте позже»; - Усиленное клонирование заметно дольше обычного создания (минуты), поэтому не ждите его синхронным тайм-аутом.
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" -F "title=Мой голос" -F "enhanced=true"
4. Создание голоса из имеющегося аудио
Если не хотите загружать заново: скопируйте в голос аудио, которое уже загружено или уже сгенерировано. Бесплатно и идемпотентно.
POST /api/music/voice-profile/create-from-clip
Content-Type: application/json
{
"source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Сюй Цин Цян",
"client_request_id": "vp-clip-1789…"
}
source_song_id: clip id завершённого аудио в вашем аккаунте (совпадает сsong_idпесни).- Повторная отправка того же клипа не создаёт новую запись: сразу возвращается существующий голос с
reused: true(измерено).
Ответ — все поля из §3.3 плюс два поля только для чтения:
| Поле | Комментарий |
|---|---|
reused |
true = это аудио уже было вашим голосом и переиспользуется |
source_type |
Откуда аудио: generate / custom_generate / voice_generate / upload_source / enhanced_upload |
{
"success": true,
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Сюй Цин Цян",
"status": "ready",
"enhanced": true,
"reused": true,
"source_type": "enhanced_upload"
}
}
Ошибки (message как есть; рекомендуется показать или локализовать):
| message | Смысл |
|---|---|
source audio not found |
Клип не существует или не ваш |
source audio is invalid |
Это аудио ещё генерируется / является промежуточным продуктом и пока не годится |
source_song_id is required |
source_song_id не передан |
5. Список / детали / удаление голосов
5.1 Список
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "Мой голос", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
Поля полностью совпадают с §3.3. Удалённые голоса по умолчанию не возвращаются.
5.2 Детали
GET /api/music/voice-profile/{voice_id}
Возвращается один объект голоса (data — сам объект, не массив). Пока идёт усиленное клонирование, добавляются:
| Поле | Комментарий |
|---|---|
progress_percent |
Целое от 0 до 100 |
progress_stage |
Идентификатор этапа, например media_preparing |
progress_message |
Текст прогресса для показа пользователю |
5.3 Удаление
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- После удаления голос исчезает из списка и больше не годится для новых каверов: отправка с этим
voice_idвозвращает 400 (см. §6.4). - Песни, уже созданные им, вообще не затрагиваются; воспроизведение, скачивание, продолжение, замена и разделение работают как прежде.
- Удаление несуществующего голоса или голоса, не принадлежащего этому аккаунту, возвращает
{"success":false,"message":"voice not found"}.
6. Кавер с голосом (ключевой эндпоинт)
POST /api/music/voice-profile/cover
Content-Type: application/json
Одна отправка создаёт 2 песни (как и обычная генерация).
6.1 Два сценария
| Сценарий | Условие | Комментарий |
|---|---|---|
| A. Кавер на выбранную песню | Передан song_clip_id |
Поёт эту песню вашим голосом (мелодия / ритм / разделы как в оригинале; вокал — ваш) |
| B. Новая песня этим голосом | song_clip_id не передан |
Даёте только голос + текст (необязательно) + требования к стилю; модель сочиняет новую мелодию в этом стиле и поёт |
resolved_scene в ответе вернёт cover или sing, чтобы вы могли подтвердить выбранный путь.
6.2 Поля запроса
| Поле | Тип | Обязательно | По умолчанию | Комментарий |
|---|---|---|---|---|
model |
string | Да | — | Имя модели для клиента, см. §6.5. Без него вернётся model is required (HTTP 500) |
voice_id |
string | Одно из двух | — | ID голоса (vp_…); должен быть status=ready |
voice_clip_id |
string | Одно из двух | — | Можно сразу использовать clip id голоса; если переданы оба, приоритет у voice_id |
song_clip_id |
string | Нет | пусто | clip id (song_id) песни для кавера. Не передан = сценарий B |
lyrics |
string | Нет | пусто | Полный текст песни, передаётся посимвольно, без переписывания и обрезки; ≤ 3000 символов |
cover_requirements |
string | Нет | пусто | Пожелания к каверу на естественном языке, например «чётче артикулировать». Они дописываются к фиксированному промпту |
style_requirements |
string | Нет | пусто | Требования к стилю, например «медленный фолк, акустическая гитара» |
title |
string | Нет | пусто | Название этих двух песен в рабочем пространстве (влияет на song_title в последующих запросах) |
negative_tags |
string | Нет | пусто | Исключаемые стили, например электроника, рэп; ≤ 1000 символов |
vocal_gender |
string | Нет | пусто | m / f (также принимается male / female); пусто = не задано |
duration |
number | Нет | пусто | Желаемая длительность в секундах, целое от 1 до 480; пусто = решает платформа. Практический минимум платформы — около 30 с: при меньших значениях в измерениях всё равно выходило около 30 секунд |
audio_weight |
number | Нет | 0,85 | Audio Influence, десятичная дробь от 0 до 1. Чем выше, тем ближе к образцу голоса |
style_weight |
number | Нет | пусто | Влияние стиля, десятичная дробь от 0 до 1 |
weirdness_constraint |
number | Нет | пусто | Креативность, десятичная дробь от 0 до 1 (если в интерфейсе проценты, делите на 100) |
variety |
number | Нет | пусто | Разнообразие, целое от 0 до 4 (не проценты), только для моделей v6 |
max_mode |
boolean | Нет | false |
Max Mode, цена ×2 |
client_request_id |
string | Нет | пусто | Идентификатор отправки, пишется в серверную запись задачи для разбора (без дедупликации) |
Рекомендуется также передавать заголовок X-Create-Ui-Client-Request-Id: <тот же id отправки>: только он записывается в серверную запись задачи и служит ключом для последующего разбора (см. §1.5).
Размерности: audio_weight / style_weight / weirdness_constraint — дроби от 0 до 1, variety — целое от 0 до 4, duration — в секундах. Путаница приводит к отказу или странному результату.
В сценарии B текст песни необязателен (модель справится сама), но всегда передавайте lyrics, если нужно спеть конкретный текст.
6.3 Ответ
{
"code": 200,
"message": "success",
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
"resolved_scene": "cover",
"model": "suno-v6",
"audio_weight": 0.85,
"clips": [
{
"song_id": "0f2a…",
"status": "processing",
"song_title": "",
"model_version": "suno-v6",
"audio_url": "",
"play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
"lyrics": "",
"description": "[Задача] Это кавер. … (фиксированный структурный блок сервера + ваши требования к каверу / стилю)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
Главное:
- Готовые записи определяйте по
clips[].song_id(этот эндпоинт не возвращает полеid). - Вы сразу получаете 2 значения
song_id, при этомstatusещёprocessing(это лишь значит «принято»), аaudio_urlпуст; перед скачиванием нужно опросить доcompleted.play_url— поток предпрослушивания платформы, может появиться уже на этапе отправки и истечёт. description— это промпт, который сервер в итоге отправляет (фиксированный структурный блок + введённые вамиcover_requirements/style_requirements); он очень помогает при разборе результата.source_updates— результат обработки материалов на сервере, клиент может игнорировать.- Переданный вами
titleпишется в серверную запись задачи и появляется какsong_titleв последующих запросах; то, чтоclips[].song_titleв ответе на отправку пустой, — нормально.
6.4 Ошибки
{ "error": { "message": "этот голос не существует или был удалён (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | Причина |
|---|---|---|
| 500 | model is required |
В теле нет model (обязательное поле для выбора канала) |
| 400 | voice_id is required and must be a ready voice |
voice_id не передан, либо передан заполнитель / неготовый голос |
| 400 | этот голос не существует или был удалён (voice_id=vp_xxx)… |
Голос удалён, не существует или не принадлежит текущему аккаунту. Возьмите другой доступный голос или создайте новый |
| 400 | этот голос был удалён (voice_id=vp_xxx)… |
При прямой передаче материала через voice_clip_id голос для этого материала удалён; действия те же |
| 400 | voice is not ready yet (status=processing) |
Голос ещё создаётся; дождитесь ready и повторите |
| 400 | song_clip_id must be a real completed clip |
song_clip_id — заполнитель / не завершён |
| 400 | song_clip_id must differ from the voice clip |
Объект кавера не может быть самим образцом голоса |
| 400 | audio_weight must be a number between 0 and 1 |
Неверная размерность ползунка (переданы проценты) |
| 400 | duration must be an integer between 1 and 480 seconds |
Длительность не целое от 1 до 480 |
| 400 | vocal_gender must be one of m, f, male, female |
Недопустимое значение пола |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
Недопустимое значение разнообразия или модель не поддерживается |
Нехватка баланса возвращает ошибку биллинга прямо на этапе отправки и не оставляет незавершённых задач.
6.5 Доступные модели (имена для клиента)
| Имя модели | Комментарий |
|---|---|
suno-v6 |
По умолчанию, рекомендуется |
suno-v6-wild |
Более размашисто |
suno-v6-mini |
Лёгкая |
Используйте имена моделей для клиента (те, что выше). chirp-* — внутренние имена платформы, их использовать напрямую не следует.
7. Запрос прогресса
7.1 Пакетный запрос (рекомендуется)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_ids— строка с запятыми (не массив).- Ответ — голый массив (сразу
[...], без оболочкиsuccess/data):
[
{
"song_id": "0f2a…",
"song_title": "Два тигра",
"status": "completed",
"audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
"cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"duration": 115.15,
"model_version": "suno-v6",
"generation_type": "voice_profile_cover",
"play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
"lyrics": "[Verse 1]…",
"prompt": "[Verse 1]…",
"description": "[Задача] Это кавер. … (итоговый промпт сервера)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| Поле | Комментарий |
|---|---|
status |
См. §1.7; завершением считается только completed |
audio_url |
Прямая ссылка на mp3; заполняется только после completed |
cover_url |
Адрес обложки |
duration |
Фактическая длительность в секундах |
generation_type |
Песни из кавера с голосом всегда voice_profile_cover |
play_url |
Подписанный адрес предпрослушивания (истекает) |
song_title |
Название задачи (переданный вами title; если не передан, сервер подставит своё) |
lyrics / prompt |
Готовый текст песни / исходный текст |
description |
Итоговый промпт, который отправляет сервер (включая фиксированный структурный блок) |
style_tags |
Итоговое описание стиля |
created_at |
Строка ISO 8601 (учтите: отличается от Unix-секунд эндпоинта деталей) |
Совет по опросу: каждые 5–10 секунд, общий тайм-аут 10–15 минут (самый медленный измеренный «холодный» аккаунт занял около 4,5 минуты; очень немногие дольше). Завершение определяйте не по пустому audio_url, а по status.
Замечание о совместимости: этот эндпоинт идентифицирует песни по
song_id; в некоторых ранних ответах появлялось полеid, поэтому безопаснее читатьrow.song_id || row.id.
7.2 Детали одной песни
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "Два тигра",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
"video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
"created_at": 1790411012,
"completed_at": 1790411500,
"parameters": {
"prompt": "[Verse 1]…",
"style_tags": "…",
"title": "Два тигра",
"model": "suno-v6",
"generation_type": "voice_profile_cover",
"source_song_id": "5b773e9a-…"
},
"parameter_retention": {
"core_parameters_available": true,
"extended_parameters_available": false,
"sources": ["suno_tasks"],
"unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
}
}
}
- Здесь
created_at/completed_at— Unix-секунды (в отличие от строк ISO в пакетном запросе, клиенты должны их различать). wav_url/video_url— точки входа скачивания этой платформы (относительно текущего домена),GETотдаёт файл; если платформа такой материал не создала, там пустая строка.parameter_retentionпоказывает, к каким параметрам отправки можно проследить песню:core_parameters_available=trueозначает, что основные параметры (текст / стиль / источник) доступны для запроса, а приextended_parameters_available=falseперечисленные выше расширенные параметры не сохранены (каверы с голосом сейчас в этой категории).
7.3 Мои работы
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=ключевое слово
Параметры пагинации: p (номер страницы с 1) / page_size (элементов на странице; совместимое написание ps). Необязательные status и q (ключевое слово в названии). По умолчанию сортировка по времени создания по убыванию.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "Два тигра",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"created_at": 1790411012,
"completed_at": 1790411500
}
]
}
}
По generation_type=voice_profile_cover удобно отличать «песни из кавера с голосом» от остальных результатов генерации.
8. Скачивание готовых песен
8.1 Взять mp3 напрямую (рекомендуется, бесплатно)
Подходит любой из трёх способов, выберите один:
- Взять
audio_urlиз результата запроса (прямая ссылка на объектное хранилище, проще всего). GET /api/music/download?song_id=<id>&kind=mp3→ сразу возвращает байтовый поток аудио (вContent-Dispositionуже есть имя файла).POST /api/music/download-url(получить подписанный временный адрес).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song.mp3
Значения kind: mp3 (эквивалент song) / playback (потоковое воспроизведение) / wav / video / lyrics / timestamped_lyrics.
timestamped_lyrics (.lrc) сейчас доступен только для части песен; при неудаче сформируйте файл самостоятельно через API текста с метками времени.
Ответ — это сам байтовый поток файла, Content-Type и Content-Disposition (имя файла) уже заданы; wav_url / video_url из GET /api/music/songs/{song_id} — та же точка входа с kind=wav|video.
8.2 Конвертация в wav / получить текст песни / метаданные (платно)
POST /api/music/free2
Content-Type: application/json
{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
"success": true,
"data": {
"songs": [
{ "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
],
"requested_songs": 1,
"succeeded_songs": 1,
"price": 0.2
}
}
filesпринимает:mp3/wav/lyrics/metadata, до 10 песен за раз.- Списание по числу удачных песен (0,2 ¥ за песню); полностью неудачная песня не оплачивается, а неудачный формат виден только в
songs[].errors. - Чтобы снова получить уже скачанные файлы, сначала используйте бесплатный
POST /api/music/free2/cached(те жеsong_ids+files) и возьмите архивные адреса; егоsongs[].missing_filesперечисляет форматы без кеша, которые нужно готовить заново.
9. Запрос цен
GET /api/pricing/catalog
Публичный эндпоинт, аутентификация не нужна. Все цены, которые нужно показать клиенту, лежат в data.catalog.meta (строки):
| Ключ | Смысл | Текущее значение |
|---|---|---|
generation_price |
Обычная генерация | 0,6 |
voice_generation_price |
Базовая цена кавера с голосом | 1,2 |
max_mode_factor |
Множитель Max Mode | 2 |
enhanced_upload_price |
Усиленное клонирование / усиленная загрузка | 10 |
voice_auto_verify_price |
Автоматическая проверка голоса | 5 |
voice_long_term_clone_price |
Долгосрочное клонирование голоса | 5 |
Цены меняются в бэк-офисе, поэтому читайте их в реальном времени и не зашивайте в клиент. Фактическое списание за кавер = voice_generation_price × (при истинном max_mode ещё × max_mode_factor).
10. Ограничения и предупреждения
- Размер загрузки: ≤ 10 МБ (сервер принимает больше, но входной шлюз обрезает слишком большие тела на 10 МиБ, что выглядит как «отклонено Suno»; блокируйте раньше на своей стороне).
- Длительность образца: минимум 6 с, рекомендуется 10–60 с; слишком короткий платформа отклоняет.
- Содержимое образца: чистый вокал; избегайте всего, что сильно похоже на существующую запись (сравнение с каталогом отклонит).
- Лимиты текста:
lyrics≤ 3000 символов; дляstyle_requirements/negative_tags/titleжелательно 1000 / 1000 / 100 символов соответственно (требования к стилю и каверу дописываются в промпт, держите сумму в пределах 3000 символов). - Текст песни не переписывается: поётся то, что вы передали (посимвольно), локальной обрезки нет.
- Каждая песня даёт 2 записи; не рассчитывайте на один результат.
- Исходное аудио сохраняется навсегда: удаление голоса не очищает его исходное аудио; так сохраняется возможность последующих каверов и прослеживаемость соответствия требованиям.
- Голос должен быть ready: голос в состоянии
processingнельзя использовать для каверов. - Тайм-аут запроса: у «холодного» аккаунта первая отправка в измерениях занимала до ~4,5 минуты, поэтому ставьте тайм-аут клиента ≥ 6 минут. Каверы не дедуплицируются на уровне запроса, поэтому после тайм-аута проверьте, не появилась ли уже новая песня (§1.5), прежде чем отправлять снова.
- Принадлежность голоса: голоса принадлежат создателю; кавер принимает только готовые и не удалённые голоса. Несуществующий, удалённый или принадлежащий другому аккаунту голос вернёт 400:
этот голос не существует или был удалён (voice_id=…).
11. Частые вопросы (FAQ)
В1. Создание голоса стоит денег? Обычное создание и «создать из имеющегося аудио» бесплатны; платными являются только каверы (1,2 ¥ / MAX 2,4 ¥) и усиленное клонирование (по умолчанию 10 ¥).
В2. Можно ли использовать как образец готовую песню с аккомпанементом?
Не рекомендуется. Всё с музыкой или сильно похожее на существующую запись в каталоге платформа отклоняет (This audio matches an existing recording in our catalog.). Берите чисто вокальную сухую запись.
В3. Почему audio_url пуст после отправки кавера?
Отправка означает только приём, status ещё processing. Воспроизводимый/скачиваемый адрес появляется после опроса /api/music/query до status=completed.
В4. Нужно ли передавать текст в сценарии B (без song_clip_id)?
Необязательно. Передавайте lyrics, чтобы спеть конкретный текст; без него модель справится сама, но управляемость ниже.
В5. Можно ли использовать загруженное клиентом аудио напрямую как голос?
Да: через форму file_url у create либо сначала загрузив его как песню и затем вызвав create-from-clip.
В6. Вернут ли деньги при неудаче?
Резко отклонённый запрос (неверные параметры / ошибка платформы) не списывается, по измерениям; принятая, но в итоге неудачная задача вернёт предоплаченную сумму. При окончательной неудаче задача отдаёт status=failed и error_message.
В7. После удаления голоса можно ли ещё слушать созданные им песни? Да. Удаление влияет только на то, можно ли использовать этот голос для новых каверов.
В8. Какой длины песню можно закаверить за раз?
duration принимает 1–480 секунд; если не передать, платформа решит по оригиналу / материалу. Учтите: готовые записи платформы не короче примерно 30 секунд; при меньшем значении в измерениях всё равно выходило 29,96 / 29,76 секунды.
Приложение A: полный пример (Node.js, с опросом и скачиванием)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① Создать голос (multipart)
async function createVoice(filePath, title) {
const fd = new FormData();
fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
fd.set("file_name", "my-voice.mp3");
fd.set("source_file_name", "my-voice.mp3");
fd.set("title", title);
fd.set("client_request_id", `vp-create-${Date.now()}`);
const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
const body = await res.json();
if (!body.success) throw new Error(body.message);
return body.data; // { voice_id, status, audio_url, ... }
}
// ② Кавер
async function cover(voiceId, songClipId, lyrics) {
const submissionId = `vp-cover-${Date.now()}`;
const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
body: JSON.stringify({
model: "suno-v6",
voice_id: voiceId,
song_clip_id: songClipId || "",
lyrics: lyrics || "",
style_requirements: "медленный фолк, акустическая гитара",
audio_weight: 0.85,
max_mode: false,
client_request_id: submissionId,
}),
});
const body = await res.json();
if (body.error) throw new Error(body.error.message);
return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}
// ③ Опрос до завершения (каждые 5 секунд, максимум 15 минут)
async function waitUntilCompleted(songIds) {
const deadline = Date.now() + 15 * 60 * 1000;
while (Date.now() < deadline) {
const res = await fetch(`${BASE}/api/music/query`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json" },
body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
});
const songs = await res.json(); // голый массив
if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
await new Promise((r) => setTimeout(r, 5000));
}
throw new Error("timeout waiting for cover");
}
// ④ Скачивание
async function download(songId, outPath) {
const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
if (!res.ok) throw new Error(`download failed: ${res.status}`);
(await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}
const voice = await createVoice("./my-voice.mp3", "Мой голос");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nтекст…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}
Приложение B: журнал изменений
| Дата | Изменение |
|---|---|
| 2026-10-15 | Семантика удаления изложена прямо (§5.3); кавер с «удалённым / чужим» voice_id теперь возвращает 400 до предоплаты, таблица ошибок и FAQ синхронизированы (вместе с выпущенным в тот день ограничением на удаление голосов) |
| 2026-10-13 | В начало добавлено пояснение «почему мы рекомендуем этот путь»: по реальным оценкам многих пользователей песни из этого пути заметно лучше сохраняют исходный голос |
| 2026-09-26 | Первая версия: создание голоса (три формы ввода) / создание из имеющегося аудио / список, детали, удаление / кавер с голосом (сценарии A и B) / запрос прогресса / скачивание / чтение цен, с измеренными доказательствами |
Получить API-ключ
Создайте API-ключ в консоли после регистрации. Одна генерация стоит 0,6 ¥ и возвращает 2 трека, загрузки не ограничены, номер телефона не нужен.
Получить API-ключ Вернуться к обзору