API запроса песен и истории
На этой странице три бесплатных эндпоинта запроса:
| Возможность | Метод | Эндпоинт |
|---|---|---|
| Запрос статуса и результата песни | POST | /api/music/query |
| Запрос песен, созданных текущим аккаунтом | GET | /api/music/songs |
| Запрос параметров, сохранённых при создании песни | GET | /api/music/songs/:song_id |
Если вы использовали режим квитанции-приёмки (
accept_mode=async) на эндпоинте генерации, у вас на руках номер квитанции, а не ID песни. Отслеживайте прогресс черезGET /api/music/requests/{request_id}и возвращайтесь к эндпоинтам этой страницы, когда получите настоящийsong_id. См. «Режим квитанции-приёмки» в API генерации в простом режиме.
Аутентификация и охват данных
Все три эндпоинта используют один и тот же ключ API:
Authorization: Bearer YOUR_API_KEY
История песен изолирована по user_id, которому принадлежит ключ API. Несколько ключей, созданных под одним основным аккаунтом, могут читать историю этого аккаунта, но не песни другого пользователя или другого аккаунта подсайта.
Эндпоинты истории возвращают только реально созданные песни. Исключены:
- записи-заглушки генерации, начинающиеся с
pending:; - загрузки исходного аудио и записи улучшенной загрузки;
- побочные результаты: разделение вокала/аккомпанемента, стемы и т. п.;
- песни других пользователей или аккаунтов подсайтов.
1. Запрос статуса генерации
Запрашивает текущий статус и итоговый результат для одного или нескольких ID песен.
Эндпоинт: POST /api/music/query
Оплата: бесплатно.
Headers
| Параметр | Тип | Обязательно | Примечания |
|---|---|---|---|
| Authorization | string | да | Bearer YOUR_API_KEY |
| Content-Type | string | да | application/json |
Параметры тела
| Параметр | Тип | Обязательно | По умолчанию | Примечания |
|---|---|---|---|---|
| model | string | нет | suno-v6 |
Версия модели |
| song_ids | string | да | - | ID песен, разделённые запятыми |
Пример запроса
curl -X POST https://www.suno-api.io/api/music/query \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"song_ids": "clip_id_1,clip_id_2"
}'
Пример ответа
[
{
"song_id": "clip_id_1",
"song_title": "Название песни",
"status": "completed",
"audio_url": "https://example.com/audio.mp3",
"video_url": "https://example.com/video.mp4",
"cover_url": "https://example.com/cover.jpg",
"lyrics": "Текст песни",
"style_tags": "Mandopop, acoustic",
"duration": 180.5,
"model_version": "suno-v6",
"created_at": "2026-05-21T10:00:00Z"
}
]
Замечания о совместимости
В старой документации song_ids может быть указан как массив. Сейчас рекомендуется строка с запятыми — так эндпоинт и вызывается на самом деле.
song_ids должен содержать реальные ID песен. ID-заглушка, начинающаяся с pending:, не является итоговым song_id и здесь не работает; если запрашивать только заглушки, может вернуться пустой массив [].
Значения model, model_version или платформенного model_name в ответе могут быть историческими. Новым задачам следует использовать suno-v6, suno-v6-wild или suno-v6-mini; от suno-v2 до suno-v5-5 выведены из эксплуатации, и появление этих названий в истории не означает, что модель всё ещё можно отправлять.
Пока задача в состоянии pending, submitted или processing, поля audio_url, video_url и cover_url могут быть пустыми — это нормально для незавершённой задачи. Не делайте вывод об ошибке только из пустого адреса; ориентируйтесь на status и запросите снова, когда статус станет завершённым. Только если статус завершён, а адреса по-прежнему пусты, стоит связаться с поддержкой и указать song_id.
⚠️ Адреса аудио живут 7 дней — перенесите файлы вовремя
Возвращаемые здесь
audio_url,video_url(и другие адреса медиа, например WAV) отдаются из объектного хранилища платформы и по умолчанию истекают через 7 дней: файлы перерабатываются, и старый адрес возвращает 404.
- В течение этих 7 дней перенесите файлы в собственное хранилище; не считайте адрес долговременной ссылкой.
- Истёкший адрес не требует повторной генерации песни и не оплачивается заново: вызовите этот эндпоинт (
POST /api/music/query) снова, чтобы получить свежий действующий адрес этой песни.
2. Запрос истории песен аккаунта
Список песен, созданных основным аккаунтом текущего ключа API. Подходит для собственного списка песен, селектора или страницы истории.
Эндпоинт: GET /api/music/songs
Оплата: бесплатно.
Параметры запроса
| Параметр | Тип | Обязательно | По умолчанию | Примечания |
|---|---|---|---|---|
| p | integer | нет | 1 |
Номер страницы, начиная с 1 |
| page_size | integer | нет | 20 |
Элементов на странице, максимум 100 |
| q | string | нет | - | Нечёткий поиск по названию или точный поиск по полному ID песни |
| status | string | нет | - | Точный фильтр по статусу, например completed, playable |
Результаты упорядочены по created_at и внутреннему ID записи по убыванию, поэтому порядок постраничного вывода стабилен.
Как найти отправку, которая ушла в тайм-аут: эндпоинты генерации не дают промежуточного ответа до приёма. Если клиент ушёл в тайм-аут или соединение оборвалось при отправке, заказ мог уже быть принят и генерироваться. Загляните в этот эндпоинт (сначала новые): принятые песни появляются в списке как обычно. Отправляйте повторно только убедившись, что песни действительно нет, чтобы не заплатить дважды. См. «Время ожидания и настройка тайм-аута» в Обзоре нового API.
Пример запроса
curl "https://www.suno-api.io/api/music/songs?p=1&page_size=20&status=completed" \
-H "Authorization: Bearer YOUR_API_KEY"
Пример ответа
{
"success": true,
"message": "",
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "8e31b3c0-example-song-id",
"title": "Город в ночи",
"status": "completed",
"generation_type": "custom_generate",
"model": "suno-v6",
"duration": 187.42,
"audio_url": "https://example.com/audio.mp3",
"image_url": "https://example.com/cover.jpg",
"created_at": 1784000000,
"completed_at": 1784000120
}
]
}
}
Поля ответа
| Поле | Тип | Примечания |
|---|---|---|
| song_id | string | Реальный ID песни, пригодный для запроса деталей |
| title | string | Текущее название, которое пользователь мог переименовать |
| status | string | Текущий статус |
| generation_type | string | Тип генерации |
| model | string | Модель генерации |
| duration | number | Длительность аудио в секундах |
| audio_url | string | Адрес аудио; может быть пустым, пока задача не завершена |
| image_url | string | Адрес обложки; может быть пустым |
| created_at | integer | Время создания, временная метка Unix в секундах |
| completed_at | integer | Время завершения, временная метка Unix в секундах; может отсутствовать, пока задача не завершена |
Эндпоинт списка не возвращает промпты, поля оплаты, информацию об аккаунте или исходные ответы. За промптами и параметрами генерации обращайтесь к эндпоинту деталей песни.
3. Запрос параметров генерации
Запрашивает промпт, стиль, модель и исходную песню, которые платформа сохранила при создании песни.
Эндпоинт: GET /api/music/songs/:song_id
Оплата: бесплатно.
Доступны только песни основного аккаунта текущего ключа API. Песни других пользователей или аккаунтов подсайтов единообразно трактуются как «песня не найдена».
Параметр пути
| Параметр | Тип | Обязательно | Примечания |
|---|---|---|---|
| song_id | string | да | Реальный ID песни |
Пример запроса
curl "https://www.suno-api.io/api/music/songs/8e31b3c0-example-song-id" \
-H "Authorization: Bearer YOUR_API_KEY"
Пример ответа
{
"success": true,
"message": "",
"data": {
"song_id": "8e31b3c0-example-song-id",
"title": "Город в ночи",
"status": "completed",
"generation_type": "custom_generate",
"model": "suno-v6",
"duration": 187.42,
"audio_url": "https://example.com/audio.mp3",
"image_url": "https://example.com/cover.jpg",
"video_url": "",
"wav_url": "",
"created_at": 1784000000,
"completed_at": 1784000120,
"client_request_id": "example-request-id",
"client_request_index": 0,
"parameters": {
"prompt": "городские улицы после дождя, текст о новой встрече",
"style_tags": "Mandopop, acoustic, warm vocal",
"title": "Город в ночи",
"model": "suno-v6",
"generation_type": "custom_generate",
"source_song_id": "",
"source_audio_url": "",
"custom_mode": null,
"instrumental": null,
"negative_tags": null,
"vocal_gender": null,
"lyrics_mode": null,
"wait_audio": null,
"style_weight": null,
"weirdness_constraint": null
},
"parameter_retention": {
"core_parameters_available": true,
"extended_parameters_available": false,
"sources": [
"suno_tasks"
],
"unavailable_fields": [
"custom_mode",
"instrumental",
"negative_tags",
"vocal_gender",
"lyrics_mode",
"wait_audio",
"style_weight",
"weirdness_constraint"
]
}
}
}
Поля parameters
| Поле | Тип | Примечания |
|---|---|---|
| prompt | string | Промпт генерации или текст песни |
| style_tags | string | Теги стиля |
| title | string | Сохранённое название генерации; обычная историческая задача может хранить только текущее название |
| model | string | Модель генерации |
| generation_type | string | Тип генерации |
| source_song_id | string | ID исходной песни для каверов, продления и подобных задач |
| source_audio_url | string | Адрес исходного аудио |
| custom_mode | boolean/null | Использовался ли расширенный режим; null, если не сохранено |
| instrumental | boolean/null | Инструментальная ли песня; существующие исторические данные обычно не хранят это отдельно |
| negative_tags | string/null | Исключённые стили |
| vocal_gender | string/null | Настройка пола вокала |
| lyrics_mode | string/null | Режим текста; существующие исторические данные обычно его не хранят |
| wait_audio | boolean/null | Ожидалось ли полное аудио; существующие исторические данные обычно это не хранят |
| style_weight | number/null | Вес стиля |
| weirdness_constraint | number/null | Параметр креативности / странности |
Поле prompt_view (просмотр промпта, добавлено 2026-09-28)
prompt_view — нормализованная структура специально для «просмотра промпта»: она раскладывает данные по фиксированным
разделам в зависимости от типа генерации, так что клиенту больше не нужно решать, какое поле показывать. Это
чисто добавочное поле — старые поля (parameters, parameter_retention) сохраняют имена и
смысл, а клиенты, которые не разбирают новое поле, не затронуты вовсе.
"prompt_view": {
"type": "custom_generate",
"type_label": "Расширенный режим",
"generation": {
"model": "suno-v6", "max_mode": false, "duration": 182.4,
"title": "Четыре утра#701f37", "title_base": "Четыре утра", "title_suffix": "701f37",
"created_at": 1790421721
},
"inputs": {
"user_text": "…", "user_text_kind": "lyrics",
"user_style": "гуочао-электроника, глубокий саб-бас, ретро-синтезатор",
"style_tags": "гуочао-электроника, глубокий саб-бас, ретро-синтезатор",
"style_source": "user", "lyrics": "…",
"negative_tags": "", "is_instrumental": false
},
"extended": {
"vocal_gender": "m", "style_weight": 0.5, "audio_weight": 0.85,
"weirdness_constraint": 0.5, "variety": 2, "lyrics_mode": "manual",
"custom_mode": true
},
"reference": { "voice_name": "sv_40_34", "source_song_id": "", "source_title": "" },
"retention": {
"recorded_since": "2026-09-28", "missing_reason": "",
"not_applicable_fields": ["audio_weight"]
}
}
| Поле | Тип | Примечания |
|---|---|---|
type / type_label |
string | Исходный тип генерации / отображаемая метка (простая генерация, расширенный режим, режим звуковых эффектов, генерация с клонированным голосом…) |
generation.model |
string | Использованная модель |
generation.max_mode |
bool | Был ли включён Max Mode |
generation.duration |
number | Длительность аудио в секундах |
generation.title |
string | Название как сохранено (может содержать суффикс) |
generation.title_base |
string | Отображаемое название без завершающего суффикса #xxxxxx |
generation.title_suffix |
string | Сам суффикс (без #); пусто, если его нет |
inputs.user_text |
string | Ввод пользователя (описание или текст, зависит от типа) |
inputs.user_text_kind |
string | lyrics / description / cover_requirements |
inputs.user_style |
string | Стиль, который ввёл пользователь (расширенный режим, голос, звуковые эффекты) |
inputs.style_tags |
string | Стиль, который реально применился |
inputs.style_source |
string | user = введён пользователем; suno_derived = выведен Suno из описания |
inputs.lyrics |
string | Текст песни; пусто, если его нет, [Instrumental] для инструментальной |
inputs.negative_tags |
string | Исключённые стили |
inputs.is_instrumental |
bool | Инструментальная ли песня |
extended.* |
— | Расширенные параметры, см. ниже; несохранённые поля не появляются |
reference.voice_name |
string | Имя голоса (только для голосовых типов; внутренний persona id не возвращается) |
reference.source_song_id / source_title |
string | Исходная песня для каверов, продления и подобных задач |
retention.recorded_since |
string | Дата, с которой сохраняются расширенные параметры (2026-09-28) |
retention.missing_reason |
string | Почему нет расширенных параметров; для исторических данных not_recorded_before_20260928 |
retention.not_applicable_fields |
string[] | Параметры, которые этому типу генерации никогда не были нужны (не показывайте как «отсутствующие параметры») |
Поля, которые могут появиться в extended: vocal_gender, style_weight, audio_weight,
weirdness_constraint, variety, lyrics_mode, custom_mode, а также группа звуковых эффектов
sound_type / sound_bpm / sound_key / sound_loop. Пустые значения не возвращаются никогда.
Три правила отображения (следуйте им, а не догадывайтесь):
- Различайте источник стиля: при
style_source=suno_derivedпоказывайте «стиль (выведен Suno из вашего описания)» и никогда «ваш стиль»; - Внутренние промпты не появляются: голосовые кавер-типы возвращают только введённые пользователем 【требования к стилю】/【требования к каверу】; фиксированный каркас, который мы собираем для модели, не появляется ни в одном поле (исторические данные очищены так же);
- Не угадывайте отсутствующие параметры: если в
extendedчего-то нет, значит тогда это не записали — объясните причину черезretention.
О сохранении параметров
parameter_retention разделяет «пустое значение передали явно» и «поле исторически не сохранялось»:
core_parameters_available: существует ли основная запись задачи; при корректном запросе деталей обычноtrue;extended_parameters_available: найдена ли связанная запись расширенной музыкальной задачи;sources: из каких таблиц данных взята эта информация;unavailable_fields: поля, которые нельзя надёжно восстановить из истории; они возвращаютnullвнутриparameters.
Обычные исторические песни обычно хранят промпт, стиль, текущее название, модель, тип генерации и исходную песню, но не сохраняли все расширенные параметры отдельно. Платформа никогда не угадывает отсутствующие значения по generation_type.
Некоторые расширенные музыкальные задачи хранят также исходный промпт, стиль, название, модель и дополнительно custom_mode, negative_tags, vocal_gender, style_weight и weirdness_constraint. Даже при наличии расширенной записи instrumental, lyrics_mode и wait_audio могут остаться невосстановимыми.
Названия песен пользователь может переименовать позже. Если обычная историческая задача не сохранила отдельного исходного названия, parameters.title может быть текущим названием; при наличии расширенной записи приоритет отдаётся исходному названию генерации из неё.
Не найдено или нет прав
Бизнес-ошибки используют единый конверт ответа. Если песня не существует или не принадлежит текущему аккаунту:
{
"success": false,
"message": "song not found"
}
Эта бизнес-ошибка сейчас возвращается с HTTP 200, поэтому судите о результате по полю success. Отсутствующий, недействительный, истёкший или отключённый ключ API возвращает HTTP 401.
Безопасность
Эндпоинты истории и деталей никогда не возвращают:
- ключи API и ID токенов;
- поля квот, оплаты и возвратов;
- информацию об аккаунте и исходные ответы;
- внутренние ключи объектного хранилища;
- административные ошибки и ошибки внутренних ресурсов.
Получить API-ключ
Создайте API-ключ в консоли после регистрации. Одна генерация стоит 0,6 ¥ и возвращает 2 трека, загрузки не ограничены, номер телефона не нужен.
Получить API-ключ Вернуться к обзору