【Empfohlen】 API für Stimmprofile

Aktualisiert am 2026-09-18 · Suno-API-Team

✅ Für neue Integrationen empfehlen wir diese Kette. Nach den realen Bewertungen vieler Nutzer behalten Songs aus dieser Kette die Originalstimme sehr gut: Die Stimme in der fertigen Spur klingt näher an der Person aus der hochgeladenen Probe. Deshalb ist dies der Weg, den wir Kunden derzeit empfehlen.

Zum Vergleich: Die frühere API für Voice-Cloning und Generierung mit Stimme funktioniert weiterhin, ist in der Navigation aber als „nicht empfohlen" gekennzeichnet und wird für neue Integrationen nicht mehr empfohlen.

Hinweis: Dieses Dokument beschreibt nur die Endpunkte, die Sie aufrufen. Medienverarbeitung, Aufgabenplanung und Inhaltsprüfung erledigt der Server automatisch; der Client implementiert sie nicht.


0. In fünf Minuten startklar

Vier Schritte genügen, um aus einer Stimmprobe zwei fertige Songs zu machen.

① Stimme anlegen  POST /api/music/voice-profile/create      → voice_id erhalten (status=ready)
② Damit covern    POST /api/music/voice-profile/cover       → sofort 2 song_id erhalten
③ Fortschritt     POST /api/music/query                     → bis status=completed abfragen
④ Herunterladen   GET  /api/music/download?song_id=…&kind=mp3

Minimales Arbeitsbeispiel (curl):

API_KEY="sk-Ihr-Schluessel"
BASE="https://www.suno-api.io"

# ① Stimme anlegen (Stimmprobe hochladen; 10 s oder mehr, unter 10 MB empfohlen)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" \
  -F "title=Meine Stimme" \
  -F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}

# ② Mit dieser Stimme einen Song covern (song_clip_id = die clip id des Songs)
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]\nSongtext…",
        "style_requirements": "langsamer Folk, Akustikgitarre",
        "audio_weight": 0.85,
        "max_mode": false
      }'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}

# ③ Abfragen (mehrere ids auf einmal, durch Kommas getrennt)
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"}'

# ④ Nach Abschluss die mp3 laden (nur bei status=completed gibt es eine Datei)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song1.mp3

1. Gemeinsame Konventionen

1.1 Domain und Umgebung

Umgebung Base URL Zweck
Produktion https://www.suno-api.io Echter Kundenverkehr

Alle Pfade unten sind relativ zur Base URL; die vollständige Adresse von POST /api/music/voice-profile/create lautet zum Beispiel https://www.suno-api.io/api/music/voice-profile/create.

1.2 Authentifizierung

Alle Endpunkte nutzen denselben Anfrage-Header, dessen Wert der in der Konsole erstellte API-Key ist:

Authorization: Bearer sk-xxxxxxxx

1.3 Formate des Anfrage-Bodys

1.4 Zwei Antwort-Hüllen (Kunden müssen nur diese beiden kennen)

Die Endpunkte zur „Stimmenverwaltung" (create / create-from-clip / list / detail / delete) nutzen die Fach-Hülle:

{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }

Das „Covern mit Stimme" läuft über den Generierungskanal und nutzt die Generierungs-Hülle: Erfolg ist code/message/data, Fehler ist ein error-Objekt:

{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }

So entscheiden Sie: zuerst den HTTP-Statuscode ansehen, dann success === false, zuletzt code !== 200 oder das Vorhandensein von error. Ein Fachfehler garantiert keinen von 200 abweichenden HTTP-Status (die Endpunkte zur Stimmenverwaltung liefern bei Fehlern weiterhin HTTP 200), Sie dürfen sich also nicht allein auf den Statuscode verlassen.

1.5 Idempotenz

Das Anlegen einer Stimme (einschließlich „aus vorhandenem Audio anlegen") ist wirklich idempotent: Unter demselben Key legt ein erneut gesendeter gleicher client_request_id nur eine Stimme an, und der zweite Versuch gibt direkt das erste Ergebnis zurück (success=true, dieselbe voice_id). Gedacht ist das so, dass der Client selbst eine id erzeugt (etwa eine UUID) und beim erneuten Versuch nach einem Timeout denselben Wert wiederverwendet.

Das Senden eines Covers dedupliziert nicht auf Anfrageebene (es ist eine kostenpflichtige Generierung), beachten Sie daher zwei Punkte:

  1. Die Sende-Kennung steht im Header X-Create-Ui-Client-Request-Id: <Ihre Sende-id>. Sie wird in den serverseitigen Aufgaben-Datensatz geschrieben, um spätere Untersuchungen zu erleichtern; sie verhindert keine doppelte Abbuchung.
  2. Ein Timeout ≠ ein Fehlschlag: Die Anfrage kann bereits angenommen worden und in Generierung sein. Prüfen Sie vor einem erneuten Versuch mit GET /api/music/songs?p=1&page_size=20 (die Paginierungsparameter sind p / page_size; die kompatible Schreibweise ps funktioniert ebenfalls), ob bereits ein neuer Song mit generation_type=voice_profile_cover aufgetaucht ist, und senden Sie dieselbe Anfrage nur dann erneut, wenn nicht.

Die Bodies von create und create-from-clip nehmen ebenfalls ein Feld client_request_id (siehe §3 und §4).

1.6 Abrechnungsüberblick

Aktion Endpunkt Preis Hinweise
Stimme anlegen (Standard) POST /api/music/voice-profile/create Kostenlos Das Hochladen einer Probe verbraucht keine Suno-Guthaben
Stimme anlegen (aus vorhandenem Audio) POST /api/music/voice-profile/create-from-clip Kostenlos Der Server registriert nur eine Referenz auf das Material; nichts wird erneut hochgeladen
Verstärkter Klon Derselbe, enhanced=true Zum „Preis für verstärkten Upload" (standardmäßig 10 ¥ pro Aufruf) Asynchron; bei Fehlschlag automatisch erstattet
Covern mit Stimme POST /api/music/voice-profile/cover 1,2 ¥ pro Aufruf; 2,4 ¥ pro Aufruf bei max_mode=true Liefert 2 Songs pro Aufruf
Abfragen / Liste / Details / Löschen — Kostenlos
Download (Direktlink selbst holen) Das audio_url der Antwort Kostenlos Spielt die ausgegebene Adresse ab
Download (in wav umwandeln / Songtext etc.) POST /api/music/free2 0,2 ¥ pro erfolgreichem Song Siehe §8

Die Preise lassen sich jederzeit über einen öffentlichen Endpunkt lesen, also nicht fest verdrahten (siehe §9):

curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
#   "generation_price": "0.6",
#   "voice_generation_price": "1.2",      ← Grundpreis für ein Cover mit Stimme
#   "max_mode_factor": "2",
#   "enhanced_upload_price": "10",        ← Preis für den verstärkten Klon
#   "voice_auto_verify_price": "5",
#   "voice_long_term_clone_price": "5"
# }

Beim Covern gilt Vorabbuchung + Erstattung bei Fehlschlag:

1.7 Status-Übersicht

Der status der Stimme:

Wert Bedeutung Zum Covern nutzbar
ready Bereit ✅
processing Tritt nur bei einem verstärkten Klon (enhanced=true) auf; in Verarbeitung ❌ (auf ready warten)
failed Anlegen fehlgeschlagen; siehe error_message; ein verstärkter Klon wurde bereits erstattet ❌

Der status des Songs (der von den Abfrage-Endpunkten zurückgegebene Wert):

Wert Bedeutung Herunterladbar
submitted / queued / processing In Generierung (ein Vorschau-Stream kann schon existieren) ❌
completed Fertig ✅
failed Fehlgeschlagen; die Buchung wurde erstattet ❌

2. Endpunkt-Überblick

# Methode Pfad Zweck Abrechnung
1 POST /api/music/voice-profile/create Stimme anlegen (Upload / URL / base64) Kostenlos (außer enhanced=true)
2 POST /api/music/voice-profile/create-from-clip Stimme aus vorhandenem Audio anlegen Kostenlos
3 GET /api/music/voice-profile/list Stimmenliste Kostenlos
4 GET /api/music/voice-profile/{voice_id} Stimmen-Details (inkl. Fortschritt des verstärkten Klons) Kostenlos
5 POST /api/music/voice-profile/delete Stimme löschen Kostenlos
6 POST /api/music/voice-profile/cover Mit der Stimme covern / neuen Song singen 1,2 ¥ (MAX 2,4)
7 POST /api/music/query Songstatus im Stapel abfragen Kostenlos
8 GET /api/music/songs/{song_id} Details zu einem Song Kostenlos
9 GET /api/music/download Fertige Datei herunterladen Kostenlos (mp3/Wiedergabelink)
10 POST /api/music/free2 In wav umwandeln / Songtext etc. 0,2 ¥ pro erfolgreichem Song
11 POST /api/music/free2/cached Bereits archivierte Downloadadresse holen Kostenlos
12 GET /api/music/songs Meine Werke, paginiert Kostenlos

3. Eine Stimme anlegen

POST /api/music/voice-profile/create

Registrieren Sie ein Stück Gesangs-Audio als „Stimme" und erhalten Sie eine voice_id. Für die Plattform ist eine Stimme schlicht „ein Audio + sein Clip im Katalog", daher bleibt dieses Quellaudio nach erfolgreichem Anlegen dauerhaft erhalten (für spätere Cover).

3.1 Drei Eingabeformen (wählen Sie eine)

Form A: Multipart-Datei-Upload (empfohlen)

Content-Type: multipart/form-data

file=<Audio-Binärdaten>      # erforderlich
title=<Stimmenname>          # optional; wenn leer, der Dateiname ohne Endung
file_name=<ursprünglicher Dateiname>
source_file_name=<ursprünglicher Dateiname>
source_kind=upload|record    # optional, Herkunftsmarke (Upload / Aufnahme); Standard upload
enhanced=false|true          # optional, true = verstärkter Klon (siehe §3.5)
client_request_id=<Idempotenzschlüssel>   # optional
voice_id=<eigene ID>         # optional, selten genutzt
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=Meine Stimme" \
  -F "source_kind=upload"

Form B: JSON + eine öffentliche Audio-URL

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": "Meine Stimme"
      }'

