【Önerilir】 Ses profili API'si

2026-09-18 tarihinde güncellendi · Suno-API ekibi

✅ Yeni entegrasyonlar için bu yolu öneriyoruz. Çok sayıda kullanıcının gerçek değerlendirmelerine göre bu yolla üretilen şarkılar orijinal sesi iyi korur: bitmiş kayıttaki vokal, yüklediğiniz örnekteki kişiye daha yakın çıkar. Bu nedenle şu anda müşterilere önerdiğimiz yol budur.

Karşılaştırma: önceki ses klonlama ve belirtilen sesle üretim API'si hâlâ çalışır, ancak menüde "önerilmez" olarak işaretlidir ve yeni entegrasyonlar için önerilmez.

Not: bu belge yalnızca çağırmanız gereken uç noktaları anlatır. Malzeme işleme, görev planlama ve içerik denetimi sunucu tarafında otomatik yapılır; istemci bunları uygulamaz.


0. Beş dakikada başlangıç

Dört adım, tek bir vokal örneğinden iki bitmiş şarkı çıkarmaya yeter.

① Ses oluştur    POST /api/music/voice-profile/create      → voice_id al (status=ready)
② Cover'la       POST /api/music/voice-profile/cover       → hemen 2 song_id al
③ İzle           POST /api/music/query                     → status=completed olana kadar yokla
④ İndir          GET  /api/music/download?song_id=…&kind=mp3

En küçük çalışan örnek (curl):

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

# ① Sesi oluştur (bir vokal örneği yükleyin; 10 sn ve üzeri, 10 MB altı önerilir)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" \
  -F "title=Sesim" \
  -F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}

# ② Bu sesle bir şarkıyı cover'la (song_clip_id = cover'lanacak şarkının clip id'si)
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]\nsarki sozu…",
        "style_requirements": "yavaş folk, akustik gitar",
        "audio_weight": 0.85,
        "max_mode": false
      }'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}

# ③ Yokla (birden çok id'yi virgülle ayırarak tek seferde gönderin)
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"}'

# ④ Bitince mp3'ü indirin (dosya yalnızca status=completed iken gelir)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song1.mp3

1. Ortak kurallar

1.1 Alan adı ve ortam

Ortam Base URL Amaç
Üretim https://www.suno-api.io Gerçek müşteri trafiği

Aşağıdaki tüm yollar Base URL'ye göre görelidir; örneğin POST /api/music/voice-profile/create için tam adres https://www.suno-api.io/api/music/voice-profile/create olur.

1.2 Kimlik doğrulama

Tüm uç noktalar aynı istek başlığını kullanır; değeri konsolda oluşturduğunuz API anahtarıdır:

Authorization: Bearer sk-xxxxxxxx

1.3 İstek gövdesi biçimleri

1.4 İki yanıt kabuğu (müşterinin bilmesi gereken yalnızca bu ikisi)

"Ses yönetimi" uç noktaları (create / create-from-clip / list / detail / delete) iş kabuğunu kullanır:

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

"Sesle cover" üretim kanalından geçer ve üretim kabuğunu kullanır: başarı code/message/data, hata ise error nesnesidir:

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

Nasıl karar verilir: önce HTTP durum koduna, sonra success === false değerine, en son code !== 200 veya error varlığına bakın. İş hatası HTTP'nin 200 dışında olmasını garanti etmez (ses yönetimi uç noktaları hata durumunda da HTTP 200 döner), bu yüzden yalnızca durum koduna bakamazsınız.

1.5 Tekrarsızlık (idempotency)

Ses oluşturma ("mevcut sesten oluşturma" dâhil) gerçekten idempotenttir: aynı anahtar altında aynı client_request_id yeniden gönderildiğinde yalnızca bir ses oluşturulur ve ikinci deneme doğrudan ilk sonucu döndürür (success=true, aynı voice_id). Amaç, istemcinin kendi id'sini (örneğin bir UUID) üretip zaman aşımından sonra yeniden denerken aynı değeri kullanmasıdır.

