API zapytań o utwory i historii
Ta strona obejmuje trzy darmowe punkty końcowe zapytań:
| Możliwość | Metoda | Punkt końcowy |
|---|---|---|
| Zapytanie o status i wynik utworu | POST | /api/music/query |
| Zapytanie o utwory utworzone przez bieżące konto | GET | /api/music/songs |
| Zapytanie o parametry zachowane przy generowaniu utworu | GET | /api/music/songs/:song_id |
Jeśli użyłeś na punkcie końcowym generowania trybu potwierdzenia odbioru (
accept_mode=async), w ręku masz numer potwierdzenia, a nie identyfikator utworu. Śledź postęp przezGET /api/music/requests/{request_id}i wróć do punktów końcowych z tej strony, gdy uzyskasz prawdziwysong_id. Zobacz „Tryb potwierdzenia odbioru” w API generowania w trybie prostym.
Uwierzytelnianie i zakres danych
Wszystkie trzy punkty końcowe uwierzytelniają się tym samym kluczem API:
Authorization: Bearer YOUR_API_KEY
Historia utworów jest izolowana według user_id, do którego należy klucz API. Kilka kluczy utworzonych w ramach tego samego konta głównego może czytać historię tego konta, ale nie historię innego użytkownika ani konta podstrony.
Punkty końcowe historii zwracają wyłącznie naprawdę wygenerowane utwory. Wykluczone są:
- rekordy zastępcze generowania zaczynające się od
pending:; - wgrywanie źródłowego audio i rekordy ulepszonego wgrywania;
- wyniki pośrednie, takie jak rozdzielenie wokalu i akompaniamentu oraz stem-y;
- utwory innych użytkowników lub kont podstron.
1. Zapytanie o status generowania
Sprawdza bieżący status i wynik końcowy jednego lub kilku identyfikatorów utworów.
Punkt końcowy: POST /api/music/query
Rozliczenie: Bezpłatnie.
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 |
|---|---|---|---|---|
| model | string | nie | suno-v6 |
Wersja modelu |
| song_ids | string | tak | - | Identyfikatory utworów, rozdzielone przecinkami |
Przykładowe żądanie
curl -X POST https://www.suno-api.io/api/music/query \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"song_ids": "clip_id_1,clip_id_2"
}'
Przykładowa odpowiedź
[
{
"song_id": "clip_id_1",
"song_title": "Tytuł utworu",
"status": "completed",
"audio_url": "https://example.com/audio.mp3",
"video_url": "https://example.com/video.mp4",
"cover_url": "https://example.com/cover.jpg",
"lyrics": "Treść tekstu",
"style_tags": "Mandopop, acoustic",
"duration": 180.5,
"model_version": "suno-v6",
"created_at": "2026-05-21T10:00:00Z"
}
]
Uwagi o zgodności
Starsza dokumentacja może pokazywać song_ids jako tablicę. Obecnie zalecany jest ciąg rozdzielony przecinkami, co odpowiada rzeczywistemu wywołaniu punktu końcowego.
song_ids musi zawierać prawdziwe identyfikatory utworów. Identyfikator zastępczy zaczynający się od pending: nie jest końcowym song_id i nie działa tutaj; odpytywanie wyłącznie identyfikatorów zastępczych może zwrócić pustą tablicę [].
model, model_version lub platformowe model_name w odpowiedzi mogą zachować wartości historyczne. Nowe zadania powinny używać suno-v6, suno-v6-wild lub suno-v6-mini; od suno-v2 do suno-v5-5 zostały wycofane, a obecność tych nazw w historii nie oznacza, że model nadal przyjmuje zgłoszenia.
Dopóki zadanie ma status pending, submitted lub processing, pola audio_url, video_url i cover_url mogą być puste — to normalne dla niedokończonego zadania. Nie wyciągaj wniosku o błędzie wyłącznie z pustego adresu; kieruj się status i zapytaj ponownie, gdy status będzie zakończony. Tylko jeśli status jest zakończony, a adresy nadal puste, warto zgłosić się do wsparcia z song_id.
⚠️ Adresy audio żyją 7 dni — przenieś pliki na czas
Zwracane tu
audio_url,video_url(oraz inne adresy multimediów, np. WAV) są serwowane z magazynu obiektów platformy i domyślnie wygasają po 7 dniach: pliki są odzyskiwane, a stary adres zwraca 404.
- W ciągu tych 7 dni przenieś pliki do własnego magazynu; nie traktuj adresu jako trwałego linku.
- Wygasły adres nie wymaga ponownego generowania utworu i nie jest ponownie rozliczany: wywołaj ten punkt końcowy (
POST /api/music/query) ponownie, aby otrzymać nowy, ważny adres tego utworu.
2. Zapytanie o historię utworów konta
Listuje utwory utworzone przez konto główne, do którego należy bieżący klucz API. Przydatne do własnej listy utworów, selektora lub strony historii.
Punkt końcowy: GET /api/music/songs
Rozliczenie: Bezpłatnie.
Parametry zapytania
| Parametr | Typ | Wymagany | Domyślnie | Uwagi |
|---|---|---|---|---|
| p | integer | nie | 1 |
Numer strony, od 1 |
| page_size | integer | nie | 20 |
Elementów na stronę, maksymalnie 100 |
| q | string | nie | - | Wyszukiwanie przybliżone po tytule albo dokładne po pełnym identyfikatorze utworu |
| status | string | nie | - | Dokładny filtr statusu, na przykład completed, playable |
Wyniki są sortowane malejąco według created_at i wewnętrznego identyfikatora rekordu, dzięki czemu kolejność stron jest stabilna.
Jak odnaleźć zgłoszenie, które przekroczyło limit czasu: punkty końcowe generowania nie dają odpowiedzi pośredniej przed przyjęciem. Jeśli klient przekroczył limit czasu lub połączenie się zerwało przy zgłaszaniu, zamówienie może być już przyjęte i generowane. Zajrzyj do tego punktu końcowego (najnowsze najpierw): przyjęte utwory pojawiają się normalnie na liście. Zgłoś ponownie tylko po potwierdzeniu, że utworu naprawdę nie ma — inaczej zapłacisz dwa razy. Zobacz „Czasy oczekiwania i ustawienia limitu czasu” w Przeglądzie nowego API.
Przykładowe żądanie
curl "https://www.suno-api.io/api/music/songs?p=1&page_size=20&status=completed" \
-H "Authorization: Bearer YOUR_API_KEY"
Przykładowa odpowiedź
{
"success": true,
"message": "",
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "8e31b3c0-example-song-id",
"title": "Miasto nocą",
"status": "completed",
"generation_type": "custom_generate",
"model": "suno-v6",
"duration": 187.42,
"audio_url": "https://example.com/audio.mp3",
"image_url": "https://example.com/cover.jpg",
"created_at": 1784000000,
"completed_at": 1784000120
}
]
}
}
Pola odpowiedzi
| Pole | Typ | Uwagi |
|---|---|---|
| song_id | string | Prawdziwy identyfikator utworu, użyteczny w zapytaniu o szczegóły |
| title | string | Bieżący tytuł, który użytkownik mógł zmienić |
| status | string | Bieżący status |
| generation_type | string | Typ generowania |
| model | string | Model generowania |
| duration | number | Czas trwania audio w sekundach |
| audio_url | string | Adres audio; może być pusty, dopóki zadanie się nie skończy |
| image_url | string | Adres okładki; może być pusty |
| created_at | integer | Czas utworzenia, znacznik czasu Unix w sekundach |
| completed_at | integer | Czas zakończenia, znacznik czasu Unix w sekundach; może nie występować, dopóki zadanie się nie skończy |
Punkt końcowy listy nie zwraca promptów, pól rozliczeniowych, informacji o koncie ani surowych odpowiedzi. Po prompty i parametry generowania sięgnij do punktu końcowego szczegółów utworu.
3. Zapytanie o parametry generowania
Sprawdza prompt, styl, model i utwór źródłowy zachowane przez platformę przy generowaniu danego utworu.
Punkt końcowy: GET /api/music/songs/:song_id
Rozliczenie: Bezpłatnie.
Można czytać tylko utwory konta głównego, do którego należy bieżący klucz API. Utwory innych użytkowników lub kont podstron są jednolicie traktowane jako „nie znaleziono utworu”.
Parametr ścieżki
| Parametr | Typ | Wymagany | Uwagi |
|---|---|---|---|
| song_id | string | tak | Prawdziwy identyfikator utworu |
Przykładowe żądanie
curl "https://www.suno-api.io/api/music/songs/8e31b3c0-example-song-id" \
-H "Authorization: Bearer YOUR_API_KEY"
Przykładowa odpowiedź
{
"success": true,
"message": "",
"data": {
"song_id": "8e31b3c0-example-song-id",
"title": "Miasto nocą",
"status": "completed",
"generation_type": "custom_generate",
"model": "suno-v6",
"duration": 187.42,
"audio_url": "https://example.com/audio.mp3",
"image_url": "https://example.com/cover.jpg",
"video_url": "",
"wav_url": "",
"created_at": 1784000000,
"completed_at": 1784000120,
"client_request_id": "example-request-id",
"client_request_index": 0,
"parameters": {
"prompt": "ulice miasta po deszczu, tekst o ponownym spotkaniu",
"style_tags": "Mandopop, acoustic, warm vocal",
"title": "Miasto nocą",
"model": "suno-v6",
"generation_type": "custom_generate",
"source_song_id": "",
"source_audio_url": "",
"custom_mode": null,
"instrumental": null,
"negative_tags": null,
"vocal_gender": null,
"lyrics_mode": null,
"wait_audio": null,
"style_weight": null,
"weirdness_constraint": null
},
"parameter_retention": {
"core_parameters_available": true,
"extended_parameters_available": false,
"sources": [
"suno_tasks"
],
"unavailable_fields": [
"custom_mode",
"instrumental",
"negative_tags",
"vocal_gender",
"lyrics_mode",
"wait_audio",
"style_weight",
"weirdness_constraint"
]
}
}
}
Pola parameters
| Pole | Typ | Uwagi |
|---|---|---|
| prompt | string | Prompt generowania lub tekst |
| style_tags | string | Tagi stylu |
| title | string | Zachowany tytuł generowania; zwykłe zadanie historyczne może zachować tylko bieżący tytuł |
| model | string | Model generowania |
| generation_type | string | Typ generowania |
| source_song_id | string | Identyfikator utworu źródłowego dla coverów, przedłużeń i podobnych zadań |
| source_audio_url | string | Adres źródłowego audio |
| custom_mode | boolean/null | Czy użyto trybu niestandardowego; null, gdy nie zachowano |
| instrumental | boolean/null | Czy utwór jest instrumentalny; istniejące dane historyczne zwykle nie zachowują tego osobno |
| negative_tags | string/null | Wykluczone style |
| vocal_gender | string/null | Ustawienie płci wokalu |
| lyrics_mode | string/null | Tryb tekstu; istniejące dane historyczne zwykle go nie zachowują |
| wait_audio | boolean/null | Czy czekano na pełne audio; istniejące dane historyczne zwykle tego nie zachowują |
| style_weight | number/null | Waga stylu |
| weirdness_constraint | number/null | Parametr kreatywności / dziwności |
Pole prompt_view (podgląd promptu, dodane 2026-09-28)
prompt_view to znormalizowana struktura przeznaczona do „podglądu promptu”: porządkuje dane w stałe
sekcje zależnie od typu generowania, więc klient nie musi już sam decydować, które pole pokazać. To pole
wyłącznie dodane — stare pola (parameters, parameter_retention) zachowują nazwę i
znaczenie, a klienci, którzy nie analizują nowego pola, nie są w ogóle dotknięci.
"prompt_view": {
"type": "custom_generate",
"type_label": "Tryb niestandardowy",
"generation": {
"model": "suno-v6", "max_mode": false, "duration": 182.4,
"title": "Czwarta nad ranem#701f37", "title_base": "Czwarta nad ranem", "title_suffix": "701f37",
"created_at": 1790421721
},
"inputs": {
"user_text": "...", "user_text_kind": "lyrics",
"user_style": "elektronika guochao, głęboki subbas, retro syntezator",
"style_tags": "elektronika guochao, głęboki subbas, retro syntezator",
"style_source": "user", "lyrics": "...",
"negative_tags": "", "is_instrumental": false
},
"extended": {
"vocal_gender": "m", "style_weight": 0.5, "audio_weight": 0.85,
"weirdness_constraint": 0.5, "variety": 2, "lyrics_mode": "manual",
"custom_mode": true
},
"reference": { "voice_name": "sv_40_34", "source_song_id": "", "source_title": "" },
"retention": {
"recorded_since": "2026-09-28", "missing_reason": "",
"not_applicable_fields": ["audio_weight"]
}
}
| Pole | Typ | Uwagi |
|---|---|---|
type / type_label |
string | Surowy typ generowania / etykieta widoczna (generowanie proste, tryb niestandardowy, tryb efektów dźwiękowych, generowanie ze sklonowanym głosem…) |
generation.model |
string | Użyty model |
generation.max_mode |
bool | Czy włączono Max Mode |
generation.duration |
number | Czas trwania audio w sekundach |
generation.title |
string | Tytuł dokładnie jak zachowany (może zawierać sufiks) |
generation.title_base |
string | Tytuł do wyświetlenia bez końcowego sufiksu #xxxxxx |
generation.title_suffix |
string | Sam sufiks (bez #); pusty, gdy go nie ma |
inputs.user_text |
string | Wpis użytkownika (opis lub tekst, zależnie od typu) |
inputs.user_text_kind |
string | lyrics / description / cover_requirements |
inputs.user_style |
string | Styl wpisany przez użytkownika (tryb niestandardowy, głos, efekty dźwiękowe) |
inputs.style_tags |
string | Styl, który faktycznie został zastosowany |
inputs.style_source |
string | user = wpisany przez użytkownika; suno_derived = wyprowadzony przez Suno z opisu |
inputs.lyrics |
string | Treść tekstu; pusta, gdy go nie ma, [Instrumental] dla utworów instrumentalnych |
inputs.negative_tags |
string | Wykluczone style |
inputs.is_instrumental |
bool | Czy utwór jest instrumentalny |
extended.* |
— | Parametry rozszerzone, patrz niżej; niezachowane pola nie występują |
reference.voice_name |
string | Nazwa głosu (tylko typy z głosem; wewnętrzne persona id nie jest zwracane) |
reference.source_song_id / source_title |
string | Utwór źródłowy dla coverów, przedłużeń i podobnych zadań |
retention.recorded_since |
string | Data, od której zachowywane są parametry rozszerzone (2026-09-28) |
retention.missing_reason |
string | Dlaczego brak parametrów rozszerzonych; w danych historycznych not_recorded_before_20260928 |
retention.not_applicable_fields |
string[] | Parametry, których ten typ generowania nigdy nie potrzebował (nie pokazuj ich jako „brakujące parametry”) |
Pola, które mogą pojawić się w extended: vocal_gender, style_weight, audio_weight,
weirdness_constraint, variety, lyrics_mode, custom_mode, oraz grupa efektów dźwiękowych
sound_type / sound_bpm / sound_key / sound_loop. Puste wartości nigdy nie są zwracane.
Trzy zasady prezentacji (stosuj je, zamiast zgadywać):
- Rozróżniaj pochodzenie stylu: przy
style_source=suno_derivedpokazuj „styl (wyprowadzony przez Suno z Twojego opisu)”, nigdy „Twój styl”; - Wewnętrzne prompty nigdy się nie pojawiają: typy coveru z głosem zwracają tylko wpisane przez użytkownika 【wymagania stylu】/【wymagania coveru】; stała konstrukcja, którą składamy dla modelu, nie występuje w żadnym polu (dane historyczne są oczyszczone tak samo);
- Nie zgaduj brakujących parametrów: jeśli czegoś nie ma w
extended, nie zostało wtedy zapisane — wyjaśnij to przezretention.
Uwagi o zachowywaniu parametrów
parameter_retention rozdziela „przekazano jawnie pustą wartość” od „pola nigdy historycznie nie zapisano”:
core_parameters_available: czy istnieje główny rekord zadania; przy poprawnym zapytaniu o szczegóły zwykletrue;extended_parameters_available: czy znaleziono powiązany rekord rozszerzonego zadania muzycznego;sources: z których tabel danych pochodzi ta odpowiedź;unavailable_fields: pola, których nie da się wiarygodnie odtworzyć z historii; zwracająnullwparameters.
Zwykłe utwory historyczne zwykle zachowały prompt, styl, bieżący tytuł, model, typ generowania i utwór źródłowy, ale nie zapisały osobno wszystkich parametrów zaawansowanych. Platforma nigdy nie zgaduje brakujących wartości z generation_type.
Niektóre rozszerzone zadania muzyczne zachowały także oryginalny prompt, styl, tytuł, model oraz dodatkowo custom_mode, negative_tags, vocal_gender, style_weight i weirdness_constraint. Nawet gdy rekord rozszerzony istnieje, instrumental, lyrics_mode i wait_audio mogą pozostać nieodtwarzalne.
Tytuły mogą być później zmieniane przez użytkownika. Gdy zwykłe zadanie historyczne nie zachowało osobnego oryginalnego tytułu, parameters.title może być bieżącym tytułem; gdy istnieje rekord zadania rozszerzonego, pierwszeństwo ma zapisany tam oryginalny tytuł generowania.
Nie znaleziono lub brak uprawnień
Błędy biznesowe używają jednolitej koperty odpowiedzi. Gdy utwór nie istnieje lub nie należy do bieżącego konta:
{
"success": false,
"message": "song not found"
}
Ten błąd biznesowy jest obecnie zwracany z HTTP 200, więc wynik oceniaj po polu success. Brakujący, nieprawidłowy, wygasły lub wyłączony klucz API zwraca HTTP 401.
Uwagi o bezpieczeństwie
Punkty końcowe historii i szczegółów nigdy nie zwracają:
- kluczy API ani identyfikatorów tokenów;
- pól limitu, rozliczeń i zwrotów;
- informacji o koncie ani surowych odpowiedzi;
- wewnętrznych kluczy magazynu obiektów;
- błędów administratora i błędów zasobów wewnętrznych.
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