Upload source audio API
Endpoint description
Upload source audio turns a local or remote audio file into a source clip that later capabilities — cover, extend, replace-section, separation and so on — can use.
Endpoint: POST /api/music/upload-source
Billing: Free. This endpoint only uploads source audio; it does not start a generation task.
Recommended usage: this is step 1 of the "two-step cover". Upload the audio with this endpoint first (free, and you can retry whenever it fails) and keep the returned
clip_id; once you have confirmed that the upload succeeded (statusin a completed state), call the cover from a source clip API to start the cover — that request body is only a few hundred bytes, so it cannot be truncated in transit because the audio is too large. Compared with the one-shot upload-then-cover API, this split is more robust when the audio is large, the network is unstable, or the same material will be reused several times (extend / replace-section / separation).
Advice for large file uploads
| Situation | Recommended approach |
|---|---|
| The audio is already public (it has an https direct link) | Use file_url: the request body is only a few hundred bytes, the most robust option |
| A local file (Node / Python / desktop) | Use a multipart upload (-F "file=@source.mp3") and do not set Content-Type manually |
| Only JSON + base64 is possible | Note that Content-Length must be the byte count (Buffer.byteLength), otherwise the request body may be truncated |
After the upload finishes, always confirm that status in the response is already a completed state and save the clip_id before moving on to step 2;
a failed upload is not charged and creates no generation task, so simply retry.
Request parameters
Headers
For JSON requests:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| Authorization | string | yes | Bearer YOUR_API_KEY |
| Content-Type | string | yes | application/json |
Do not set Content-Type manually for multipart requests; the client generates it automatically.
Body parameters
| Parameter | Type | Required | Default | Notes |
|---|---|---|---|---|
| model | string | no | suno-v6 | Customer-facing model name: suno-v6, suno-v6-wild or suno-v6-mini |
| file_url | string | no | - | Remote audio URL |
| file_base64 | string | no | - | Base64 audio |
| file_name | string | no | - | File name |
| upload_type | string | no | file_upload | Upload type |
JSON request example
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 request example
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"
Response
{
"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": {}
}
Get an API key
Create an API key in the console after signing up. ¥0.6 per run returns 2 tracks, downloads are unlimited, and no phone number is required.
Get API key Back to overview