Form C: JSON + base64

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

3.2 Anforderungen an das Audio

Punkt Anforderung Hinweise
Größe ≤ 10 MB Darüber schneidet das Gateway den Body ab, was als „von Suno abgelehnt" erscheint; komprimieren oder kürzen Sie zuerst
Dauer Mindestens 6 s; 10–60 s empfohlen Unter 6 s lehnt die Plattform ab: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds.
Format mp3 / wav / m4a / aac / flac / ogg Wird anhand der Dateiendung bestimmt
Inhalt Sauberer Gesang; fertige Cover oder Originalsongs mit Begleitung vermeiden Audio, das einer vorhandenen Aufnahme im Katalog sehr ähnelt, wird abgelehnt: This audio matches an existing recording in our catalog. (gemessen)

3.3 Antwort

{
  "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": "Meine Stimme",
    "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
  }
}

Felder-Referenz (create / list / detail teilen denselben Feldsatz):

Feld Typ Hinweise
voice_id string Die Stimmen-ID; Cover nutzen sie danach
clip_id / song_id string Die clip id dieses Stimmen-Audios auf Suno-Seite (beide sind gleich); für die Fehlersuche
account_id string Das tragende Konto (für die Fehlersuche; der Client muss es nicht beachten)
title string Stimmenname
source_file_name string Ursprünglicher Dateiname
audio_url string Langfristiger Direktlink zum Quellaudio, für die Vorschau nutzbar; dauerhaft erhalten
image_url string Stimmen-Cover (das Suno für Gesangs-Audio erzeugt); wenn kein Cover existiert, fehlt der Schlüssel vollständig
duration_s number Länge der Stimmprobe in Sekunden
enhanced bool Ob sie als verstärkter Klon angelegt wurde
source_kind string upload / record / clip (aus vorhandenem Audio)
status string ready / processing / failed
error_message string Fehlergrund; nur bei failed vorhanden
task_id number Zugrunde liegende Aufgabennummer des verstärkten Klons; nur bei enhanced=true gesetzt
pre_consumed_quota number Vorab gebuchtes Guthaben (nur bei einem verstärkten Klon gesetzt)
created_at / updated_at number Unix-Sekunden

created_at / updated_at sind Zeitstempel in Sekunden (10 Ziffern), nicht in Millisekunden.

3.4 Häufige Fehler

HTTP message Ursache und Vorgehen
200 one of file_path, file_base64, or file_url is required Es wurde kein Audio-Inhalt mitgeschickt
200 Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. Die Probe ist zu kurz; nutzen Sie ≥6 s (≥10 s empfohlen)
200 This audio matches an existing recording in our catalog. Die Probe ähnelt einer vorhandenen Aufnahme im Katalog stark; nutzen Sie eine andere saubere trockene Stimme
200 upload succeeded without clip or account identity Die Antwort der Plattform war anormal; erneut versuchen
200 audio file exceeds 30 MB limit Über dem Serverlimit (für Kunden bleiben Sie bei 10 MB)
401 invalid token Falscher API-Key

3.5 Verstärkter Klon (enhanced=true)

Für Fälle, in denen „die Stimmprobe selbst geschützte Songtexte enthält / ein verstärkter Upload nötig ist". Abgerechnet zum Preis für verstärkten Upload (standardmäßig 10 ¥ pro Aufruf, bei Fehlschlag automatisch erstattet):

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=Meine Stimme" -F "enhanced=true"

4. Eine Stimme aus vorhandenem Audio anlegen

Wenn Sie nicht erneut hochladen möchten: Kopieren Sie ein Audio, das Sie bereits hochgeladen oder erzeugt haben, direkt in eine Stimme. Kostenlos und 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…"
}

Die Antwort umfasst alle Felder aus §3.3 plus zwei schreibgeschützte Felder:

Feld Hinweise
reused true = dieses Audio war bereits Ihre Stimme und wird wiederverwendet
source_type Herkunft des Audios: 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"
  }
}

Fehler (der message wie zurückgegeben; direktes Anzeigen oder Lokalisieren wird empfohlen):

message Bedeutung
source audio not found Der Clip existiert nicht oder gehört Ihnen nicht
source audio is invalid Dieses Audio wird noch erzeugt / ist ein Zwischenprodukt und noch nicht nutzbar
source_song_id is required source_song_id wurde nicht gesendet

5. Stimmenliste / Details / Löschen

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": "Meine Stimme", "status": "ready", "audio_url": "…", "image_url": "…" } ],
    "total": 1
  }
}

Die Felder entsprechen genau §3.3. Gelöschte Stimmen werden standardmäßig nicht zurückgegeben.

5.2 Details

GET /api/music/voice-profile/{voice_id}

Liefert ein einzelnes Stimmenobjekt (data ist das Objekt selbst, kein Array). Läuft ein verstärkter Klon, kommen zusätzlich mit:

Feld Hinweise
progress_percent Ganzzahl von 0 bis 100
progress_stage Phasenkennung, zum Beispiel media_preparing
progress_message Fortschrittstext für die Anzeige beim Nutzer

5.3 Löschen

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. Mit einer Stimme covern (der Kernendpunkt)

POST /api/music/voice-profile/cover
Content-Type: application/json

Ein Senden erzeugt 2 Songs (wie die normale Generierung).

6.1 Zwei Szenarien

Szenario Auslöser Hinweise
A. Einen gewählten Song covern song_clip_id wurde gesendet Singt diesen Song mit Ihrer Stimme (Melodie / Rhythmus / Abschnitte bleiben wie im Original; die Stimme wird Ihre)
B. Einen neuen Song mit der Stimme singen song_clip_id nicht gesendet Nur die Stimme + Songtext (optional) + Stilvorgaben; das Modell komponiert in diesem Stil eine neue Melodie und singt sie

Das resolved_scene der Antwort gibt cover oder sing zurück, sodass Sie den gewählten Weg bestätigen können.

6.2 Anfragefelder

Feld Typ Erforderlich Standard Hinweise
model string Ja — Modellname für Kunden, siehe §6.5. Ohne Angabe kommt model is required (HTTP 500)
voice_id string Eines von beiden — Stimmen-ID (vp_…); muss status=ready sein
voice_clip_id string Eines von beiden — Die clip id der Stimme geht auch; werden beide gesendet, gewinnt voice_id
song_clip_id string Nein leer Clip id (song_id) des zu covernden Songs. Nicht gesendet = Szenario B
lyrics string Nein leer Vollständiger Songtext, Zeichen für Zeichen gesendet, ohne Umschreiben oder Kürzen; ≤ 3000 Zeichen
cover_requirements string Nein leer Cover-Vorgaben in natürlicher Sprache, zum Beispiel „klarer artikulieren". Sie werden an einen festen Prompt angehängt
style_requirements string Nein leer Stilvorgaben, zum Beispiel „langsamer Folk, Akustikgitarre"
title string Nein leer Der Titel dieser beiden Songs im Arbeitsbereich (beeinflusst die song_title späterer Abfragen)
negative_tags string Nein leer Ausgeschlossene Stile, zum Beispiel elektronisch, rap; ≤ 1000 Zeichen
vocal_gender string Nein leer m / f (akzeptiert auch male / female); leer = egal
duration number Nein leer Gewünschte Länge in Sekunden, eine Ganzzahl von 1 bis 480; leer = die Plattform entscheidet. Das praktische Minimum der Plattform liegt bei etwa 30 s: kleinere Werte ergaben in den Messungen weiterhin etwa 30 Sekunden lange Songs
audio_weight number Nein 0,85 Audio Influence, eine Dezimalzahl von 0 bis 1. Höher bleibt näher an der Stimmprobe
style_weight number Nein leer Stileinfluss, eine Dezimalzahl von 0 bis 1
weirdness_constraint number Nein leer Kreativität, eine Dezimalzahl von 0 bis 1 (bei Prozentangaben in Ihrer Oberfläche teilen Sie durch 100)
variety number Nein leer Vielfalt, eine Ganzzahl von 0 bis 4 (kein Prozentwert), nur bei v6-Modellen unterstützt
max_mode boolean Nein false Max Mode, Preis ×2
client_request_id string Nein leer Sende-Kennung, wird für die Fehlersuche in den serverseitigen Aufgaben-Datensatz geschrieben (keine Deduplizierung)

Senden Sie zusätzlich den Header X-Create-Ui-Client-Request-Id: <dieselbe Sende-id>: nur dieser wird in den serverseitigen Aufgaben-Datensatz geschrieben und dient als Schlüssel für die spätere Untersuchung (siehe §1.5).

Einheiten beachten: audio_weight / style_weight / weirdness_constraint sind Dezimalzahlen von 0 bis 1, variety ist eine Ganzzahl von 0 bis 4 und duration ist in Sekunden. Verwechslungen führen zu Ablehnungen oder seltsamen Ergebnissen.

Der Songtext ist in Szenario B optional (das Modell erledigt das selbst), aber senden Sie immer lyrics, wenn ein bestimmter Inhalt gesungen werden soll.

6.3 Antwort

{
  "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": "[Aufgabe] Dies ist ein Cover. … (der feste Strukturteil des Servers + Ihre Cover- / Stilvorgaben)"
      },
      {
        "song_id": "7c91…",
        "status": "processing",
        "model_version": "suno-v6",
        "audio_url": ""
      }
    ],
    "source_updates": []
  }
}

Kernpunkte:

  1. Identifizieren Sie die fertigen Songs über clips[].song_id (dieser Endpunkt liefert kein Feld id).
  2. Sie erhalten sofort 2 song_id-Werte, während status noch processing ist (das heißt nur „angenommen") und audio_url leer ist; vor dem Download müssen Sie bis completed abfragen. play_url ist der Vorschau-Stream der Plattform, kann schon beim Senden erscheinen und läuft ab.
  3. description ist der Prompt, den der Server letztlich sendet (der feste Strukturteil + Ihre cover_requirements / style_requirements); er ist bei der Ergebnisanalyse sehr nützlich.
  4. source_updates ist das Ergebnis der Medienverarbeitung des Servers und kann vom Client ignoriert werden.
  5. Die von Ihnen gesendete title wird in den serverseitigen Aufgaben-Datensatz geschrieben und erscheint in späteren Abfragen als song_title; dass clips[].song_title in der Sendeantwort leer ist, ist normal.

6.4 Fehler

{ "error": { "message": "diese Stimme existiert nicht oder wurde gelöscht (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
HTTP message Ursache
500 model is required Im Body fehlt model (ein Pflichtfeld für die Kanalwahl)
400 voice_id is required and must be a ready voice voice_id wurde nicht gesendet, oder ein Platzhalterwert / eine nicht bereite Stimme wurde gesendet
400 diese Stimme existiert nicht oder wurde gelöscht (voice_id=vp_xxx)… Die Stimme wurde gelöscht, existiert nicht oder gehört nicht zum aktuellen Konto. Nutzen Sie eine andere verfügbare Stimme oder legen Sie eine neue an
400 diese Stimme wurde gelöscht (voice_id=vp_xxx)… Beim direkten Übergeben von Material via voice_clip_id wurde die zugehörige Stimme gelöscht; Vorgehen wie oben
400 voice is not ready yet (status=processing) Die Stimme wird noch angelegt; warten Sie auf ready und versuchen Sie es erneut
400 song_clip_id must be a real completed clip song_clip_id ist ein Platzhalter / nicht abgeschlossen
400 song_clip_id must differ from the voice clip Das Cover-Ziel darf nicht die Stimmprobe selbst sein
400 audio_weight must be a number between 0 and 1 Falsche Einheit am Regler (ein Prozentwert wurde gesendet)
400 duration must be an integer between 1 and 480 seconds Die Länge ist keine Ganzzahl von 1 bis 480
400 vocal_gender must be one of m, f, male, female Ungültiger Geschlechtswert
400 variety must be an integer between 0 and 4 / variety is only supported on v6 models Ungültiger Vielfaltswert oder nicht unterstütztes Modell

Unzureichendes Guthaben liefert direkt beim Senden einen Abrechnungsfehler und hinterlässt nie eine halbfertige Aufgabe.

6.5 Verfügbare Modelle (Kundennamen)

Modellname Hinweise
suno-v6 Standard, empfohlen
suno-v6-wild Ausgelassener
suno-v6-mini Leichtgewichtig

Verwenden Sie die Modellnamen für Kunden (die oben). chirp-* sind interne Plattformnamen und sollten nicht direkt verwendet werden.


7. Fortschritt abfragen

7.1 Stapelabfrage (empfohlen)

POST /api/music/query
Content-Type: application/json

{ "model": "suno-v6", "song_ids": "id1,id2" }
[
  {
    "song_id": "0f2a…",
    "song_title": "Zwei Tiger",
    "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": "[Aufgabe] Dies ist ein Cover. … (der endgültige Prompt des Servers)",
    "style_tags": "…",
    "created_at": "2026-09-25T18:19:09.918Z",
    "video_url": ""
  }
]
Feld Hinweise
status Siehe §1.7; nur completed zählt als fertig
audio_url mp3-Direktlink; erst ab completed gefüllt
cover_url Adresse des Covers
duration Tatsächliche Länge in Sekunden
generation_type Songs aus einem Cover mit Stimme sind immer voice_profile_cover
play_url Signierte Vorschauadresse (läuft ab)
song_title Aufgabentitel (die von Ihnen gesendete title; ohne Angabe setzt der Server einen Wert)
lyrics / prompt Fertiger Songtext / Originaltext
description Der endgültig gesendete Prompt des Servers (inklusive festem Strukturteil)
style_tags Die letztliche Stilbeschreibung
created_at Eine ISO-8601-Zeichenkette (Achtung: anders als die Unix-Sekunden des Detail-Endpunkts)

Abfrageempfehlung: alle 5–10 Sekunden, mit einem Gesamt-Timeout von 10–15 Minuten (das langsamste gemessene kalte Konto brauchte etwa 4,5 Minuten; sehr wenige brauchen länger). Beurteilen Sie den Abschluss nicht am leeren audio_url, sondern am status.

Kompatibilitätshinweis: Dieser Endpunkt identifiziert Songs über song_id; in einigen frühen Antworten tauchte ein Feld id auf, daher ist row.song_id || row.id die sichere Lesart.

7.2 Details zu einem Song

GET /api/music/songs/{song_id}
{
  "success": true,
  "data": {
    "song_id": "0f2a…",
    "title": "Zwei Tiger",
    "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": "Zwei Tiger",
      "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 Meine Werke

GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=Stichwort

Paginierungsparameter: p (Seitennummer ab 1) / page_size (Einträge pro Seite; ps ist eine kompatible Schreibweise). Optional status und q (ein Titelstichwort). Standardmäßig absteigend nach Erstellzeit sortiert.

{
  "success": true,
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "0f2a…",
        "title": "Zwei Tiger",
        "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
      }
    ]
  }
}

Mit generation_type=voice_profile_cover unterscheiden Sie „Songs aus einem Cover mit Stimme" von anderen Generierungsergebnissen.


8. Die fertigen Songs herunterladen

8.1 Die mp3 direkt holen (empfohlen, kostenlos)

Alle drei gehen; wählen Sie eine:

  1. Das audio_url aus dem Abfrageergebnis nutzen (ein Direktlink zum Objektspeicher, am einfachsten).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → liefert direkt den Audio-Byte-Stream (der Dateiname steht schon in Content-Disposition).
  3. POST /api/music/download-url (um eine signierte temporäre Adresse zu erhalten).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song.mp3

kind-Werte: mp3 (entspricht song) / playback (Streaming-Wiedergabe) / wav / video / lyrics / timestamped_lyrics. timestamped_lyrics (.lrc) ist derzeit nur für manche Songs verfügbar; wenn es fehlschlägt, erzeugen Sie die Datei selbst mit der API für Songtexte mit Zeitstempeln. Die Antwort ist der reine Datei-Byte-Stream, mit bereits gesetztem Content-Type und Content-Disposition (Dateiname); die von GET /api/music/songs/{song_id} gelieferten wav_url / video_url sind derselbe Einstieg mit kind=wav|video.

8.2 In wav umwandeln / Songtext / Metadaten holen (kostenpflichtig)

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. Preise abfragen

GET /api/pricing/catalog

Ein öffentlicher Endpunkt ohne Authentifizierung. Alle Einzelpreise, die der Kunde anzeigen muss, stehen in data.catalog.meta (Zeichenketten):

Schlüssel Bedeutung Aktueller Wert
generation_price Normale Generierung 0,6
voice_generation_price Grundpreis eines Covers mit Stimme 1,2
max_mode_factor Max-Mode-Multiplikator 2
enhanced_upload_price Verstärkter Klon / verstärkter Upload 10
voice_auto_verify_price Automatische Stimmprüfung 5
voice_long_term_clone_price Langfristiges Stimmklonen 5

Die Preise werden im Backoffice angepasst, lesen Sie sie also live, statt sie im Client fest zu verdrahten. Die tatsächliche Cover-Buchung = voice_generation_price × (bei wahrem max_mode nochmals max_mode_factor).


10. Grenzen und Hinweise

  1. Upload-Größe: ≤ 10 MB (der Server akzeptiert mehr, aber das Eingangs-Gateway schneidet übergroße Bodies bei 10 MiB ab, was als „von Suno abgelehnt" erscheint; blocken Sie es zuerst auf Ihrer Seite).
  2. Probendauer: mindestens 6 s, 10–60 s empfohlen; zu kurz und die Plattform lehnt ab.
  3. Probeninhalt: sauberer Gesang; vermeiden Sie alles, was einer vorhandenen Aufnahme stark ähnelt (der Katalogvergleich lehnt es ab).
  4. Textgrenzen: lyrics ≤ 3000 Zeichen; für style_requirements / negative_tags / title empfehlen sich 1000 / 1000 / 100 Zeichen (Stil- und Cover-Vorgaben werden an den Prompt angehängt, halten Sie die Summe unter 3000 Zeichen).
  5. Songtexte werden nicht umgeschrieben: was Sie übergeben, wird gesungen (Zeichen für Zeichen), ohne lokales Kürzen.
  6. Jeder Song liefert 2 Spuren; gehen Sie nicht von einem einzelnen Ergebnis aus.
  7. Das Quellaudio bleibt dauerhaft erhalten: Das Löschen einer Stimme räumt ihr Quellaudio nicht weg; das hält spätere Cover möglich und die Compliance nachvollziehbar.
  8. Die Stimme muss bereit sein: Eine Stimme im Status processing kann nicht zum Covern genutzt werden.
  9. Anfrage-Timeout: Bei einem kalten Konto dauerte das erste Senden in unseren Messungen bis zu etwa 4,5 Minuten, setzen Sie den Client-Timeout also auf ≥ 6 Minuten. Cover deduplizieren nicht auf Anfrageebene, prüfen Sie daher nach einem Timeout, ob schon ein neuer Song aufgetaucht ist (§1.5), bevor Sie erneut senden.
  10. Eigentum an der Stimme: Stimmen gehören ihrem Ersteller; ein Cover akzeptiert nur bereite und nicht gelöschte Stimmen. Eine nicht existierende, gelöschte oder zu einem anderen Konto gehörende Stimme liefert 400: diese Stimme existiert nicht oder wurde gelöscht (voice_id=…).

11. Häufige Fragen (FAQ)

F1. Kostet das Anlegen einer Stimme Geld? Standard-Anlegen und „aus vorhandenem Audio anlegen" sind kostenlos; berechnet werden nur Cover (1,2 ¥ / MAX 2,4 ¥) und verstärkte Klone (standardmäßig 10 ¥).

F2. Kann ich einen fertigen Song mit Begleitung als Stimmprobe nutzen? Nicht empfehlenswert. Alles mit Musik oder starke Ähnlichkeit mit einer vorhandenen Aufnahme im Katalog lehnt die Plattform ab (This audio matches an existing recording in our catalog.). Nutzen Sie eine rein vokale, trockene Aufnahme.

F3. Warum ist audio_url nach dem Senden eines Covers leer? Das Senden bedeutet nur, dass es angenommen wurde, und status ist noch processing. Eine abspielbare/herunterladbare Adresse erscheint erst, wenn Sie /api/music/query bis status=completed abgefragt haben.

F4. Muss ich in Szenario B (ohne song_clip_id) einen Songtext senden? Optional. Senden Sie lyrics, um einen bestimmten Inhalt zu singen; ohne erledigt das Modell es selbst, aber mit weniger Kontrolle.

F5. Kann vom Kunden hochgeladenes Audio direkt als Stimme dienen? Ja: über die file_url-Form von create, oder indem Sie es zuerst als Song hochladen und dann create-from-clip aufrufen.

F6. Wird bei einem Fehlschlag Geld erstattet? Eine rundheraus abgelehnte Anfrage (falsche Parameter / Plattformfehler) wird nicht berechnet, wie gemessen; eine angenommene, letztlich gescheiterte Aufgabe gibt den vorab gebuchten Betrag zurück. Bei endgültigem Fehlschlag meldet die Aufgabe status=failed plus error_message.

F7. Kann ich nach dem Löschen einer Stimme früher damit erzeugte Songs noch hören? Ja. Das Löschen betrifft nur, ob diese Stimme für neue Cover genutzt werden kann.

F8. Wie lange kann ein Song auf einmal gecovert werden? duration nimmt 1–480 Sekunden; ohne Angabe entscheidet die Plattform anhand des Originalsongs / Materials. Beachten Sie: Die fertigen Spuren der Plattform sind mindestens etwa 30 Sekunden lang; mit einem kleineren Wert kamen in den Messungen weiterhin 29,96 / 29,76 Sekunden heraus.


Anhang A: vollständiges Beispiel (Node.js, mit Abfrage und Download)

const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };

// ① Stimme anlegen (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, ... }
}

// ② Covern
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: "langsamer Folk, Akustikgitarre",
      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 }] }
}

