API-справочник
Зарегистрированы 23 метода Suno. Для каждого ниже приведены схема, обязательные поля и примеры; выполнение доступно только через опубликованный проверенный маршрут модели. Импорт схемы и локальные проверки не означают реальную приёмку всех методов.
Задайте AI_SERVICE_MODEL и AI_SERVICE_API_KEY. AI_SERVICE_TASK_ID — ID собственного исходного запроса Formula AI, AI_SERVICE_AUDIO_ID — ID его готового аудиофайла. Внешние идентификаторы поставщика не принимаются. Источник должен принадлежать клиенту, быть завершённым и доступным в течение срока хранения. Исходное подключение сохраняется.
AI_SERVICE_SOURCE_URL и AI_SERVICE_SECOND_SOURCE_URL — доступные по HTTPS исходные файлы либо data URI. AI_SERVICE_VERIFY_URL — запись владельцем фразы из validation-phrase. Используйте достаточно длинный исходный трек для указанного отрезка; continue_at должен находиться внутри него, замена — не короче 10 секунд и не больше половины трека.
Для MIDI нужен результат separate-vocals. create-voice и regenerate-phrase используют задачу validation-phrase либо regenerate-phrase; check-voice — завершённую create-voice. После получения фразы владелец записывает её сам. Persona передаётся собственным ID запроса, создавшего Persona или Voice.
Все POST возвращают HTTP 202 и собственный ID. Опрос GET /requests/{id} не вызывает новую генерацию. Результаты могут содержать аудио, изображения, видео или JSON; медиа скачиваются с тем же Bearer по адресам Formula AI. Итоговый расход и возврат находятся в billing.
Продолжение через extend использует ту же версию Suno, что исходный трек. Генерация Persona использует завершённую generate или extend; vocal_start/vocal_end должны задавать отрезок 10–30 секунд внутри трека. Инструментальные upload-cover и upload-extend не принимают lyrics, prompt и vocal_gender.
Разделение: separate_vocal — вокал и сопровождение, split_stem — несколько stems, split_stem_advanced — отдельный инструмент из stem_name. Полное перечисление 98 инструментов есть в схеме; stem_name требуется только в advanced. Выберите task_id + audio_id собственного трека либо audio_url загруженного аудио. Для MIDI можно передать только task_id разделения или дополнительно audio_id из result.data.tracks разделения для выбора одного stem. Каждый такой трек имеет собственные id и url.
Recovery принимает task_id собственной завершённой музыкальной генерации, даже если локальные файлы и содержимое уже очищены. Создаётся отдельная задача; исходные файлы остаются удалёнными. Успешно восстановленные ссылки сохраняются как новые защищённые файлы с обычным сроком хранения. Срок доступности у поставщика и успешное восстановление не гарантируются.
Sounds: sound_loop — цикл, sound_tempo — целое BPM 1–300, sound_key — одна из 24 тональностей в схеме, grab_lyrics — получение текста. Voice: validation-phrase → запись владельцем полученной фразы → create-voice → check-voice; regenerate-phrase выдаёт новую фразу. singer_skill_level: beginner, intermediate, advanced, professional. Persona или Voice передаются в persona_id как собственный ID создавшего их запроса; persona_model выбирает style_persona либо voice_persona.
Параметры передачи файлов проверяются до платной отправки: референсы простого режима — изображения JPEG/PNG/WebP/BMP до 10 MB, видео MP4/MOV/WebM до 100 MB и 241 секунды, аудио до 500 MB и от 6 секунд до 30 минут. Upload-cover/upload-extend принимают исходное аудио до восьми минут. Ключи, внутренние ID и адреса поставщика клиенту не передаются.
cURL · POST /music/generations
curl "https://formula-ai.ru/api/v1/music/generations" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"custom_mode\": true,
\"instrumental\": true,
\"style\": \"Calm minimalist piano\",
\"title\": \"Integration check\"
}"
cURL · POST /music/extend
curl "https://formula-ai.ru/api/v1/music/extend" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_extend-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\",
\"continue_at\": 10,
\"instrumental\": true
}"
cURL · POST /music/upload-and-cover-audio
curl "https://formula-ai.ru/api/v1/music/upload-and-cover-audio" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_upload_and_cover_audio-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"upload_url\": \"$AI_SERVICE_SOURCE_URL\",
\"instrumental\": true
}"
cURL · POST /music/upload-and-extend-audio
curl "https://formula-ai.ru/api/v1/music/upload-and-extend-audio" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_upload_and_extend_audio-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"upload_url\": \"$AI_SERVICE_SOURCE_URL\",
\"instrumental\": true
}"
cURL · POST /music/add-instrumental
curl "https://formula-ai.ru/api/v1/music/add-instrumental" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_add_instrumental-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"upload_url\": \"$AI_SERVICE_SOURCE_URL\",
\"title\": \"Piano accompaniment\",
\"negative_tags\": \"\",
\"tags\": \"Calm piano\"
}"
cURL · POST /music/add-vocals
curl "https://formula-ai.ru/api/v1/music/add-vocals" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_add_vocals-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"upload_url\": \"$AI_SERVICE_SOURCE_URL\",
\"title\": \"A calm song\",
\"negative_tags\": \"\",
\"style\": \"Gentle vocals\"
}"
cURL · POST /music/time-stamped-lyrics
curl "https://formula-ai.ru/api/v1/music/time-stamped-lyrics" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_time_stamped_lyrics-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\"
}"
cURL · POST /music/boost-music-style
curl "https://formula-ai.ru/api/v1/music/boost-music-style" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_boost_music_style-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"content\": \"Calm instrumental piano, gentle melody\"
}"
cURL · POST /music/cover-generate
curl "https://formula-ai.ru/api/v1/music/cover-generate" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_cover_generate-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\"
}"
cURL · POST /music/replace-section
curl "https://formula-ai.ru/api/v1/music/replace-section" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_replace_section-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\",
\"prompt\": \"Gentle piano passage\",
\"tags\": \"Piano\",
\"title\": \"Revised passage\",
\"infill_start_s\": 0,
\"infill_end_s\": 10,
\"full_lyrics\": \"An original song about sunrise\"
}"
cURL · POST /music/generate-persona
curl "https://formula-ai.ru/api/v1/music/generate-persona" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_generate_persona-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\",
\"name\": \"My music persona\",
\"description\": \"Calm piano\",
\"vocal_start\": 0,
\"vocal_end\": 20
}"
cURL · POST /music/mashup
curl "https://formula-ai.ru/api/v1/music/mashup" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_mashup-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"upload_url_list\": [
\"$AI_SERVICE_SOURCE_URL\",
\"$AI_SERVICE_SECOND_SOURCE_URL\"
],
\"style\": \"Calm piano\",
\"title\": \"My mashup\"
}"
cURL · POST /music/suno-recovery-audio
curl "https://formula-ai.ru/api/v1/music/suno-recovery-audio" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_suno_recovery_audio-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\"
}"
cURL · POST /music/convert-to-wav-format
curl "https://formula-ai.ru/api/v1/music/convert-to-wav-format" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_convert_to_wav_format-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\"
}"
cURL · POST /music/create-music-video
curl "https://formula-ai.ru/api/v1/music/create-music-video" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_create_music_video-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\"
}"
cURL · POST /music/generate-lyrics
curl "https://formula-ai.ru/api/v1/music/generate-lyrics" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_generate_lyrics-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"prompt\": \"A nostalgic song about childhood memories and growing up in a small town\"
}"
cURL · POST /music/validation-phrase
curl "https://formula-ai.ru/api/v1/music/validation-phrase" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_validation_phrase-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"voice_url\": \"$AI_SERVICE_SOURCE_URL\",
\"vocal_start_s\": 0,
\"vocal_end_s\": 10,
\"language\": \"ru\"
}"
cURL · POST /music/create-voice
curl "https://formula-ai.ru/api/v1/music/create-voice" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_create_voice-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"verify_url\": \"$AI_SERVICE_VERIFY_URL\",
\"voice_name\": \"My verified voice\"
}"
cURL · POST /music/regenerate-phrase
curl "https://formula-ai.ru/api/v1/music/regenerate-phrase" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_regenerate_phrase-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\"
}"
cURL · POST /music/check-voice
curl "https://formula-ai.ru/api/v1/music/check-voice" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_check_voice-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\"
}"
cURL · POST /music/separate-vocals
curl "https://formula-ai.ru/api/v1/music/separate-vocals" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_separate_vocals-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\",
\"audio_id\": \"$AI_SERVICE_AUDIO_ID\",
\"type\": \"separate_vocal\"
}"
cURL · POST /music/generate-midi-from-audio
curl "https://formula-ai.ru/api/v1/music/generate-midi-from-audio" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_generate_midi_from_audio-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"task_id\": \"$AI_SERVICE_TASK_ID\"
}"
cURL · POST /music/sounds
curl "https://formula-ai.ru/api/v1/music/sounds" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: example-music_sounds-1" \
--data-binary "{
\"model\": \"$AI_SERVICE_MODEL\",
\"prompt\": \"A gentle chime in a quiet room\"
}"
PHP · POST /music/generations
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/generations";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'custom_mode' => true,
'instrumental' => true,
'style' => 'Calm minimalist piano',
'title' => 'Integration check',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/extend
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/extend";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
'continue_at' => 10,
'instrumental' => true,
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_extend-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/upload-and-cover-audio
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/upload-and-cover-audio";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'upload_url' => getenv("AI_SERVICE_SOURCE_URL"),
'instrumental' => true,
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_upload_and_cover_audio-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/upload-and-extend-audio
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/upload-and-extend-audio";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'upload_url' => getenv("AI_SERVICE_SOURCE_URL"),
'instrumental' => true,
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_upload_and_extend_audio-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/add-instrumental
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/add-instrumental";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'upload_url' => getenv("AI_SERVICE_SOURCE_URL"),
'title' => 'Piano accompaniment',
'negative_tags' => '',
'tags' => 'Calm piano',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_add_instrumental-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/add-vocals
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/add-vocals";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'upload_url' => getenv("AI_SERVICE_SOURCE_URL"),
'title' => 'A calm song',
'negative_tags' => '',
'style' => 'Gentle vocals',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_add_vocals-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/time-stamped-lyrics
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/time-stamped-lyrics";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_time_stamped_lyrics-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/boost-music-style
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/boost-music-style";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'content' => 'Calm instrumental piano, gentle melody',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_boost_music_style-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/cover-generate
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/cover-generate";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_cover_generate-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/replace-section
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/replace-section";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
'prompt' => 'Gentle piano passage',
'tags' => 'Piano',
'title' => 'Revised passage',
'infill_start_s' => 0,
'infill_end_s' => 10,
'full_lyrics' => 'An original song about sunrise',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_replace_section-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/generate-persona
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/generate-persona";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
'name' => 'My music persona',
'description' => 'Calm piano',
'vocal_start' => 0,
'vocal_end' => 20,
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_generate_persona-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/mashup
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/mashup";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'upload_url_list' =>
array (
0 => getenv("AI_SERVICE_SOURCE_URL"),
1 => getenv("AI_SERVICE_SECOND_SOURCE_URL"),
),
'style' => 'Calm piano',
'title' => 'My mashup',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_mashup-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/suno-recovery-audio
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/suno-recovery-audio";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_suno_recovery_audio-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/convert-to-wav-format
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/convert-to-wav-format";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_convert_to_wav_format-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/create-music-video
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/create-music-video";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_create_music_video-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/generate-lyrics
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/generate-lyrics";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'prompt' => 'A nostalgic song about childhood memories and growing up in a small town',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_generate_lyrics-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/validation-phrase
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/validation-phrase";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'voice_url' => getenv("AI_SERVICE_SOURCE_URL"),
'vocal_start_s' => 0,
'vocal_end_s' => 10,
'language' => 'ru',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_validation_phrase-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/create-voice
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/create-voice";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'verify_url' => getenv("AI_SERVICE_VERIFY_URL"),
'voice_name' => 'My verified voice',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_create_voice-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/regenerate-phrase
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/regenerate-phrase";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_regenerate_phrase-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/check-voice
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/check-voice";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_check_voice-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/separate-vocals
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/separate-vocals";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
'audio_id' => getenv("AI_SERVICE_AUDIO_ID"),
'type' => 'separate_vocal',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_separate_vocals-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/generate-midi-from-audio
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/generate-midi-from-audio";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'task_id' => getenv("AI_SERVICE_TASK_ID"),
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_generate_midi_from_audio-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
PHP · POST /music/sounds
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/music/sounds";
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(["model" => getenv("AI_SERVICE_MODEL")] + array (
'prompt' => 'A gentle chime in a quiet room',
), JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key, "Content-Type: application/json", "Idempotency-Key: php-music_sounds-1"],
]);
if (getenv("AI_SERVICE_CA")) {
curl_setopt($handle, CURLOPT_CAINFO, getenv("AI_SERVICE_CA"));
}
$body = curl_exec($handle);
if ($body === false) {
throw new RuntimeException(curl_error($handle));
}
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
curl_close($handle);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode(["status" => $status, "result" => $result], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
Схемы метода
Обязательные поля, типы, параметры и ответы описаны в OpenAPI 3.1. Полный машинный справочник
Показать JSON-схемы
{
"openapi": "3.1.1",
"info": {
"title": "Formula AI API",
"version": "1",
"description": "Методы нашего сервиса. Доступность модели и её параметров определяется опубликованным проверенным маршрутом. Suno: 23 музыкальные и вспомогательные операции, схемы и ограничения параметров. Streaming текста, изображений и аудио: SSE, сохранённые части и собственный расчёт."
},
"servers": [
{
"url": "https://formula-ai.ru/api/v1"
}
],
"security": [
{
"ClientKey": []
}
],
"paths": {
"/music/generations": {
"post": {
"operationId": "createMusic",
"summary": "Генерация музыки",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MusicInput"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/extend": {
"post": {
"operationId": "create_music_extend",
"summary": "Suno: extend",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_extend"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/upload-and-cover-audio": {
"post": {
"operationId": "create_music_upload_and_cover_audio",
"summary": "Suno: upload and cover audio",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_upload_and_cover_audio"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/upload-and-extend-audio": {
"post": {
"operationId": "create_music_upload_and_extend_audio",
"summary": "Suno: upload and extend audio",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_upload_and_extend_audio"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/add-instrumental": {
"post": {
"operationId": "create_music_add_instrumental",
"summary": "Suno: add instrumental",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_add_instrumental"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/add-vocals": {
"post": {
"operationId": "create_music_add_vocals",
"summary": "Suno: add vocals",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_add_vocals"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/time-stamped-lyrics": {
"post": {
"operationId": "create_music_time_stamped_lyrics",
"summary": "Suno: time stamped lyrics",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_time_stamped_lyrics"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/boost-music-style": {
"post": {
"operationId": "create_music_boost_music_style",
"summary": "Suno: boost music style",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_boost_music_style"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/cover-generate": {
"post": {
"operationId": "create_music_cover_generate",
"summary": "Suno: cover generate",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_cover_generate"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/replace-section": {
"post": {
"operationId": "create_music_replace_section",
"summary": "Suno: replace section",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_replace_section"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/generate-persona": {
"post": {
"operationId": "create_music_generate_persona",
"summary": "Suno: generate persona",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_generate_persona"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/mashup": {
"post": {
"operationId": "create_music_mashup",
"summary": "Suno: mashup",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_mashup"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/suno-recovery-audio": {
"post": {
"operationId": "create_music_suno_recovery_audio",
"summary": "Suno: suno recovery audio",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_suno_recovery_audio"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/convert-to-wav-format": {
"post": {
"operationId": "create_music_convert_to_wav_format",
"summary": "Suno: convert to wav format",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_convert_to_wav_format"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/create-music-video": {
"post": {
"operationId": "create_music_create_music_video",
"summary": "Suno: create music video",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_create_music_video"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/generate-lyrics": {
"post": {
"operationId": "create_music_generate_lyrics",
"summary": "Suno: generate lyrics",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_generate_lyrics"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/validation-phrase": {
"post": {
"operationId": "create_music_validation_phrase",
"summary": "Suno: validation phrase",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_validation_phrase"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/create-voice": {
"post": {
"operationId": "create_music_create_voice",
"summary": "Suno: create voice",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_create_voice"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/regenerate-phrase": {
"post": {
"operationId": "create_music_regenerate_phrase",
"summary": "Suno: regenerate phrase",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_regenerate_phrase"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/check-voice": {
"post": {
"operationId": "create_music_check_voice",
"summary": "Suno: check voice",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_check_voice"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/separate-vocals": {
"post": {
"operationId": "create_music_separate_vocals",
"summary": "Suno: separate vocals",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_separate_vocals"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/generate-midi-from-audio": {
"post": {
"operationId": "create_music_generate_midi_from_audio",
"summary": "Suno: generate midi from audio",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_generate_midi_from_audio"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
},
"/music/sounds": {
"post": {
"operationId": "create_music_sounds",
"summary": "Suno: sounds",
"description": "JSON-объект. Действуют ограничения выбранной модели и серверного окружения. Параметры допускаются только совместимым проверенным маршрутом; неподдержанные поля не отбрасываются. Повтор с прежним Idempotency-Key возвращает существующую операцию. После очистки её содержимого возвращается 410.",
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 191,
"pattern": "^[A-Za-z0-9._:\\-]+$"
},
"description": "Область ключа — клиент. Изменение параметров с прежним ключом даёт 409."
},
{
"name": "Prefer",
"in": "header",
"schema": {
"type": "string"
},
"description": "respond-async: вернуть собственный ID без ожидания поставщика, в том числе при stream=true. Формат тела и Idempotency-Key сохраняются. Готовый повтор возвращает сохранённый результат."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunoInput_music_sounds"
}
}
}
},
"responses": {
"202": {
"description": "Операция принята. Опросите GET /requests/{id}.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Request"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
},
"Location": {
"schema": {
"type": "string"
},
"description": "Путь GET /api/v1/requests/{id}."
},
"Preference-Applied": {
"schema": {
"type": "string",
"const": "respond-async"
}
}
}
},
"502": {
"description": "Генерация завершилась ошибкой. Проверьте billing.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenerationError"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
},
"default": {
"description": "Ошибка валидации, настроек, доступа или баланса.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
},
"headers": {
"X-Generation-ID": {
"schema": {
"$ref": "#/components/schemas/PublicId"
}
}
}
}
}
}
}
},
"components": {
"securitySchemes": {
"ClientKey": {
"type": "http",
"scheme": "bearer",
"description": "API-ключ клиента Formula AI."
}
},
"schemas": {
"PublicId": {
"type": "string",
"pattern": "^[a-f0-9]{32}$"
},
"Billing": {
"type": "object",
"properties": {
"currency": {
"const": "RUB"
},
"charged": {
"type": "string",
"pattern": "^-?[0-9]+\\.[0-9]{7}$",
"description": "Рубли, точная десятичная строка с 7 знаками."
},
"refunded": {
"type": "string",
"pattern": "^-?[0-9]+\\.[0-9]{7}$",
"description": "Рубли, точная десятичная строка с 7 знаками."
},
"status": {
"enum": [
"pending",
"confirmed"
]
}
},
"required": [
"currency",
"charged",
"refunded",
"status"
]
},
"Usage": {
"type": "object",
"description": "Применимые единицы: prompt_tokens, completion_tokens, total_tokens, input_tokens, output_tokens, token_details, images, videos, audio_seconds, duration_seconds. Счётчики могут быть точными численными строками. Поля себестоимости не выдаются."
},
"ErrorDetail": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"code": {
"type": "string"
},
"type": {
"type": "string"
},
"param": {
"type": [
"string",
"null"
]
}
},
"required": [
"message",
"code"
]
},
"Error": {
"type": "object",
"properties": {
"error": {
"$ref": "#/components/schemas/ErrorDetail"
},
"request_id": {
"$ref": "#/components/schemas/PublicId"
}
},
"required": [
"error",
"request_id"
]
},
"GenerationError": {
"type": "object",
"properties": {
"error": {
"$ref": "#/components/schemas/ErrorDetail"
},
"request_id": {
"$ref": "#/components/schemas/PublicId"
},
"billing": {
"$ref": "#/components/schemas/Billing"
}
},
"required": [
"error",
"request_id",
"billing"
]
},
"Request": {
"type": "object",
"properties": {
"id": {
"$ref": "#/components/schemas/PublicId"
},
"object": {
"const": "ai_service.request"
},
"model": {
"type": "string"
},
"operation": {
"type": "string"
},
"status": {
"enum": [
"queued",
"running",
"waiting",
"saving_media",
"uncertain",
"completed",
"failed",
"cancelled"
]
},
"created_at": {
"type": [
"string",
"null"
],
"description": "Время сервиса Europe/Moscow: YYYY-MM-DD HH:mm:ss, возможно дробная часть секунд."
},
"finished_at": {
"type": [
"string",
"null"
],
"description": "Время сервиса Europe/Moscow: YYYY-MM-DD HH:mm:ss, возможно дробная часть секунд."
},
"content_expires_at": {
"type": [
"string",
"null"
],
"description": "Время сервиса Europe/Moscow: YYYY-MM-DD HH:mm:ss, возможно дробная часть секунд."
},
"content_expired": {
"type": "boolean"
},
"usage": {
"$ref": "#/components/schemas/Usage"
},
"billing": {
"$ref": "#/components/schemas/Billing"
},
"result": {
"type": [
"object",
"null"
],
"description": "Результат выбранной операции. Файлы — только адреса Formula AI либо запрошенный base64."
},
"error": {
"anyOf": [
{
"$ref": "#/components/schemas/ErrorDetail"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"object",
"model",
"operation",
"status",
"created_at",
"finished_at",
"content_expires_at",
"content_expired",
"usage",
"billing",
"result",
"error"
]
},
"MusicInput": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "A description of the desired audio content. Optional.\n- Custom mode (`custom_mode=true`): When provided, the prompt is used strictly as lyrics and sung in the generated track. Character limits by model:\n - V4: Maximum 3000 characters\n - V4_5, V4_5PLUS, V4_5ALL, V5_5, V5: Maximum 5000 characters\n- Non-custom mode (`custom_mode=false`): When provided, the prompt serves as the core idea. Lyrics are generated automatically based on it and do not strictly match the input. Maximum 3000 characters.\n`prompt` is not required. In non-custom mode, provide at least one of `image_urls`, `video_urls`, `audio_urls`, `style`, or `lyrics`. In custom mode, provide at least one of `style`, `lyrics`, or `negative_tags`. Generation is rejected if all related inputs are empty."
},
"style": {
"type": "string",
"description": "Music style specification for the generated audio.\n- Character limits by model:\n - **V4** (Discontinued): Maximum 200 characters\n - **V4_5 and V4_5PLUS** (Discontinued): Maximum 1000 characters\n - **V4_5ALL** (Discontinued): Maximum 1000 characters\n - **V5_5 and V5** (Discontinued): Maximum 1000 characters\n - **V6, V6_MINI, and V6_WILD**: Maximum 1000 characters\n- Common examples: Jazz, Classical, Electronic, Pop, Rock, Hip-hop, etc.",
"maxLength": 1000
},
"title": {
"type": "string",
"description": "Title for the generated music track.\n- Required in Custom Mode (`custom_mode: true`).\n- Max length: 80 characters.\n- Will be displayed in player interfaces and filenames.",
"maxLength": 80
},
"custom_mode": {
"type": "boolean",
"description": "Determines whether advanced parameter customization is enabled.\n- If `true`: Allows detailed control\n- If `false`: Simplified mode"
},
"instrumental": {
"type": "boolean",
"description": "Determines whether the audio should be instrumental (no lyrics).\n- In Custom Mode (`custom_mode: true`):\n - If `true`: Only `style` and `title` are required.\n - If `false`: `style`, `title`, and `prompt` are required (`prompt` is used as the exact lyrics).\n- In Non-custom Mode (`custom_mode: false`):\n - If `true`: Only `style` and `prompt` are required.\n - If `false`: `style`, `prompt`, and `lyrics` are required (`lyrics` is used as a lyrics attachment and can be used together with the audio description in `prompt`)."
},
"negative_tags": {
"type": "string",
"description": "Music styles or traits to exclude from the generated audio. Optional. Use to avoid specific styles."
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference. Optional. Use `m` for male and `f` for female. This parameter is only effective when `custom_mode` is true. In practice, it only increases probability and cannot guarantee male/female voice instructions are followed.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Only available when Custom Mode (`custom_mode: true`) is enabled. Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Only available when Custom Mode (`custom_mode: true`) is enabled. Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Only available when Custom Mode (`custom_mode: true`) is enabled. Relative weight of audio features. Optional. Range 0–1, up to 2 decimal places.\n- `audio_weight` is not supported when there are no vocals",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"style_persona",
"voice_persona"
],
"description": "Persona model. Only available for V5 (Discontinued), V5.5 (Discontinued), V6, V6_MINI, and V6_WILD."
},
"duration": {
"type": "number",
"default": 20,
"minimum": 10,
"maximum": 360,
"description": "Audio duration. Optional; only valid when `custom_mode` is true and the model is V5_5 (Discontinued), V6, V6_MINI, or V6_WILD."
},
"image_urls": {
"type": "array",
"description": "Image references. Only effective when `custom_mode=false`.\n- Optional\n- Up to 5 images; each image must not exceed 10 MB\n- Supported formats: `jpeg`, `png`, `webp`, and `bmp`",
"items": {
"type": "string"
},
"maxItems": 5
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"multipleOf": 1,
"description": "Only available when Custom Mode (`custom_mode: true`) is enabled. Controls the diversity and stylistic variation of generated results. Optional. Range 0–4, integer, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"lyrics": {
"type": "string",
"description": "Lyrics for the generated audio. Optional.\n- V6: Maximum 5000 characters.\n- When `custom_mode=true`, `lyrics` is used as lyrics first; if `lyrics` is not provided, `prompt` is used as lyrics.\n- When `custom_mode=false`, `lyrics` is used as a lyrics attachment and can be used together with the audio description in `prompt`.",
"maxLength": 5000
},
"audio_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Audio references. Only effective when `custom_mode=false`.\n- Optional\n- Audio duration must be between 6 seconds and 30 minutes; each audio file must not exceed 500 MB",
"maxItems": 10
},
"video_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Video references. Only effective when `custom_mode=false`.\n- Optional\n- Up to 1 video file; each file must not exceed 100 MB, duration must not exceed 241 seconds, with no minimum duration\n- Supported formats: mp4, mov, and webm",
"maxItems": 1
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"custom_mode",
"instrumental"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"custom_mode": {
"const": true
}
},
"required": [
"custom_mode"
]
},
"then": {
"required": [
"title"
],
"properties": {
"prompt": {
"maxLength": 5000
},
"title": {
"minLength": 1
},
"image_urls": {
"maxItems": 0
},
"video_urls": {
"maxItems": 0
},
"audio_urls": {
"maxItems": 0
}
},
"anyOf": [
{
"required": [
"style"
],
"properties": {
"style": {
"minLength": 1
}
}
},
{
"required": [
"lyrics"
],
"properties": {
"lyrics": {
"minLength": 1
}
}
},
{
"required": [
"negative_tags"
],
"properties": {
"negative_tags": {
"minLength": 1
}
}
}
]
},
"else": {
"properties": {
"prompt": {
"maxLength": 3000
}
},
"anyOf": [
{
"required": [
"style"
],
"properties": {
"style": {
"minLength": 1
}
}
},
{
"required": [
"lyrics"
],
"properties": {
"lyrics": {
"minLength": 1
}
}
},
{
"required": [
"image_urls"
],
"properties": {
"image_urls": {
"minItems": 1
}
}
},
{
"required": [
"audio_urls"
],
"properties": {
"audio_urls": {
"minItems": 1
}
}
},
{
"required": [
"video_urls"
],
"properties": {
"video_urls": {
"minItems": 1
}
}
}
],
"not": {
"anyOf": [
{
"required": [
"duration"
]
},
{
"required": [
"vocal_gender"
]
},
{
"required": [
"style_weight"
]
},
{
"required": [
"weirdness_constraint"
]
},
{
"required": [
"audio_weight"
]
},
{
"required": [
"variety"
]
}
]
}
}
},
{
"if": {
"properties": {
"instrumental": {
"const": true
}
},
"required": [
"instrumental"
]
},
"then": {
"not": {
"required": [
"audio_weight"
]
}
}
}
]
},
"SunoInput_music_extend": {
"type": "object",
"properties": {
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"prompt": {
"type": "string",
"description": "Lyrics for the extended audio. Optional.\n- Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`audio_id`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`.",
"maxLength": 5000
},
"style": {
"type": "string",
"description": "Music style specification for the extended audio. Optional.\n- Not required. Source audio (`audio_id`) is enough to generate.\n- Character limits by model:\n - **V4**(Discontinued): Maximum 200 characters\n - **V4_5 & V4_5PLUS**(Discontinued): Maximum 1000 characters\n - **V4_5ALL**(Discontinued): Maximum 1000 characters\n - **V5_5 & V5**(Discontinued): Maximum 1000 characters\n - **V6, V6_MINI, and V6_WILD**: Maximum 1000 characters\n- Should typically align with the original audio's style for best results.",
"maxLength": 1000
},
"title": {
"type": "string",
"description": "Title for the extended music track. Optional.\n- Maximum 100 characters.\n- Displayed in player interfaces and filenames.",
"maxLength": 100
},
"continue_at": {
"type": "number",
"description": "The time point (in seconds) from which to start extending the music.\n- Value range: greater than 0 and less than the total duration of the generated audio.\n- Specifies the position in the original track where the extension should begin."
},
"negative_tags": {
"type": "string",
"description": "Music styles or traits to exclude from the extended audio. Optional. Use to avoid specific undesired characteristics."
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference. Optional. 'm' denotes a male voice, and 'f' denotes a female voice. In practice, this parameter only influences the probability and does not guarantee strict adherence to the gender instruction. This parameter is not required if `instrumental` is set to `true`.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"style_persona",
"voice_persona"
],
"description": "The persona model is only applicable to the V5 (deactivated), V5.5 (deactivated), V6, V6_MINI, and V6_WILD models."
},
"instrumental": {
"type": "boolean",
"default": false,
"description": "Indicates whether it is an instrumental track. If true, passing the `lyrics`, `prompt`, and `vocal_gender` parameters is prohibited."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the extended audio. Optional.\n- Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`audio_id`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"audio_id"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"instrumental": {
"const": true
}
},
"required": [
"instrumental"
]
},
"then": {
"not": {
"anyOf": [
{
"required": [
"prompt"
]
},
{
"required": [
"lyrics"
]
},
{
"required": [
"vocal_gender"
]
}
]
}
}
}
]
},
"SunoInput_music_upload_and_cover_audio": {
"type": "object",
"properties": {
"upload_url": {
"type": "string",
"format": "uri",
"description": "The URL of the source audio file to cover. Required. Source audio (`upload_url`) is enough to generate. Ensure the uploaded audio does not exceed 8 minutes in length."
},
"prompt": {
"type": "string",
"description": "Lyrics for the covered audio. Optional.\n- Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`.",
"maxLength": 5000
},
"style": {
"type": "string",
"description": "The music style or genre for the audio. Optional.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Character limits by model:\n - **V4**(Discontinued): Maximum 200 characters\n - **V4_5 & V4_5PLUS**(Discontinued): Maximum 1000 characters\n - **V4_5ALL**(Discontinued): Maximum 1000 characters\n - **V5_5 & V5**(Discontinued): Maximum 1000 characters\n - **V6, V6_MINI, and V6_WILD**: Maximum 1000 characters",
"maxLength": 1000
},
"title": {
"type": "string",
"description": "The title of the generated music track. Optional.\n- Maximum 80 characters.\n- Displayed in player interfaces and filenames.",
"maxLength": 80
},
"instrumental": {
"type": "boolean",
"description": "Determines if the audio should be instrumental (no lyrics).\n- If `true`: generate instrumental music (no vocals). Do not pass `lyrics`, `prompt`, or `vocal_gender`.\n- If `false`: use `lyrics` as lyrics (fall back to `prompt` if `lyrics` is not provided)."
},
"negative_tags": {
"type": "string",
"description": "Music styles or traits to exclude from the generated audio. \n- Optional. Use to avoid specific styles. \n Example: \"Heavy Metal, Upbeat Drums\""
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference for the singing voice. Optional. Use 'm' for male and 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions. Do not pass this parameter when `instrumental` is `true`.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"voice_persona",
"style_persona"
],
"description": "The persona model is only available for models version 5 and 5.5."
},
"duration": {
"type": "integer",
"default": 20,
"minimum": 10,
"maximum": 360,
"description": "Audio duration in seconds. Optional. Range 10–360, default 20. Valid when `model` is ~~V5_5~~ (Discontinued), V6, V6_MINI, or V6_WILD."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the covered audio. Optional.\n- Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"upload_url",
"instrumental"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"instrumental": {
"const": true
}
},
"required": [
"instrumental"
]
},
"then": {
"not": {
"anyOf": [
{
"required": [
"prompt"
]
},
{
"required": [
"lyrics"
]
},
{
"required": [
"vocal_gender"
]
}
]
}
}
}
]
},
"SunoInput_music_upload_and_extend_audio": {
"type": "object",
"properties": {
"upload_url": {
"type": "string",
"format": "uri",
"description": "The URL of the source audio file to extend. Required. Source audio (`upload_url`) is enough to generate. Ensure the uploaded audio does not exceed 8 minutes in length."
},
"instrumental": {
"type": "boolean",
"description": "Determines whether the audio is instrumental (without lyrics). Optional; defaults to `false`.\n- If `true`: generate instrumental music (no vocals). Do not pass `lyrics`, `prompt`, or `vocal_gender`.\n- If `false`: use `lyrics` as lyrics (fall back to `prompt` if `lyrics` is not provided).",
"default": false
},
"prompt": {
"type": "string",
"description": "Lyrics for the extended audio. Optional.\n- Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`.",
"maxLength": 5000
},
"style": {
"type": "string",
"description": "Music style, e.g., Jazz, Classical, Electronic. Optional.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Character limits by model:\n- **V6, V6_MINI & V6_WILD**: Maximum 1000 characters\n- **V5_5 & V5** (Discontinued): Maximum 1000 characters\n- **V4_5PLUS & V4_5** (Discontinued): Maximum 1000 characters\n- **V4_5ALL** (Discontinued): Maximum 1000 characters\n- **V4** (Discontinued): Maximum 200 characters",
"maxLength": 1000
},
"title": {
"type": "string",
"description": "Music title. Optional.\n- Maximum 100 characters.\n- Displayed in player interfaces and filenames.",
"maxLength": 100
},
"continue_at": {
"type": "number",
"description": "The time point (in seconds) from which to start extending the music.\n- Value range: greater than 0 and less than the total duration of the uploaded audio.\n- Specifies the position in the original track where the extension should begin."
},
"negative_tags": {
"type": "string",
"description": "Music styles to exclude from generation"
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference for the singing voice. Optional. Use 'm' for male and 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions. Do not pass this parameter when `instrumental` is `true`.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"style_persona",
"voice_persona"
],
"description": "The persona model is only available for models version V5 (Discontinued), V5_5 (Discontinued), V6, V6_MINI, and V6_WILD."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the extended audio. Optional.\n- Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate.\n- Do not pass this parameter when `instrumental` is `true`."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"upload_url"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"instrumental": {
"const": true
}
},
"required": [
"instrumental"
]
},
"then": {
"not": {
"anyOf": [
{
"required": [
"prompt"
]
},
{
"required": [
"lyrics"
]
},
{
"required": [
"vocal_gender"
]
}
]
}
}
}
]
},
"SunoInput_music_add_instrumental": {
"type": "object",
"properties": {
"upload_url": {
"type": "string",
"format": "uri",
"description": "URL of the uploaded audio file. Required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `tags` are provided."
},
"title": {
"type": "string",
"description": "Title of the generated music. Required. Will be displayed in the player interface and file name."
},
"negative_tags": {
"type": "string",
"description": "Music styles or characteristics to exclude from the generated audio. Required. Used to avoid specific unwanted music elements.",
"maxLength": 200
},
"tags": {
"type": "string",
"description": "Music styles or tags to include in the generated music. Required. Defines the desired music style and characteristics.",
"maxLength": 1000
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference. Optional. 'm' for male, 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Adherence strength to specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation level. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Relative weight of audio elements. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the generated audio. Optional.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `tags` are provided."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"upload_url",
"title",
"negative_tags",
"tags"
],
"additionalProperties": false
},
"SunoInput_music_add_vocals": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "Prompt for generating audio. Optional.\n- Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.",
"maxLength": 5000
},
"title": {
"type": "string",
"description": "Music title. Required. Will be displayed in the player interface and file name."
},
"negative_tags": {
"type": "string",
"description": "Excluded music styles. Required. Used to avoid including specific styles or elements in the generated music.",
"maxLength": 200
},
"style": {
"type": "string",
"description": "Music style. Required. Such as jazz, electronic, classical and other music types.",
"maxLength": 1000
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference. Optional. 'm' for male, 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Adherence strength to specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation level. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Relative weight of audio elements. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"upload_url": {
"type": "string",
"format": "uri",
"description": "URL of the uploaded audio file. Required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `style` are provided."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the generated audio. Optional.\n- Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.\n- Not required. Source audio (`upload_url`) is enough to generate once `title`, `negative_tags`, and `style` are provided."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"upload_url",
"title",
"negative_tags",
"style"
],
"additionalProperties": false
},
"SunoInput_music_time_stamped_lyrics": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id",
"audio_id"
],
"additionalProperties": false
},
"SunoInput_music_boost_music_style": {
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "Style description. Please describe in concise and clear language the music style you expect to generate. Example: 'Pop, Mysterious'"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"content"
],
"additionalProperties": false
},
"SunoInput_music_cover_generate": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id"
],
"additionalProperties": false
},
"SunoInput_music_replace_section": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The lyrics after replacement. Required."
},
"tags": {
"type": "string",
"description": "Style tags for the music, such as jazz or electronic. Required."
},
"title": {
"type": "string",
"description": "The title of the music. Required."
},
"negative_tags": {
"type": "string",
"description": "Music styles to exclude, used to prevent specific stylistic elements from appearing in the replacement section."
},
"infill_start_s": {
"type": "number",
"description": "The point in time, in seconds, at which replacement starts, rounded to 2 decimal places. Required. Must be less than infill_end_s, and the difference between infill_end_s and infill_start_s must be at least 10 seconds.",
"minimum": 0
},
"infill_end_s": {
"type": "number",
"description": "The point in time, in seconds, at which replacement ends, rounded to 2 decimal places. Required. Must be greater than infill_start_s, and the difference between infill_end_s and infill_start_s must be at least 10 seconds.",
"minimum": 0
},
"full_lyrics": {
"type": "string",
"description": "The complete modified lyrics, combining the modified and unmodified lyrics. Required. This parameter contains the complete lyrics text that will be used for the entire song after section replacement."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the replaced segment. Optional.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters."
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference. Optional. 'm' for male, 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Adherence strength to specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation level. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Relative weight of audio elements. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"style_persona",
"voice_persona"
],
"default": "style_persona",
"description": "Persona model. Optional. Use `style_persona` for Generate Persona IDs, or `voice_persona` for Suno Voice IDs. Default: `style_persona`. Available for V5 (Discontinued), V5_5 (Discontinued), V6, V6_MINI, and V6_WILD."
},
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"upload_url": {
"type": "string",
"format": "uri",
"description": "The URL of the custom audio uploaded by the user."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"prompt",
"tags",
"title",
"infill_start_s",
"infill_end_s",
"full_lyrics"
],
"additionalProperties": false,
"oneOf": [
{
"required": [
"task_id",
"audio_id"
],
"not": {
"anyOf": [
{
"required": [
"upload_url"
]
}
]
},
"type": "object"
},
{
"required": [
"upload_url"
],
"not": {
"anyOf": [
{
"required": [
"task_id"
]
},
{
"required": [
"audio_id"
]
}
]
},
"type": "object"
}
]
},
"SunoInput_music_generate_persona": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"name": {
"type": "string",
"description": "Name for the Persona. A descriptive name that captures the essence of the musical style or character."
},
"description": {
"type": "string",
"description": "Detailed description of the Persona's musical characteristics, style, and personality. Be specific about genre, mood, instrumentation, and vocal qualities."
},
"vocal_start": {
"type": "number",
"description": "Start time (in seconds) for Persona analysis segment extraction. Used to specify the time point in the audio from which to extract the segment for Persona analysis. Must be less than vocal_end, and vocal_end - vocalStart must be between 10–30 seconds. Defaults to 0.0.",
"default": 0,
"minimum": 0
},
"vocal_end": {
"type": "number",
"description": "End time (in seconds) for Persona analysis segment extraction. Together with vocal_start, used to specify the time range for analysis. vocalEnd - vocalStart must be between 10–30 seconds. Defaults to 30.0.",
"multipleOf": 0.01,
"default": 30,
"minimum": 0
},
"style": {
"type": "string",
"description": "Optional. Used to supplement the description of the music style tag corresponding to the Persona, such as \"Electronic Pop\", \"Jazz Trio\", etc."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id",
"audio_id",
"name",
"description"
],
"additionalProperties": false
},
"SunoInput_music_mashup": {
"type": "object",
"properties": {
"upload_url_list": {
"type": "array",
"description": "Array of audio file URLs to mashup. Provide 2 audio URLs. Upstream uses only the first 2. Each URL must be publicly accessible.",
"items": {
"type": "string",
"format": "uri"
},
"minItems": 2,
"maxItems": 2
},
"prompt": {
"type": "string",
"description": "A description of the desired audio content. Optional.\n- Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters.",
"maxLength": 5000
},
"style": {
"type": "string",
"description": "Music style specification for the generated audio. Required.\n- Character limits by model:\n - **V4** (Discontinued): Maximum 200 characters\n - **V4_5 & V4_5PLUS** (Discontinued): Maximum 1000 characters\n - **V4_5ALL** (Discontinued): Maximum 1000 characters\n - **V5 & V5_5** (Discontinued): Maximum 1000 characters\n - **V6, V6_MINI & V6_WILD**: Maximum 1000 characters\n- Common examples: Jazz, Classical, Electronic, Pop, Rock, Hip-hop, etc.",
"maxLength": 1000
},
"title": {
"type": "string",
"description": "Title for the generated music track. Required.\n- Character limits by model:\n - **V4** (Discontinued): Maximum 80 characters\n - **V4_5 & V4_5PLUS** (Discontinued): Maximum 100 characters\n - **V4_5ALL** (Discontinued): Maximum 80 characters\n - **V5 & V5_5** (Discontinued): Maximum 100 characters\n - **V6, V6_MINI & V6_WILD**: Maximum 100 characters\n- Will be displayed in player interfaces and filenames.",
"maxLength": 100
},
"vocal_gender": {
"type": "string",
"description": "Vocal gender preference for the singing voice. Optional. Use 'm' for male and 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions.",
"enum": [
"m",
"f"
]
},
"style_weight": {
"type": "number",
"description": "Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"weirdness_constraint": {
"type": "number",
"description": "Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"audio_weight": {
"type": "number",
"description": "Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places.",
"minimum": 0,
"maximum": 1,
"multipleOf": 0.01
},
"duration": {
"type": "integer",
"default": 20,
"minimum": 10,
"maximum": 360,
"description": "Audio duration in seconds. Optional. Range 10–360, default 20. Valid when `model` is ~~V5_5~~ (Discontinued), V6, V6_MINI, or V6_WILD."
},
"lyrics": {
"type": "string",
"maxLength": 5000,
"description": "Lyrics for the mashup. Optional.\n- Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided.\n- V6, V6_MINI, and V6_WILD: Maximum 5000 characters."
},
"variety": {
"type": "integer",
"default": 1,
"minimum": 0,
"maximum": 4,
"description": "Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1.\n\n- **`0`**: off (exact style) — fully off, strictly the same style\n- **`1`**: normal (balanced variety) — default, balances stability and diversity\n- **`2`**: high (distinct styles) — produces results with clearly different styles\n- **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles\n- **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly"
},
"persona_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"persona_model": {
"type": "string",
"enum": [
"style_persona",
"voice_persona"
],
"default": "style_persona",
"description": "Persona model. Optional. Use `style_persona` for Generate Persona IDs, or `voice_persona` for Suno Voice IDs. Default: `style_persona`. Available for V5 (Discontinued), V5_5 (Discontinued), V6, V6_MINI, and V6_WILD."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"upload_url_list",
"style",
"title"
],
"additionalProperties": false
},
"SunoInput_music_suno_recovery_audio": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id"
],
"additionalProperties": false
},
"SunoInput_music_convert_to_wav_format": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id",
"audio_id"
],
"additionalProperties": false
},
"SunoInput_music_create_music_video": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"author": {
"type": "string",
"maxLength": 50,
"description": "Artist or creator name to display as a signature on the video cover. Maximum 50 characters. This creates attribution for the music creator."
},
"domain_name": {
"type": "string",
"maxLength": 50,
"description": "Website or brand to display as a watermark at the bottom of the video. Maximum 50 characters. Useful for promotional branding or attribution."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id",
"audio_id"
],
"additionalProperties": false
},
"SunoInput_music_generate_lyrics": {
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "Description of the desired lyrics content. Be specific about theme, mood, style, or story elements you want in the lyrics. More detailed prompts yield better results. The maximum word limit is 200 characters."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"prompt"
],
"additionalProperties": false
},
"SunoInput_music_validation_phrase": {
"type": "object",
"properties": {
"voice_url": {
"description": "The original recording URL uploaded by the user [Required]",
"type": "string"
},
"vocal_start_s": {
"description": "Start time (in seconds) for extracting the vocal segment [Required]",
"type": "integer"
},
"vocal_end_s": {
"description": "End time (in seconds) for extracting the vocal segment, must be greater than vocal_start_s [Required]",
"type": "integer"
},
"language": {
"description": "Verify the language of the short phrase. Supported languages include: English (en), Chinese (zh), Spanish (es), French (fr), Portuguese (pt), German (de), Japanese (ja), Korean (ko), Hindi (hi), and Russian (ru).",
"type": "string"
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"voice_url",
"vocal_start_s",
"vocal_end_s"
],
"additionalProperties": false
},
"SunoInput_music_create_voice": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"verify_url": {
"description": "Audio URL for the user's recording of the server-returned `validateInfo` validation phrase. For best voice generation results, recording the phrase in a singing voice rather than plain speech is recommended. [Required]",
"type": "string"
},
"voice_name": {
"description": "Voice name",
"type": "string"
},
"description": {
"description": "Voice description",
"type": "string"
},
"style": {
"description": "Voice style",
"type": "string"
},
"singer_skill_level": {
"type": "string",
"description": "Singer skill level. Supported: beginner, intermediate, advanced, professional",
"default": "beginner",
"enum": [
"beginner",
"intermediate",
"advanced",
"professional"
]
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id",
"verify_url"
],
"additionalProperties": false
},
"SunoInput_music_regenerate_phrase": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id"
],
"additionalProperties": false
},
"SunoInput_music_check_voice": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id"
],
"additionalProperties": false
},
"SunoInput_music_separate_vocals": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"separate_vocal",
"split_stem",
"split_stem_advanced"
],
"default": "separate_vocal",
"description": "Separation type, options:\n\n- **separate_vocal**: Separate vocals and accompaniment, generating a vocal track and an instrumental track.\n- **split_stem**: Separate various instrument sounds, generating multiple instrument tracks.\n- **split_stem_advanced**: Advanced multi-track separation, supporting the specification of a particular instrument track to generate finer instrument tracks."
},
"stem_name": {
"type": "string",
"enum": [
"Lead Vocal",
"Drum Kit",
"Kick",
"Snare",
"Risers",
"Bass",
"Backing Vocals",
"Piano",
"Electric Guitar",
"Percussion",
"String Section",
"Synth",
"Acoustic Guitar",
"Sound Effects",
"Synth Pad",
"Synth Bass",
"Guitar",
"Brass Section",
"Organ",
"Electronic Drum Kit",
"Lead Electric Guitar",
"Synth Keys",
"Rhythm Electric Guitar",
"Electric Piano",
"Upright Bass",
"Keyboards",
"Distorted Electric Guitar",
"Synth Strings",
"Synth Lead",
"Woodwinds",
"Rhythm Acoustic Guitar",
"Flute",
"Harp",
"Tambourine",
"Trumpet",
"Arpeggiator",
"Accordion",
"Fiddle",
"Pedal Steel Guitar",
"Synth Voice",
"Violin",
"Digital Piano",
"Synth Brass",
"Mandolin",
"Choir",
"Banjo",
"Bells",
"Clarinet",
"Tenor Saxophone",
"Trombone",
"Shaker",
"French Horn",
"Glockenspiel",
"Electric Bass",
"Cello",
"Timpani",
"Harmonica",
"Marimba",
"Vibraphone",
"Lap Steel Guitar",
"Saxophone",
"Orchestra",
"Horns",
"Cymbals",
"Hand Clap",
"Oboe",
"Celesta",
"Congas",
"Drone",
"Alto Saxophone",
"Double Bass",
"Ukulele",
"Harpsichord",
"Baritone Saxophone",
"Xylophone",
"Tuba",
"Bass Guitar",
"Whistle",
"Lead Guitar",
"Rhodes",
"808",
"Bongos",
"Bassoon",
"Cowbell",
"Viola",
"Sitar",
"Steel Drums",
"Piccolo",
"Theremin",
"Bagpipes",
"Hi-Hat",
"Music Box",
"Melodica",
"Tabla",
"Koto",
"Djembe",
"Taiko",
"Didgeridoo"
],
"description": "Only used when `type` is `split_stem_advanced` to request a specific stem track/instrument name."
},
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"audio_url": {
"type": "string",
"format": "uri",
"description": "Custom audio URL uploaded by the user. The maximum file size is 20MB."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model"
],
"additionalProperties": false,
"oneOf": [
{
"required": [
"task_id",
"audio_id"
],
"not": {
"anyOf": [
{
"required": [
"audio_url"
]
}
]
},
"type": "object"
},
{
"required": [
"audio_url"
],
"not": {
"anyOf": [
{
"required": [
"task_id"
]
},
{
"required": [
"audio_id"
]
}
]
},
"type": "object"
}
],
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "split_stem_advanced"
}
},
"required": [
"type"
]
},
"then": {
"required": [
"stem_name"
]
},
"else": {
"not": {
"required": [
"stem_name"
]
}
}
}
]
},
"SunoInput_music_generate_midi_from_audio": {
"type": "object",
"properties": {
"task_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного исходного запроса."
},
"audio_id": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"description": "ID собственного файла трека."
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"task_id"
],
"additionalProperties": false
},
"SunoInput_music_sounds": {
"type": "object",
"properties": {
"prompt": {
"description": "Sound task type limit: 500 characters",
"type": "string"
},
"sound_loop": {
"type": "boolean",
"description": "Is it a cycle?",
"default": false
},
"sound_tempo": {
"type": "integer",
"description": "Do not broadcast.",
"default": null,
"minimum": 1,
"maximum": 300
},
"sound_key": {
"type": "string",
"default": "Any",
"enum": [
"Cm",
"C#m",
"Dm",
"D#m",
"Em",
"Fm",
"F#m",
"Gm",
"G#m",
"Am",
"A#m",
"Bm",
"C",
"C#",
"D",
"D#",
"E",
"F",
"F#",
"G",
"G#",
"A",
"A#",
"B"
]
},
"grab_lyrics": {
"type": "boolean",
"description": "Whether to capture the lyrics subtitles \n\nWill the interface be called after completion to obtain the lyrics subtitles?",
"default": false
},
"model": {
"type": "string",
"minLength": 1,
"description": "Публичный ID Suno из GET /models."
}
},
"required": [
"model",
"prompt"
],
"additionalProperties": false
}
}
},
"externalDocs": {
"url": "https://formula-ai.ru/docs"
}
}Примеры cURL используют Bash. Задайте AI_SERVICE_API_KEY и AI_SERVICE_MODEL; модель выберите из /models. В PHP для опроса/файла задайте AI_SERVICE_REQUEST_ID/AI_SERVICE_MEDIA_ID, для правки — AI_SERVICE_SOURCE_URL. Для локального сертификата используйте доверенный CA через --cacert, для PHP — AI_SERVICE_CA. Проверку TLS сохраняйте включённой.