【Recomandat】 API-ul de profil vocal

Actualizat pe 2026-09-18 · echipa Suno-API

✅ 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.

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

1.3 Formatele corpului cererii

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:

  1. 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ă.
  2. 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 sunt p / page_size; scrierea compatibilă ps funcționează și ea) dacă a apărut deja o piesă nouă cu generation_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:

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"
      }'

Forma C: JSON + base64

{
  "file_base64": "data:audio/mpeg;base64,//uQxAAA…",
  "file_name": "my-voice.mp3",
  "title": "Vocea mea"
}

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_at sunt 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):

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…"
}

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" } }

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:

  1. Identifică piesele finale prin clips[].song_id (acest endpoint nu returnează un câmp id).
  2. Primești imediat 2 valori song_id, în timp ce status este încă processing (însemnând doar că au fost acceptate), iar audio_url este gol; trebuie să interoghezi până la completed înainte de descărcare. play_url este fluxul de previzualizare al platformei, poate apărea deja la trimitere și expiră.
  3. description este promptul pe care serverul îl trimite în final (partea structurală fixă + cover_requirements / style_requirements completate de tine); este foarte util când investighezi un rezultat.
  4. source_updates este rezultatul procesării materialelor pe server și clientul îl poate ignora.
  5. title-ul trimis este scris în înregistrarea de sarcină de pe server și apare ca song_title în interogările ulterioare; faptul că clips[].song_title este 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_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âmp id, așa că row.song_id || row.id este 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"]
    }
  }
}

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:

  1. Folosește audio_url din rezultatul interogării (un link direct către stocarea de obiecte, cel mai simplu).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → întoarce direct fluxul de octeți audio (cu numele fișierului deja în Content-Disposition).
  3. 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
  }
}

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

  1. 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).
  2. Durata mostrei: minimum 6 s, se recomandă 10–60 s; prea scurtă și platforma respinge.
  3. Conținutul mostrei: vocal curat; evită orice seamănă foarte mult cu o înregistrare existentă (comparația cu catalogul o respinge).
  4. Limite de text: lyrics ≤ 3000 de caractere; pentru style_requirements / negative_tags / title se recomandă 1000 / 1000 / 100 de caractere (cerințele de stil și de cover se concatenează la prompt, ține totalul sub 3000 de caractere).
  5. Versurile nu sunt rescrise: se cântă ce trimiți (caracter cu caracter), fără trunchiere locală.
  6. Fiecare piesă produce 2 variante; nu presupune un singur rezultat.
  7. 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ă.
  8. Vocea trebuie să fie gata: o voce în processing nu poate fi folosită pentru coveruri.
  9. 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.
  10. 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
UrmătorulAPI de îmbunătățire a stilului

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