Tek adımda yükleme ve cover API'si
Uç nokta açıklaması
Tek adımda yükleme ve cover, bir ses dosyası veya ses URL'si gönderir ve o kaynak sesten yeni bir cover sürümü üretir.
Uç nokta: POST /api/music/upload-cover
Faturalama: Ücretli, şu anda varsayılan olarak çağrı başına 0,6 ¥. Bu uç nokta "yükle ve cover yap" içindir; görsel kapak yüklemekle ilgili değildir. Gerçekte tahsil edilen tutar güncel arka ofis fiyat yapılandırmasına göre belirlenir.
Max Mode / Variety: bu uç nokta isteğe bağlı max_mode ve variety (0-4) parametrelerini destekler. max_mode
açıkken bu çağrı 2 kat fiyattan faturalanır (0,6 → 1,2 ¥ / çağrı); variety için ek ücret alınmaz.
Anlamları ve nasıl gönderilecekleri Yeni API genel bakışı sayfasındaki
"Gelişmiş parametreler" bölümündedir.
Bekleme süreleri ve zaman aşımları (önemli): bu uç nokta senkrondur — sipariş ancak yanıt geldiğinde kabul edilir ve üretime verilir. Ölçümlere göre isteklerin çoğu 1-3 saniyede yanıtlanır, yaklaşık %10'u 30 saniyeyi aşar ve en uzunu yaklaşık 230 saniyedir. İstemci zaman aşımını 300 saniye veya üzerine ayarlayın; yanıt gelmemesi hiçbir şey üretilmediği anlamına gelmez ve zaman aşımından hemen sonra yeniden denemeyin (siparişi çoğaltır ve tekrar ücret alır). Bağlantı koptuysa daha sonra
GET /api/music/songsile kontrol edin. Yeni API genel bakışı sayfasındaki "Bekleme süreleri ve zaman aşımı ayarları" bölümüne bakın.
Ses büyükse "yükleme" ve "cover" işlemlerini iki adıma ayırmanız önerilir
Bu uç nokta sesin tamamının istek gövdesine konmasını gerektirir: ses büyüdükçe gövde büyür ve tek bir ağ dalgalanması ya da zaman aşımı aktarımı yarıda keser, ardından sunucu
unexpected end of JSON inputdöndürür (HTTP 400, ücret alınmaz).Ses yaklaşık 8 MB'ı aşıyorsa, ağ kararsızsa veya aynı kaynak materyal tekrar kullanılacaksa iki adımlı biçime geçin:
POST /api/music/upload-sourceönce kaynak sesi yükler — ücretsiz, her zaman yeniden denenebilir — ve birclip_idverir;POST /api/music/generate-from-sourcebuclip_idile cover'ı başlatır — ücret alınan adımın istek gövdesi yalnızca yaklaşık 250 bayttır.Kaynak ses yükleme API'si, kaynak klipten cover API'si ve bu sayfanın sonundaki "Büyük dosyalar ve kesilen istekler" bölümüne bakın.
İstek parametreleri
Headers
| Parametre | Tür | Zorunlu | Notlar |
|---|---|---|---|
| Authorization | string | evet | Bearer YOUR_API_KEY |
| Content-Type | string | evet | application/json |
Gövde parametreleri
| Parametre | Tür | Zorunlu | Varsayılan | Notlar |
|---|---|---|---|---|
| model | string | hayır | suno-v6 | Müşteriye dönük model adı: suno-v6, suno-v6-wild veya suno-v6-mini |
| file_url | string | hayır | - | Kaynak ses URL'si |
| file_base64 | string | hayır | - | Base64 ses |
| file_name | string | hayır | - | Dosya adı |
| prompt | string | hayır | - | Yeni şarkı sözleri veya uyarlama yönü |
| style | string | hayır | - | Stil etiketleri |
| title | string | hayır | - | Başlık |
| negativeTags | string | hayır | - | Negatif stil |
| instrumental | boolean | hayır | false | Şarkının enstrümantal olup olmadığı |
| waitAudio | boolean | hayır | false | Sesin tamamlanmasının beklenip beklenmeyeceği |
| cover_start_s | number | hayır | - | Cover yapılacak bölümün başlangıç saniyesi |
| cover_end_s | number | hayır | - | Cover yapılacak bölümün bitiş saniyesi |
| audio_weight | number | hayır | - | Referans sese bağımlılık, aralık 0.0-1.0; yalnızca referans ses verildiğinde gönderilebilir |
cover_start_s ve cover_end_s saniye cinsindendir ve ondalık olabilir; başlangıç zamanı bitiş zamanından küçük olmalı ve kaynak sesin süresini aşmamalıdır. İki alan da atlanırsa sesin tamamı kullanılır. audio_weight, Suno'nun metadata.control_sliders.audio_weight alanına eşlenir ve sonucun referans sese ne kadar yaslandığını kontrol eder; 0.0-1.0 değerini alır ve yalnızca istekte geçerli bir file_url veya file_base64 referans sesi varsa gönderilebilir. 0 geçerli bir değerdir; alanı atlamak "belirtilmedi" anlamına gelir ve Suno'nun varsayılan davranışını korur. instrumental ve waitAudio JSON boolean olmalıdır, metin olmamalıdır.
Yükleme uç noktası varsayılan olarak asenkron döner. Yanıttaki clips[].status değeri pending iken audio_url alanının boş olması normaldir ve yüklemenin veya cover'ın başarısız olduğu anlamına gelmez; dönen gerçek song_id değerini kaydedin ve ses adresini okumadan önce şarkı sorgu uç noktasıyla tamamlanana kadar yoklayın.
İstek örneği
curl -X POST https://www.suno-api.io/api/music/upload-cover \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"file_url": "https://example.com/source.mp3",
"file_name": "source.mp3",
"prompt": "Yeni şarkı sözleri veya uyarlama yönü",
"style": "Mandopop, acoustic guitar",
"title": "Cover sürümü",
"negativeTags": "noise, low quality",
"audio_weight": 0.5,
"instrumental": false,
"waitAudio": false,
"cover_start_s": 0,
"cover_end_s": 60
}'
Yanıt
{
"code": 200,
"message": "success",
"data": {
"upload": {
"clip_id": "uploaded_clip_id",
"status": "complete"
},
"clips": [
{
"song_id": "new_clip_id",
"song_title": "Cover sürümü",
"status": "pending"
}
]
}
}
Büyük dosyalar ve kesilen istekler
Önerilen: yükleme ve cover'ı iki adıma ayırma
Tek seferlik uç nokta (bu) yükleme ile üretimi tek adımda birleştirir: büyük gövde o tek adımda bulunur, dolayısıyla kesildiğinde ne bir şeyin üretildiğini ne de ücret alındığını bilirsiniz.
| 1. adım yükleme | 2. adım cover | |
|---|---|---|
| Uç nokta | POST /api/music/upload-source |
POST /api/music/generate-from-source |
| Faturalama | Ücretsiz (yalnızca yükleme, üretim yok) | Çağrı başına 0,6 ¥; Max Mode ile çağrı başına 1,2 ¥ |
| İstek gövdesi | Sesin kendisi (base64 / multipart) veya file_url ile yalnızca bağlantı |
Yaklaşık 250 bayt (yalnızca bir sourceClipId) |
| Döndürdüğü | clip_id (kaynak sesin clip ID'si) |
data.clips[].song_id (üretilen sonuç) |
| Başarısız olursa | Doğrudan yeniden deneyin, ücret yok ve üretim görevi oluşmaz | İstemci zaman aşımını ≥300 s yapın; zaman aşımında önce /api/music/songs ile kontrol edin, hemen yeniden denemeyin |
| Kaynak materyali yeniden kullanma | Aynı clip_id uzatma / değiştirme / ayırma için de çalışır |
Ses her seferinde yeniden yüklenmelidir |
Sonuç: ses yaklaşık 8 MB'ın üzerindeyse, ağ kararsızsa veya aynı materyal birkaç kez kullanılacaksa → iki adımlı biçim; ses çok küçük ve ağ kararlıysa → bu uç nokta daha zahmetsizdir.
400 unexpected end of JSON input ne demek
Anlamı, sunucunun aldığı JSON'un eksik olmasıdır (yanlış parametre değil, izin veya bakiye sorunu değil). Olasılık sırasına göre sık nedenler:
- Büyük gövdenin aktarım ortasında kesilmesi: giriş katmanı hem "istemcinin kaç bayt göndereceğini bildirdiğini" hem de "gerçekte kaç baytın ulaştığını" kaydeder. Ölçülen örnek: istemci 14,17 MB bildirdi, gerçekte yalnızca 11,8–12,4 MB ulaştı ve üç isteğin tümü yaklaşık 1,6–1,7 sn civarında durdu; eksik bayt sayısı her seferinde farklıydı, bu da sabit bir sınıra değil aktarım kesintisine işaret eder (sunucu istek gövdesi boyutunu sınırlamaz).
Content-Lengthile gerçekte gönderilen bayt sayısının uyuşmaması: Node.js'te bir metnin.lengthdeğerini (UTF-16 karakter sayısı) uzunluk olarak kullanmak, içerikte Çince veya çok baytlı metin varsa yanlış sonuç verir.- Gövdenin Buffer yerine metin olarak yazılması, böylece yazılan baytlar bildirilenle uyuşmaz.
Üç durum da ücretlendirmeden önce gerçekleşir, dolayısıyla masraf doğmaz.
İstemci tarafı öz denetim listesi
-
Content-Length,Buffer.byteLength(json, 'utf8')(veyaBuffer.from(json).length) ile elde edilir —json.lengthkullanılmaz; - İstek gövdesi Buffer olarak yazılır, metin olarak yazılmaz;
- Soket / istek zaman aşımı ≥ 300 saniye;
- Ses yaklaşık 8 MB'ı aşıyorsa:
file_urlkullanın (gövde yalnızca birkaç yüz bayt) veyaupload-source'un multipart yüklemesini kullanın ya da doğrudan iki adımlı biçime geçin; - multipart isteklerde
Content-Typeelle ayarlanmaz (boundary'yi istemci ekler); - "Gerçekte gönderilen bayt sayısı" yazdırılıp
Content-Lengthile karşılaştırılır; - İki adımlı biçimde, 2. adımı göndermeden önce 1. adımın
clip_iddöndürdüğü vestatusdeğerinin tamamlanmış olduğu doğrulanır.
Sık görülen hatalar
| Hata | Anlamı | Ne yapmalı |
|---|---|---|
unexpected end of JSON input |
İstek gövdesi eksik (kesilmiş) | Yukarıdaki öz denetimi uygulayın veya iki adımlı biçime geçin |
invalid character '-' in numeric literal |
multipart gövdesi JSON uç noktasına gönderildi | JSON uç noktalarında multipart kullanmayın ve Content-Type ayarlamayın |
one of file_path, file_base64, file_url, or multipart file is required |
Ses eklenmemiş | file_base64 / file_url / multipart file ekleyin |
model is required |
Gövde boş ve geçerli JSON (örneğin {}) |
En azından model gönderin |
Invalid request: Invalid request, ... |
Gövde ayrıştırma hatasının sarmalayıcı mesajı | Somut nedeni için ikinci yarıyı okuyun (genellikle yukarıdakilerden biri) |
İlgili uç noktalar: Kaynak ses yükleme API'si (1. adım), kaynak klipten cover API'si (2. adım).
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