Przejdź do treści głównej

Suno v6 Mini API, lżejszy generator piosenek: jedno zdanie albo własny tekst na wejściu, dwie gotowe piosenki MP3 z wokalem na wyjściu, za tę samą stałą cenę co v6.

Od $0.072/żądanie

Obszar roboczy

Wyślij żądanie

Szybki start

Przykłady korzystają z publicznych definicji parametrów wybranego endpointu. Podmień klucz API i przykładowe media, a potem wyślij żądanie ze swojego serwera.

SDK i integracje
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Uwierzytelnianie API

Klucz API trzymaj w zmiennej środowiskowej serwera SPICY_API_KEY. Dla żądań JSON używaj uwierzytelniania Bearer i Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "suno/v6-mini/text-to-audio",
  "input": {
    "prompt": "Calm ambient pads with a slow rising motif"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Wygenerowane ze schematu wejścia tego modelu – tego samego, względem którego API waliduje każde żądanie.

Parametry wejściowe

Te pola umieść w obiekcie input w ciele żądania. Nazwy i typy odpowiadają API. Gdy wartości domyślnej nie podano, nie zakładaj żadnej.

promptstringWymagane

Opis stylu. Przy własnym tekście lub włączonym instrumental to wyłącznie styl: gatunek, tempo, instrumenty, głos, nastrój, do 1000 znaków. Bez tekstu i przy włączonym generate_lyrics to pomysł na utwór, a model pisze na jego podstawie słowa, do 3000 znaków. Style opisuj słowami; prompty z nazwiskami prawdziwych artystów są odrzucane. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:3000
reference_audio_urlsarray<string>Opcjonalne

Jeden plik audio referencyjny (od 6 sekund do 30 minut, do 500 MB), który inspiruje utwór. Tylko przy wygenerowanym tekście: bez tekstu, instrumental wyłączone, generate_lyrics włączone. Używaj dźwięku, do którego masz prawa. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
maxItems:1
reference_video_urlsarray<string>Opcjonalne

Jedno wideo referencyjne (MP4, MOV lub WebM, do 100 MB i 241 sekund), wokół którego powstaje utwór, na przykład aby opatrzyć je muzyką. Tylko przy wygenerowanym tekście: bez tekstu, instrumental wyłączone, generate_lyrics włączone. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
maxItems:1
image_urlsarray<string>Opcjonalne

Do 5 obrazów nastroju (JPEG, PNG, WebP lub BMP, każdy do 10 MB), na których model opiera klimat utworu. Tylko przy wygenerowanym tekście: bez tekstu, instrumental wyłączone, generate_lyrics włączone. W pozostałych trybach zwraca czytelny błąd. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
maxItems:5
persona_modelstringOpcjonalne

Mówi modelowi, czym jest persona_id: style_persona (przenosi jej styl muzyczny) albo voice_persona (przenosi jej głos). Wysyłaj razem z persona_id. Działa tylko przy własnym tekście lub włączonym instrumental. Nie zmienia ceny.

Domyślnie
Nie określono
Dozwolone wartości
"style_persona""voice_persona"
persona_idstringOpcjonalne

Identyfikator zapisanej persony lub głosu Suno, które zaśpiewają albo zagrają utwór. Opcjonalne. Działa tylko przy własnym tekście lub włączonym instrumental. Używaj razem z persona_model. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:200
varietyintegerOpcjonalne

Jak bardzo model modyfikuje Twój prompt stylu, jako liczba całkowita od 0 (wyłączone: Twoje znaczniki stylu są używane dokładnie tak, jak je zapisałeś) do 4 (maksimum). Domyślnie 1. To opis tego ustawienia podany przez samo Suno; nie testowaliśmy go. Działa tylko przy własnym tekście lub włączonym instrumental. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:4
audio_weightnumberOpcjonalne

Jak mocno dźwięk wejściowy wpływa na wynik, od 0 do 1 w krokach co 0,01. Suno nie obsługuje tego w utworach bez wokalu. Działa tylko przy własnym tekście lub włączonym instrumental. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:1
weirdnessnumberOpcjonalne

Jak daleko utwór może odejść od tego, czego się spodziewasz, od 0 (konwencjonalnie) do 1 (odważnie), w krokach co 0,01. Działa tylko przy własnym tekście lub włączonym instrumental. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:1
style_weightnumberOpcjonalne

Jak ściśle utwór trzyma się opisu stylu, od 0 do 1 w krokach co 0,01. Działa tylko przy własnym tekście lub włączonym instrumental; w innych przypadkach zwraca czytelny błąd. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:1
vocal_genderstringOpcjonalne

Przechyla głos prowadzący w stronę żeńskiego lub męskiego. To preferencja, a nie gwarancja, i nie testowaliśmy, jak często jest spełniana. Działa tylko przy własnym tekście lub włączonym instrumental; wysłanie go przy wygenerowanym tekście zwraca czytelny błąd. Nie zmienia ceny.

Domyślnie
Nie określono
Dozwolone wartości
"female""male"
negative_promptstringOpcjonalne

Style, dźwięki lub nastroje, które mają zostać poza utworem, jako krótka lista oddzielona przecinkami, na przykład „harsh distortion, spoken word”. Opcjonalne. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:500
titlestringOpcjonalne

Tytuł utworu, do 80 znaków. Działa przy własnym tekście lub przy włączonym instrumental; przy wygenerowanym tekście tytuł wybiera model. Opcjonalne. Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:80
instrumentalbooleanOpcjonalne

Włącz, aby uzyskać utwór bez wokalu. Wtedy prompt opisuje styl (do 1000 znaków), a lyrics nie jest potrzebne. Domyślnie wyłączone. Nie zmienia ceny.

Domyślnie
false
generate_lyricsbooleanOpcjonalne

Domyślnie włączone: gdy lyrics jest puste, a instrumental wyłączone, model pisze tekst na podstawie prompt. Tekst, który podasz, nigdy nie jest przepisywany. Wyłącz tylko wtedy, gdy wysyłasz tekst albo włączasz instrumental. Nie zmienia ceny.

Domyślnie
true
lyricsstringOpcjonalne

Słowa do zaśpiewania, do 5000 znaków, jedna linijka w wierszu. Znaczniki sekcji, takie jak [Verse], [Chorus], [Bridge] i [Outro], w osobnych wierszach kształtują strukturę i nie są śpiewane. W naszych testach każda linijka została zaśpiewana w zapisanej kolejności, a refren nie powtarzał się, jeśli sam go nie powtórzyłeś. Zostaw puste, aby tekst został napisany (zob. generate_lyrics). Nie zmienia ceny.

Domyślnie
Nie określono
Ograniczenia
minLength:1
maxLength:5000

Śledź zadanie

HTTP 202 oznacza, że zadanie zostało przyjęte, a nie ukończone. Zapisz zwrócone taskId i odpytuj właśnie to zadanie. Nie twórz kolejnego zadania, czekając na jego wynik.

Odpowiedź o przyjęciu
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Odpowiedź o przyjęciu zawiera szacunek, dzięki czemu twoja aplikacja pokaże tę samą kwotę w historii zadań i w rozliczeniach.

Odczytaj zadanie
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Zacznij odpytywać mniej więcej co 2 sekundy i stopniowo wydłużaj odstęp. Zatrzymaj się na stanie końcowym. Po zerwaniu połączenia odpytaj pierwotne taskId. Tworzenie ponawiaj wyłącznie z pierwotnym kluczem idempotentności i pierwotnym ciałem żądania.

Albo odbierz wynik przez callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Podaj callBackUrl przy tworzeniu zadania, a gotowy rekord przyjdzie do ciebie metodą POST – bez żadnej pętli odpytywania. Każda dostawa niesie X-Webhook-Timestamp, X-Webhook-Signature i X-Webhook-Payload-Version. Podpis to HMAC-SHA256 w base64 z taskId.timestamp.sha256(body), więc trzeba go sprawdzać na surowych bajtach: sparsowanie JSON-a i ponowne zserializowanie zmienia je i weryfikacja się nie powiedzie. Nieudane dostawy są ponawiane, więc to samo taskId może przyjść dwa razy – zrób obsługę idempotentną. Najpierw odpowiedz kodem 2xx, a pracę wykonaj potem; wolna obsługa jest traktowana jak nieudana dostawa.

Odczytaj wynik

Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.

Przykład odpowiedzi po zakończeniu
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "suno/v6-mini/text-to-audio",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp3",
          "mime": "audio/mpeg",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp3?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Każdy dostępny materiał otwieraj lub pobieraj bezpośrednio spod assets[].url, bez nagłówka Authorization. Podpisany adres wygasa o expiresAt; odpytaj zadanie ponownie, żeby go odświeżyć, dopóki materiał mieści się w okresie przechowywania. Materiał oczekujący lub niedostępny nie ma adresu. Podpisane adresy traktuj jako prywatne.

SDK i integracje

Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.

Użyj w ComfyUI

Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Suno v6 Mini · Text to Music. Węzeł ma te same opcje co ta strona i pokazuje cenę, zanim ruszy.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi