【Recommandé】 API de profil vocal

Mis à jour le 2026-09-18 · équipe Suno-API

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

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

1.3 Formats du corps de la requête

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 :

  1. 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.
  2. 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 sont p / page_size ; l'orthographe compatible ps fonctionne aussi) pour voir si une nouvelle chanson avec generation_type=voice_profile_cover est 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 :

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

Forme C : JSON + base64

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

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

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

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

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 :

  1. Identifiez les chansons finies avec clips[].song_id (cet endpoint ne renvoie pas de champ id).
  2. Vous obtenez 2 valeurs de song_id immédiatement, alors que status est encore processing (ce qui signifie seulement qu'elles ont été acceptées) et que audio_url est vide ; il faut interroger jusqu'à completed avant de télécharger. play_url est le flux d'écoute de la plateforme, il peut déjà apparaître à l'envoi et expirera.
  3. description est le prompt que le serveur envoie finalement (la partie structurelle fixe + les cover_requirements / style_requirements que vous avez saisis) ; c'est très utile pour enquêter sur un résultat.
  4. source_updates est le résultat du traitement des médias côté serveur et le client peut l'ignorer.
  5. Le title que vous envoyez est écrit dans l'enregistrement de tâche côté serveur et apparaît comme song_title dans les consultations ultérieures ; que clips[].song_title soit 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_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 champ id, donc row.song_id || row.id est 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"]
    }
  }
}

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 :

  1. Utiliser l'audio_url du résultat de consultation (un lien direct vers le stockage objet, le plus simple).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → renvoie directement le flux d'octets audio (avec le nom du fichier déjà dans Content-Disposition).
  3. 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
  }
}

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

  1. 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é).
  2. Durée de l'échantillon : au moins 6 s, 10–60 s recommandé ; trop court et la plateforme refuse.
  3. Contenu de l'échantillon : voix propre ; évitez tout ce qui ressemble de près à un enregistrement existant (la comparaison du catalogue le refuse).
  4. Limites de texte : lyrics ≤ 3000 caractères ; il est conseillé de garder style_requirements / negative_tags / title dans 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).
  5. Les paroles ne sont pas réécrites : ce que vous passez est ce qui est chanté (caractère par caractère), sans troncature locale.
  6. Chaque chanson produit 2 pistes ; ne supposez pas un résultat unique.
  7. 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é.
  8. La voix doit être prête : une voix en processing ne peut pas servir aux reprises.
  9. 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.
  10. 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
SuivantAPI de boost de style

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