// ③ Bis zum Abschluss abfragen (alle 5 Sekunden, höchstens 15 Minuten)
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(); // nacktes Array
    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");
}

// ④ Herunterladen
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", "Meine Stimme");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nSongtext…");
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`);
}

Anhang B: Änderungsprotokoll

Datum Änderung
2026-10-15 Löschsemantik klar benannt (§5.3); ein Cover mit einer „gelöschten / unberechtigten" voice_id liefert nun vor jeder Vorabbuchung 400, Fehlertabelle und FAQ wurden angeglichen (zusammen mit dem an diesem Tag ausgelieferten Lösch-Gate für Stimmen)
2026-10-13 Oben den Hinweis „warum wir diese Kette empfehlen" ergänzt: Nach den realen Bewertungen vieler Nutzer behalten Songs aus dieser Kette die Originalstimme deutlich besser
2026-09-26 Erste Version: Stimme anlegen (drei Eingabeformen) / aus vorhandenem Audio anlegen / Liste, Details, Löschen / Covern mit Stimme (Szenarien A und B) / Fortschrittsabfrage / Download / Preisauslesen, mit gemessenen Belegen
WeiterStil-Boost-API

API-Schlüssel erhalten

Erstellen Sie nach der Anmeldung einen API-Schlüssel in der Konsole. Jede Generierung kostet 0,6 ¥ und liefert 2 Tracks, Downloads sind unbegrenzt und eine Telefonnummer ist nicht erforderlich.

API-Schlüssel holen Zurück zur Übersicht