【Recommandé】 API de profil vocal
✅ Chaîne recommandée pour les nouvelles intégrations. D'après les évaluations réelles de nombreux utilisateurs, les chansons générées par cette chaîne conservent très bien la voix d'origine : la voix de la piste finale ressemble davantage à la personne de l'échantillon que vous avez envoyé, c'est donc la voie que nous recommandons actuellement aux clients.
Comparaison : l'API de clonage vocal et de génération avec voix précédente fonctionne toujours, mais le menu la signale comme « non recommandé » et elle n'est plus conseillée pour les nouvelles intégrations.
- Date du document : 2026-09-26
- Périmètre : créer votre propre voix → l'utiliser pour reprendre une chanson choisie / chanter une nouvelle chanson → suivre l'avancement → télécharger les résultats
- Tous les endpoints, champs et réponses ont été vérifiés par des appels réels (ce qui est marqué « mesuré » a été vérifié en détail)
Remarque : ce document ne décrit que les endpoints que vous devez appeler. Le traitement des médias, l'ordonnancement des tâches et la validation du contenu sont assurés automatiquement par le serveur ; le client ne les implémente pas.
0. Prise en main en cinq minutes
Quatre étapes suffisent pour transformer un échantillon vocal en deux chansons finies.
① Créer la voix POST /api/music/voice-profile/create → obtenir voice_id (status=ready)
② Reprendre POST /api/music/voice-profile/cover → obtenir 2 song_id immédiatement
③ Suivre POST /api/music/query → interroger jusqu'à status=completed
④ Télécharger GET /api/music/download?song_id=…&kind=mp3
Exemple minimal (curl) :
API_KEY="sk-votre-cle"
BASE="https://www.suno-api.io"
# ① Créer la voix (envoyer un échantillon vocal ; 10 s ou plus recommandé, moins de 10 Mo)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@./my-voice.mp3" \
-F "title=Ma voix" \
-F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}
# ② Reprendre une chanson avec cette voix (song_clip_id = le clip id de la chanson à reprendre)
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]\ntexte des paroles…",
"style_requirements": "folk lent, guitare acoustique",
"audio_weight": 0.85,
"max_mode": false
}'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}
# ③ Interroger (envoyer plusieurs ids d'un coup, séparés par des virgules)
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"}'
# ④ Télécharger le mp3 une fois terminé (seul status=completed donne un fichier)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song1.mp3
1. Conventions communes
1.1 Domaine et environnement
| Environnement | Base URL | Usage |
|---|---|---|
| Production | https://www.suno-api.io |
Trafic client réel |
Tous les chemins ci-dessous sont relatifs à la Base URL ; par exemple l'adresse complète de POST /api/music/voice-profile/create est
https://www.suno-api.io/api/music/voice-profile/create.
1.2 Authentification
Tous les endpoints utilisent le même en-tête de requête, dont la valeur est la clé API que vous avez créée dans la console :
Authorization: Bearer sk-xxxxxxxx
- Le préfixe
Bearerest facultatif ; celui desk-aussi (Authorization: sk-xxxfonctionne de la même façon). - Clé absente ou invalide → HTTP 401, avec un corps du type
{"success":false,"message":"…"}(le texte varie selon la langue de la requête). - Chaque clé ne peut voir et ne peut agir que sur les chansons et les voix de son propre compte.
1.3 Formats du corps de la requête
- Créer une voix :
multipart/form-data(envoi d'un fichier) est recommandé ;application/json(une URL ou du base64) est également pris en charge. - Les autres endpoints :
application/json.
1.4 Deux enveloppes de réponse (le client n'a besoin de connaître que celles-ci)
Les endpoints de « gestion des voix » (create / create-from-clip / list / detail / delete) utilisent l'enveloppe métier :
{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }
La « reprise avec voix » passe par le canal de génération et utilise l'enveloppe de génération : le succès est code/message/data, l'échec un objet error :
{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }
Comment décider : regardez d'abord le code HTTP, puis success === false, enfin code !== 200 ou la présence d'error.
Un échec métier ne garantit pas un HTTP différent de 200 (les endpoints de gestion des voix renvoient toujours HTTP 200 en cas d'erreur), vous ne pouvez donc pas vous fier au seul code de statut.
1.5 Idempotence
Créer une voix (y compris « créer à partir d'un audio existant ») est réellement idempotent : sous la même clé, renvoyer le même client_request_id ne crée qu'une seule voix et la seconde tentative renvoie directement le premier résultat (success=true, le même voice_id). L'usage prévu est que le client génère lui-même un id (un UUID, par exemple) et réutilise la même valeur lors d'une nouvelle tentative après un délai dépassé.
L'envoi d'une reprise ne déduplique pas au niveau de la requête (c'est une génération facturée), aussi notez deux points :
- L'identifiant d'envoi se place dans l'en-tête
X-Create-Ui-Client-Request-Id: <votre id d'envoi>. Il est écrit dans l'enregistrement de tâche côté serveur pour faciliter l'investigation ultérieure ; il n'empêche pas un débit en double. - Un délai dépassé ≠ un échec : la requête peut déjà avoir été acceptée et être en cours de génération. Avant de réessayer, consultez
GET /api/music/songs?p=1&page_size=20(les paramètres de pagination sontp/page_size; l'orthographe compatiblepsfonctionne aussi) pour voir si une nouvelle chanson avecgeneration_type=voice_profile_coverest déjà apparue, et ne renvoyez la même requête que si ce n'est pas le cas.
Les corps de create et create-from-clip acceptent aussi un champ client_request_id (voir §3 et §4).
1.6 Aperçu de la facturation
| Action | Endpoint | Prix | Remarques |
|---|---|---|---|
| Créer une voix (standard) | POST /api/music/voice-profile/create |
Gratuit | L'envoi d'un échantillon ne consomme pas de crédits Suno |
| Créer une voix (à partir d'un audio existant) | POST /api/music/voice-profile/create-from-clip |
Gratuit | Le serveur ne fait qu'enregistrer une référence au média ; rien n'est renvoyé |
| Clonage renforcé | Idem, enhanced=true |
Au « tarif d'envoi renforcé » (10 ¥ par appel par défaut) | Asynchrone ; remboursement automatique en cas d'échec |
| Reprise avec voix | POST /api/music/voice-profile/cover |
1,2 ¥ par appel ; 2,4 ¥ par appel avec max_mode=true |
Renvoie 2 chansons par appel |
| Consultation / liste / détail / suppression | — | Gratuit | |
| Téléchargement (récupérer le lien direct) | L'audio_url de la réponse |
Gratuit | Lit l'adresse que nous délivrons |
| Téléchargement (convertir en wav / paroles, etc.) | POST /api/music/free2 |
0,2 ¥ par chanson réussie | Voir §8 |
Les prix peuvent être lus à tout moment depuis un endpoint public, donc ne les figez pas dans le code (voir §9) :
curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
# "generation_price": "0.6",
# "voice_generation_price": "1.2", ← prix de base d'une reprise avec voix
# "max_mode_factor": "2",
# "enhanced_upload_price": "10", ← prix du clonage renforcé
# "voice_auto_verify_price": "5",
# "voice_long_term_clone_price": "5"
# }
La reprise utilise un pré-débit + un remboursement en cas d'échec :
- Une requête rejetée (paramètres erronés, un 4xx/5xx de la plateforme, solde insuffisant en soi) n'est pas facturée : lors d'un envoi avec une voix inexistante, le solde n'a pas bougé du tout dans nos mesures (delta = 0) ;
- Une tâche acceptée qui échoue finalement (y compris une erreur de service de la plateforme) passe par la voie de remboursement du serveur et rend le montant pré-débité.
1.7 Dictionnaire des états
Le status de la voix :
| Valeur | Signification | Utilisable pour reprendre |
|---|---|---|
ready |
Prête | ✅ |
processing |
N'apparaît que pour un clonage renforcé (enhanced=true) ; en traitement |
❌ (attendre ready) |
failed |
La création a échoué ; voir error_message ; le clonage renforcé a déjà été remboursé |
❌ |
Le status de la chanson (la valeur renvoyée par les endpoints de consultation) :
| Valeur | Signification | Téléchargeable |
|---|---|---|
submitted / queued / processing |
En génération (un flux d'écoute peut déjà exister) | ❌ |
completed |
Terminée | ✅ |
failed |
Échec ; le débit a été remboursé | ❌ |
2. Aperçu des endpoints
| # | Méthode | Chemin | Rôle | Facturation |
|---|---|---|---|---|
| 1 | POST | /api/music/voice-profile/create |
Créer une voix (envoi / URL / base64) | Gratuit (sauf enhanced=true) |
| 2 | POST | /api/music/voice-profile/create-from-clip |
Créer une voix à partir d'un audio existant | Gratuit |
| 3 | GET | /api/music/voice-profile/list |
Liste des voix | Gratuit |
| 4 | GET | /api/music/voice-profile/{voice_id} |
Détail d'une voix (avec l'avancement du clonage renforcé) | Gratuit |
| 5 | POST | /api/music/voice-profile/delete |
Supprimer une voix | Gratuit |
| 6 | POST | /api/music/voice-profile/cover |
Reprendre avec la voix / chanter une nouvelle chanson | 1,2 ¥ (MAX 2,4) |
| 7 | POST | /api/music/query |
Consultation par lot de l'état des chansons | Gratuit |
| 8 | GET | /api/music/songs/{song_id} |
Détail d'une chanson | Gratuit |
| 9 | GET | /api/music/download |
Télécharger le fichier final | Gratuit (mp3/lien de lecture) |
| 10 | POST | /api/music/free2 |
Convertir en wav / récupérer les paroles, etc. | 0,2 ¥ par chanson réussie |
| 11 | POST | /api/music/free2/cached |
Récupérer une adresse de téléchargement déjà archivée | Gratuit |
| 12 | GET | /api/music/songs |
Ma liste d'œuvres, paginée | Gratuit |
3. Créer une voix
POST /api/music/voice-profile/create
Enregistrez un extrait d'audio vocal comme « voix » et obtenez un voice_id. Pour la plateforme, une voix n'est que « un audio + son clip dans le catalogue » ; une fois la création réussie, cet audio source est donc conservé définitivement (pour les reprises ultérieures).
3.1 Trois formes d'entrée (choisissez-en une)
Forme A : envoi de fichier multipart (recommandée)
Content-Type: multipart/form-data
file=<binaire audio> # obligatoire
title=<nom de la voix> # facultatif ; si vide, le nom du fichier sans extension
file_name=<nom d'origine du fichier>
source_file_name=<nom d'origine du fichier>
source_kind=upload|record # facultatif, marque d'origine (envoi / enregistrement) ; par défaut upload
enhanced=false|true # facultatif, true = clonage renforcé (voir §3.5)
client_request_id=<clé d'idempotence> # facultatif
voice_id=<ID personnalisé> # facultatif, rarement utilisé
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=Ma voix" \
-F "source_kind=upload"
Forme B : JSON + une URL d'audio publique
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": "Ma voix"
}'
- L'URL doit être un lien direct HTTPS accessible publiquement ; le serveur le télécharge une fois et le stocke dans notre stockage objet.
- Vous pouvez aussi mettre l'adresse dans le champ
audio_url, l'effet est équivalent (si les deux sont envoyés,file_urll'emporte). - Si l'adresse est déjà sur le stockage objet de cette plateforme (
*.myqcloud.com/create-ui/voice-source/...), rien n'est retéléchargé : elle est enregistrée directement.
Forme C : JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "Ma voix"
}
- Le préfixe
data:audio/xxx;base64,comme le base64 pur sont acceptés. - La taille est limitée (le base64 gonfle de 1,33×), utilisez donc la forme A pour les gros fichiers.
3.2 Exigences sur l'audio
| Élément | Exigence | Remarques |
|---|---|---|
| Taille | ≤ 10 Mo | Au-delà, la passerelle tronque le corps, ce qui se manifeste par « rejeté par Suno » ; compressez ou coupez d'abord |
| Durée | Au moins 6 s ; 10–60 s recommandé | En dessous de 6 s la plateforme refuse : Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
| Format | mp3 / wav / m4a / aac / flac / ogg | Déterminé par l'extension du fichier |
| Contenu | Voix propre ; évitez les reprises finies ou les chansons originales avec accompagnement | Un audio très proche d'un enregistrement existant du catalogue est refusé : This audio matches an existing recording in our catalog. (mesuré) |
3.3 Réponse
{
"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": "Ma voix",
"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
}
}
Référence des champs (create / list / detail partagent le même ensemble de champs) :
| Champ | Type | Remarques |
|---|---|---|
voice_id |
string | L'identifiant de voix ; les reprises l'utilisent ensuite |
clip_id / song_id |
string | Le clip id de cet audio de voix côté Suno (les deux sont identiques) ; pour le diagnostic |
account_id |
string | Le compte qui le porte (pour le diagnostic ; le client n'a pas à s'en soucier) |
title |
string | Nom de la voix |
source_file_name |
string | Nom d'origine du fichier |
audio_url |
string | Lien direct de longue durée vers l'audio source, utilisable pour l'écoute ; conservé définitivement |
image_url |
string | Pochette de la voix (celle que Suno génère pour l'audio vocal) ; en l'absence de pochette la clé n'apparaît pas du tout |
duration_s |
number | Durée de l'échantillon vocal en secondes |
enhanced |
bool | S'il a été créé par clonage renforcé |
source_kind |
string | upload / record / clip (issue d'un audio existant) |
status |
string | ready / processing / failed |
error_message |
string | Cause de l'échec ; présent uniquement avec failed |
task_id |
number | Numéro de tâche sous-jacent du clonage renforcé ; renseigné seulement avec enhanced=true |
pre_consumed_quota |
number | Quota pré-débité (renseigné uniquement pour un clonage renforcé) |
created_at / updated_at |
number | Secondes Unix |
created_at/updated_atsont des horodatages en secondes (10 chiffres), pas en millisecondes.
3.4 Erreurs courantes
| HTTP | message | Cause et traitement |
|---|---|---|
| 200 | one of file_path, file_base64, or file_url is required |
Aucun contenu audio n'a été joint |
| 200 | Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. |
L'échantillon est trop court ; utilisez ≥6 s (≥10 s recommandé) |
| 200 | This audio matches an existing recording in our catalog. |
L'échantillon est très proche d'un enregistrement existant du catalogue ; utilisez une voix sèche différente et propre |
| 200 | upload succeeded without clip or account identity |
La réponse de la plateforme est anormale ; réessayez |
| 200 | audio file exceeds 30 MB limit |
Au-delà de la limite du serveur (côté client, restez à 10 Mo) |
| 401 | invalid token |
Clé API incorrecte |
3.5 Clonage renforcé (enhanced=true)
Pour les cas où « l'échantillon vocal porte lui-même des paroles protégées / il faut un envoi renforcé ». Facturé au tarif d'envoi renforcé (10 ¥ par appel par défaut, remboursé automatiquement en cas d'échec) :
- La réponse est immédiatement
status=processing+task_id(pas encore declip_id) et l'exécution est asynchrone ; - Pendant le traitement, utilisez
GET /api/music/voice-profile/{voice_id}pour consulter l'avancement, qui renvoieprogress_percent/progress_stage/progress_message; - À la fin,
statuspasse àreadyetclip_id,audio_url,image_urlsont complétés ; - En cas d'échec,
status=failedeterror_messageindique quelque chose comme « l'envoi renforcé a échoué ; le montant a été remboursé automatiquement, réessayez plus tard » ; - Un clonage renforcé prend nettement plus de temps qu'une création standard (minutes), ne l'attendez donc pas avec un délai synchrone.
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=Ma voix" -F "enhanced=true"
4. Créer une voix à partir d'un audio existant
Si vous préférez ne pas renvoyer de fichier : copiez directement un audio que vous avez déjà envoyé ou déjà généré en voix. Gratuit et 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: le clip id d'un audio terminé de votre compte (équivalent ausong_idde la chanson).- Renvoyer le même clip ne crée pas de nouvel enregistrement : cela renvoie directement la voix existante avec
reused: true(mesuré).
La réponse reprend tous les champs de §3.3 plus deux champs en lecture seule :
| Champ | Remarques |
|---|---|
reused |
true = cet audio était déjà votre voix et il est réutilisé |
source_type |
L'origine de 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"
}
}
Erreurs (le message tel que renvoyé ; il est recommandé de l'afficher ou de le localiser) :
| message | Signification |
|---|---|
source audio not found |
Le clip n'existe pas ou ne vous appartient pas |
source audio is invalid |
Cet audio est encore en génération / est un produit intermédiaire et n'est pas encore utilisable |
source_song_id is required |
source_song_id n'a pas été envoyé |
5. Liste / détail / suppression des voix
5.1 Liste
GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
"success": true,
"message": "",
"data": {
"items": [ { "voice_id": "vp_…", "title": "Ma voix", "status": "ready", "audio_url": "…", "image_url": "…" } ],
"total": 1
}
}
Les champs sont exactement ceux de §3.3. Par défaut, les voix supprimées ne sont pas renvoyées.
5.2 Détail
GET /api/music/voice-profile/{voice_id}
Renvoie un seul objet de voix (data est l'objet lui-même, pas un tableau). Tant qu'un clonage renforcé est en cours, il ajoute en plus :
| Champ | Remarques |
|---|---|
progress_percent |
Entier de 0 à 100 |
progress_stage |
Identifiant d'étape, par exemple media_preparing |
progress_message |
Texte d'avancement à montrer à l'utilisateur |
5.3 Suppression
POST /api/music/voice-profile/delete
Content-Type: application/json
{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }
- Après suppression, la voix disparaît de la liste et ne peut plus servir aux nouvelles reprises : un envoi avec ce
voice_idrenvoie 400 (voir §6.4). - Les chansons déjà générées avec elle ne sont absolument pas affectées ; lecture, téléchargement, prolongation, remplacement et séparation fonctionnent comme avant.
- Supprimer une voix inexistante, ou qui n'appartient pas à ce compte, renvoie
{"success":false,"message":"voice not found"}.
6. Reprendre avec une voix (l'endpoint central)
POST /api/music/voice-profile/cover
Content-Type: application/json
Un envoi génère 2 chansons (comme la génération ordinaire).
6.1 Deux scénarios
| Scénario | Déclencheur | Remarques |
|---|---|---|
| A. Reprendre une chanson choisie | song_clip_id a été envoyé |
Chante cette chanson avec votre voix (mélodie / rythme / sections suivent l'original ; la voix devient la vôtre) |
| B. Chanter une nouvelle chanson avec la voix | song_clip_id non envoyé |
Seulement la voix + des paroles (facultatif) + des exigences de style ; le modèle compose une mélodie inédite dans ce style et la chante |
Le resolved_scene de la réponse renvoie cover ou sing, ce qui vous permet de confirmer la voie suivie.
6.2 Champs de la requête
| Champ | Type | Obligatoire | Par défaut | Remarques |
|---|---|---|---|---|
model |
string | Oui | — | Nom de modèle côté client, voir §6.5. Ne pas l'envoyer renvoie model is required (HTTP 500) |
voice_id |
string | L'un des deux | — | Identifiant de voix (vp_…) ; doit être status=ready |
voice_clip_id |
string | L'un des deux | — | Le clip id de la voix fonctionne aussi ; si les deux sont envoyés, voice_id l'emporte |
song_clip_id |
string | Non | vide | Clip id (song_id) de la chanson à reprendre. Non envoyé = scénario B |
lyrics |
string | Non | vide | Paroles complètes, envoyées caractère par caractère, sans réécriture ni troncature ; ≤ 3000 caractères |
cover_requirements |
string | Non | vide | Consignes de reprise en langage naturel, par exemple « articuler plus clairement ». Elles sont concaténées à un prompt fixe |
style_requirements |
string | Non | vide | Exigences de style, par exemple « folk lent, guitare acoustique » |
title |
string | Non | vide | Le titre de ces deux chansons dans l'espace de travail (il influe sur le song_title renvoyé par les consultations ultérieures) |
negative_tags |
string | Non | vide | Styles exclus, par exemple électronique, rap ; ≤ 1000 caractères |
vocal_gender |
string | Non | vide | m / f (accepte aussi male / female) ; vide = indifférent |
duration |
number | Non | vide | Durée souhaitée en secondes, un entier de 1 à 480 ; vide = la plateforme décide. Le minimum pratique de la plateforme est d'environ 30 s : avec des valeurs plus petites, les mesures donnaient toujours des chansons d'environ 30 secondes |
audio_weight |
number | Non | 0,85 | Audio Influence, un décimal de 0 à 1. Plus il est élevé, plus on reste proche de l'échantillon vocal |
style_weight |
number | Non | vide | Influence du style, un décimal de 0 à 1 |
weirdness_constraint |
number | Non | vide | Créativité, un décimal de 0 à 1 (si votre interface utilise des pourcentages, divisez par 100) |
variety |
number | Non | vide | Variété, un entier de 0 à 4 (pas un pourcentage), pris en charge uniquement sur les modèles v6 |
max_mode |
boolean | Non | false |
Max Mode, prix ×2 |
client_request_id |
string | Non | vide | Identifiant d'envoi, écrit dans l'enregistrement de tâche côté serveur pour le diagnostic (pas de déduplication) |
Il est recommandé d'envoyer aussi l'en-tête X-Create-Ui-Client-Request-Id: <le même id d'envoi> : c'est le seul élément écrit dans l'enregistrement de tâche côté serveur et il sert de clé principale pour l'investigation ultérieure (voir §1.5).
Unités à surveiller : audio_weight / style_weight / weirdness_constraint sont des décimaux de 0 à 1, variety est un entier de 0 à 4 et duration est en secondes. Les confondre entraîne un refus ou des résultats étranges.
Les paroles sont facultatives dans le scénario B (le modèle gère tout seul), mais envoyez toujours lyrics quand un contenu précis doit être chanté.
6.3 Réponse
{
"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": "[Tâche] Ceci est une reprise. … (la partie structurelle fixe du serveur + les consignes de reprise / de style que vous avez saisies)"
},
{
"song_id": "7c91…",
"status": "processing",
"model_version": "suno-v6",
"audio_url": ""
}
],
"source_updates": []
}
}
Points clés :
- Identifiez les chansons finies avec
clips[].song_id(cet endpoint ne renvoie pas de champid). - Vous obtenez 2 valeurs de
song_idimmédiatement, alors questatusest encoreprocessing(ce qui signifie seulement qu'elles ont été acceptées) et queaudio_urlest vide ; il faut interroger jusqu'àcompletedavant de télécharger.play_urlest le flux d'écoute de la plateforme, il peut déjà apparaître à l'envoi et expirera. descriptionest le prompt que le serveur envoie finalement (la partie structurelle fixe + lescover_requirements/style_requirementsque vous avez saisis) ; c'est très utile pour enquêter sur un résultat.source_updatesest le résultat du traitement des médias côté serveur et le client peut l'ignorer.- Le
titleque vous envoyez est écrit dans l'enregistrement de tâche côté serveur et apparaît commesong_titledans les consultations ultérieures ; queclips[].song_titlesoit vide dans la réponse d'envoi est normal.
6.4 Erreurs
{ "error": { "message": "cette voix n'existe pas ou a été supprimée (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
| HTTP | message | Cause |
|---|---|---|
| 500 | model is required |
Le corps ne contient pas model (champ obligatoire pour le choix du canal) |
| 400 | voice_id is required and must be a ready voice |
voice_id n'a pas été envoyé, ou une valeur de substitution / une voix non prête a été envoyée |
| 400 | cette voix n'existe pas ou a été supprimée (voice_id=vp_xxx)… |
La voix a été supprimée, n'existe pas ou n'appartient pas au compte courant. Utilisez une autre voix disponible ou créez-en une |
| 400 | cette voix a été supprimée (voice_id=vp_xxx)… |
Lorsqu'on passe un média directement via voice_clip_id, la voix de ce média a été supprimée ; même traitement que ci-dessus |
| 400 | voice is not ready yet (status=processing) |
La voix est encore en cours de création ; attendez ready et réessayez |
| 400 | song_clip_id must be a real completed clip |
song_clip_id est un substitut / n'est pas terminé |
| 400 | song_clip_id must differ from the voice clip |
La cible de la reprise ne peut pas être l'échantillon vocal lui-même |
| 400 | audio_weight must be a number between 0 and 1 |
Mauvaise unité du curseur (un pourcentage a été envoyé) |
| 400 | duration must be an integer between 1 and 480 seconds |
La durée n'est pas un entier de 1 à 480 |
| 400 | vocal_gender must be one of m, f, male, female |
Valeur de genre invalide |
| 400 | variety must be an integer between 0 and 4 / variety is only supported on v6 models |
Valeur de variété invalide ou modèle non pris en charge |
Un solde insuffisant renvoie une erreur de facturation dès l'envoi et ne laisse jamais de tâche à moitié faite.
6.5 Modèles disponibles (noms côté client)
| Nom de modèle | Remarques |
|---|---|
suno-v6 |
Par défaut, recommandé |
suno-v6-wild |
Plus débridé |
suno-v6-mini |
Léger |
Utilisez les noms de modèles côté client (ceux ci-dessus). chirp-* sont des noms internes à la plateforme et ne doivent pas être utilisés directement.
7. Suivre l'avancement
7.1 Consultation par lot (recommandée)
POST /api/music/query
Content-Type: application/json
{ "model": "suno-v6", "song_ids": "id1,id2" }
song_idsest une chaîne séparée par des virgules (pas un tableau).- La réponse est un tableau nu (directement
[...], sans enveloppesuccess/data) :
[
{
"song_id": "0f2a…",
"song_title": "Deux tigres",
"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": "[Tâche] Ceci est une reprise. … (le prompt final du serveur)",
"style_tags": "…",
"created_at": "2026-09-25T18:19:09.918Z",
"video_url": ""
}
]
| Champ | Remarques |
|---|---|
status |
Voir §1.7 ; seul completed compte comme terminé |
audio_url |
Lien direct mp3 ; renseigné seulement à partir de completed |
cover_url |
Adresse de la pochette |
duration |
Durée réelle en secondes |
generation_type |
Les chansons issues d'une reprise avec voix sont toujours voice_profile_cover |
play_url |
Adresse d'écoute signée (expire) |
song_title |
Titre de la tâche (le title que vous avez envoyé ; sans envoi, le serveur met une valeur par défaut) |
lyrics / prompt |
Paroles finales / texte d'origine des paroles |
description |
Le prompt final que le serveur envoie (partie structurelle fixe comprise) |
style_tags |
La description finale du style |
created_at |
Une chaîne ISO 8601 (attention : diffère des secondes Unix de l'endpoint de détail) |
Conseil d'interrogation : toutes les 5 à 10 secondes, avec un délai global de 10 à 15 minutes (le compte froid le plus lent mesuré a pris environ 4 min 30 ; de très rares cas prennent plus longtemps). Ne jugez pas la fin au fait que audio_url est vide : utilisez status.
Note de compatibilité : cet endpoint identifie les chansons par
song_id; quelques anciennes réponses comportaient un champid, doncrow.song_id || row.idest la façon sûre de le lire.
7.2 Détail d'une chanson
GET /api/music/songs/{song_id}
{
"success": true,
"data": {
"song_id": "0f2a…",
"title": "Deux tigres",
"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": "Deux tigres",
"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"]
}
}
}
- Ici
created_at/completed_atsont des secondes Unix (contrairement aux chaînes ISO de la consultation par lot, les clients doivent donc les distinguer). wav_url/video_urlsont les entrées de téléchargement de cette plateforme (relatives au domaine courant) et unGETrécupère le fichier ; ce sont des chaînes vides quand la plateforme n'a pas produit ce média.parameter_retentionindique à quels paramètres d'envoi cette chanson peut être rattachée :core_parameters_available=truesignifie que les paramètres centraux (paroles / style / source) sont consultables, et avecextended_parameters_available=falseles paramètres étendus listés ci-dessus n'ont pas été conservés (les reprises avec voix sont actuellement dans cette catégorie).
7.3 Ma liste d'œuvres
GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=mot-clé
Paramètres de pagination : p (numéro de page, à partir de 1) / page_size (éléments par page ; ps est une orthographe compatible). status et q facultatifs (un mot-clé du titre). Tri par date de création décroissante par défaut.
{
"success": true,
"data": {
"page": 1,
"page_size": 20,
"total": 42,
"items": [
{
"song_id": "0f2a…",
"title": "Deux tigres",
"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
}
]
}
}
Utilisez generation_type=voice_profile_cover pour distinguer « les chansons issues d'une reprise avec voix » des autres résultats de génération.
8. Télécharger les chansons finies
8.1 Prendre le mp3 directement (recommandé, gratuit)
Les trois fonctionnent ; choisissez-en une :
- Utiliser l'
audio_urldu résultat de consultation (un lien direct vers le stockage objet, le plus simple). GET /api/music/download?song_id=<id>&kind=mp3→ renvoie directement le flux d'octets audio (avec le nom du fichier déjà dansContent-Disposition).POST /api/music/download-url(pour obtenir une adresse temporaire signée).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
-H "Authorization: Bearer $API_KEY" -o song.mp3
Valeurs de kind : mp3 (équivalent à song) / playback (lecture en streaming) / wav / video / lyrics / timestamped_lyrics.
timestamped_lyrics (.lrc) n'est disponible que pour certaines chansons pour l'instant ; en cas d'échec, générez le fichier vous-même avec l'API des paroles horodatées.
La réponse est le flux d'octets du fichier, avec Content-Type et Content-Disposition (nom du fichier) déjà définis ; les wav_url / video_url renvoyés par GET /api/music/songs/{song_id} sont la même entrée avec kind=wav|video.
8.2 Convertir en wav / récupérer les paroles / les métadonnées (facturé)
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
}
}
filesaccepte :mp3/wav/lyrics/metadata, jusqu'à 10 chansons à la fois.- Facturé par chanson réussie (0,2 ¥ chacune) ; une chanson entièrement en échec n'est pas facturée, et un format en échec n'apparaît que dans
songs[].errors. - Pour récupérer des fichiers déjà obtenus auparavant, utilisez d'abord l'endpoint gratuit
POST /api/music/free2/cached(les mêmessong_ids+files) afin d'obtenir des adresses archivées ; sessongs[].missing_fileslistent les formats non mis en cache qu'il faut préparer à nouveau.
9. Consulter les prix
GET /api/pricing/catalog
Un endpoint public ne nécessitant aucune authentification. Tous les prix unitaires que le client doit afficher sont dans data.catalog.meta (chaînes) :
| Clé | Signification | Valeur actuelle |
|---|---|---|
generation_price |
Génération ordinaire | 0,6 |
voice_generation_price |
Prix de base d'une reprise avec voix | 1,2 |
max_mode_factor |
Multiplicateur Max Mode | 2 |
enhanced_upload_price |
Clonage renforcé / envoi renforcé | 10 |
voice_auto_verify_price |
Vérification automatique de la voix | 5 |
voice_long_term_clone_price |
Clonage vocal à long terme | 5 |
Les prix sont ajustés dans le back-office, donc lisez-les en direct plutôt que de les figer dans le client. Le débit réel d'une reprise = voice_generation_price × (max_mode_factor en plus si max_mode est vrai).
10. Limites et mises en garde
- Taille d'envoi : ≤ 10 Mo (le serveur accepte davantage, mais la passerelle d'entrée tronque les corps surdimensionnés à 10 MiB, ce qui se manifeste par « rejeté par Suno » ; bloquez-le d'abord de votre côté).
- Durée de l'échantillon : au moins 6 s, 10–60 s recommandé ; trop court et la plateforme refuse.
- Contenu de l'échantillon : voix propre ; évitez tout ce qui ressemble de près à un enregistrement existant (la comparaison du catalogue le refuse).
- Limites de texte :
lyrics≤ 3000 caractères ; il est conseillé de garderstyle_requirements/negative_tags/titledans 1000 / 1000 / 100 caractères respectivement (les exigences de style et de reprise sont concaténées au prompt, gardez donc le total sous 3000 caractères). - Les paroles ne sont pas réécrites : ce que vous passez est ce qui est chanté (caractère par caractère), sans troncature locale.
- Chaque chanson produit 2 pistes ; ne supposez pas un résultat unique.
- L'audio source est conservé définitivement : supprimer une voix ne nettoie pas son audio source ; cela maintient les reprises ultérieures possibles et la traçabilité de conformité.
- La voix doit être prête : une voix en
processingne peut pas servir aux reprises. - Délai de la requête : sur un compte froid, le premier envoi a pris jusqu'à environ 4 min 30 dans nos mesures, réglez donc le délai client à ≥ 6 minutes. Les reprises ne dédupliquent pas au niveau de la requête, donc après un délai dépassé, vérifiez si une nouvelle chanson est déjà apparue (§1.5) avant de décider de renvoyer.
- Propriété de la voix : les voix appartiennent à leur créateur ; une reprise n'accepte que les voix prêtes et non supprimées. Une voix inexistante, supprimée ou appartenant à un autre compte renvoie 400 :
cette voix n'existe pas ou a été supprimée (voice_id=…).
11. Questions fréquentes (FAQ)
Q1. Créer une voix coûte-t-il de l'argent ? La création standard et « créer à partir d'un audio existant » sont gratuites ; seules les reprises (1,2 ¥ / MAX 2,4 ¥) et les clonages renforcés (10 ¥ par défaut) sont facturés.
Q2. Puis-je utiliser comme échantillon une chanson finie avec accompagnement ?
Déconseillé. Tout ce qui contient de la musique, ou ressemble de près à un enregistrement existant du catalogue, est refusé par la plateforme (This audio matches an existing recording in our catalog.). Utilisez un enregistrement purement vocal et sec.
Q3. Pourquoi audio_url est-il vide après l'envoi d'une reprise ?
L'envoi signifie seulement que la tâche a été acceptée et status est encore processing. Une adresse lisible/téléchargeable n'apparaît qu'après avoir interrogé /api/music/query jusqu'à status=completed.
Q4. Faut-il envoyer des paroles dans le scénario B (sans song_clip_id) ?
Facultatif. Envoyez lyrics pour chanter un contenu précis ; sans cela le modèle gère tout seul, mais avec moins de contrôle.
Q5. Un audio envoyé par le client peut-il servir directement de voix ?
Oui : via la forme file_url de create, ou en l'envoyant d'abord comme chanson puis en appelant create-from-clip.
Q6. L'argent est-il remboursé en cas d'échec ?
Une requête rejetée d'emblée (paramètres erronés / erreur de la plateforme) n'est pas facturée, d'après nos mesures ; une tâche acceptée qui échoue finalement rend le montant pré-débité. En échec terminal, la tâche indique status=failed plus error_message.
Q7. Après avoir supprimé une voix, puis-je encore écouter les chansons générées avant avec elle ? Oui. La suppression n'affecte que la possibilité d'utiliser cette voix pour de nouvelles reprises.
Q8. Quelle durée de chanson puis-je reprendre d'un coup ?
duration accepte de 1 à 480 secondes ; si vous l'omettez, la plateforme décide d'après la chanson d'origine / le média. Attention : les pistes finies de la plateforme font au minimum environ 30 secondes ; avec une valeur plus petite, les mesures donnaient encore 29,96 / 29,76 secondes.
Annexe A : exemple complet (Node.js, avec interrogation et téléchargement)
const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };
// ① Créer la voix (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, ... }
}
// ② Reprendre
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, guitare acoustique",
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 }] }
}
// ③ Interroger jusqu'à la fin (toutes les 5 secondes, 15 minutes au maximum)
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(); // tableau nu
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");
}
// ④ Télécharger
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", "Ma voix");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nparoles…");
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`);
}
Annexe B : journal des modifications
| Date | Modification |
|---|---|
| 2026-10-15 | Sémantique de la suppression écrite noir sur blanc (§5.3) ; une reprise avec un voice_id « supprimé / non autorisé » renvoie désormais 400 avant tout pré-débit, avec le tableau des erreurs et la FAQ mis à jour (en lien avec la barrière de suppression des voix livrée ce jour-là) |
| 2026-10-13 | Ajout en tête de la note « pourquoi nous recommandons cette chaîne » : d'après les évaluations réelles de nombreux utilisateurs, les chansons générées par cette chaîne conservent beaucoup mieux la voix d'origine |
| 2026-09-26 | Première version : créer une voix (trois formes d'entrée) / créer à partir d'un audio existant / liste, détail, suppression / reprise avec voix (scénarios A et B) / suivi de l'avancement / téléchargement / lecture des prix, avec des preuves mesurées |
Obtenir une clé d'API
Créez une clé d'API dans la console après votre inscription. Chaque génération coûte 0,6 ¥ et renvoie 2 pistes, les téléchargements sont illimités et aucun numéro de téléphone n'est requis.
Obtenir une clé d'API Retour à la présentation