Cover gönderimi istek düzeyinde tekilleştirme yapmaz (ücretli bir üretimdir), iki noktaya dikkat edin:

  1. Gönderim kimliği X-Create-Ui-Client-Request-Id: <gönderim id'niz> başlığına konur. Sunucu tarafındaki görev kaydına yazılır ve sonraki incelemeyi kolaylaştırır; ancak çift ücretlendirmeyi engellemez.
  2. Zaman aşımı ≠ başarısızlık: istek kabul edilmiş ve üretimde olabilir. Yeniden denemeden önce GET /api/music/songs?p=1&page_size=20 ile (sayfalama parametreleri p / page_size; uyumlu yazım ps de olur) generation_type=voice_profile_cover olan yeni bir şarkının çıkıp çıkmadığını kontrol edin ve yalnızca yoksa aynı isteği yeniden gönderin.

create ve create-from-clip gövdeleri de client_request_id alanını kabul eder (§3 ve §4).

1.6 Ücretlendirme özeti

İşlem Uç nokta Fiyat Notlar
Ses oluşturma (normal) POST /api/music/voice-profile/create Ücretsiz Örnek yüklemek Suno kotası tüketmez
Ses oluşturma (mevcut sesten) POST /api/music/voice-profile/create-from-clip Ücretsiz Sunucu yalnızca malzeme referansı kaydeder, yeniden yükleme yapmaz
Güçlendirilmiş klon Aynısı, enhanced=true "Güçlendirilmiş yükleme fiyatı" (varsayılan çağrı başına 10 ¥) Eşzamansız değil; hata olursa otomatik iade
Sesle cover POST /api/music/voice-profile/cover Çağrı başına 1,2 ¥; max_mode=true ise 2,4 ¥ Bir çağrıda 2 şarkı döner
Sorgulama / listeleme / ayrıntı / silme — Ücretsiz
İndirme (doğrudan bağlantıyı kendiniz alın) Yanıttaki audio_url Ücretsiz Verilen adresi oynatır
İndirme (wav'a çevirme / şarkı sözü vb.) POST /api/music/free2 Başarılı şarkı başına 0,2 ¥ §8'e bakın

Fiyatlar her an herkese açık bir uç noktadan okunabilir, bu yüzden sabit değer yazmayın (§9):

curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
#   "generation_price": "0.6",
#   "voice_generation_price": "1.2",      ← sesle cover'ın temel fiyatı
#   "max_mode_factor": "2",
#   "enhanced_upload_price": "10",        ← güçlendirilmiş klon fiyatı
#   "voice_auto_verify_price": "5",
#   "voice_long_term_clone_price": "5"
# }

Cover peşin ücret + hata durumunda iade ile çalışır:

1.7 Durum sözlüğü

Sesin status değeri:

Değer Anlamı Cover'da kullanılabilir
ready Hazır ✅
processing Yalnızca güçlendirilmiş klonda (enhanced=true) çıkar; işleniyor ❌ (ready bekle)
failed Oluşturma başarısız; error_message'a bakın; güçlendirilmiş klonda ücret zaten iade edildi ❌

Şarkının status değeri (sorgu uç noktalarının döndürdüğü değer):

Değer Anlamı İndirilebilir
submitted / queued / processing Üretiliyor (ön dinleme akışı zaten olabilir) ❌
completed Bitti ✅
failed Başarısız; ücret iade edildi ❌

2. Uç noktalara genel bakış

# Yöntem Yol İşlev Ücret
1 POST /api/music/voice-profile/create Ses oluşturma (yükleme / URL / base64) Ücretsiz (enhanced=true hariç)
2 POST /api/music/voice-profile/create-from-clip Kendi sesinizden ses oluşturma Ücretsiz
3 GET /api/music/voice-profile/list Ses listesi Ücretsiz
4 GET /api/music/voice-profile/{voice_id} Ses ayrıntısı (güçlendirilmiş klon ilerlemesi dâhil) Ücretsiz
5 POST /api/music/voice-profile/delete Ses silme Ücretsiz
6 POST /api/music/voice-profile/cover Sesle cover / yeni şarkı söyleme 1,2 ¥ (MAX 2,4)
7 POST /api/music/query Toplu şarkı durumu sorgusu Ücretsiz
8 GET /api/music/songs/{song_id} Tek şarkı ayrıntısı Ücretsiz
9 GET /api/music/download Bitmiş dosyayı indirme Ücretsiz (mp3/oynatma bağlantısı)
10 POST /api/music/free2 wav'a çevirme / şarkı sözü vb. Başarılı şarkı başına 0,2 ¥
11 POST /api/music/free2/cached Arşivlenmiş indirme adresini alma Ücretsiz
12 GET /api/music/songs Eserlerim, sayfalı Ücretsiz

3. Ses oluşturma

POST /api/music/voice-profile/create

Bir vokal ses parçasını "ses" olarak kaydedin ve voice_id alın. Platform için ses, "bir ses dosyası + katalogdaki clip'i" demektir; bu yüzden oluşturma başarılı olduğunda o kaynak ses kalıcı olarak saklanır (sonraki cover'lar için).

3.1 Üç giriş biçimi (birini seçin)

Biçim A: multipart dosya yükleme (önerilir)

Content-Type: multipart/form-data

file=<ses ikili verisi>      # zorunlu
title=<ses adı>              # isteğe bağlı; boşsa uzantısız dosya adı
file_name=<özgün dosya adı>
source_file_name=<özgün dosya adı>
source_kind=upload|record    # isteğe bağlı, kaynak işareti (yükleme / kayıt); varsayılan upload
enhanced=false|true          # isteğe bağlı, true = güçlendirilmiş klon (§3.5'e bakın)
client_request_id=<idempotency anahtarı>   # isteğe bağlı
voice_id=<kendi ID'niz>      # isteğe bağlı, genelde kullanılmaz
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=Sesim" \
  -F "source_kind=upload"

Biçim B: JSON + herkese açık ses URL'si

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

Biçim C: JSON + base64

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

3.2 Ses gereksinimleri

Konu Gereksinim Notlar
Boyut ≤ 10 MB Sınırın üstünde ağ geçidi gövdeyi keser ve "Suno reddetti" gibi görünür; önce sıkıştırın veya kısaltın
Süre En az 6 sn; 10–60 sn önerilir 6 sn'nin altında platform reddeder: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds.
Biçim mp3 / wav / m4a / aac / flac / ogg Dosya uzantısına göre belirlenir
İçerik Temiz vokal; bitmiş cover'lardan ve eşlikli orijinallerden kaçının Katalogdaki mevcut bir kayda çok benzeyen ses reddedilir: This audio matches an existing recording in our catalog. (ölçüldü)

3.3 Yanıt

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

Alan açıklaması (create / list / detail aynı alan kümesini paylaşır):

Alan Tür Notlar
voice_id string Ses ID'si; sonraki cover'lar bunu kullanır
clip_id / song_id string Bu ses parçasının Suno tarafındaki clip id'si (ikisi aynı); sorun giderme için
account_id string Taşıyan hesap kimliği (sorun giderme için; istemcinin umurunda değil)
title string Ses adı
source_file_name string Özgün dosya adı
audio_url string Kaynak sese uzun vadeli doğrudan bağlantı, ön dinlemede kullanılabilir; kalıcı olarak saklanır
image_url string Ses kapağı (Suno'nun vokal ses için ürettiği kapak); kapak yoksa bu anahtar hiç görünmez
duration_s number Ses örneğinin saniye cinsinden uzunluğu
enhanced bool Güçlendirilmiş klonla mı oluşturuldu
source_kind string upload / record / clip (mevcut sesten)
status string ready / processing / failed
error_message string Başarısızlık nedeni; yalnızca failed durumunda
task_id number Güçlendirilmiş klonun alttaki görev numarası; yalnızca enhanced=true iken
pre_consumed_quota number Peşin alınan kota (yalnızca güçlendirilmiş klonda)
created_at / updated_at number Unix saniyesi

created_at / updated_at saniye düzeyinde zaman damgalarıdır (10 hane), milisaniye değildir.

3.4 Sık görülen hatalar

HTTP message Neden ve çözüm
200 one of file_path, file_base64, or file_url is required Ses içeriği eklenmedi
200 Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. Örnek çok kısa; ≥6 sn (≥10 sn önerilir) kullanın
200 This audio matches an existing recording in our catalog. Örnek katalogdaki mevcut kayda çok benziyor; farklı, temiz bir kuru vokal kullanın
200 upload succeeded without clip or account identity Platform yanıtı anormal; yeniden deneyin
200 audio file exceeds 30 MB limit Sunucu sınırının üstünde (müşteri tarafında 10 MB'ta kalın)
401 invalid token API anahtarı yanlış

3.5 Güçlendirilmiş klon (enhanced=true)

"Ses örneğinin kendisi telifli şarkı sözü taşıyor / güçlendirilmiş yükleme gerekiyor" durumları için. Fiyat güçlendirilmiş yükleme fiyatıdır (varsayılan çağrı başına 10 ¥, hata olursa otomatik iade):

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

4. Mevcut sesten ses oluşturma

Yeniden yüklemek istemiyorsanız: zaten yüklediğiniz veya ürettiğiniz bir sesi doğrudan sese kopyalayın. Ücretsiz ve 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…"
}

Yanıt, §3.3'teki tüm alanlar artı iki salt okunur alandır:

Alan Notlar
reused true = bu ses zaten sizin sesinizdi ve yeniden kullanılıyor
source_type Sesin kaynağı: 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"
  }
}

Hatalar (message döndüğü gibi; doğrudan göstermeniz veya yerelleştirmeniz önerilir):

message Anlamı
source audio not found Clip yok veya size ait değil
source audio is invalid O ses hâlâ üretiliyor / ara ürün ve henüz kullanılamaz
source_song_id is required source_song_id gönderilmedi

5. Ses listesi / ayrıntı / silme

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

Alanlar tam olarak §3.3'teki gibidir. Silinmiş sesler varsayılan olarak dönmez.

5.2 Ayrıntı

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

Tek bir ses nesnesi döner (data nesnenin kendisidir, dizi değil). Güçlendirilmiş klon sürerken ek olarak:

Alan Notlar
progress_percent 0–100 arası tam sayı
progress_stage Aşama kimliği, örneğin media_preparing
progress_message Kullanıcıya gösterilecek ilerleme metni

5.3 Silme

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. Sesle cover (çekirdek uç nokta)

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

Bir gönderim 2 şarkı üretir (normal üretimdeki gibi).

6.1 İki senaryo

Senaryo Tetikleyici Notlar
A. Seçilen şarkıyı cover'lama song_clip_id gönderildi O şarkıyı sizin sesinizle söyler (melodi / ritim / bölümler orijinaldeki gibi kalır; vokal sizin sesiniz olur)
B. Sesle yeni şarkı söyleme song_clip_id gönderilmedi Yalnızca ses + şarkı sözü (isteğe bağlı) + stil gereksinimleri verilir; model o stilde yeni bir melodi besteler ve söyler

Yanıttaki resolved_scene cover veya sing döner, böylece hangi yoldan gidildiğini görebilirsiniz.

6.2 İstek alanları

Alan Tür Zorunlu Varsayılan Notlar
model string Evet — Müşteriye dönük model adı, §6.5'e bakın. Gönderilmezse model is required (HTTP 500) döner
voice_id string İkisinden biri — Ses ID'si (vp_…); status=ready olmalı
voice_clip_id string İkisinden biri — Sesin clip id'si de kullanılabilir; ikisi de gönderilirse voice_id kazanır
song_clip_id string Hayır boş Cover'lanacak şarkının clip id'si (song_id). Gönderilmezse senaryo B
lyrics string Hayır boş Tam şarkı sözü, karakter karakter gönderilir, yeniden yazılmaz veya kısaltılmaz; ≤ 3000 karakter
cover_requirements string Hayır boş Doğal dilde cover yönergeleri, örneğin "daha net telaffuz et". Sabit prompt'a eklenir
style_requirements string Hayır boş Stil gereksinimleri, örneğin "yavaş folk, akustik gitar"
title string Hayır boş Bu iki şarkının çalışma alanındaki başlığı (sonraki sorgularda dönen song_title'ı etkiler)
negative_tags string Hayır boş Hariç tutulacak stiller, örneğin elektronik, rap; ≤ 1000 karakter
vocal_gender string Hayır boş m / f (male / female de kabul edilir); boş = fark etmez
duration number Hayır boş Saniye cinsinden istenen uzunluk, 1–480 arası tam sayı; boş = platform karar verir. Platformun pratikteki alt sınırı yaklaşık 30 sn: daha küçük değerlerde ölçümlerde yine yaklaşık 30 saniyelik şarkılar çıktı
audio_weight number Hayır 0,85 Audio Influence, 0–1 arası ondalık. Yükseldikçe ses örneğine yaklaşır
style_weight number Hayır boş Stil etkisi, 0–1 arası ondalık
weirdness_constraint number Hayır boş Yaratıcılık, 0–1 arası ondalık (arayüz yüzde kullanıyorsa 100'e bölün)
variety number Hayır boş Çeşitlilik, 0–4 arası tam sayı (yüzde değil), yalnızca v6 modellerinde
max_mode boolean Hayır false Max Mode, fiyat ×2
client_request_id string Hayır boş Gönderim kimliği, inceleme için sunucu görev kaydına yazılır (tekilleştirme yapmaz)

Ayrıca X-Create-Ui-Client-Request-Id: <aynı gönderim id'si> başlığını da göndermenizi öneririz: yalnızca bu, sunucu tarafındaki görev kaydına yazılır ve sonraki inceleme için ana anahtar olur (§1.5'e bakın).

Birim uyarısı: audio_weight / style_weight / weirdness_constraint 0–1 arası ondalık, variety 0–4 arası tam sayı, duration ise saniyedir. Karıştırmak reddedilmeye veya tuhaf sonuca yol açar.

Senaryo B'de şarkı sözü isteğe bağlıdır (model kendi halleder), ancak belirli bir içeriğin söylenmesi gerekiyorsa lyrics mutlaka gönderin.

6.3 Yanıt

{
  "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": "[Görev] Bu bir cover'dır. … (sunucunun sabit yapı bölümü + sizin girdiğiniz cover / stil gereksinimleri)"
      },
      {
        "song_id": "7c91…",
        "status": "processing",
        "model_version": "suno-v6",
        "audio_url": ""
      }
    ],
    "source_updates": []
  }
}

