API generowania w trybie prostym
Opis punktu końcowego
Generowanie w trybie prostym zamienia opis w jednym zdaniu w gotowy utwór. Usługa sama pisze tekst, melodię, aranżację i wokal na podstawie Twojego opisu.
Punkt końcowy: POST /api/music/create
Rozliczenie: Płatne, obecnie domyślnie 0,6 ¥ za wywołanie. Jedno wywołanie zwykle daje 2 utwory; faktycznie pobierana kwota zależy od bieżącej konfiguracji cen w panelu administracyjnym.
Max Mode / Variety: ten punkt końcowy obsługuje opcjonalne parametry max_mode i variety (0-4). Przy włączonym
max_mode to wywołanie jest rozliczane po podwójnej cenie (0,6 ¥ → 1,2 ¥ za wywołanie); variety nie kosztuje
nic dodatkowo. Znaczenie i sposób wysyłania opisano w sekcji „Parametry zaawansowane”
Przeglądu nowego API.
Zalecany model: suno-v6
Czasy oczekiwania i limity czasu (ważne): to punkt końcowy synchroniczny — zamówienie zostaje przyjęte i przekazane do generowania dopiero, gdy przyjdzie odpowiedź. Z pomiarów: większość żądań odpowiada w 1-3 sekundy, około 10% przekracza 30 sekund, a najdłuższe trwa około 230 sekund. Ustaw limit czasu klienta na 300 sekund lub więcej; brak odpowiedzi nie oznacza, że nic nie zostało wygenerowane, a ponawianie od razu po limicie czasu duplikuje zamówienie i pobiera opłatę ponownie. Jeśli połączenie się zerwało, sprawdź później przez
GET /api/music/songs. Zobacz „Czasy oczekiwania i ustawienia limitu czasu” w Przeglądzie nowego API.
Parametry żądania
Headers
| Parametr | Typ | Wymagany | Uwagi |
|---|---|---|---|
| Authorization | string | tak | Bearer YOUR_API_KEY |
| Content-Type | string | tak | application/json |
Parametry treści
| Parametr | Typ | Wymagany | Domyślnie | Uwagi |
|---|---|---|---|---|
| description | string | tak | - | Opis utworu w dowolnym języku; maksymalnie 3000 znaków (więcej zwraca 400 i nie jest rozliczane) |
| model | string | nie | suno-v6 | Nazwa modelu dla klienta: suno-v6, suno-v6-wild lub suno-v6-mini |
| instrumental | boolean | nie | false | Czy utwór jest wyłącznie instrumentalny |
| wait_completion | boolean | nie | false | Czy czekać na zakończenie generowania przed odpowiedzią |
| references | array | nie | - | Lista materiału referencyjnego: utwory referencyjne / stare głosy / obrazy referencyjne; maksymalnie 5 utworów, 1 głos i 1 obraz. Zobacz „Materiał referencyjny references (opcjonalnie)” poniżej |
Przykłady żądania
curl -X POST https://www.suno-api.io/api/music/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"description": "żywiołowa mandaryńska piosenka pop o lecie nad morzem",
"instrumental": false,
"wait_completion": false
}'
Materiał referencyjny references (opcjonalnie)
references to tablica, która doczepia do tego generowania „materiał referencyjny”. Jest całkowicie opcjonalna (pominięcie działa dokładnie jak wcześniej) i można doczepić jeden rodzaj lub dowolną kombinację.
Typy elementów
| type | Pole wymagane | Pola opcjonalne | Maksimum | Uwagi |
|---|---|---|---|---|
song |
song_id |
style_prompt, lyrics, duration_s |
5 | Utwór referencyjny; song_id pochodzi z API zapytań o utwory i historii, a utwór musi być już zakończony |
voice |
voice_id |
- | 1 | Stary głos; voice_id pochodzi z API klonowania głosu i generowania z głosem |
image |
base64 |
- | 1 | Obraz referencyjny; wyślij zawartość base64 w formie data:image/jpeg;base64,... |
Zasady
- Kolejność utworów referencyjnych to ich kolejność znaczeniowa: podaj je w zamierzonej kolejności (na przykład „melodia z pierwszego, wokal z drugiego”).
style_prompt/lyrics/duration_smożna pominąć; platforma uzupełni je z informacji o utworze, a to, co wyślesz, ma pierwszeństwo.- W utworach czysto instrumentalnych
lyricsmoże być""lub"[Instrumental]". - Obrazy referencyjne obsługują
jpeg/png/webp, do 10 MB każdy, przesyłane razem z treścią jako base64. - Przy kilku utworach referencyjnych użyj dodatkowo
accept_mode=async(patrz „Tryb potwierdzenia odbioru” powyżej): usługa musi najpierw przygotować materiał, więc synchroniczne oczekiwanie może być długie.
Przykład: dwa utwory referencyjne
curl -X POST https://www.suno-api.io/api/music/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"description": "połącz te pomysły w jeden utwór",
"references": [
{ "type": "song", "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
{ "type": "song", "song_id": "a90438d2-35fc-4443-88f4-56531e6e5d24" }
]
}'
Przykład: utwór referencyjny + stary głos
{
"model": "suno-v6",
"description": "zaśpiewaj te pomysły tym głosem",
"references": [
{ "type": "song", "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
{ "type": "voice", "voice_id": "5813cbe1-36f1-414a-a9a8-4d399dfeb292" }
]
}
Przykład: utwór referencyjny + obraz referencyjny
{
"model": "suno-v6",
"description": "oddaj nastrój tego obrazu",
"references": [
{ "type": "song", "song_id": "43eb711d-81f8-4e72-a68e-b2498bac88f9" },
{ "type": "image", "base64": "data:image/jpeg;base64,/9j/4AAQ..." }
]
}
Błędy parametrów
Te przypadki zwracają HTTP 400, blokowane przed jakimkolwiek rozliczeniem, więc nic nie kosztują:
| Przypadek | Komunikat błędu |
|---|---|
| Więcej niż 5 utworów referencyjnych | references supports at most 5 song references |
| Więcej niż 1 głos | references supports at most 1 voice reference |
| Więcej niż 1 obraz referencyjny | references supports at most 1 image reference |
Nieprawidłowy type |
references[0].type must be one of song, voice, image |
Utwór bez song_id |
references[0].song_id is required |
| Utwór jeszcze nieukończony | references[0].song_id must be a real completed clip |
| Ten sam utwór dwa razy | references[0].song_id is duplicated |
Liczba w
references[0]to indeks tego elementu w tablicy, więc błędny element łatwo znaleźć.
Odpowiedź
Tablica utworów, zwykle z 2 zadaniami lub utworami.
[
{
"song_id": "clip_id",
"song_title": "Letnia bryza morska",
"status": "pending",
"description": "żywiołowa mandaryńska piosenka pop o lecie nad morzem",
"audio_url": "",
"cover_url": "",
"video_url": "",
"model_version": "suno-v6",
"generation_type": "generate",
"created_at": "2026-05-21T10:00:00Z"
}
]
Tryb potwierdzenia odbioru (opcjonalny, zalecany klientom, które nie powinny trzymać długich połączeń)
Domyślnie ten punkt końcowy jest synchroniczny: przyjście odpowiedzi oznacza, że zamówienie zostało przyjęte, a mierzone czasy oczekiwania mogą sięgać około 230 sekund. Jeśli klient nie powinien trzymać długiego połączenia, włącz tryb potwierdzenia odbioru — wystarczy jedno z dwóch:
- dodaj
"accept_mode": "async"do treści żądania - dodaj nagłówek
X-Accept-Mode: async
Po włączeniu punkt końcowy natychmiast zwraca HTTP 202, co oznacza tylko „przyjęte i w kolejce do generowania”, a generowanie trwa w tle:
{
"success": true,
"data": {
"request_id": "ac_20260920092714315816800d76fv3nq",
"status": "queued",
"accepted_at": 1789896434,
"pre_consumed_quota": 300000,
"tasks": [
{ "index": 0, "status": "queued" },
{ "index": 1, "status": "queued" }
]
}
}
Na etapie przyjęcia nie zwraca się
song_id. Prawdziwy identyfikator utworu jeszcze nie istnieje, a anirequest_id, anitasks[].indexnie są identyfikatorem utworu — nie zapisuj ich jakosong_id. Prawdziwysong_idpojawia się w poniższym zapytaniu o postęp.
Zapytanie o postęp przyjęcia
Punkt końcowy: GET /api/music/requests/{request_id} (bezpłatnie, uwierzytelnianie tym samym kluczem API)
curl "https://www.suno-api.io/api/music/requests/ac_20260920092714315816800d76fv3nq" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"success": true,
"data": {
"request_id": "ac_20260920092714315816800d76fv3nq",
"status": "processing",
"tasks": [
{ "index": 0, "status": "processing", "song_id": "f3fa09f5-3d55-4953-826c-0d23f043ec57" },
{ "index": 1, "status": "processing", "song_id": "5fcafe3e-3fae-4d64-8f66-c01bc027b0c3" }
]
}
}
Co oznacza każda wartość status:
| status | Znaczenie |
|---|---|
queued |
Przyjęte, jeszcze niepowiązane z konkretnymi utworami (tasks może być pustą tablicą) |
processing |
Przekazane do generowania |
partial |
Jeden z dwóch jest już gotowy |
completed |
Oba gotowe, tasks[].song_id jest do odczytu |
failed |
Przekazanie nie powiodło się, kwota została w pełni zwrócona, a error_message podaje przyczynę |
Każde zadanie ma też własne tasks[].status, o tych samych wartościach co w API zapytań o utwory:
pending (przekazane, generowane), processing, completed, failed. Elementy zadań mogą też zawierać title,
duration oraz już zarejestrowany audio_url; brak oznacza po prostu, że jeszcze nie wygenerowano.
Gdy masz prawdziwy song_id, kontynuuj przez API zapytań o utwory lub punkty końcowe pobierania.
Przykład w Pythonie
import time
import requests
BASE = "https://www.suno-api.io"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
accepted = requests.post(
f"{BASE}/api/music/create",
headers={**HEADERS, "Idempotency-Key": "your-own-unique-key"},
json={"description": "żywiołowa piosenka pop", "model": "suno-v6", "accept_mode": "async"},
timeout=300,
).json()["data"]
request_id = accepted["request_id"]
while True:
time.sleep(5)
progress = requests.get(
f"{BASE}/api/music/requests/{request_id}", headers=HEADERS, timeout=60
).json()["data"]
if progress["status"] in ("completed", "failed"):
print(progress)
break
Zgodność i uwagi
- Bez
accept_modezachowanie jest dokładnie takie jak wcześniej: synchroniczne oczekiwanie, odpowiedź200i tablica utworów. Istniejące integracje nie muszą nic zmieniać. - Ten przełącznik działa obecnie tylko na
POST /api/music/createiPOST /api/music/create/custom; pozostałe punkty końcowe generowania jeszcze go nie obsługują. - Wyślij także
Idempotency-Key(własny unikalny ciąg, ≤128 znaków): ten sam klucz zostanie przyjęty tylko raz, powtórzenie zwraca to samo potwierdzenie i nie ma podwójnego obciążenia. W trybie asynchronicznym ma to szczególne znaczenie. - Przy
accept_mode=asyncparametrwait_completionjest ignorowany (potwierdzenie wraca natychmiast, bez czekania na utwory). - Kwota nadal jest pobierana z góry przy przyjęciu zamówienia; nieudane generowanie jest automatycznie w pełni zwracane.
- Limit pola tekstowego:
descriptionmieści maksymalnie 3000 znaków (liczone w znakach Unicode, jeden znak han liczy się jako 1). Dłuższy tekst od razu zwraca HTTP400, nie trafia do generowania i nie jest rozliczany, a komunikat błędu podaje zmierzoną długość, na przykładdescription must not exceed 3000 characters; received 4120. Ten punkt końcowy nie ma pól tekstu/stylu; dla nich zobacz „Limit pola tekstowego” w API generowania w trybie niestandardowym. Ogólne zasady są w „Limity pól tekstowych” Przeglądu nowego API. - Bez
referenceszachowanie, cena i odpowiedź są dokładnie takie jak wcześniej: istniejące integracje nie muszą nic zmieniać. - Gdy dołączony jest materiał referencyjny (zwłaszcza kilka utworów), preferuj tryb potwierdzenia
accept_mode=asynczamiast długiego synchronicznego oczekiwania; czas przygotowania materiału zależy od jego ilości i źródła.
Następne kroki
Jeśli utwory nie są gotowe w chwili odpowiedzi, pobierz wynik końcowy przez API zapytań o utwory.
Przykład integracji w Node/Electron
Jeśli wbudowujesz standardowe generowanie w proces główny Electrona, serwer Node.js lub klienta desktopowego, zalecany przebieg jest taki:
- Wywołaj
POST /api/music/create, aby utworzyć zadanie generowania. - Odczytaj
song_idlubidz odpowiedzi. - Co 2 sekundy wywołuj
POST /api/music/query, aby sprawdzić status. - Uznaj generowanie za zakończone, gdy tylko w wyniku pojawi się
audio_url.
Nie używaj już starych ścieżek POST /api/generate ani GET /api/clip?id=...; nie należą do obecnie zalecanej publicznej powierzchni integracji.
const http = require('http');
const https = require('https');
const BASE_URL = 'https://www.suno-api.io';
const MODEL = 'suno-v6';
const POLL_INTERVAL_MS = 2000;
const MAX_POLL_ATTEMPTS = 60;
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function requestJson(urlString, apiKey, body) {
const url = new URL(urlString);
const transport = url.protocol === 'https:' ? https : http;
const payload = JSON.stringify(body);
return new Promise((resolve, reject) => {
const req = transport.request(
{
method: 'POST',
hostname: url.hostname,
port: url.port || undefined,
path: `${url.pathname}${url.search}`,
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(payload),
},
},
(res) => {
let raw = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
raw += chunk;
});
res.on('end', () => {
const data = raw ? JSON.parse(raw) : {};
if (!res.statusCode || res.statusCode < 200 || res.statusCode >= 300) {
reject(new Error(`Suno API request failed: HTTP ${res.statusCode} ${raw}`));
return;
}
resolve(data);
});
}
);
req.on('error', reject);
req.write(payload);
req.end();
});
}
function getPayload(response) {
return response && response.data !== undefined ? response.data : response;
}
function toSongList(payload) {
if (Array.isArray(payload)) return payload;
if (Array.isArray(payload?.songs)) return payload.songs;
if (Array.isArray(payload?.clips)) return payload.clips;
return payload ? [payload] : [];
}
function collectSongIds(createResponse) {
return toSongList(getPayload(createResponse))
.map((song) => song.song_id || song.id)
.filter(Boolean);
}
async function generateSunoSong({ apiKey, description, instrumental = false }) {
const createResponse = await requestJson(`${BASE_URL}/api/music/create`, apiKey, {
description,
model: MODEL,
instrumental,
wait_completion: false,
});
const songIds = collectSongIds(createResponse);
if (songIds.length === 0) {
throw new Error(`Suno API did not return song ids: ${JSON.stringify(createResponse)}`);
}
for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt += 1) {
await sleep(POLL_INTERVAL_MS);
const queryResponse = await requestJson(`${BASE_URL}/api/music/query`, apiKey, {
song_ids: songIds,
model: MODEL,
});
const songs = toSongList(getPayload(queryResponse));
const completed = songs.find((song) => song.audio_url);
if (completed) {
return {
audioUrl: completed.audio_url,
title: completed.song_title || completed.title || 'Suno Song',
duration: completed.duration,
};
}
const allFailed = songs.length > 0 && songs.every((song) =>
['failed', 'error', 'rejected'].includes(String(song.status || '').toLowerCase())
);
if (allFailed) {
throw new Error(`Suno generation failed: ${JSON.stringify(songs)}`);
}
}
throw new Error('Suno generation timed out after 120 seconds. Please query again later.');
}
// Usage:
// generateSunoSong({
// apiKey: process.env.SUNO_API_KEY,
// description: 'A bright pop song about the ocean in summer',
// }).then(console.log).catch(console.error);
W rzeczywistych projektach trzymaj klucz API w zmiennej środowiskowej serwera, w ustawieniach klienta desktopowego lub w bezpiecznym magazynie — nigdy w kodzie front-endowym i nigdy w repozytorium.
Uzyskaj klucz API
Po rejestracji utwórz klucz API w konsoli. Każde generowanie kosztuje 0,6 ¥ i zwraca 2 utwory, pobierania są nieograniczone, a numer telefonu nie jest wymagany.
Pobierz klucz API Powrót do przeglądu