ソース音声アップロード API
インターフェースの説明
ソース音声アップロードは、ローカルまたはリモートの音声を、以降のカバー・延長・セクション置換・ステム分離などで使えるソース clip としてアップロードします。
エンドポイント: POST /api/music/upload-source
課金: 無料。本エンドポイントはソース音声をアップロードするだけで、生成タスクは開始しません。
推奨の使い方: これは「2 段階カバー」の 1 段目です。 まず本エンドポイントで音声をアップロードし(無料、失敗してもいつでも再試行できます)、返ってきた
clip_idを保存します。アップロードが成功したこと(statusが完了状態)を確認したうえで、 ソース clip からのカバー API を呼び出してカバーを開始してください。この段階のリクエストボディは数百バイトしかないため、 音声が大きすぎて転送中に切れることはありません。一括型のアップロード後カバー APIと比べて、 この分割方式は音声が大きい、ネットワークが不安定、同じ素材を何度も使い回す(延長 / 置換 / ステム分離)場合により安定します。
大きなファイルのアップロードのヒント
| 状況 | 推奨する方法 |
|---|---|
| 音声がすでに公開されている(https の直リンクがある) | file_url を使う: リクエストボディは数百バイトで最も安定 |
| 一時的な署名 URL(ByteDance など) | URL が公開アクセス可能で有効な場合のみ file_url を使用し、それ以外は multipart または即時アップロードを使用 |
| ローカルファイル(Node / Python / デスクトップ) | multipart でアップロード(-F "file=@source.mp3")し、Content-Type を手動で設定しない |
| JSON + base64 しか使えない | Content-Length はバイト数(Buffer.byteLength)にすること。そうしないとリクエストボディが切れる可能性があります |
アップロード完了後は、必ずレスポンスの status が完了状態であることを確認し、clip_id を保存してから 2 段目に進んでください。
アップロードに失敗しても課金されず、生成タスクも作られません。そのまま再試行してください。
アップロード前に file_url を確認
file_urlはブラウザではなく、プラットフォームのサーバーが直接 HTTP でダウンロードします。ブラウザで開ける URL でも、本番サーバーから取得できるとは限りません。
ローカルファイルは file フィールドを使った multipart アップロードを推奨します。ByteDance などの一時署名 URL は、公開アクセス可能でリクエスト送信時にも有効な場合を除き、file_url を使用しないでください。
アップロードを送る前に、一般公開されたサーバーで次を実行してください。
curl -L --max-time 30 -D - -o /dev/null "https://example.com/source.mp3"
GET が HTTP 200 で終了し、音声 MIME を返し、内容が空でないことを確認してください。ログインページ、HTML、401、403、404、410 はサーバー側で利用できません。
file_url download failed: HTTP 404 は通常、署名の期限切れ、ファイル削除、URL パラメータの欠落を示します。
このアップロードは無料です。file_url のダウンロードに失敗しても clip_id、楽曲タスク、生成呼び出しは作られず、料金も発生しないため返金は不要です。
リクエストパラメータ
Headers
JSON リクエスト:
| パラメータ名 | 型 | 必須 | 説明 |
|---|---|---|---|
| Authorization | string | はい | Bearer YOUR_API_KEY |
| Content-Type | string | はい | application/json |
multipart リクエストでは Content-Type を手動で指定しないでください。クライアントが自動生成します。
ボディパラメータ
| パラメータ名 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| model | string | いいえ | suno-v6 | 対客モデル名: suno-v6、suno-v6-wild、suno-v6-mini |
| file_url | string | いいえ | - | リモート音声 URL |
| file_base64 | string | いいえ | - | Base64 音声 |
| file | ファイル(multipart) | いいえ | - | アップロードする音声ファイル。フィールド名は file |
| file_name | string | いいえ | - | ファイル名 |
| upload_type | string | いいえ | file_upload | アップロード種別 |
JSON リクエスト例
curl -X POST https://www.suno-api.io/api/music/upload-source \
-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",
"upload_type": "file_upload"
}'
multipart リクエスト例
curl -X POST https://www.suno-api.io/api/music/upload-source \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@source.mp3" \
-F "file_name=source.mp3" \
-F "upload_type=file_upload" \
-F "model=suno-v6"
import requests
with open("source.mp3", "rb") as audio:
response = requests.post(
"https://www.suno-api.io/api/music/upload-source",
headers={"Authorization": "Bearer YOUR_API_KEY"},
data={
"file_name": "source.mp3",
"upload_type": "file_upload",
"model": "suno-v6",
},
files={"file": ("source.mp3", audio, "audio/mpeg")},
timeout=300,
)
response.raise_for_status()
print(response.json())
レスポンス結果
{
"clip_id": "uploaded_clip_id",
"status": "complete",
"title": "source.mp3",
"image_url": "https://...",
"audio_url": "https://...",
"display_tags": "pop, vocal",
"inferred_description": "uploaded source audio",
"clip_metadata": {}
}