【Recomandat】 API-ul de profil vocal
✅ Recomandăm acest lanț pentru integrări noi. Conform evaluărilor reale ale multor utilizatori, piesele generate prin acest lanț păstrează foarte bine vocea originală: vocalul din mixajul final seamănă mai mult cu persoana din mostra pe care ai încărcat-o, așa că este calea pe care o recomandăm momentan clienților.
Comparație: API-ul de clonare vocală și generare cu voce indicată de dinainte funcționează în continuare, dar meniul îl marchează „nerecomandat" și nu mai este recomandat pentru integrări noi.
- Data documentului: 2026-09-26
- Acoperire: creează-ți propria voce → folosește-o pentru a face un cover la o piesă aleasă / a cânta o piesă nouă → urmărește progresul → descarcă rezultatul
- Toate endpointurile, câmpurile și răspunsurile au fost verificate cu apeluri reale (ce e marcat „măsurat" a fost verificat în detaliu)
Notă: acest document descrie doar endpointurile pe care le apelezi. Procesarea materialelor, planificarea sarcinilor și validarea conținutului sunt făcute automat de server; clientul nu le implementează.
0. Pornire în cinci minute
Patru pași sunt de ajuns ca dintr-o mostră vocală să obții două piese gata.
① Creează vocea POST /api/music/voice-profile/create → obții voice_id (status=ready)
② Fă cover POST /api/music/voice-profile/cover → obții imediat 2 song_id
③ Urmărește POST /api/music/query → interoghează până status=completed
④ Descarcă GET /api/music/download?song_id=…&kind=mp3
Exemplu minim funcțional (curl):
API_KEY="sk-cheia-ta"
BASE="https://www.suno-api.io"
# ① Creează vocea (încarcă o mostră vocală; se recomandă 10 s sau mai mult, sub 10 MB)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=Vocea mea" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② Fă un cover la o piesă cu această voce (song_clip_id = clip id-ul piesei de coverat)
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]\ntextul piesei…",
"style_requirements": "folk lent, chitară acustică",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ Interoghează (mai multe id-uri deodată, separate prin virgule)
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"}'
# ④ Descarcă mp3 după finalizare (fișierul vine doar la status=completed)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. Convenții comune
1.1 Domeniu și mediu
| Mediu | Base URL | Scop |
|---|---|---|
| Producție | https://www.suno-api.io |
Trafic real de clienți |
Toate căile de mai jos sunt relative la Base URL; de exemplu adresa completă a POST /api/music/voice-profile/create este
https://www.suno-api.io/api/music/voice-profile/create.
1.2 Autentificare
Toate endpointurile folosesc același antet de cerere, a cărui valoare este cheia API creată în consolă:
Authorization: Bearer sk-xxxxxxxx
- Prefixul
Bearereste opțional; prefixulsk-la fel (Authorization: sk-xxxfuncționează la fel). - Cheie lipsă sau nevalidă → HTTP 401, cu un corp de forma
{"success":false,"message":"…"}(textul depinde de limba cererii). - Fiecare cheie vede și poate modifica doar piesele și vocile propriului cont.
1.3 Formatele corpului cererii
- Crearea unei voci: se recomandă
multipart/form-data(încărcarea unui fișier);application/json(un URL sau base64) este și el acceptat. - Restul endpointurilor:
application/json.
1.4 Două învelișuri de răspuns (clientul trebuie să cunoască doar acestea)
Endpointurile de „administrare a vocilor" (create / create-from-clip / list / detail / delete) folosesc învelișul de business:
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
„Coverul cu voce" trece prin canalul de generare și folosește învelișul de generare: succesul este code/message/data, eșecul este un obiect error:
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
Cum decizi: uită-te mai întâi la codul de stare HTTP, apoi la success === false, apoi la code !== 200 sau la prezența lui error.
Un eșec de business nu garantează un HTTP diferit de 200 (endpointurile de administrare a vocilor răspund tot HTTP 200 la eroare), așa că nu te poți baza doar pe codul de stare.
1.5 Idempotență
Crearea unei voci (inclusiv „creează din audio existent") este cu adevărat idempotentă: sub aceeași cheie, retrimiterea aceluiași client_request_id creează o singură voce, iar a doua încercare întoarce direct primul rezultat (success=true, același voice_id). Ideea este ca clientul să genereze singur un id (un UUID, de exemplu) și să folosească aceeași valoare la reîncercarea după un timeout.
Trimiterea unui cover nu deduplică la nivel de cerere (este o generare taxată), așa că reține două lucruri:
- Identificatorul de trimitere stă în antetul
X-Create-Ui-Client-Request-Id: <id-ul tău de trimitere>. Este scris în înregistrarea de sarcină de pe server pentru a ușura investigația ulterioară; nu împiedică o taxare dublă. - Timeout ≠ eșec: cererea poate fi deja acceptată și în generare. Înainte de reîncercare, verifică prin
GET /api/music/songs?p=1&page_size=20(parametrii de paginare suntp/page_size; scrierea compatibilăpsfuncționează și ea) dacă a apărut deja o piesă nouă cugeneration_type=voice_profile_coverși retrimite aceeași cerere doar dacă nu a apărut.
Corpurile pentru create și create-from-clip acceptă și un câmp client_request_id (vezi §3 și §4).
1.6 Privire generală asupra facturării
| Acțiune | Endpoint | Preț | Note |
|---|---|---|---|
| Creează o voce (standard) | POST /api/music/voice-profile/create |
Gratuit | Încărcarea unei mostre nu consumă credit Suno |
| Creează o voce (din audio existent) | POST /api/music/voice-profile/create-from-clip |
Gratuit | Serverul doar înregistrează o referință la material; nu se reîncarcă nimic |
| Clonare întărită | Același, enhanced=true |
La „prețul de încărcare întărită" (implicit 10 ¥ per apel) | Asincron; la eșec se returnează automat |
| Cover cu voce | POST /api/music/voice-profile/cover |
1,2 ¥ per apel; 2,4 ¥ per apel la max_mode=true |
Un apel întoarce 2 piese |
| Interogare / listă / detalii / ștergere | — | Gratuit | |
| Descărcare (iei singur linkul direct) | audio_url din răspuns |
Gratuit | Redă adresa emisă |
| Descărcare (convertire în wav / versuri etc.) | POST /api/music/free2 |
0,2 ¥ per piesă reușită | Vezi §8 |
Prețurile pot fi citite oricând dintr-un endpoint public, așa că nu le fixa în cod (vezi §9):
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← prețul de bază al unui cover cu voce
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← prețul clonării întărite
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
Coverul folosește debitare în avans + returnare la eșec:
- O cerere respinsă (parametri greșiți, un 4xx/5xx al platformei, sold insuficient în sine) nu se taxează — la trimiterea cu o voce inexistentă soldul nu s-a schimbat deloc în măsurătorile noastre (delta = 0);
- O sarcină acceptată care eșuează în final (inclusiv o eroare de serviciu a platformei) trece prin calea de returnare a serverului și dă înapoi suma debitată în avans.
1.7 Dicționar de stări
status-ul vocii:
| Valoare | Semnificație | Utilizabilă pentru cover |
|---|---|---|
ready |
Gata | ✅ |
processing |
Apare doar la o clonare întărită (enhanced=true); în procesare |
❌ (așteaptă ready) |
failed |
Crearea a eșuat; vezi error_message; la clonarea întărită suma a fost deja returnată |
❌ |
status-ul piesei (valoarea returnată de endpointurile de interogare):
| Valoare | Semnificație | Se poate descărca |
|---|---|---|
submitted / queued / processing |
Se generează (un flux de previzualizare poate exista deja) | ❌ |
completed |
Gata | ✅ |
failed |
A eșuat; taxa a fost returnată | ❌ |
2. Privire generală asupra endpointurilor
| # | Metodă | Cale | Rol | Facturare |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
Creează o voce (încărcare / URL / base64) | Gratuit (cu excepția enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
Creează o voce din audio propriu | Gratuit |
| 3 | GET | /api/music/voice-profile/list |
Lista vocilor | Gratuit |
| 4 | GET | /api/music/voice-profile/{voice_id} |
Detaliile vocii (inclusiv progresul clonării întărite) | Gratuit |
| 5 | POST | /api/music/voice-profile/delete |
Șterge o voce | Gratuit |
| 6 | POST | /api/music/voice-profile/cover |
Fă cover cu vocea / cântă o piesă nouă | 1,2 ¥ (MAX 2,4) |
| 7 | POST | /api/music/query |
Interogare în bloc a stării pieselor | Gratuit |
| 8 | GET | /api/music/songs/{song_id} |
Detaliile unei piese | Gratuit |
| 9 | GET | /api/music/download |
Descarcă fișierul final | Gratuit (mp3/link de redare) |
| 10 | POST | /api/music/free2 |
Convertire în wav / versuri etc. | 0,2 ¥ per piesă reușită |
| 11 | POST | /api/music/free2/cached |
Ia o adresă de descărcare deja arhivată | Gratuit |
| 12 | GET | /api/music/songs |
Piesele mele, paginat | Gratuit |
3. Creează o voce
POST /api/music/voice-profile/create
Înregistrează un fragment de audio vocal ca „voce" și obține un voice_id. Pentru platformă, o voce este pur și simplu „un audio + clipul lui din catalog", așa că după o creare reușită acel audio sursă este păstrat permanent (pentru coverurile viitoare).
3.1 Trei forme de intrare (alege una)
Forma A: încărcare de fișier multipart (recomandată)
Content-Type: multipart/form-data
file=<date binare audio> # obligatoriu
title=<numele vocii> # opțional; dacă e gol, numele fișierului fără extensie
file_name=<numele original al fișierului>
source_file_name=<numele original al fișierului>
source_kind=upload|record # opțional, marcă de origine (încărcare / înregistrare); implicit upload
enhanced=false|true # opțional, true = clonare întărită (vezi §3.5)
client_request_id=<cheie de idempotență> # opțional
voice_id=<ID propriu> # opțional, rar folosit
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=Vocea mea" \
-F "source_kind=upload"
Forma B: JSON + un URL audio public
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": "Vocea mea"
}'
- URL-ul trebuie să fie un link direct HTTPS accesibil public; serverul îl descarcă o dată și îl mută în stocarea noastră de obiecte.
- Poți pune adresa și în câmpul
audio_url, efectul este echivalent (dacă trimiți ambele, câștigăfile_url). - Dacă adresa este deja în stocarea de obiecte a acestei platforme (
*.myqcloud.com/create-ui/voice-source/...), nu se descarcă din nou: se înregistrează direct.
Forma C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "Vocea mea"
}
- Se acceptă atât prefixul
data:audio/xxx;base64,, cât și base64 pur. - Dimensiunea este limitată (base64 umflă cu 1,33×), așa că folosește forma A pentru fișiere mari.
3.2 Cerințe pentru audio
| Element | Cerință | Note |
|---|---|---|
| Dimensiune | ≤ 10 MB | Peste limită gateway-ul trunchiază corpul, ceea ce arată ca „respins de Suno"; comprimă sau scurtează mai întâi |
| Durată | Minimum 6 s; se recomandă 10–60 s | Sub 6 s platforma respinge: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| Format | mp3 / wav / m4a / aac / flac / ogg | Se decide după extensia fișierului |
| Conținut | Vocal curat; evită coverurile finite sau originalele cu acompaniament | Audio foarte asemănător cu o înregistrare existentă din catalog este respins: This audio matches an existing recording in our catalog. (măsurat) |
3.3 Răspuns
{
"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": "Vocea mea",
"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
}
}
Descrierea câmpurilor (create / list / detail împart același set):
| Câmp | Tip | Note |
|---|---|---|
voice_id |
string | ID-ul vocii; coverurile îl folosesc apoi |
clip_id / song_id |
string | clip id-ul acelui audio vocal pe partea Suno (cele două sunt identice); pentru diagnostic |
account_id |
string | Contul care îl susține (pentru diagnostic; clientul nu trebuie să-i pese) |
title |
string | Numele vocii |
source_file_name |
string | Numele original al fișierului |
audio_url |
string | Link direct pe termen lung către audio-ul sursă, utilizabil pentru previzualizare; păstrat permanent |
image_url |
string | Coperta vocii (cea pe care Suno o generează pentru audio vocal); când nu există copertă cheia nu apare deloc |
duration_s |
number | Durata mostrei vocale în secunde |
enhanced |
bool | Dacă a fost creată prin clonare întărită |
source_kind |
string | upload / record / clip (din audio existent) |
status |
string | ready / processing / failed |
error_message |
string | Motivul eșecului; apare doar la failed |
task_id |
number | Numărul sarcinii de bază a clonării întărite; doar la enhanced=true |
pre_consumed_quota |
number | Cota debitată în avans (doar la o clonare întărită) |
created_at / updated_at |
number | Secunde Unix |
created_at/updated_atsunt marcaje de timp în secunde (10 cifre), nu în milisecunde.
3.4 Erori frecvente
| HTTP | message | Cauză și tratament |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
Nu s-a atașat conținut audio |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
Mostra este prea scurtă; folosește ≥6 s (≥10 s recomandat) |
| 200 | This audio matches an existing recording in our catalog. |
Mostra seamănă foarte mult cu o înregistrare existentă din catalog; folosește alt vocal curat, sec |
| 200 | upload succeeded without clip or account identity |
Răspuns anormal al platformei; reîncearcă |
| 200 | audio file exceeds 30 MB limit |
Peste limita serverului (pentru client rămâi la 10 MB) |
| 401 | invalid token |
Cheie API greșită |
3.5 Clonare întărită (enhanced=true)
Pentru cazurile în care „mostra vocală în sine conține versuri protejate / este nevoie de o încărcare întărită". Prețul este cel de încărcare întărită (implicit 10 ¥ per apel, returnat automat la eșec):
- Răspunsul este imediat
status=processing+task_id(încă fărăclip_id) și rulează asincron; - În timpul procesării urmărești progresul cu
GET /api/music/voice-profile/{voice_id}, care returneazăprogress_percent/progress_stage/progress_message; - La final
statusdevineready, iarclip_id,audio_url,image_urlse completează; - La eșec
status=failed, iarerror_messagesună ca „încărcarea întărită a eșuat; suma a fost returnată automat, încearcă mai târziu"; - O clonare întărită durează clar mai mult decât o creare standard (minute), așa că nu o aștepta cu un timeout sincron.
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=Vocea mea" -F "enhanced=true"
4. Creează o voce din audio existent
Dacă nu vrei să încarci din nou: copiază direct în voce un audio pe care l-ai încărcat deja sau l-ai generat deja. Gratuit și 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-ul unui audio finalizat din contul tău (identic cusong_idal piesei).- Retrimiterea aceluiași clip nu creează o înregistrare nouă: vocea existentă vine direct, cu
reused: true(măsurat).
Răspunsul este format din toate câmpurile din §3.3 plus două câmpuri doar-citire:
| Câmp | Note |
|---|---|
reused |
true = acest audio era deja vocea ta și este reutilizat |
source_type |
De unde vine audio-ul: 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"
}
}
Erori (message ca atare; se recomandă afișarea sau localizarea):
| message | Semnificație |
|---|---|
source audio not found |
Clipul nu există sau nu este al tău |
source audio is invalid |
Acel audio se generează încă / este un produs intermediar și nu e încă utilizabil |
source_song_id is required |
Nu s-a trimis source_song_id |
5. Listă / detalii / ștergerea vocilor
5.1 Listă
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "Vocea mea", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
Câmpurile sunt exact cele din §3.3. Vocile șterse nu sunt returnate implicit.
5.2 Detalii
GET /api/music/voice-profile/{voice_id}
Returnează un singur obiect de voce (data este obiectul în sine, nu un tablou). Cât timp o clonare întărită rulează, se adaugă:
| Câmp | Note |
|---|---|
progress_percent |
Număr întreg de la 0 la 100 |
progress_stage |
Identificator de etapă, de exemplu media_preparing |
progress_message |
Text de progres de afișat utilizatorului |
5.3 Ștergere
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- După ștergere vocea dispare din listă și nu mai poate fi folosită pentru coveruri noi: trimiterea cu acel
voice_iddă 400 (vezi §6.4). - Piesele deja generate cu ea nu sunt afectate deloc; redare, descărcare, continuare, înlocuire și separare funcționează ca înainte.
- Ștergerea unei voci inexistente, sau care nu aparține acestui cont, întoarce
{"success":false,"message":"voice not found"}.
6. Cover cu o voce (endpointul central)
POST /api/music/voice-profile/cover
Content-Type: application/json
O trimitere generează 2 piese (ca la generarea obișnuită).
6.1 Două scenarii
| Scenariu | Declanșator | Note |
|---|---|---|
| A. Cover la o piesă aleasă | S-a trimis song_clip_id |
Cântă piesa respectivă cu vocea ta (melodie / ritm / secțiuni ca originalul; vocalul devine vocea ta) |
| B. Cântă o piesă nouă cu vocea | Nu s-a trimis song_clip_id |
Doar vocea + versurile (opțional) + cerințele de stil; modelul compune o melodie nouă în acel stil și o cântă |
resolved_scene din răspuns ecouă cover sau sing, ca să poți confirma ce cale a fost folosită.
6.2 Câmpurile cererii
| Câmp | Tip | Obligatoriu | Implicit | Note |
|---|---|---|---|---|
model |
string | Da | — | Numele modelului pentru client, vezi §6.5. Fără el primești model is required (HTTP 500) |
voice_id |
string | Unul din două | — | ID-ul vocii (vp_…); trebuie să fie status=ready |
voice_clip_id |
string | Unul din două | — | Merge și clip id-ul vocii; dacă trimiți ambele câștigă voice_id |
song_clip_id |
string | Nu | gol | Clip id-ul (song_id) al piesei de coverat. Netrimis = scenariul B |
lyrics |
string | Nu | gol | Versurile complete, trimise caracter cu caracter, fără rescriere sau trunchiere; ≤ 3000 de caractere |
cover_requirements |
string | Nu | gol | Indicații de cover în limbaj natural, de exemplu „articulează mai clar". Se concatenează la un prompt fix |
style_requirements |
string | Nu | gol | Cerințe de stil, de exemplu „folk lent, chitară acustică" |
title |
string | Nu | gol | Titlul acestor două piese în spațiul de lucru (influențează song_title din interogările ulterioare) |
negative_tags |
string | Nu | gol | Stiluri de exclus, de exemplu electronic, rap; ≤ 1000 de caractere |
vocal_gender |
string | Nu | gol | m / f (acceptă și male / female); gol = nu contează |
duration |
number | Nu | gol | Durata dorită în secunde, un întreg de la 1 la 480; gol = decide platforma. Minimul practic al platformei este de circa 30 s: la valori mai mici măsurătorile dădeau tot piese de circa 30 de secunde |
audio_weight |
number | Nu | 0,85 | Audio Influence, o zecimală de la 0 la 1. Mai mare = mai aproape de mostra vocală |
style_weight |
number | Nu | gol | Influența stilului, o zecimală de la 0 la 1 |
weirdness_constraint |
number | Nu | gol | Creativitate, o zecimală de la 0 la 1 (dacă interfața folosește procente, împarte la 100) |
variety |
number | Nu | gol | Varietate, un întreg de la 0 la 4 (nu procent), doar la modelele v6 |
max_mode |
boolean | Nu | false |
Max Mode, preț ×2 |
client_request_id |
string | Nu | gol | Identificator de trimitere, scris în înregistrarea de sarcină de pe server pentru diagnostic (fără deduplicare) |
Se recomandă să trimiți și antetul X-Create-Ui-Client-Request-Id: <același id de trimitere>: doar acela este scris în înregistrarea de sarcină de pe server și servește drept cheie pentru investigația ulterioară (vezi §1.5).
Unități de urmărit: audio_weight / style_weight / weirdness_constraint sunt zecimale de la 0 la 1, variety este un întreg de la 0 la 4, iar duration este în secunde. Amestecarea lor duce la respingeri sau rezultate ciudate.
Versurile sunt opționale în scenariul B (modelul se descurcă singur), dar trimite mereu lyrics când trebuie cântat un conținut anume.
6.3 Răspuns
{
"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": "[Sarcină] Acesta este un cover. … (partea structurală fixă a serverului + cerințele tale de cover / stil)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
Puncte cheie:
- Identifică piesele finale prin
clips[].song_id(acest endpoint nu returnează un câmpid). - Primești imediat 2 valori
song_id, în timp cestatuseste încăprocessing(însemnând doar că au fost acceptate), iaraudio_urleste gol; trebuie să interoghezi până lacompletedînainte de descărcare.play_urleste fluxul de previzualizare al platformei, poate apărea deja la trimitere și expiră. descriptioneste promptul pe care serverul îl trimite în final (partea structurală fixă +cover_requirements/style_requirementscompletate de tine); este foarte util când investighezi un rezultat.source_updateseste rezultatul procesării materialelor pe server și clientul îl poate ignora.title-ul trimis este scris în înregistrarea de sarcină de pe server și apare casong_titleîn interogările ulterioare; faptul căclips[].song_titleeste gol în răspunsul de trimitere este normal.
6.4 Erori
{ "error": { "message": "această voce nu există sau a fost ștearsă (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | Cauză |
|---|---|---|
| 500 | model is required |
Corpului îi lipsește model (câmp obligatoriu pentru alegerea canalului) |
| 400 | voice_id is required and must be a ready voice |
Nu s-a trimis voice_id sau s-a trimis o valoare substituent / o voce nepregătită |
| 400 | această voce nu există sau a fost ștearsă (voice_id=vp_xxx)… |
Vocea a fost ștearsă, nu există sau nu este în contul curent. Folosește altă voce disponibilă sau creează una nouă |
| 400 | această voce a fost ștearsă (voice_id=vp_xxx)… |
Când trimiți material direct prin voice_clip_id, vocea acelui material a fost ștearsă; același tratament ca mai sus |
| 400 | voice is not ready yet (status=processing) |
Vocea se creează încă; așteaptă ready și reîncearcă |
| 400 | song_clip_id must be a real completed clip |
song_clip_id este un substituent / nu este finalizat |
| 400 | song_clip_id must differ from the voice clip |
Ținta coverului nu poate fi mostra vocală în sine |
| 400 | audio_weight must be a number between 0 and 1 |
Unitate greșită la cursor (s-a trimis un procent) |
| 400 | duration must be an integer between 1 and 480 seconds |
Durata nu este un întreg de la 1 la 480 |
| 400 | vocal_gender must be one of m, f, male, female |
Valoare de gen invalidă |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
Valoare de varietate invalidă sau model neacceptat |
Soldul insuficient dă o eroare de facturare direct la trimitere și nu lasă niciodată o sarcină pe jumătate.
6.5 Modele disponibile (nume pentru client)
| Nume de model | Note |
|---|---|
suno-v6 |
Implicit, recomandat |
suno-v6-wild |
Mai dezlănțuit |
suno-v6-mini |
Ușor |
Folosește numele de model pentru client (cele de mai sus). chirp-* sunt nume interne ale platformei și nu trebuie folosite direct.
7. Urmărirea progresului
7.1 Interogare în bloc (recomandată)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_idseste un șir separat prin virgule (nu un tablou).- Răspunsul este un tablou gol (direct
[...], fără învelișulsuccess/data):
[
{
"song_id": "0f2a…",
"song_title": "Doi tigri",
"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": "[Sarcină] Acesta este un cover. … (promptul final al serverului)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| Câmp | Note |
|---|---|
status |
Vezi §1.7; doar completed contează ca finalizat |
audio_url |
Link direct mp3; se completează doar de la completed |
cover_url |
Adresa copertei |
duration |
Durata reală în secunde |
generation_type |
Piesele din coverul cu voce sunt mereu voice_profile_cover |
play_url |
Adresă de previzualizare semnată (expiră) |
song_title |
Titlul sarcinii (title-ul trimis de tine; dacă nu ai trimis niciunul, serverul pune o valoare implicită) |
lyrics / prompt |
Versurile finale / textul original |
description |
Promptul final pe care îl trimite serverul (inclusiv partea structurală fixă) |
style_tags |
Descrierea finală a stilului |
created_at |
Un șir ISO 8601 (atenție: diferă de secundele Unix ale endpointului de detalii) |
Sfat de interogare: la fiecare 5–10 secunde, cu un timeout total de 10–15 minute (cel mai lent cont rece măsurat a durat circa 4 minute și jumătate; foarte puține mai mult). Nu judeca finalizarea după faptul că audio_url este gol: folosește status.
Notă de compatibilitate: acest endpoint identifică piesele prin
song_id; în câteva răspunsuri timpurii a apărut un câmpid, așa cărow.song_id || row.ideste citirea sigură.
7.2 Detaliile unei piese
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "Doi tigri",
"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": "Doi tigri",
"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"]
}
}
}
- Aici
created_at/completed_atsunt secunde Unix (spre deosebire de șirurile ISO din interogarea în bloc, deci clienții trebuie să le distingă). wav_url/video_urlsunt intrările de descărcare ale acestei platforme (relative la domeniul curent), iar unGETia fișierul; sunt șiruri goale când platforma nu a produs acel material.parameter_retentionspune la ce parametri de trimitere poate fi urmărită piesa:core_parameters_available=trueînseamnă că parametrii de bază (versuri / stil / sursă) pot fi interogați, iar cuextended_parameters_available=falseparametrii extinși de mai sus nu au fost păstrați (coverurile cu voce sunt momentan în această categorie).
7.3 Piesele mele
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=cuvant cheie
Parametrii de paginare: p (numărul paginii, de la 1) / page_size (elemente pe pagină; ps este o scriere compatibilă). Opțional status și q (un cuvânt cheie din titlu). Implicit sortare descrescătoare după momentul creării.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "Doi tigri",
"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
}
]
}
}
Cu generation_type=voice_profile_cover distingi „piesele din coverul cu voce" de alte rezultate de generare.
8. Descărcarea pieselor finale
8.1 Ia mp3-ul direct (recomandat, gratuit)
Toate trei funcționează; alege una:
- Folosește
audio_urldin rezultatul interogării (un link direct către stocarea de obiecte, cel mai simplu). GET /api/music/download?song_id=<id>&kind=mp3→ întoarce direct fluxul de octeți audio (cu numele fișierului deja înContent-Disposition).POST /api/music/download-url(pentru o adresă temporară semnată).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song.mp3
Valori pentru kind: mp3 (echivalent cu song) / playback (redare în streaming) / wav / video / lyrics / timestamped_lyrics.
timestamped_lyrics (.lrc) este momentan disponibil doar pentru unele piese; dacă eșuează, generează fișierul singur cu API-ul de versuri cu marcaje de timp.
Răspunsul este fluxul brut de octeți ai fișierului, cu Content-Type și Content-Disposition (nume de fișier) deja setate; wav_url / video_url returnate de GET /api/music/songs/{song_id} sunt aceeași intrare cu kind=wav|video.
8.2 Convertire în wav / versuri / metadate (cu plată)
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
}
}
filesacceptă:mp3/wav/lyrics/metadata, până la 10 piese odată.- Se taxează per piesă reușită (0,2 ¥ fiecare); o piesă care eșuează în totalitate nu se taxează, iar un format care eșuează apare doar în
songs[].errors. - Ca să reiei fișiere deja obținute, folosește mai întâi gratuitul
POST /api/music/free2/cached(aceleașisong_ids+files) pentru adrese arhivate;songs[].missing_filesdin răspuns listează formatele care nu sunt în cache și trebuie pregătite din nou.
9. Interogarea prețurilor
GET /api/pricing/catalog
Un endpoint public care nu necesită autentificare. Toate prețurile unitare pe care clientul trebuie să le afișeze sunt în data.catalog.meta (șiruri):
| Cheie | Semnificație | Valoare actuală |
|---|---|---|
generation_price |
Generare obișnuită | 0,6 |
voice_generation_price |
Prețul de bază al coverului cu voce | 1,2 |
max_mode_factor |
Multiplicatorul Max Mode | 2 |
enhanced_upload_price |
Clonare întărită / încărcare întărită | 10 |
voice_auto_verify_price |
Verificare automată a vocii | 5 |
voice_long_term_clone_price |
Clonare vocală pe termen lung | 5 |
Prețurile sunt ajustate în back-office, așa că citește-le în timp real în loc să le fixezi în client. Taxa reală pentru un cover = voice_generation_price × (la max_mode adevărat încă × max_mode_factor).
10. Limite și avertismente
- Dimensiunea încărcării: ≤ 10 MB (serverul acceptă mai mult, dar gateway-ul de intrare trunchiază corpurile supradimensionate la 10 MiB, ceea ce arată ca „respins de Suno"; blochează mai întâi de partea ta).
- Durata mostrei: minimum 6 s, se recomandă 10–60 s; prea scurtă și platforma respinge.
- Conținutul mostrei: vocal curat; evită orice seamănă foarte mult cu o înregistrare existentă (comparația cu catalogul o respinge).
- Limite de text:
lyrics≤ 3000 de caractere; pentrustyle_requirements/negative_tags/titlese recomandă 1000 / 1000 / 100 de caractere (cerințele de stil și de cover se concatenează la prompt, ține totalul sub 3000 de caractere). - Versurile nu sunt rescrise: se cântă ce trimiți (caracter cu caracter), fără trunchiere locală.
- Fiecare piesă produce 2 variante; nu presupune un singur rezultat.
- Audio-ul sursă este păstrat permanent: ștergerea unei voci nu curăță audio-ul sursă; astfel coverurile ulterioare rămân posibile și conformitatea rămâne trasabilă.
- Vocea trebuie să fie gata: o voce în
processingnu poate fi folosită pentru coveruri. - Timeout-ul cererii: pe un cont rece prima trimitere a durat până la circa 4 minute și jumătate în măsurători, așa că setează timeout-ul clientului la ≥ 6 minute. Coverurile nu deduplică la nivel de cerere, așa că după un timeout verifică dacă a apărut deja o piesă nouă (§1.5) înainte de a decide retrimiterea.
- Proprietatea vocii: vocile aparțin creatorului; un cover acceptă doar voci gata și neșterse. O voce inexistentă, ștearsă sau din alt cont dă 400:
această voce nu există sau a fost ștearsă (voice_id=…).
11. Întrebări frecvente (FAQ)
Î1. Crearea unei voci costă? Crearea standard și „creează din audio existent" sunt gratuite; se taxează doar coverurile (1,2 ¥ / MAX 2,4 ¥) și clonările întărite (implicit 10 ¥).
Î2. Pot folosi ca mostră o piesă finală cu acompaniament?
Nu se recomandă. Orice conține muzică, sau seamănă foarte mult cu o înregistrare existentă din catalog, este respins de platformă (This audio matches an existing recording in our catalog.). Folosește o înregistrare pur vocală, secă.
Î3. De ce audio_url este gol după ce trimit un cover?
Trimiterea înseamnă doar că a fost acceptată și status este încă processing. O adresă redabilă/descărcabilă apare doar după ce interoghezi /api/music/query până la status=completed.
Î4. Trebuie să trimit versuri în scenariul B (fără song_clip_id)?
Opțional. Trimite lyrics pentru a cânta un conținut anume; fără el modelul se descurcă, dar cu mai puțin control.
Î5. Audio încărcat de client poate fi folosit direct ca voce?
Da: prin forma file_url a create, sau încărcându-l mai întâi ca piesă și apoi apelând create-from-clip.
Î6. Se returnează banii dacă eșuează?
O cerere respinsă de la început (parametri greșiți / eroare a platformei) nu se taxează, conform măsurătorilor; o sarcină acceptată care eșuează în final dă înapoi suma debitată în avans. La eșec definitiv sarcina raportează status=failed plus error_message.
Î7. După ce șterg o voce, mai pot asculta piesele generate cu ea? Da. Ștergerea afectează doar dacă vocea poate fi folosită pentru coveruri noi.
Î8. Cât de lungă poate fi o piesă coverată o dată?
duration acceptă de la 1 la 480 de secunde; dacă îl omiți decide platforma pe baza originalului / materialului. Atenție: variantele finale ale platformei au cel puțin circa 30 de secunde; la o valoare mai mică măsurătorile dădeau tot 29,96 / 29,76 secunde.
Anexa A: exemplu complet (Node.js, cu interogare și descărcare)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① Creează vocea (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, ... }
}
// ② Fă 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: "folk lent, chitară acustică",
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 }] }
}
// ③ Interoghează până la final (la fiecare 5 secunde, maximum 15 minute)
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(); // tablou gol
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");
}
// ④ Descarcă
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", "Vocea mea");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nversuri…");
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`);
}
Anexa B: jurnal de modificări
| Dată | Modificare |
|---|---|
| 2026-10-15 | Semantica ștergerii enunțată direct (§5.3); un cover cu un voice_id „șters / neautorizat" întoarce acum 400 înainte de orice debitare în avans, cu tabelul de erori și FAQ actualizate (împreună cu poarta de ștergere a vocilor livrată în acea zi) |
| 2026-10-13 | Adăugată nota „de ce recomandăm acest lanț" la început: conform evaluărilor reale ale multor utilizatori, piesele din acest lanț păstrează mult mai bine vocea originală |
| 2026-09-26 | Prima versiune: creează o voce (trei forme de intrare) / creează din audio existent / listă, detalii, ștergere / cover cu voce (scenariile A și B) / interogarea progresului / descărcare / citirea prețurilor, cu dovezi măsurate |
Obține o cheie API
Creează o cheie API în consolă după înregistrare. Fiecare generare costă 0,6 ¥ și returnează 2 piese, descărcările sunt nelimitate și nu este nevoie de număr de telefon.
Obține cheia API Înapoi la prezentare