Гайды
Реализован POST /music/generations для текущих версий Suno: suno/v6, suno/v6-mini и suno/v6-wild. Выбирайте доступную модель с операцией music из GET /models; непроверенные сочетания остаются черновиками.
Тело содержит model, custom_mode и instrumental. В custom_mode=true укажите title и хотя бы style, lyrics или negative_tags. title — до 80 символов, style — до 1000, lyrics — до 5000. Переносы строк в lyrics сохраняются.
В custom_mode=false обязательна хотя бы одна ссылка на изображение/видео/аудио либо style или lyrics. Всего допускается до 10 вложений; до пяти изображений и одного видео. Параметры duration, vocal_gender, style_weight, weirdness_constraint, audio_weight и variety предназначены для пользовательского режима.
duration — запрошенная длительность от 10 до 360 секунд. Реальные проверки показали, что фактическая длительность может отличаться; проверяйте duration_seconds каждого трека. Не считайте запрошенную длительность доказательством фактического использования.
Создание возвращает собственный ID и HTTP 202. Опрашивайте GET /requests/{id}; completed содержит result.data с собственными id и защищёнными url, названием, текстом песни и фактической длительностью. Файлы хранятся сутки. Денежный результат находится в billing; количество токенов баланса внешнего поставщика не подменяет рублёвую стоимость клиента.
Suno поддерживает генерацию и продолжение, кавер и продолжение загруженного аудио, добавление вокала и инструментов, mashup, замену участка, звуковые эффекты и циклы, тексты песен и временные метки, улучшение стиля, Persona, Voice, разделение stems, MIDI, WAV, обложку, клип и восстановление аудиоссылок. Схемы всех 23 методов, включая обязательные поля, перечисления и значения по умолчанию, находятся в /docs/api/music и /openapi.json.
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 · GET /requests/REQUEST_ID
curl "https://formula-ai.ru/api/v1/requests/REQUEST_ID" \
-H "Authorization: Bearer $AI_SERVICE_API_KEY"
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 · GET /requests/
<?php
$key = getenv("AI_SERVICE_API_KEY");
$url = "https://formula-ai.ru/api/v1/requests/";
$url .= rawurlencode(getenv("AI_SERVICE_REQUEST_ID"));
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $key],
]);
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);
Примеры 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 сохраняйте включённой.