【Consigliato】 API profilo vocale
✅ Catena consigliata per le nuove integrazioni. Secondo le valutazioni reali di molti utenti, i brani generati con questa catena conservano molto bene la voce originale: la voce nella traccia finale somiglia di più alla persona del campione che hai caricato, perciò è la via che consigliamo attualmente ai clienti.
Confronto: la precedente API di clonazione vocale e generazione con voce indicata funziona ancora, ma il menu la segnala come «non consigliato» e non è più consigliata per le nuove integrazioni.
- Data del documento: 2026-09-26
- Copertura: creare la propria voce → usarla per fare una cover di un brano scelto / cantare un brano nuovo → seguire l'avanzamento → scaricare i risultati
- Tutti gli endpoint, i campi e le risposte sono stati verificati con chiamate reali (i punti marcati «misurato» sono stati verificati nel dettaglio)
Nota: questo documento descrive solo gli endpoint che devi chiamare. Il trattamento dei materiali, la pianificazione delle attività e la validazione dei contenuti sono gestiti automaticamente dal server; il client non li implementa.
0. Pronti in cinque minuti
Bastano quattro passi per trasformare un campione vocale in due brani finiti.
① Creare la voce POST /api/music/voice-profile/create → ottenere voice_id (status=ready)
② Fare la cover POST /api/music/voice-profile/cover → ottenere subito 2 song_id
③ Seguire POST /api/music/query → interrogare fino a status=completed
④ Scaricare GET /api/music/download?song_id=…&kind=mp3
Esempio minimo (curl):
API_KEY="sk-la-tua-chiave"
BASE="https://www.suno-api.io"
# ① Creare la voce (carica un campione vocale; 10 s o più consigliati, sotto 10 MB)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=La mia voce" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② Fare una cover con questa voce (song_clip_id = il clip id del brano da coverare)
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]\ntesto del brano…",
"style_requirements": "folk lento, chitarra acustica",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ Interrogare (più id in una volta, separati da virgole)
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"}'
# ④ Scaricare l'mp3 a fine lavorazione (solo con status=completed ottieni il file)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. Convenzioni comuni
1.1 Dominio e ambiente
| Ambiente | Base URL | Uso |
|---|---|---|
| Produzione | https://www.suno-api.io |
Traffico reale dei clienti |
Tutti i percorsi seguenti sono relativi alla Base URL; per esempio l'indirizzo completo di POST /api/music/voice-profile/create è
https://www.suno-api.io/api/music/voice-profile/create.
1.2 Autenticazione
Tutti gli endpoint usano lo stesso header di richiesta, il cui valore è la chiave API che hai creato nella console:
Authorization: Bearer sk-xxxxxxxx
- Il prefisso
Bearerè facoltativo; anche quellosk-(Authorization: sk-xxxfunziona allo stesso modo). - Chiave assente o non valida → HTTP 401, con un corpo come
{"success":false,"message":"…"}(il testo varia con la lingua della richiesta). - Ogni chiave può vedere e può agire solo sui brani e sulle voci del proprio account.
1.3 Formati del corpo della richiesta
- Creazione della voce: si consiglia
multipart/form-data(caricamento di un file); è supportato ancheapplication/json(un URL o base64). - Tutti gli altri endpoint:
application/json.
1.4 Due involucri di risposta (il cliente deve conoscere solo questi due)
Gli endpoint di «gestione delle voci» (create / create-from-clip / list / detail / delete) usano l'involucro di business:
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
La «cover con voce» passa per il canale di generazione e usa l'involucro di generazione: il successo è code/message/data, il fallimento è un oggetto error:
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
Come decidere: guarda prima il codice di stato HTTP, poi success === false, infine code !== 200 o la presenza di error.
Un fallimento di business non garantisce un HTTP diverso da 200 (gli endpoint di gestione delle voci restituiscono comunque HTTP 200 in caso di errore), quindi non puoi basarti solo sul codice di stato.
1.5 Idempotenza
La creazione di una voce (incluso «creare da audio esistente») è realmente idempotente: sotto la stessa chiave, inviare di nuovo lo stesso client_request_id crea una sola voce e il secondo tentativo restituisce direttamente il primo risultato (success=true, lo stesso voice_id). L'uso previsto è che il client generi da sé un id (un UUID, per esempio) e riutilizzi lo stesso valore quando riprova dopo un timeout.
L'invio di una cover non deduplica a livello di richiesta (è una generazione fatturata), quindi tieni presente due cose:
- L'identificatore di invio va nell'header
X-Create-Ui-Client-Request-Id: <il tuo id di invio>. Viene scritto nel record di attività lato server per facilitare le indagini successive; non impedisce un addebito duplicato. - Timeout ≠ fallimento: la richiesta potrebbe essere già stata accettata e in generazione. Prima di riprovare, controlla con
GET /api/music/songs?p=1&page_size=20(i parametri di paginazione sonop/page_size; la grafia compatibilepsfunziona pure) se è già comparso un brano nuovo congeneration_type=voice_profile_cover, e re-invia la stessa richiesta solo se non c'è.
I corpi di create e create-from-clip accettano anch'essi un campo client_request_id (vedi §3 e §4).
1.6 Panoramica della fatturazione
| Azione | Endpoint | Prezzo | Note |
|---|---|---|---|
| Creare una voce (standard) | POST /api/music/voice-profile/create |
Gratuito | Caricare un campione non consuma crediti Suno |
| Creare una voce (da audio esistente) | POST /api/music/voice-profile/create-from-clip |
Gratuito | Il server registra solo un riferimento al materiale; non si ricarica nulla |
| Clonazione potenziata | Stesso, enhanced=true |
Al «prezzo di caricamento potenziato» (10 ¥ per chiamata per impostazione predefinita) | Asincrona; rimborso automatico in caso di errore |
| Cover con voce | POST /api/music/voice-profile/cover |
1,2 ¥ per chiamata; 2,4 ¥ per chiamata con max_mode=true |
Restituisce 2 brani per chiamata |
| Interrogare / elencare / dettaglio / eliminare | — | Gratuito | |
| Scaricare (prendere il link diretto) | L'audio_url della risposta |
Gratuito | Riproduce/riproduce l'indirizzo che forniamo |
| Scaricare (convertire in wav / testi, ecc.) | POST /api/music/free2 |
0,2 ¥ per brano riuscito | Vedi §8 |
I prezzi si leggono in qualsiasi momento da un endpoint pubblico, quindi non fissarli nel codice (vedi §9):
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← prezzo base di una cover con voce
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← prezzo della clonazione potenziata
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
La cover usa addebito anticipato + rimborso in caso di errore:
- Una richiesta rifiutata (parametri errati, un 4xx/5xx della piattaforma, saldo insufficiente in sé) non viene addebitata: inviando con una voce inesistente il saldo è rimasto del tutto invariato nelle nostre misure (delta = 0);
- Un'attività accettata che alla fine fallisce (compreso un errore di servizio della piattaforma) passa per la via di rimborso del server e restituisce l'importo anticipato.
1.7 Dizionario degli stati
Lo status della voce:
| Valore | Significato | Utilizzabile per la cover |
|---|---|---|
ready |
Pronta | ✅ |
processing |
Compare solo con una clonazione potenziata (enhanced=true); in elaborazione |
❌ (attendere ready) |
failed |
Creazione fallita; vedi error_message; per la clonazione potenziata il rimborso è già avvenuto |
❌ |
Lo status del brano (il valore restituito dagli endpoint di interrogazione):
| Valore | Significato | Scaricabile |
|---|---|---|
submitted / queued / processing |
In generazione (può già esistere un flusso di ascolto) | ❌ |
completed |
Finito | ✅ |
failed |
Fallito; l'addebito è stato rimborsato | ❌ |
2. Panoramica degli endpoint
| # | Metodo | Percorso | Scopo | Fatturazione |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
Creare una voce (caricamento / URL / base64) | Gratuito (tranne enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
Creare una voce da audio già disponibile | Gratuito |
| 3 | GET | /api/music/voice-profile/list |
Elenco delle voci | Gratuito |
| 4 | GET | /api/music/voice-profile/{voice_id} |
Dettaglio della voce (incluso l'avanzamento della clonazione potenziata) | Gratuito |
| 5 | POST | /api/music/voice-profile/delete |
Eliminare una voce | Gratuito |
| 6 | POST | /api/music/voice-profile/cover |
Fare una cover con la voce / cantare un brano nuovo | 1,2 ¥ (MAX 2,4) |
| 7 | POST | /api/music/query |
Interrogazione in blocco dello stato dei brani | Gratuito |
| 8 | GET | /api/music/songs/{song_id} |
Dettaglio di un brano | Gratuito |
| 9 | GET | /api/music/download |
Scaricare il file finito | Gratuito (mp3/link di riproduzione) |
| 10 | POST | /api/music/free2 |
Convertire in wav / ottenere i testi, ecc. | 0,2 ¥ per brano riuscito |
| 11 | POST | /api/music/free2/cached |
Ottenere un indirizzo di download già archiviato | Gratuito |
| 12 | GET | /api/music/songs |
I miei lavori, con paginazione | Gratuito |
3. Creare una voce
POST /api/music/voice-profile/create
Registra un frammento di audio vocale come «voce» e ottieni un voice_id. Per la piattaforma una voce è semplicemente «un audio + il suo clip nel catalogo», quindi dopo la creazione riuscita quell'audio di origine viene conservato per sempre (per le cover successive).
3.1 Tre forme di input (scegline una)
Forma A: caricamento file multipart (consigliata)
Content-Type: multipart/form-data
file=<binario audio> # obbligatorio
title=<nome della voce> # facoltativo; se vuoto, il nome del file senza estensione
file_name=<nome file originale>
source_file_name=<nome file originale>
source_kind=upload|record # facoltativo, marcatore di origine (caricamento / registrazione); predefinito upload
enhanced=false|true # facoltativo, true = clonazione potenziata (vedi §3.5)
client_request_id=<chiave di idempotenza> # facoltativo
voice_id=<ID personalizzato> # facoltativo, raramente usato
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=La mia voce" \
-F "source_kind=upload"
Forma B: JSON + un URL audio pubblico
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": "La mia voce"
}'
- L'URL deve essere un link diretto HTTPS raggiungibile pubblicamente; il server lo scarica una volta e lo deposita nel nostro object storage.
- Puoi mettere l'indirizzo anche nel campo
audio_url, l'effetto è identico (se invii entrambi vincefile_url). - Se l'indirizzo è già sull'object storage di questa piattaforma (
*.myqcloud.com/create-ui/voice-source/...) non viene riscaricato: viene registrato direttamente.
Forma C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "La mia voce"
}
- Sono accettati sia il prefisso
data:audio/xxx;base64,sia il base64 puro. - La dimensione è limitata (il base64 gonfia di 1,33×), quindi per i file grandi usa la forma A.
3.2 Requisiti dell'audio
| Voce | Requisito | Note |
|---|---|---|
| Dimensione | ≤ 10 MB | Oltre il limite il gateway tronca il corpo, cosa che si manifesta come «rifiutato da Suno»; comprimi o accorcia prima |
| Durata | Almeno 6 s; 10–60 s consigliati | Sotto i 6 s la piattaforma rifiuta: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| Formato | mp3 / wav / m4a / aac / flac / ogg | Deciso dall'estensione del file |
| Contenuto | Voce pulita; evita cover finite o brani originali con accompagnamento | Un audio molto simile a una registrazione esistente nel catalogo viene rifiutato: This audio matches an existing recording in our catalog. (misurato) |
3.3 Risposta
{
"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": "La mia voce",
"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
}
}
Riferimento dei campi (create / list / detail condividono lo stesso insieme):
| Campo | Tipo | Note |
|---|---|---|
voice_id |
string | L'ID voce; le cover lo usano dopo |
clip_id / song_id |
string | Il clip id di quell'audio vocale lato Suno (i due coincidono); per la diagnosi |
account_id |
string | L'account che lo porta (per la diagnosi; al client non serve) |
title |
string | Nome della voce |
source_file_name |
string | Nome file originale |
audio_url |
string | Link diretto a lungo termine all'audio di origine, utilizzabile per l'ascolto; conservato per sempre |
image_url |
string | Copertina della voce (quella che Suno genera per l'audio vocale); se non c'è copertina la chiave non compare affatto |
duration_s |
number | Durata del campione vocale in secondi |
enhanced |
bool | Se è stata creata con clonazione potenziata |
source_kind |
string | upload / record / clip (preso da audio esistente) |
status |
string | ready / processing / failed |
error_message |
string | Motivo del fallimento; presente solo con failed |
task_id |
number | Numero dell'attività sottostante della clonazione potenziata; presente solo con enhanced=true |
pre_consumed_quota |
number | Quota anticipata (solo con clonazione potenziata) |
created_at / updated_at |
number | Secondi Unix |
created_at/updated_atsono timestamp in secondi (10 cifre), non in millisecondi.
3.4 Errori comuni
| HTTP | message | Causa e trattamento |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
Non è stato allegato alcun contenuto audio |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
Il campione è troppo corto; usa ≥6 s (≥10 s consigliati) |
| 200 | This audio matches an existing recording in our catalog. |
Il campione somiglia molto a una registrazione esistente nel catalogo; usa una voce asciutta diversa e pulita |
| 200 | upload succeeded without clip or account identity |
La risposta della piattaforma è anomala; riprova |
| 200 | audio file exceeds 30 MB limit |
Oltre il limite del server (lato cliente resta entro 10 MB) |
| 401 | invalid token |
Chiave API errata |
3.5 Clonazione potenziata (enhanced=true)
Per i casi in cui «il campione vocale stesso contiene testi protetti / serve un caricamento potenziato». Fatturata al prezzo del caricamento potenziato (10 ¥ per chiamata per impostazione predefinita, rimborso automatico in caso di errore):
- La risposta è subito
status=processing+task_id(ancora senzaclip_id) e l'esecuzione è asincrona; - Durante l'elaborazione usa
GET /api/music/voice-profile/{voice_id}per l'avanzamento, che restituisceprogress_percent/progress_stage/progress_message; - Al termine
statusdiventareadyeclip_id,audio_url,image_urlvengono completati; - In caso di errore
status=failedeerror_messagedice qualcosa come «il caricamento potenziato non è riuscito; l'importo è stato rimborsato automaticamente, riprova più tardi»; - Una clonazione potenziata richiede molto più tempo di una creazione standard (minuti), quindi non attenderla con un timeout sincrono.
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=La mia voce" -F "enhanced=true"
4. Creare una voce da audio esistente
Se preferisci non ricaricare: copia direttamente in voce un audio che hai già caricato o già generato. Gratuito e idempotente.
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: il clip id di un audio finito del tuo account (equivale allasong_iddel brano).- Reinviare lo stesso clip non crea un nuovo record: restituisce direttamente la voce esistente con
reused: true(misurato).
La risposta è composta da tutti i campi di §3.3 più due campi in sola lettura:
| Campo | Note |
|---|---|
reused |
true = questo audio era già la tua voce e viene riutilizzato |
source_type |
Da dove viene l'audio: 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"
}
}
Errori (il message così com'è restituito; si consiglia di mostrarlo o localizzarlo):
| message | Significato |
|---|---|
source audio not found |
Il clip non esiste o non è tuo |
source audio is invalid |
Quell'audio è ancora in generazione / è un prodotto intermedio e non è ancora utilizzabile |
source_song_id is required |
source_song_id non è stato inviato |
5. Elenco / dettaglio / eliminazione delle voci
5.1 Elenco
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "La mia voce", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
I campi sono esattamente quelli di §3.3. Per impostazione predefinita le voci eliminate non vengono restituite.
5.2 Dettaglio
GET /api/music/voice-profile/{voice_id}
Restituisce un singolo oggetto voce (data è l'oggetto stesso, non un array). Mentre una clonazione potenziata è in corso, aggiunge:
| Campo | Note |
|---|---|
progress_percent |
Intero da 0 a 100 |
progress_stage |
Identificatore della fase, per esempio media_preparing |
progress_message |
Testo di avanzamento da mostrare all'utente |
5.3 Eliminazione
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- Dopo l'eliminazione la voce sparisce dall'elenco e non può più essere usata per nuove cover: inviando con quel
voice_idsi ottiene 400 (vedi §6.4). - I brani già generati con essa non sono minimamente influenzati; riproduzione, download, prosecuzione, sostituzione e separazione funzionano come prima.
- Eliminare una voce inesistente, o che non appartiene a questo account, restituisce
{"success":false,"message":"voice not found"}.
6. Fare una cover con una voce (l'endpoint centrale)
POST /api/music/voice-profile/cover
Content-Type: application/json
Un invio genera 2 brani (come la generazione normale).
6.1 Due scenari
| Scenario | Condizione | Note |
|---|---|---|
| A. Cover di un brano scelto | È stato inviato song_clip_id |
Canta quel brano con la tua voce (melodia / ritmo / sezioni seguono l'originale; la voce diventa la tua) |
| B. Cantare un brano nuovo con la voce | song_clip_id non inviato |
Solo voce + testo (facoltativo) + requisiti di stile; il modello compone una melodia nuova in quello stile e la canta |
Il resolved_scene della risposta restituisce cover o sing, così puoi confermare quale percorso è stato seguito.
6.2 Campi della richiesta
| Campo | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
model |
string | Sì | — | Nome modello per il cliente, vedi §6.5. Se non lo invii ottieni model is required (HTTP 500) |
voice_id |
string | Uno dei due | — | ID voce (vp_…); deve essere status=ready |
voice_clip_id |
string | Uno dei due | — | Va bene anche il clip id della voce; se invii entrambi vince voice_id |
song_clip_id |
string | No | vuoto | Clip id (song_id) del brano da coverare. Non inviato = scenario B |
lyrics |
string | No | vuoto | Testo completo, inviato carattere per carattere senza riscritture né troncamenti; ≤ 3000 caratteri |
cover_requirements |
string | No | vuoto | Indicazioni per la cover in linguaggio naturale, per esempio «articolare più chiaramente». Vengono concatenate a un prompt fisso |
style_requirements |
string | No | vuoto | Requisiti di stile, per esempio «folk lento, chitarra acustica» |
title |
string | No | vuoto | Il titolo di questi due brani nell'area di lavoro (influenza il song_title restituito dalle interrogazioni successive) |
negative_tags |
string | No | vuoto | Stili da escludere, per esempio elettronica, rap; ≤ 1000 caratteri |
vocal_gender |
string | No | vuoto | m / f (accetta anche male / female); vuoto = indifferente |
duration |
number | No | vuoto | Durata desiderata in secondi, un intero da 1 a 480; vuoto = decide la piattaforma. Il minimo pratico della piattaforma è di circa 30 s: con valori più piccoli le misure davano comunque brani da circa 30 secondi |
audio_weight |
number | No | 0,85 | Audio Influence, un decimale da 0 a 1. Più alto = più vicino al campione vocale |
style_weight |
number | No | vuoto | Influenza dello stile, un decimale da 0 a 1 |
weirdness_constraint |
number | No | vuoto | Creatività, un decimale da 0 a 1 (se l'interfaccia usa percentuali, dividi per 100) |
variety |
number | No | vuoto | Varietà, un intero da 0 a 4 (non una percentuale), solo sui modelli v6 |
max_mode |
boolean | No | false |
Max Mode, prezzo ×2 |
client_request_id |
string | No | vuoto | Identificatore di invio, scritto nel record di attività lato server per la diagnosi (nessuna deduplica) |
Si consiglia di inviare anche l'header X-Create-Ui-Client-Request-Id: <lo stesso id di invio>: solo quello viene scritto nel record di attività lato server e serve da chiave per le indagini successive (vedi §1.5).
Unità da tenere d'occhio: audio_weight / style_weight / weirdness_constraint sono decimali da 0 a 1, variety è un intero da 0 a 4 e duration è in secondi. Confonderli porta a rifiuti o risultati strani.
Il testo è facoltativo nello scenario B (il modello si arrangia), ma invia sempre lyrics quando un contenuto preciso deve essere cantato.
6.3 Risposta
{
"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": "[Attività] Questa è una cover. … (la parte strutturale fissa del server + i tuoi requisiti di cover / stile)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
Punti chiave:
- Identifica i brani finiti con
clips[].song_id(questo endpoint non restituisce un campoid). - Ottieni subito 2 valori
song_id, mentrestatusè ancoraprocessing(significa solo che sono stati accettati) eaudio_urlè vuoto; devi interrogare fino acompletedprima di scaricare.play_urlè il flusso di ascolto della piattaforma, può già comparire all'invio e scadrà. descriptionè il prompt che il server invia alla fine (la parte strutturale fissa + icover_requirements/style_requirementsche hai inserito); è molto utile quando si indaga su un risultato.source_updatesè il risultato del trattamento dei materiali del server e il client può ignorarlo.- Il
titleche invii viene scritto nel record di attività lato server e compare comesong_titlenelle interrogazioni successive; checlips[].song_titlesia vuoto nella risposta di invio è normale.
6.4 Errori
{ "error": { "message": "questa voce non esiste o è stata eliminata (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | Causa |
|---|---|---|
| 500 | model is required |
Nel corpo manca model (campo obbligatorio per la scelta del canale) |
| 400 | voice_id is required and must be a ready voice |
voice_id non inviato, oppure inviato un valore segnaposto / una voce non pronta |
| 400 | questa voce non esiste o è stata eliminata (voice_id=vp_xxx)… |
La voce è stata eliminata, non esiste o non è dell'account corrente. Usa un'altra voce disponibile o creane una nuova |
| 400 | questa voce è stata eliminata (voice_id=vp_xxx)… |
Passando il materiale direttamente con voice_clip_id, la voce di quel materiale è stata eliminata; stesso trattamento di sopra |
| 400 | voice is not ready yet (status=processing) |
La voce è ancora in creazione; attendi ready e riprova |
| 400 | song_clip_id must be a real completed clip |
song_clip_id è un segnaposto / non è finito |
| 400 | song_clip_id must differ from the voice clip |
L'oggetto della cover non può essere il campione vocale stesso |
| 400 | audio_weight must be a number between 0 and 1 |
Unità sbagliata nel cursore (è stata inviata una percentuale) |
| 400 | duration must be an integer between 1 and 480 seconds |
La durata non è un intero da 1 a 480 |
| 400 | vocal_gender must be one of m, f, male, female |
Valore di genere non valido |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
Valore di varietà non valido o modello non supportato |
Un saldo insufficiente restituisce un errore di fatturazione già all'invio e non lascia mai attività a metà.
6.5 Modelli disponibili (nomi per il cliente)
| Nome modello | Note |
|---|---|
suno-v6 |
Predefinito, consigliato |
suno-v6-wild |
Più sfrenato |
suno-v6-mini |
Leggero |
Usa i nomi modello per il cliente (quelli sopra). chirp-* sono nomi interni della piattaforma e non vanno usati direttamente.
7. Seguire l'avanzamento
7.1 Interrogazione in blocco (consigliata)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_idsè una stringa separata da virgole (non un array).- La risposta è un array nudo (direttamente
[...], senza involucrosuccess/data):
[
{
"song_id": "0f2a…",
"song_title": "Due 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": "[Attività] Questa è una cover. … (il prompt finale del server)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| Campo | Note |
|---|---|
status |
Vedi §1.7; solo completed vale come finito |
audio_url |
Link diretto mp3; popolato solo da completed |
cover_url |
Indirizzo della copertina |
duration |
Durata effettiva in secondi |
generation_type |
I brani prodotti da una cover con voce sono sempre voice_profile_cover |
play_url |
Indirizzo di ascolto firmato (scade) |
song_title |
Titolo dell'attività (il title che hai inviato; senza invio il server ne mette uno) |
lyrics / prompt |
Testo finito / testo originale |
description |
Il prompt finale che il server invia (parte strutturale fissa inclusa) |
style_tags |
La descrizione finale dello stile |
created_at |
Una stringa ISO 8601 (attenzione: diversa dai secondi Unix dell'endpoint di dettaglio) |
Consiglio sull'interrogazione: ogni 5–10 secondi, con timeout totale di 10–15 minuti (l'account freddo più lento misurato ha impiegato circa 4 minuti e mezzo; pochissimi di più). Non giudicare la fine dal fatto che audio_url sia vuoto: usa status.
Nota di compatibilità: questo endpoint identifica i brani con
song_id; in alcune risposte iniziali comparve un campoid, quindirow.song_id || row.idè la lettura sicura.
7.2 Dettaglio di un brano
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "Due 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": "Due 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"]
}
}
}
- Qui
created_at/completed_atsono secondi Unix (a differenza delle stringhe ISO dell'interrogazione in blocco, quindi i client devono distinguerli). wav_url/video_urlsono le entrate di download di questa piattaforma (relative al dominio corrente) e unGETrecupera il file; sono stringhe vuote quando la piattaforma non ha prodotto quel materiale.parameter_retentionindica a quali parametri di invio quel brano è riconducibile:core_parameters_available=truesignifica che i parametri principali (testo / stile / origine) sono interrogabili, mentre conextended_parameters_available=falsei parametri estesi elencati sopra non sono stati conservati (le cover con voce rientrano attualmente in questa categoria).
7.3 I miei lavori
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=parola chiave
Parametri di paginazione: p (numero di pagina, da 1) / page_size (elementi per pagina; ps è una grafia compatibile). Facoltativi status e q (una parola chiave del titolo). Per impostazione predefinita ordinati per data di creazione decrescente.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "Due 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
}
]
}
}
Con generation_type=voice_profile_cover distingui «i brani prodotti da una cover con voce» dagli altri risultati di generazione.
8. Scaricare i brani finiti
8.1 Prendere l'mp3 direttamente (consigliato, gratuito)
Vanno bene tutte e tre; scegline una:
- Usare l'
audio_urldel risultato dell'interrogazione (un link diretto all'object storage, il più comodo). GET /api/music/download?song_id=<id>&kind=mp3→ restituisce direttamente il flusso di byte audio (con il nome del file già inContent-Disposition).POST /api/music/download-url(per ottenere un indirizzo temporaneo firmato).
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 di kind: mp3 (equivalente a song) / playback (riproduzione in streaming) / wav / video / lyrics / timestamped_lyrics.
timestamped_lyrics (.lrc) è al momento disponibile solo per alcuni brani; se fallisce, genera il file tu stesso con l'API dei testi con timestamp.
La risposta è il flusso di byte del file, con Content-Type e Content-Disposition (nome file) già impostati; i wav_url / video_url restituiti da GET /api/music/songs/{song_id} sono la stessa entrata con kind=wav|video.
8.2 Convertire in wav / ottenere testi / metadati (a pagamento)
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
}
}
filesaccetta:mp3/wav/lyrics/metadata, fino a 10 brani alla volta.- Fatturato per brano riuscito (0,2 ¥ ciascuno); un brano completamente fallito non viene addebitato, e un formato fallito compare solo in
songs[].errors. - Per riottenere file già scaricati in precedenza, usa prima il gratuito
POST /api/music/free2/cached(gli stessisong_ids+files) per ottenere indirizzi archiviati; il suosongs[].missing_fileselenca i formati non in cache da preparare di nuovo.
9. Consultare i prezzi
GET /api/pricing/catalog
Un endpoint pubblico che non richiede autenticazione. Tutti i prezzi unitari che il cliente deve mostrare sono in data.catalog.meta (stringhe):
| Chiave | Significato | Valore attuale |
|---|---|---|
generation_price |
Generazione normale | 0,6 |
voice_generation_price |
Prezzo base di una cover con voce | 1,2 |
max_mode_factor |
Moltiplicatore Max Mode | 2 |
enhanced_upload_price |
Clonazione potenziata / caricamento potenziato | 10 |
voice_auto_verify_price |
Verifica automatica della voce | 5 |
voice_long_term_clone_price |
Clonazione vocale a lungo termine | 5 |
I prezzi vengono regolati nel back-office, quindi leggili in tempo reale invece di fissarli nel client. L'addebito effettivo della cover = voice_generation_price × (con max_mode vero, ancora × max_mode_factor).
10. Limiti e avvertenze
- Dimensione del caricamento: ≤ 10 MB (il server ne accetta di più, ma il gateway d'ingresso tronca i corpi sovradimensionati a 10 MiB, cosa che si manifesta come «rifiutato da Suno»; bloccalo prima dal tuo lato).
- Durata del campione: almeno 6 s, 10–60 s consigliati; troppo corto e la piattaforma rifiuta.
- Contenuto del campione: voce pulita; evita qualsiasi cosa molto simile a una registrazione esistente (il confronto con il catalogo la rifiuta).
- Limiti di testo:
lyrics≤ 3000 caratteri; perstyle_requirements/negative_tags/titlesi consigliano 1000 / 1000 / 100 caratteri (i requisiti di stile e di cover vengono concatenati al prompt, tieni il totale entro 3000 caratteri). - I testi non vengono riscritti: si canta quello che passi (carattere per carattere), senza troncamenti locali.
- Ogni brano produce 2 tracce; non dare per scontato un solo risultato.
- L'audio di origine è conservato per sempre: eliminare una voce non ripulisce il suo audio di origine; così restano possibili le cover successive e tracciabile la conformità.
- La voce deve essere pronta: una voce in
processingnon può essere usata per le cover. - Timeout della richiesta: su un account freddo il primo invio nelle misure ha richiesto fino a circa 4 minuti e mezzo, quindi imposta il timeout del client a ≥ 6 minuti. Le cover non deduplicano a livello di richiesta, quindi dopo un timeout controlla se è già comparso un brano nuovo (§1.5) prima di decidere di rinviare.
- Proprietà della voce: le voci appartengono a chi le crea; una cover accetta solo voci pronte e non eliminate. Una voce inesistente, eliminata o di un altro account restituisce 400:
questa voce non esiste o è stata eliminata (voice_id=…).
11. Domande frequenti (FAQ)
D1. Creare una voce costa? La creazione standard e «creare da audio esistente» sono gratuite; si fatturano solo le cover (1,2 ¥ / MAX 2,4 ¥) e le clonazioni potenziate (10 ¥ per impostazione predefinita).
D2. Posso usare come campione un brano finito con accompagnamento?
Sconsigliato. Qualsiasi cosa con musica, o molto simile a una registrazione esistente nel catalogo, viene rifiutata dalla piattaforma (This audio matches an existing recording in our catalog.). Usa una registrazione puramente vocale e asciutta.
D3. Perché audio_url è vuoto dopo l'invio di una cover?
L'invio significa solo che è stata accettata e status è ancora processing. Un indirizzo riproducibile/scaricabile compare solo dopo aver interrogato /api/music/query fino a status=completed.
D4. Nello scenario B (senza song_clip_id) devo inviare il testo?
Facoltativo. Invia lyrics per cantare un contenuto preciso; senza, il modello si arrangia, ma con meno controllo.
D5. Un audio caricato dal cliente può essere usato direttamente come voce?
Sì: tramite la forma file_url di create, oppure caricandolo prima come brano e poi chiamando create-from-clip.
D6. In caso di errore i soldi vengono rimborsati?
Una richiesta respinta di netto (parametri errati / errore della piattaforma) non viene addebitata, secondo le misure; un'attività accettata che alla fine fallisce restituisce l'importo anticipato. In caso di fallimento definitivo l'attività riporta status=failed più error_message.
D7. Dopo aver eliminato una voce, posso ancora ascoltare i brani generati prima con essa? Sì. L'eliminazione influisce solo sulla possibilità di usare quella voce per cover nuove.
D8. Quanto lungo può essere un brano da coverare in una volta?
duration accetta da 1 a 480 secondi; se lo ometti decide la piattaforma in base all'originale / al materiale. Attenzione: le tracce finite della piattaforma sono lunghe almeno circa 30 secondi; con un valore più piccolo le misure davano comunque 29,96 / 29,76 secondi.
Appendice A: esempio completo (Node.js, con interrogazione e download)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① Creare la voce (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, ... }
}
// ② 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 lento, chitarra acustica",
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 }] }
}
// ③ Interrogare fino al completamento (ogni 5 secondi, massimo 15 minuti)
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(); // array nudo
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");
}
// ④ Download
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", "La mia voce");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\ntesto…");
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`);
}
Appendice B: registro delle modifiche
| Data | Modifica |
|---|---|
| 2026-10-15 | Semantica dell'eliminazione esposta chiaramente (§5.3); una cover con un voice_id «eliminato / non autorizzato» ora restituisce 400 prima di qualsiasi addebito anticipato, con tabella degli errori e FAQ allineate (insieme al blocco sull'eliminazione delle voci rilasciato quel giorno) |
| 2026-10-13 | Aggiunta in testa la nota «perché consigliamo questa catena»: secondo le valutazioni reali di molti utenti, i brani generati con questa catena conservano molto meglio la voce originale |
| 2026-09-26 | Prima versione: creare una voce (tre forme di input) / creare da audio esistente / elenco, dettaglio, eliminazione / cover con voce (scenari A e B) / interrogazione dell'avanzamento / download / lettura dei prezzi, con prove misurate |
Ottenere una chiave API
Dopo la registrazione puoi creare una chiave API nella console. Ogni generazione costa 0,6 ¥ e restituisce 2 brani, i download sono illimitati e non serve un numero di telefono.
Ottieni chiave API Torna alla panoramica