【Önerilir】 Ses profili API'si
✅ 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.
- Belge tarihi: 2026-09-26
- Kapsam: kendi sesinizi oluşturma → seçtiğiniz şarkıyı bu sesle cover'lama / yeni bir şarkı söyleme → ilerlemeyi izleme → çıktıyı indirme
- Tüm uç noktalar, alanlar ve yanıtlar gerçek çağrılarla doğrulandı ("ölçüldü" diye işaretlenenler ayrıntılı doğrulandı)
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
Beareröneki isteğe bağlıdır;sk-öneki de (Authorization: sk-xxxde aynı şekilde çalışır).- Anahtar yok veya geçersiz → HTTP 401, gövde
{"success":false,"message":"…"}biçimindedir (metin isteğin diline göre değişir). - Her anahtar yalnızca kendi hesabının şarkılarını ve seslerini görebilir ve işleyebilir.
1.3 İstek gövdesi biçimleri
- Ses oluşturma:
multipart/form-data(dosya yükleme) önerilir;application/json(URL veya base64) da desteklenir. - Diğer uç noktalar:
application/json.
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:
- 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. - 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=20ile (sayfalama parametrelerip/page_size; uyumlu yazımpsde olur)generation_type=voice_profile_coverolan 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:
- Reddedilen istek (hatalı parametre, platformun 4xx/5xx'i, bakiyenin kendisinin yetersiz olması) ücretlendirilmez — var olmayan bir sesle gönderimde ölçümlerimizde bakiye hiç değişmedi (delta = 0);
- Kabul edilip sonunda başarısız olan görev (platform servis hatası dâhil) sunucu tarafındaki iade yolundan geçer ve peşin alınan tutarı geri verir.
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"
}'
- URL, herkese açık erişilebilen bir HTTPS doğrudan bağlantısı olmalıdır; sunucu bir kez indirip nesne depolamamıza aktarır.
- Adresi
audio_urlalanına da koyabilirsiniz, etki aynıdır (ikisi de gönderilirsefile_urlkazanır). - Adres zaten bu platformun nesne deposundaysa (
*.myqcloud.com/create-ui/voice-source/...) yeniden indirilmez: doğrudan kaydedilir.
Biçim C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "Sesim"
}
- Hem
data:audio/xxx;base64,öneki hem de saf base64 kabul edilir. - Boyut sınırlıdır (base64 1,33× şişirir), büyük dosyalar için A biçimini kullanın.
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_atsaniye 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):
- Yanıt hemen
status=processing+task_idolur (bu aşamadaclip_idyok) ve eşzamansız çalışır; - İşlem sürerken ilerlemeyi
GET /api/music/voice-profile/{voice_id}ile sorgulayın;progress_percent/progress_stage/progress_messagedöner; - Bitince
statusreadyolur veclip_id,audio_url,image_urltamamlanır; - Başarısız olursa
status=failedolur veerror_messageyaklaşık "güçlendirilmiş yükleme başarısız oldu; ücret otomatik iade edildi, sonra yeniden deneyin" der; - Güçlendirilmiş klon normal oluşturmadan belirgin biçimde uzun sürer (dakikalar), bu yüzden eşzamanlı zaman aşımı mantığıyla beklemeyin.
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…"
}
source_song_id: hesabınızdaki tamamlanmış bir sesin clip id'si (şarkınınsong_id'siyle aynı).- Aynı clip yeniden gönderilirse yeni kayıt açılmaz; mevcut ses doğrudan
reused: trueile döner (ölçüldü).
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" } }
- Silme sonrası ses listeden kaybolur ve yeni cover'larda kullanılamaz: bu
voice_idile gönderim 400 döner (§6.4'e bakın). - Onunla üretilmiş şarkılar hiç etkilenmez; çalma, indirme, devam ettirme, değiştirme ve ayırma eskisi gibi çalışır.
- Var olmayan veya bu hesaba ait olmayan bir sesi silmek
{"success":false,"message":"voice not found"}döner.
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:
- Bitmiş kayıtları
clips[].song_idile tanımlayın (bu uç noktaidalanı döndürmez). - Hemen 2
song_idalırsınız, ancakstatushâlâprocessing(yalnızca kabul edildiği anlamına gelir) veaudio_urlboştur; indirmeden öncecompletedolana kadar yoklamalısınız.play_urlplatformun ön dinleme akışıdır, gönderim aşamasında bile görünebilir ve süresi dolar. description, sunucunun sonunda gönderdiği prompt'tur (sabit yapı bölümü + girdiğinizcover_requirements/style_requirements); sonucu incelerken çok işe yarar.source_updatessunucunun malzeme işleme sonucudur, istemci yok sayabilir.- Gönderdiğiniz
titlesunucu görev kaydına yazılır ve sonraki sorgulardasong_titleolarak görünür; gönderim yanıtındakiclips[].song_titlegenelde 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_idsvirgülle ayrılmış bir dizedir (dizi değil).- Yanıt çıplak bir dizidir (doğrudan
[...],success/datakabuğu yok):
[
{
"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_idile tanımlar; erken bazı yanıtlardaidalanı göründü, bu yüzdenrow.song_id || row.idgü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"]
}
}
}
- Burada
created_at/completed_atUnix saniyesidir (toplu sorgunun ISO dizelerinden farklı, istemciler ayırmalı). wav_url/video_urlbu platformun indirme girişleridir (geçerli alan adına göre) veGETdosyayı verir; platform o çıktıyı üretmediyse boş dizedir.parameter_retention, o şarkının hangi gönderim parametrelerine kadar izlenebileceğini söyler:core_parameters_available=trueçekirdek parametrelerin (şarkı sözü / stil / kaynak) sorgulanabilir olduğunu,extended_parameters_available=falseise yukarıda listelenen genişletilmiş parametrelerin saklanmadığını gösterir (sesle cover'lar şu anda bu kategoride).
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:
- Sorgu sonucundaki
audio_url'yi kullanmak (nesne deposuna doğrudan bağlantı, en kolayı). GET /api/music/download?song_id=<id>&kind=mp3→ doğrudan ses bayt akışını döndürür (dosya adıContent-Dispositioniçinde gelir).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
}
}
filesşunları kabul eder:mp3/wav/lyrics/metadata, tek seferde en fazla 10 şarkı.- Başarılı şarkı sayısına göre ücretlendirilir (şarkı başına 0,2 ¥); tümüyle başarısız olan şarkı ücretlendirilmez ve başarısız bir biçim yalnızca
songs[].errorsiçinde görünür. - Daha önce aldığınız dosyaları yeniden almak için önce ücretsiz
POST /api/music/free2/cached(aynısong_ids+files) ile arşivlenmiş adresleri alın; yanıtındakisongs[].missing_filesönbellekte olmayan ve yeniden hazırlanması gereken biçimleri listeler.
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
- 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).
- Örnek süresi: en az 6 sn, 10–60 sn önerilir; çok kısa olursa platform reddeder.
- Örnek içeriği: temiz vokal; mevcut bir kayda çok benzeyen her şeyden kaçının (katalog karşılaştırması reddeder).
- Metin sınırları:
lyrics≤ 3000 karakter;style_requirements/negative_tags/titleiçin sırasıyla 1000 / 1000 / 100 karakter önerilir (stil ve cover gereksinimleri prompt'a eklenir, toplamı 3000 karakterin altında tutun). - Şarkı sözü yeniden yazılmaz: ne verirseniz o söylenir (karakter karakter), yerel kısaltma yapılmaz.
- Her şarkı 2 kayıt üretir; tek sonuç varsaymayın.
- Kaynak ses kalıcı olarak saklanır: sesi silmek kaynak sesi temizlemez; bu, sonraki cover'ları mümkün ve uyumu izlenebilir tutar.
- Ses ready olmalı:
processingdurumundaki bir ses cover'da kullanılamaz. - İ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.
- 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 |
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