Önemli noktalar:

  1. Bitmiş kayıtları clips[].song_id ile tanımlayın (bu uç nokta id alanı döndürmez).
  2. Hemen 2 song_id alırsınız, ancak status hâlâ processing (yalnızca kabul edildiği anlamına gelir) ve audio_url boştur; indirmeden önce completed olana kadar yoklamalısınız. play_url platformun ön dinleme akışıdır, gönderim aşamasında bile görünebilir ve süresi dolar.
  3. description, sunucunun sonunda gönderdiği prompt'tur (sabit yapı bölümü + girdiğiniz cover_requirements / style_requirements); sonucu incelerken çok işe yarar.
  4. source_updates sunucunun malzeme işleme sonucudur, istemci yok sayabilir.
  5. Gönderdiğiniz title sunucu görev kaydına yazılır ve sonraki sorgularda song_title olarak görünür; gönderim yanıtındaki clips[].song_title genelde boştur ve bu normaldir.

6.4 Hatalar

{ "error": { "message": "bu ses yok veya silinmiş (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
HTTP message Neden
500 model is required Gövdede model yok (kanal seçimi için zorunlu alan)
400 voice_id is required and must be a ready voice voice_id gönderilmedi veya yer tutucu / hazır olmayan bir ses gönderildi
400 bu ses yok veya silinmiş (voice_id=vp_xxx)… Ses silinmiş, yok veya geçerli hesaba ait değil. Başka bir kullanılabilir ses kullanın ya da yeni bir ses oluşturun
400 bu ses silinmiş (voice_id=vp_xxx)… Malzemeyi voice_clip_id ile doğrudan verirken o malzemenin sesi silinmiş; çözüm yukarıdakiyle aynı
400 voice is not ready yet (status=processing) Ses hâlâ oluşturuluyor; ready olmasını bekleyip yeniden deneyin
400 song_clip_id must be a real completed clip song_clip_id yer tutucu / tamamlanmamış
400 song_clip_id must differ from the voice clip Cover hedefi ses örneğinin kendisi olamaz
400 audio_weight must be a number between 0 and 1 Kaydırıcı birimi yanlış (yüzde gönderildi)
400 duration must be an integer between 1 and 480 seconds Süre 1–480 arası tam sayı değil
400 vocal_gender must be one of m, f, male, female Geçersiz cinsiyet değeri
400 variety must be an integer between 0 and 4 / variety is only supported on v6 models Geçersiz çeşitlilik değeri veya desteklenmeyen model

Yetersiz bakiye gönderim aşamasında doğrudan ücretlendirme hatası verir ve yarım kalmış görev bırakmaz.

6.5 Kullanılabilir modeller (müşteriye dönük adlar)

Model adı Notlar
suno-v6 Varsayılan, önerilir
suno-v6-wild Daha serbest
suno-v6-mini Hafif

Müşteriye dönük model adlarını (yukarıdakileri) kullanın. chirp-* platformun iç adlarıdır, doğrudan kullanılmamalıdır.


7. İlerlemeyi izleme

7.1 Toplu sorgu (önerilir)

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

{ "model": "suno-v6", "song_ids": "id1,id2" }
[
  {
    "song_id": "0f2a…",
    "song_title": "İki Kaplan",
    "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": "[Görev] Bu bir cover'dır. … (sunucunun son prompt'u)",
    "style_tags": "…",
    "created_at": "2026-09-25T18:19:09.918Z",
    "video_url": ""
  }
]
Alan Notlar
status §1.7'ye bakın; yalnızca completed bitmiş sayılır
audio_url mp3 doğrudan bağlantısı; yalnızca completed sonrası dolar
cover_url Kapak adresi
duration Gerçek uzunluk, saniye
generation_type Sesle cover'dan çıkan şarkılar her zaman voice_profile_cover
play_url İmzalı ön dinleme adresi (süresi dolar)
song_title Görev başlığı (gönderdiğiniz title; göndermediyseniz sunucu bir varsayılan koyar)
lyrics / prompt Bitmiş şarkı sözü / özgün söz metni
description Sunucunun sonunda gönderdiği prompt (sabit yapı bölümü dâhil)
style_tags Nihai stil açıklaması
created_at ISO 8601 dizesi (ayrıntı uç noktasındaki Unix saniyesinden farklı olduğuna dikkat)

Yoklama tavsiyesi: 5–10 saniyede bir, toplam 10–15 dakika zaman aşımı (en yavaş ölçülen soğuk hesap yaklaşık 4,5 dakika sürdü; çok azı daha uzun). Bittiğini audio_url boş mu diye değil, status ile değerlendirin.

Uyumluluk notu: bu uç nokta şarkıları song_id ile tanımlar; erken bazı yanıtlarda id alanı göründü, bu yüzden row.song_id || row.id güvenli okuma yoludur.

7.2 Tek şarkı ayrıntısı

GET /api/music/songs/{song_id}
{
  "success": true,
  "data": {
    "song_id": "0f2a…",
    "title": "İki Kaplan",
    "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": "İki Kaplan",
      "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 Eserlerim

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

Sayfalama parametreleri: p (sayfa numarası, 1'den başlar) / page_size (sayfa başına kayıt; uyumlu yazım ps). İsteğe bağlı status ve q (başlıkta anahtar kelime). Varsayılan olarak oluşturma zamanına göre azalan sıralama.

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

generation_type=voice_profile_cover ile "sesle cover'dan çıkan şarkılar"ı diğer üretim sonuçlarından ayırabilirsiniz.


8. Bitmiş şarkıları indirme

8.1 mp3'ü doğrudan almak (önerilir, ücretsiz)

Üçü de olur; birini seçin:

  1. Sorgu sonucundaki audio_url'yi kullanmak (nesne deposuna doğrudan bağlantı, en kolayı).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → doğrudan ses bayt akışını döndürür (dosya adı Content-Disposition içinde gelir).
  3. POST /api/music/download-url (imzalı geçici adres almak için).
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 değerleri: mp3 (song ile aynı) / playback (akış oynatma) / wav / video / lyrics / timestamped_lyrics. timestamped_lyrics (.lrc) şu anda yalnızca bazı şarkılarda var; başarısız olursa dosyayı zaman damgalı şarkı sözü API'si ile kendiniz üretin. Yanıt doğrudan dosya bayt akışıdır, Content-Type ve Content-Disposition (dosya adı) hazırdır; GET /api/music/songs/{song_id} çıktısındaki wav_url / video_url aynı girişin kind=wav|video hâlidir.

8.2 wav'a çevirme / şarkı sözü / üst veri (ücretli)

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. Fiyat sorgulama

GET /api/pricing/catalog

Kimlik doğrulama gerektirmeyen herkese açık bir uç nokta. Müşteriye gösterilecek tüm birim fiyatlar data.catalog.meta içindedir (dizeler):

Anahtar Anlamı Güncel değer
generation_price Normal üretim 0,6
voice_generation_price Sesle cover'ın temel fiyatı 1,2
max_mode_factor Max Mode çarpanı 2
enhanced_upload_price Güçlendirilmiş klon / güçlendirilmiş yükleme 10
voice_auto_verify_price Otomatik ses doğrulama 5
voice_long_term_clone_price Uzun vadeli ses klonlama 5

Fiyatlar arka ofisten ayarlanır, bu yüzden istemcide sabit yazmak yerine canlı okuyun. Cover'ın gerçek ücreti = voice_generation_price × (max_mode doğruysa ayrıca max_mode_factor).


10. Sınırlar ve uyarılar

  1. Yükleme boyutu: ≤ 10 MB (sunucu daha fazlasını kabul eder ama giriş ağ geçidi 10 MiB'da büyük gövdeleri keser ve bu "Suno reddetti" gibi görünür; kendi tarafınızda önce engelleyin).
  2. Örnek süresi: en az 6 sn, 10–60 sn önerilir; çok kısa olursa platform reddeder.
  3. Örnek içeriği: temiz vokal; mevcut bir kayda çok benzeyen her şeyden kaçının (katalog karşılaştırması reddeder).
  4. Metin sınırları: lyrics ≤ 3000 karakter; style_requirements / negative_tags / title için sırasıyla 1000 / 1000 / 100 karakter önerilir (stil ve cover gereksinimleri prompt'a eklenir, toplamı 3000 karakterin altında tutun).
  5. Şarkı sözü yeniden yazılmaz: ne verirseniz o söylenir (karakter karakter), yerel kısaltma yapılmaz.
  6. Her şarkı 2 kayıt üretir; tek sonuç varsaymayın.
  7. Kaynak ses kalıcı olarak saklanır: sesi silmek kaynak sesi temizlemez; bu, sonraki cover'ları mümkün ve uyumu izlenebilir tutar.
  8. Ses ready olmalı: processing durumundaki bir ses cover'da kullanılamaz.
  9. İstek zaman aşımı: soğuk hesapta ilk gönderim ölçümlerde yaklaşık 4,5 dakikaya kadar sürdü, istemci zaman aşımını ≥ 6 dakika yapın. Cover'lar istek düzeyinde tekilleştirme yapmaz, bu yüzden zaman aşımından sonra yeni bir şarkının çıkıp çıkmadığını kontrol edip (§1.5) yeniden göndermeye karar verin.
  10. Ses sahipliği: sesler onu oluşturana aittir; cover yalnızca hazır ve silinmemiş sesleri kabul eder. Var olmayan, silinmiş veya başka bir hesaba ait ses 400 döner: bu ses yok veya silinmiş (voice_id=…).

11. Sık sorulan sorular (FAQ)

S1. Ses oluşturmak para tutar mı? Normal oluşturma ve "mevcut sesten oluşturma" ücretsizdir; yalnızca cover'lar (1,2 ¥ / MAX 2,4 ¥) ve güçlendirilmiş klonlar (varsayılan 10 ¥) ücretlidir.

S2. Eşlikli bitmiş bir şarkıyı örnek olarak kullanabilir miyim? Önerilmez. Müzik içeren veya katalogdaki mevcut bir kayda çok benzeyen her şeyi platform reddeder (This audio matches an existing recording in our catalog.). Saf vokal, kuru bir kayıt kullanın.

S3. Cover gönderdikten sonra audio_url neden boş? Gönderim yalnızca kabul edildiği anlamına gelir ve status hâlâ processingtir. Oynatılabilir/indirilebilir adres ancak /api/music/query ile status=completed olana kadar yoklandığında çıkar.

S4. Senaryo B'de (song_clip_id yok) şarkı sözü göndermeli miyim? İsteğe bağlı. Belirli bir içeriği söyletmek için lyrics gönderin; göndermezseniz model kendi halleder ama denetim azalır.

S5. Müşterinin yüklediği ses doğrudan ses olarak kullanılabilir mi? Evet: create'in file_url biçimiyle ya da önce şarkı olarak yükleyip sonra create-from-clip çağırarak.

S6. Başarısızlıkta para iade edilir mi? Doğrudan reddedilen istek (hatalı parametre / platform hatası) ölçümlerde ücretlendirilmez; kabul edilip sonunda başarısız olan görev peşin alınan tutarı geri verir. Nihai başarısızlıkta görev status=failed ve error_message döndürür.

S7. Sesi sildikten sonra onunla üretilmiş şarkıları dinleyebilir miyim? Evet. Silme yalnızca o sesin yeni cover'larda kullanılabilirliğini etkiler.

S8. Bir seferde ne kadar uzun bir şarkıyı cover'layabilirim? duration 1–480 saniye kabul eder; göndermezseniz platform orijinal şarkıya / malzemeye göre karar verir. Dikkat: platformun bitmiş kayıtları en az yaklaşık 30 saniyedir; 30 saniyenin altında bir değer verildiğinde ölçümlerde yine 29,96 / 29,76 saniye çıktı.


Ek A: tam örnek (Node.js, yoklama ve indirme dâhil)

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

// ① Ses oluştur (multipart)
async function createVoice(filePath, title) {
  const fd = new FormData();
  fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
  fd.set("file_name", "my-voice.mp3");
  fd.set("source_file_name", "my-voice.mp3");
  fd.set("title", title);
  fd.set("client_request_id", `vp-create-${Date.now()}`);
  const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
  const body = await res.json();
  if (!body.success) throw new Error(body.message);
  return body.data; // { voice_id, status, audio_url, ... }
}

// ② Cover'la
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: "yavaş folk, akustik gitar",
      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 }] }
}

// ③ Bitene kadar yokla (5 saniyede bir, en fazla 15 dakika)
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(); // çıplak dizi
    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");
}

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

Ek B: değişiklik günlüğü

Tarih Değişiklik
2026-10-15 Silme anlamı açıkça yazıldı (§5.3); "silinmiş / yetkisiz" voice_id ile cover artık peşin ücretten önce 400 döndürüyor, hata tablosu ve FAQ uyarlandı (aynı gün yayına alınan ses silme kapısıyla birlikte)
2026-10-13 Başa "bu yolu neden öneriyoruz" notu eklendi: çok sayıda kullanıcının gerçek değerlendirmesine göre bu yoldan üretilen şarkılar orijinal sesi belirgin biçimde daha iyi koruyor
2026-09-26 İlk sürüm: ses oluşturma (üç giriş biçimi) / mevcut sesten oluşturma / listeleme, ayrıntı, silme / sesle cover (A ve B senaryoları) / ilerleme sorgusu / indirme / fiyat okuma, ölçülmüş kanıtlarla
SonrakiStil güçlendirme API'si

API anahtarı alın

Kaydolduktan sonra konsoldan bir API anahtarı oluşturun. Her üretim 0,6 ¥ tutarındadır ve 2 parça döner, indirmeler sınırsızdır ve telefon numarası gerekmez.

API anahtarı al Genel bakışa dön