【Rekommenderas】 röstprofil-API
✅ Den här kedjan rekommenderar vi för nya integrationer. Enligt många användares verkliga utvärderingar behåller låtar som skapats den här vägen originalrösten väl: sången i den färdiga mixen ligger närmare personen i det prov du laddade upp, så det är den väg vi för närvarande rekommenderar till kunder.
Jämförelse: den tidigare API för röstkloning och generering med angiven röst fungerar fortfarande, men navigeringen märker den som "rekommenderas inte" och den rekommenderas inte för nya integrationer.
- Dokumentdatum: 2026-09-26
- Omfattning: skapa din egen röst → använd den för att göra en cover på en vald låt / sjunga en ny låt → följ förloppet → ladda ner resultatet
- Alla ändpunkter, fält och svar har verifierats med riktiga anrop (det som står som "uppmätt" verifierades i detalj)
Not: detta dokument beskriver bara de ändpunkter du anropar. Mediehantering, uppgiftsplanering och innehållsvalidering gör servern automatiskt; klienten implementerar dem inte.
0. Kom igång på fem minuter
Fyra steg räcker för att göra två färdiga låtar av ett röstprov.
① Skapa rösten POST /api/music/voice-profile/create → hämta voice_id (status=ready)
② Gör en cover POST /api/music/voice-profile/cover → få 2 song_id direkt
③ Följ POST /api/music/query → polla tills status=completed
④ Ladda ner GET /api/music/download?song_id=…&kind=mp3
Minsta fungerande exempel (curl):
API_KEY="sk-din-nyckel"
BASE="https://www.suno-api.io"
# ① Skapa rösten (ladda upp ett röstprov; 10 s eller mer, under 10 MB rekommenderas)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=Min röst" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② Gör en cover på en låt med rösten (song_clip_id = clip-id för låten som ska coveras)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
-H "Authorization: Bearer $API_KEY" \
-H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"voice_id": "vp_2026…",
"song_clip_id": "5b773e9a-…",
"lyrics": "[Verse 1]\ntext…",
"style_requirements": "långsam folk, akustisk gitarr",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ Polla (flera id samtidigt, kommaseparerade)
curl -sS -X POST "$BASE/api/music/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"suno-v6","song_ids":"id1,id2"}'
# ④ Ladda ner mp3 när den är klar (filen kommer bara vid status=completed)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. Gemensamma konventioner
1.1 Domän och miljö
| Miljö | Base URL | Syfte |
|---|---|---|
| Produktion | https://www.suno-api.io |
Verklig kundtrafik |
Alla sökvägar nedan är relativa till Base URL; till exempel är hela adressen för POST /api/music/voice-profile/create
https://www.suno-api.io/api/music/voice-profile/create.
1.2 Autentisering
Alla ändpunkter använder samma begärandehuvud, vars värde är API-nyckeln du skapade i konsolen:
Authorization: Bearer sk-xxxxxxxx
- Prefixet
Bearerär valfritt; prefixetsk-är också valfritt (Authorization: sk-xxxfungerar lika bra). - Nyckel saknas eller är ogiltig → HTTP 401, med en body som
{"success":false,"message":"…"}(texten följer begärans språk). - Varje nyckel ser och ändrar bara låtarna och rösterna för sitt eget konto.
1.3 Format för begärans body
- Skapa en röst:
multipart/form-data(ladda upp en fil) rekommenderas;application/json(en URL eller base64) stöds också. - Alla andra ändpunkter:
application/json.
1.4 Två svarskuvert (kunden behöver bara känna till dessa två)
Ändpunkterna för "rösthantering" (create / create-from-clip / list / detail / delete) använder affärskuvertet:
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
"Cover med röst" går via genereringskanalen och använder genereringskuvertet: framgång är code/message/data, fel är ett error-objekt:
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
Så avgör du: titta först på HTTP-statuskoden, sedan på success === false och sist på code !== 200 eller om error finns.
Ett affärsfel garanterar inte en annan HTTP-status än 200 (ändpunkterna för rösthantering svarar fortfarande HTTP 200 vid fel), så du kan inte gå enbart på statuskoden.
1.5 Idempotens
Att skapa en röst (inklusive "skapa från befintligt ljud") är verkligen idempotent: under samma nyckel skapar en ny sändning av samma client_request_id bara en röst och det andra försöket returnerar direkt det första resultatet (success=true, samma voice_id). Tanken är att klienten själv skapar ett id (ett UUID till exempel) och återanvänder samma värde vid ett nytt försök efter timeout.
Att skicka in en cover dedupliserar inte på begärandenivå (det är en fakturerad generering), så observera två saker:
- Sändningsidentifieraren ligger i huvudet
X-Create-Ui-Client-Request-Id: <ditt sändnings-id>. Den skrivs in i serverns uppgiftspost och underlättar senare utredning; den förhindrar inte en dubbel debitering. - Timeout ≠ misslyckande: begäran kan redan ha accepterats och generera. Kontrollera före ett nytt försök med
GET /api/music/songs?p=1&page_size=20(pagineringens parametrar ärp/page_size; den kompatibla stavningenpsfungerar också) om en ny låt medgeneration_type=voice_profile_coverredan har dykt upp, och skicka bara om samma begäran om den inte har det.
Body för create och create-from-clip tar också emot fältet client_request_id (se §3 och §4).
1.6 Översikt över fakturering
| Åtgärd | Ändpunkt | Pris | Noter |
|---|---|---|---|
| Skapa en röst (standard) | POST /api/music/voice-profile/create |
Gratis | Att ladda upp ett prov förbrukar inga Suno-krediter |
| Skapa en röst (från befintligt ljud) | POST /api/music/voice-profile/create-from-clip |
Gratis | Servern registrerar bara en referens till materialet; inget laddas upp igen |
| Förstärkt klon | Samma, enhanced=true |
Till "priset för förstärkt uppladdning" (10 ¥ per anrop som standard) | Asynkron; återbetalas automatiskt vid fel |
| Cover med röst | POST /api/music/voice-profile/cover |
1,2 ¥ per anrop; 2,4 ¥ per anrop vid max_mode=true |
Ger 2 låtar per anrop |
| Fråga / lista / detalj / ta bort | — | Gratis | |
| Ladda ner (ta den direkta länken själv) | audio_url i svaret |
Gratis | Spelar upp den adress vi lämnar |
| Ladda ner (konvertera till wav / text med mera) | POST /api/music/free2 |
0,2 ¥ per lyckad låt | Se §8 |
Priser kan läsas när som helst från en publik ändpunkt, så hårdkoda dem inte (se §9):
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← baspris för cover med röst
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← pris för förstärkt klon
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
Cover använder förskottsdebitering + återbetalning vid fel:
- En avvisad begäran (fel parametrar, plattformens 4xx/5xx, otillräckligt saldo i sig) debiteras inte — vid sändning med en obefintlig röst ändrades saldot inte alls i våra mätningar (delta = 0);
- En accepterad uppgift som till slut misslyckas (inklusive ett tjänstefel hos plattformen) går via serverns återbetalningsväg och ger tillbaka det förskottsdebiterade beloppet.
1.7 Statusordlista
Röstens status:
| Värde | Betydelse | Användbar för cover |
|---|---|---|
ready |
Klar | ✅ |
processing |
Förekommer bara vid en förstärkt klon (enhanced=true); bearbetas |
❌ (vänta på ready) |
failed |
Skapandet misslyckades; se error_message; vid förstärkt klon har återbetalning redan skett |
❌ |
Låtens status (värdet som frågeändpunkterna returnerar):
| Värde | Betydelse | Nedladdningsbar |
|---|---|---|
submitted / queued / processing |
Genereras (en förhandslyssningsström kan redan finnas) | ❌ |
completed |
Klar | ✅ |
failed |
Misslyckades; debiteringen har återbetalats | ❌ |
2. Översikt över ändpunkter
| # | Metod | Sökväg | Syfte | Fakturering |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
Skapa en röst (uppladdning / URL / base64) | Gratis (utom enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
Skapa en röst från eget ljud | Gratis |
| 3 | GET | /api/music/voice-profile/list |
Röstlista | Gratis |
| 4 | GET | /api/music/voice-profile/{voice_id} |
Röstens detaljer (inklusive förloppet för förstärkt klon) | Gratis |
| 5 | POST | /api/music/voice-profile/delete |
Ta bort en röst | Gratis |
| 6 | POST | /api/music/voice-profile/cover |
Gör en cover med rösten / sjung en ny låt | 1,2 ¥ (MAX 2,4) |
| 7 | POST | /api/music/query |
Statusfråga för låtar i bulk | Gratis |
| 8 | GET | /api/music/songs/{song_id} |
Detaljer för en låt | Gratis |
| 9 | GET | /api/music/download |
Ladda ner den färdiga filen | Gratis (mp3/uppspelningslänk) |
| 10 | POST | /api/music/free2 |
Konvertera till wav / hämta text med mera | 0,2 ¥ per lyckad låt |
| 11 | POST | /api/music/free2/cached |
Hämta en redan arkiverad nedladdningsadress | Gratis |
| 12 | GET | /api/music/songs |
Mina verk, paginerat | Gratis |
3. Skapa en röst
POST /api/music/voice-profile/create
Registrera ett stycke vokalljud som en "röst" och få ett voice_id. För plattformen är en röst helt enkelt "ett ljud + dess clip i katalogen", så efter ett lyckat skapande bevaras källjudet permanent (för senare covers).
3.1 Tre indataformer (välj en)
Form A: uppladdning av multipartfil (rekommenderas)
Content-Type: multipart/form-data
file=<ljudets binärdata> # obligatoriskt
title=<röstens namn> # valfritt; tomt ger filnamnet utan filändelse
file_name=<ursprungligt filnamn>
source_file_name=<ursprungligt filnamn>
source_kind=upload|record # valfritt, ursprungsmarkering (uppladdning / inspelning); standard upload
enhanced=false|true # valfritt, true = förstärkt klon (se §3.5)
client_request_id=<idempotensnyckel> # valfritt
voice_id=<eget ID> # valfritt, används sällan
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3;type=audio/mpeg" \
-F "file_name=my-voice.mp3" \
-F "source_file_name=my-voice.mp3" \
-F "title=Min röst" \
-F "source_kind=upload"
Form B: JSON + en offentlig ljud-URL
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
"file_name": "my-voice.mp3",
"title": "Min röst"
}'
- URL:en måste vara en offentligt nåbar direktlänk över HTTPS; servern laddar ner den en gång och lägger den i vår objektlagring.
- Du kan också lägga adressen i fältet
audio_url, effekten är densamma (skickas båda vinnerfile_url). - Om adressen redan ligger i den här plattformens objektlagring (
*.myqcloud.com/create-ui/voice-source/...) laddas inget ner igen: den registreras direkt.
Form C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "Min röst"
}
- Både prefixet
data:audio/xxx;base64,och ren base64 accepteras. - Storleken är begränsad (base64 blåser upp med 1,33×), använd form A för stora filer.
3.2 Krav på ljudet
| Punkt | Krav | Noter |
|---|---|---|
| Storlek | ≤ 10 MB | Över gränsen klipper gatewayen av bodyn, vilket ser ut som "avvisad av Suno"; komprimera eller korta av först |
| Längd | Minst 6 s; 10–60 s rekommenderas | Under 6 s avvisar plattformen: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| Format | mp3 / wav / m4a / aac / flac / ogg | Avgörs av filändelsen |
| Innehåll | Ren sång; undvik färdiga covers eller original med komp | Ljud som liknar en befintlig inspelning i katalogen mycket avvisas: This audio matches an existing recording in our catalog. (uppmätt) |
3.3 Svar
{
"success": true,
"message": "",
"data": {
"voice_id": "vp_20260926080618509168500DXXrxe",
"clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
"account_id": "acc_1790085275308",
"title": "Min röst",
"source_file_name": "my-voice.mp3",
"audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
"image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
"duration_s": 29.18,
"enhanced": false,
"source_kind": "upload",
"status": "ready",
"client_request_id": "",
"created_at": 1790409978,
"updated_at": 1790409998
}
}
Fältbeskrivning (create / list / detail delar samma fältuppsättning):
| Fält | Typ | Noter |
|---|---|---|
voice_id |
string | Röst-ID:t; covers använder det sedan |
clip_id / song_id |
string | clip-id för det vokala ljudet på Sunos sida (båda är samma); för felsökning |
account_id |
string | Kontot som bär det (för felsökning; klienten behöver inte bry sig) |
title |
string | Röstens namn |
source_file_name |
string | Ursprungligt filnamn |
audio_url |
string | Långsiktig direktlänk till källjudet, användbar för förhandslyssning; bevaras permanent |
image_url |
string | Röstens omslag (det Suno skapar för vokalljud); finns inget omslag utelämnas nyckeln helt |
duration_s |
number | Röstprovets längd i sekunder |
enhanced |
bool | Om den skapades som förstärkt klon |
source_kind |
string | upload / record / clip (från befintligt ljud) |
status |
string | ready / processing / failed |
error_message |
string | Orsak till misslyckandet; finns bara vid failed |
task_id |
number | Underliggande uppgiftsnummer för den förstärkta klonen; bara vid enhanced=true |
pre_consumed_quota |
number | Förskottsdebiterad kvot (bara vid en förstärkt klon) |
created_at / updated_at |
number | Unix-sekunder |
created_at/updated_atär tidsstämplar i sekunder (10 siffror), inte millisekunder.
3.4 Vanliga fel
| HTTP | message | Orsak och åtgärd |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
Inget ljudinnehåll bifogades |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
Provet är för kort; använd ≥6 s (≥10 s rekommenderas) |
| 200 | This audio matches an existing recording in our catalog. |
Provet liknar en befintlig inspelning i katalogen mycket; använd ett annat rent torrt vokalljud |
| 200 | upload succeeded without clip or account identity |
Plattformens svar var avvikande; försök igen |
| 200 | audio file exceeds 30 MB limit |
Över serverns gräns (håll dig till 10 MB mot kund) |
| 401 | invalid token |
Fel API-nyckel |
3.5 Förstärkt klon (enhanced=true)
För fall där "röstprovet självt innehåller skyddad text / en förstärkt uppladdning behövs". Priset är det för förstärkt uppladdning (10 ¥ per anrop som standard, återbetalas automatiskt vid fel):
- Svaret är omedelbart
status=processing+task_id(ännu ingetclip_id) och körs asynkront; - Medan den körs följer du förloppet med
GET /api/music/voice-profile/{voice_id}, som returnerarprogress_percent/progress_stage/progress_message; - När den är klar blir
statusreadyochclip_id,audio_url,image_urlfylls i; - Vid fel blir
status=failedocherror_messagelyder ungefär "den förstärkta uppladdningen misslyckades; beloppet har återbetalats automatiskt, försök igen senare"; - En förstärkt klon tar klart längre tid än ett standard-skapande (minuter), så vänta inte med en synkron timeout.
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" -F "title=Min röst" -F "enhanced=true"
4. Skapa en röst från befintligt ljud
Om du inte vill ladda upp igen: kopiera ljud som du redan laddat upp eller redan genererat direkt till en röst. Gratis och idempotent.
POST /api/music/voice-profile/create-from-clip
Content-Type: application/json
{
"source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Xu Qing Qiang",
"client_request_id": "vp-clip-1789…"
}
source_song_id: clip-id för färdigt ljud i ditt konto (samma som låtenssong_id).- Att skicka samma clip igen skapar ingen ny post: den befintliga rösten returneras direkt med
reused: true(uppmätt).
Svaret är alla fält från §3.3 plus två skrivskyddade fält:
| Fält | Noter |
|---|---|
reused |
true = ljudet var redan din röst och återanvänds |
source_type |
Var ljudet kommer från: generate / custom_generate / voice_generate / upload_source / enhanced_upload |
{
"success": true,
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"title": "Xu Qing Qiang",
"status": "ready",
"enhanced": true,
"reused": true,
"source_type": "enhanced_upload"
}
}
Fel (message som det returneras; det rekommenderas att visa eller lokalisera det):
| message | Betydelse |
|---|---|
source audio not found |
Clippen finns inte eller är inte din |
source audio is invalid |
Ljudet genereras fortfarande / är en mellanprodukt och är ännu inte användbart |
source_song_id is required |
source_song_id skickades inte |
5. Röstlista / detalj / borttagning
5.1 Lista
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "Min röst", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
Fälten är exakt desamma som i §3.3. Borttagna röster returneras inte som standard.
5.2 Detalj
GET /api/music/voice-profile/{voice_id}
Returnerar ett enskilt röstobjekt (data är objektet självt, inte en array). Medan en förstärkt klon körs tillkommer:
| Fält | Noter |
|---|---|
progress_percent |
Heltal från 0 till 100 |
progress_stage |
Fasmärke, till exempel media_preparing |
progress_message |
Förloppstext att visa användaren |
5.3 Ta bort
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- Efter borttagning försvinner rösten ur listan och kan inte längre användas för nya covers: att skicka med det
voice_id:t ger 400 (se §6.4). - Låtar som redan skapats med den påverkas inte alls; uppspelning, nedladdning, förlängning, ersättning och separering fungerar som förut.
- Att ta bort en obefintlig röst, eller en som inte tillhör det här kontot, ger
{"success":false,"message":"voice not found"}.
6. Gör en cover med en röst (kärnändpunkten)
POST /api/music/voice-profile/cover
Content-Type: application/json
En sändning genererar 2 låtar (som vid vanlig generering).
6.1 Två scenarier
| Scenario | Utlösare | Noter |
|---|---|---|
| A. Covera en vald låt | song_clip_id skickades |
Sjunger den låten med din röst (melodi / rytm / avsnitt som originalet; sången blir din röst) |
| B. Sjung en ny låt med rösten | song_clip_id skickades inte |
Bara rösten + text (valfritt) + stilönskemål; modellen komponerar en ny melodi i den stilen och sjunger den |
resolved_scene i svaret ekar cover eller sing, så du kan bekräfta vilken väg som användes.
6.2 Begärans fält
| Fält | Typ | Obligatoriskt | Standard | Noter |
|---|---|---|---|---|
model |
string | Ja | — | Modellnamn för kund, se §6.5. Utan det blir svaret model is required (HTTP 500) |
voice_id |
string | En av två | — | Röst-ID (vp_…); måste vara status=ready |
voice_clip_id |
string | En av två | — | Röstens clip-id går också; skickas båda vinner voice_id |
song_clip_id |
string | Nej | tomt | Clip-id (song_id) för låten som ska coveras. Inte skickat = scenario B |
lyrics |
string | Nej | tomt | Fullständig text, skickas tecken för tecken utan omskrivning eller avkortning; ≤ 3000 tecken |
cover_requirements |
string | Nej | tomt | Coveranvisningar i naturligt språk, till exempel "tydligare artikulation". De läggs till en fast prompt |
style_requirements |
string | Nej | tomt | Stilönskemål, till exempel "långsam folk, akustisk gitarr" |
title |
string | Nej | tomt | Titeln på dessa två låtar i arbetsytan (påverkar song_title i senare frågor) |
negative_tags |
string | Nej | tomt | Stilar som ska uteslutas, till exempel elektroniskt, rap; ≤ 1000 tecken |
vocal_gender |
string | Nej | tomt | m / f (tar även male / female); tomt = spelar ingen roll |
duration |
number | Nej | tomt | Önskad längd i sekunder, ett heltal från 1 till 480; tomt = plattformen bestämmer. Plattformens praktiska minimum är cirka 30 s: mindre värden gav i mätningarna ändå låtar på omkring 30 sekunder |
audio_weight |
number | Nej | 0,85 | Audio Influence, ett decimaltal från 0 till 1. Högre ligger närmare röstprovet |
style_weight |
number | Nej | tomt | Stilpåverkan, ett decimaltal från 0 till 1 |
weirdness_constraint |
number | Nej | tomt | Kreativitet, ett decimaltal från 0 till 1 (använder gränssnittet procent delar du med 100) |
variety |
number | Nej | tomt | Variation, ett heltal från 0 till 4 (inte procent), stöds bara på v6-modeller |
max_mode |
boolean | Nej | false |
Max Mode, pris ×2 |
client_request_id |
string | Nej | tomt | Sändningsidentifierare, skrivs in i serverns uppgiftspost för felsökning (ingen deduplicering) |
Skicka gärna också huvudet X-Create-Ui-Client-Request-Id: <samma sändnings-id>: bara det skrivs in i serverns uppgiftspost och fungerar som nyckel för senare utredning (se §1.5).
Enheter att se upp med: audio_weight / style_weight / weirdness_constraint är decimaltal från 0 till 1, variety är ett heltal från 0 till 4 och duration är i sekunder. Att blanda dem leder till avvisande eller konstiga resultat.
Texten är valfri i scenario B (modellen klarar det själv), men skicka alltid lyrics när ett visst innehåll ska sjungas.
6.3 Svar
{
"code": 200,
"message": "success",
"data": {
"voice_id": "vp_20260926081712557959800Z5gvlt",
"voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
"song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
"resolved_scene": "cover",
"model": "suno-v6",
"audio_weight": 0.85,
"clips": [
{
"song_id": "0f2a…",
"status": "processing",
"song_title": "",
"model_version": "suno-v6",
"audio_url": "",
"play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
"lyrics": "",
"description": "[Uppgift] Det här är en cover. … (serverns fasta strukturdel + dina cover- / stilönskemål)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
Viktigast:
- Identifiera de färdiga låtarna med
clips[].song_id(den här ändpunkten returnerar ingetid-fält). - Du får 2
song_iddirekt, medanstatusfortfarande ärprocessing(betyder bara att de accepterats) ochaudio_urlär tom; du måste polla tillcompletedinnan du laddar ner.play_urlär plattformens förhandslyssningsström, kan redan dyka upp vid sändning och löper ut. descriptionär prompten servern slutligen skickar (den fasta strukturdelen + decover_requirements/style_requirementsdu fyllde i); den är mycket användbar när ett resultat ska utredas.source_updatesär serverns resultat av mediehanteringen och kan ignoreras av klienten.- Den
titledu skickar skrivs in i serverns uppgiftspost och visas somsong_titlei senare frågor; attclips[].song_titleär tomt i sändningssvaret är normalt.
6.4 Fel
{ "error": { "message": "den här rösten finns inte eller har tagits bort (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | Orsak |
|---|---|---|
| 500 | model is required |
Bodyn saknar model (ett obligatoriskt fält för kanalval) |
| 400 | voice_id is required and must be a ready voice |
voice_id skickades inte, eller ett platshållarvärde / en icke klar röst skickades |
| 400 | den här rösten finns inte eller har tagits bort (voice_id=vp_xxx)… |
Rösten har tagits bort, finns inte eller tillhör inte det aktuella kontot. Använd en annan tillgänglig röst eller skapa en ny |
| 400 | den här rösten har tagits bort (voice_id=vp_xxx)… |
När material skickas direkt via voice_clip_id har rösten för det materialet tagits bort; samma åtgärd som ovan |
| 400 | voice is not ready yet (status=processing) |
Rösten skapas fortfarande; vänta på ready och försök igen |
| 400 | song_clip_id must be a real completed clip |
song_clip_id är en platshållare / inte färdig |
| 400 | song_clip_id must differ from the voice clip |
Coverobjektet kan inte vara själva röstprovet |
| 400 | audio_weight must be a number between 0 and 1 |
Fel enhet på skjutreglaget (procent skickades) |
| 400 | duration must be an integer between 1 and 480 seconds |
Längden är inte ett heltal från 1 till 480 |
| 400 | vocal_gender must be one of m, f, male, female |
Ogiltigt könsvärde |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
Ogiltigt variationsvärde eller modellen stöds inte |
Otillräckligt saldo ger ett faktureringsfel redan vid sändning och lämnar aldrig en halvfärdig uppgift.
6.5 Tillgängliga modeller (kundnamn)
| Modellnamn | Noter |
|---|---|
suno-v6 |
Standard, rekommenderas |
suno-v6-wild |
Friare |
suno-v6-mini |
Lättviktig |
Använd modellnamnen för kund (de ovan). chirp-* är interna plattformsnamn och bör inte användas direkt.
7. Följ förloppet
7.1 Bulkgråga (rekommenderas)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_idsär en kommaseparerad sträng (inte en array).- Svaret är en naken array (direkt
[...], utansuccess/data-kuvert):
[
{
"song_id": "0f2a…",
"song_title": "Två tigrar",
"status": "completed",
"audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
"cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"duration": 115.15,
"model_version": "suno-v6",
"generation_type": "voice_profile_cover",
"play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
"lyrics": "[Verse 1]…",
"prompt": "[Verse 1]…",
"description": "[Uppgift] Det här är en cover. … (serverns slutliga prompt)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| Fält | Noter |
|---|---|
status |
Se §1.7; bara completed räknas som klart |
audio_url |
Direktlänk till mp3; fylls först från completed |
cover_url |
Adress till omslaget |
duration |
Verklig längd i sekunder |
generation_type |
Låtar från en cover med röst är alltid voice_profile_cover |
play_url |
Signerad förhandslyssningsadress (löper ut) |
song_title |
Uppgiftens titel (den title du skickade; utan den sätter servern ett standardvärde) |
lyrics / prompt |
Färdig text / ursprunglig text |
description |
Den slutliga prompt servern skickar (inklusive den fasta strukturdelen) |
style_tags |
Den slutliga stilbeskrivningen |
created_at |
En ISO 8601-sträng (observera: skiljer sig från detaljändpunktens Unix-sekunder) |
Råd för pollning: var 5–10 sekund, med total timeout 10–15 minuter (det långsammaste uppmätta kalla kontot tog cirka 4,5 minuter; mycket få tar längre). Bedöm inte att det är klart efter om audio_url är tomt — använd status.
Kompatibilitetsnot: den här ändpunkten identifierar låtar med
song_id; i några tidiga svar förekom ettid-fält, sårow.song_id || row.idär det säkra sättet att läsa det.
7.2 Detaljer för en låt
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "Två tigrar",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
"video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
"created_at": 1790411012,
"completed_at": 1790411500,
"parameters": {
"prompt": "[Verse 1]…",
"style_tags": "…",
"title": "Två tigrar",
"model": "suno-v6",
"generation_type": "voice_profile_cover",
"source_song_id": "5b773e9a-…"
},
"parameter_retention": {
"core_parameters_available": true,
"extended_parameters_available": false,
"sources": ["suno_tasks"],
"unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
}
}
}
- Här är
created_at/completed_atUnix-sekunder (till skillnad från bulkfrågans ISO-strängar, så klienter bör skilja dem åt). wav_url/video_urlär den här plattformens nedladdningsingångar (relativa till aktuell domän) och enGEThämtar filen; de är tomma strängar när plattformen inte har producerat det materialet.parameter_retentionsäger vilka sändningsparametrar låten kan spåras till:core_parameters_available=truebetyder att kärnparametrarna (text / stil / källa) går att fråga, och medextended_parameters_available=falsehar de utökade parametrarna ovan inte bevarats (covers med röst ligger för närvarande i den kategorin).
7.3 Mina verk
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=nyckelord
Pagineringens parametrar: p (sidnummer från 1) / page_size (poster per sida; ps är en kompatibel stavning). Valfria status och q (ett nyckelord i titeln). Standard är fallande skapandetid.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "Två tigrar",
"status": "completed",
"generation_type": "voice_profile_cover",
"model": "suno-v6",
"duration": 115.15,
"audio_url": "https://…/assets/0f2a…-mp3.mp3",
"image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
"created_at": 1790411012,
"completed_at": 1790411500
}
]
}
}
Med generation_type=voice_profile_cover skiljer du "låtar från en cover med röst" från andra genereringsresultat.
8. Ladda ner de färdiga låtarna
8.1 Ta mp3 direkt (rekommenderas, gratis)
Alla tre fungerar; välj en:
- Använd
audio_urlfrån frågeresultatet (en direktlänk till objektlagringen, enklast). GET /api/music/download?song_id=<id>&kind=mp3→ ger direkt ljudets byteflöde (filnamnet finns redan iContent-Disposition).POST /api/music/download-url(för en signerad tillfällig adress).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song.mp3
kind-värden: mp3 (samma som song) / playback (strömmande uppspelning) / wav / video / lyrics / timestamped_lyrics.
timestamped_lyrics (.lrc) finns för närvarande bara för vissa låtar; misslyckas det skapar du filen själv med API för tidsstämplad text.
Svaret är filens råa byteflöde, med Content-Type och Content-Disposition (filnamn) redan satta; wav_url / video_url från GET /api/music/songs/{song_id} är samma ingång med kind=wav|video.
8.2 Konvertera till wav / hämta text / metadata (avgiftsbelagt)
POST /api/music/free2
Content-Type: application/json
{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
"success": true,
"data": {
"songs": [
{ "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
],
"requested_songs": 1,
"succeeded_songs": 1,
"price": 0.2
}
}
filestar emot:mp3/wav/lyrics/metadata, upp till 10 låtar åt gången.- Debiteras per lyckad låt (0,2 ¥ styck); en låt som misslyckas helt debiteras inte, och ett format som misslyckas syns bara i
songs[].errors. - För att hämta filer du redan tagit tidigare: använd först den gratis
POST /api/music/free2/cached(sammasong_ids+files) för arkiverade adresser; desssongs[].missing_fileslistar de format som inte är cachade och måste förberedas igen.
9. Fråga om priser
GET /api/pricing/catalog
En publik ändpunkt utan autentisering. Alla styckepriser kunden behöver visa finns i data.catalog.meta (strängar):
| Nyckel | Betydelse | Aktuellt värde |
|---|---|---|
generation_price |
Vanlig generering | 0,6 |
voice_generation_price |
Baspris för cover med röst | 1,2 |
max_mode_factor |
Max Mode-multiplikator | 2 |
enhanced_upload_price |
Förstärkt klon / förstärkt uppladdning | 10 |
voice_auto_verify_price |
Automatisk röstverifiering | 5 |
voice_long_term_clone_price |
Långsiktig röstkloning | 5 |
Priserna justeras i backoffice, så läs dem live i stället för att hårdkoda dem i klienten. Den faktiska debiteringen för en cover = voice_generation_price × (vid sant max_mode dessutom max_mode_factor).
10. Gränser och varningar
- Uppladdningsstorlek: ≤ 10 MB (servern tar emot mer, men ingångsgatewayen klipper av för stora bodies vid 10 MiB, vilket ser ut som "avvisad av Suno"; blockera det först på din sida).
- Provets längd: minst 6 s, 10–60 s rekommenderas; för kort och plattformen avvisar.
- Provets innehåll: ren sång; undvik allt som liknar en befintlig inspelning (katalogjämförelsen avvisar det).
- Textgränser:
lyrics≤ 3000 tecken; förstyle_requirements/negative_tags/titlerekommenderas 1000 / 1000 / 100 tecken (stil- och coverönskemål läggs till prompten, håll summan under 3000 tecken). - Texten skrivs inte om: det du skickar är det som sjungs (tecken för tecken), utan lokal avkortning.
- Varje låt ger 2 spår; utgå inte från ett enda resultat.
- Källjudet bevaras permanent: att ta bort en röst rensar inte dess källjud; det håller senare covers möjliga och efterlevnaden spårbar.
- Rösten måste vara redo: en röst i
processingkan inte användas för covers. - Begärans timeout: på ett kallt konto tog den första sändningen upp till cirka 4,5 minuter i mätningarna, så sätt klientens timeout till ≥ 6 minuter. Covers dedupliserar inte på begärandenivå, så kontrollera efter en timeout om en ny låt redan dykt upp (§1.5) innan du bestämmer dig för att skicka igen.
- Ägarskap av rösten: röster tillhör den som skapade dem; en cover tar bara emot reda och icke borttagna röster. En röst som inte finns, tagits bort eller tillhör ett annat konto ger 400:
den här rösten finns inte eller har tagits bort (voice_id=…).
11. Vanliga frågor (FAQ)
F1. Kostar det att skapa en röst? Standard-skapande och "skapa från befintligt ljud" är gratis; bara covers (1,2 ¥ / MAX 2,4 ¥) och förstärkta kloner (10 ¥ som standard) debiteras.
F2. Kan jag använda en färdig låt med komp som röstprov?
Rekommenderas inte. Allt med musik, eller med stark likhet med en befintlig inspelning i katalogen, avvisas av plattformen (This audio matches an existing recording in our catalog.). Använd en rent vokal, torr inspelning.
F3. Varför är audio_url tomt efter att jag skickat in en cover?
Sändningen betyder bara att den accepterats och status är fortfarande processing. En spelbar/nedladdningsbar adress kommer först när du pollat /api/music/query till status=completed.
F4. Måste jag skicka text i scenario B (utan song_clip_id)?
Valfritt. Skicka lyrics för att sjunga ett visst innehåll; utan det klarar modellen det själv, men med mindre kontroll.
F5. Kan ljud som kunden laddat upp användas direkt som röst?
Ja: via file_url-formen av create, eller genom att först ladda upp det som en låt och sedan anropa create-from-clip.
F6. Återbetalas pengarna vid misslyckande?
En begäran som avvisas direkt (fel parametrar / plattformsfel) debiteras inte, enligt mätningarna; en accepterad uppgift som till slut misslyckas ger tillbaka det förskottsdebiterade beloppet. Vid slutligt misslyckande rapporterar uppgiften status=failed plus error_message.
F7. Kan jag fortfarande lyssna på låtar som skapats med en röst efter att jag tagit bort den? Ja. Borttagningen påverkar bara om rösten kan användas för nya covers.
F8. Hur lång låt kan jag covera åt gången?
duration tar emot 1–480 sekunder; utelämnar du det bestämmer plattformen utifrån originalet / materialet. Observera: plattformens färdiga spår är minst cirka 30 sekunder; med ett mindre värde gav mätningarna ändå 29,96 / 29,76 sekunder.
Bilaga A: komplett exempel (Node.js, med pollning och nedladdning)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① Skapa rösten (multipart)
async function createVoice(filePath, title) {
const fd = new FormData();
fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
fd.set("file_name", "my-voice.mp3");
fd.set("source_file_name", "my-voice.mp3");
fd.set("title", title);
fd.set("client_request_id", `vp-create-${Date.now()}`);
const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
const body = await res.json();
if (!body.success) throw new Error(body.message);
return body.data; // { voice_id, status, audio_url, ... }
}
// ② Gör en cover
async function cover(voiceId, songClipId, lyrics) {
const submissionId = `vp-cover-${Date.now()}`;
const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
body: JSON.stringify({
model: "suno-v6",
voice_id: voiceId,
song_clip_id: songClipId || "",
lyrics: lyrics || "",
style_requirements: "långsam folk, akustisk gitarr",
audio_weight: 0.85,
max_mode: false,
client_request_id: submissionId,
}),
});
const body = await res.json();
if (body.error) throw new Error(body.error.message);
return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}
// ③ Polla till klart (var 5:e sekund, högst 15 minuter)
async function waitUntilCompleted(songIds) {
const deadline = Date.now() + 15 * 60 * 1000;
while (Date.now() < deadline) {
const res = await fetch(`${BASE}/api/music/query`, {
method: "POST",
headers: { ...H, "Content-Type": "application/json" },
body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
});
const songs = await res.json(); // naken array
if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
await new Promise((r) => setTimeout(r, 5000));
}
throw new Error("timeout waiting for cover");
}
// ④ Ladda ner
async function download(songId, outPath) {
const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
if (!res.ok) throw new Error(`download failed: ${res.status}`);
(await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}
const voice = await createVoice("./my-voice.mp3", "Min röst");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\ntext…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}
Bilaga B: ändringslogg
| Datum | Ändring |
|---|---|
| 2026-10-15 | Borttagningssemantiken uttryckligen beskriven (§5.3); en cover med ett "borttaget / obehörigt" voice_id ger nu 400 före all förskottsdebitering, med feltabell och FAQ uppdaterade (tillsammans med den röstborttagningsspärr som släpptes samma dag) |
| 2026-10-13 | Notisen "varför vi rekommenderar den här kedjan" tillagd i början: enligt många användares verkliga utvärderingar behåller låtar från den här kedjan originalrösten klart bättre |
| 2026-09-26 | Första versionen: skapa en röst (tre indataformer) / skapa från befintligt ljud / lista, detalj, borttagning / cover med röst (scenario A och B) / förloppsfråga / nedladdning / prisavläsning, med uppmätta bevis |
Skaffa en API-nyckel
Skapa en API-nyckel i konsolen efter registreringen. Varje generering kostar 0,6 ¥ och returnerar 2 spår, nedladdningar är obegränsade och inget telefonnummer krävs.
Hämta API-nyckel Tillbaka till översikten