When you build music features, the first useful primitive is often not “generate a full song from scratch.” It is: take an existing reference track, upload it safely, extract the metadata you need, and keep the returned song ID for the next step in your workflow.
This guide walks through the Suno Upload Reference Audio API on Ace Data Cloud. The API is intentionally small: send a publicly accessible MP3 URL, receive an uploaded audio record, and use the returned audio_id later for secondary creation.
What you can do
The upload endpoint is:
Base URL: https://api.acedata.cloud
Endpoint: POST /suno/upload
Headers:
accept: application/json
authorization: Bearer {token}
content-type: application/json
The request body has one input parameter:
{
"audio_url": "https://cdn.acedata.cloud/suno_demo.mp3"
}
The important constraint is that audio_url must be a publicly accessible CDN address and support the .mp3 suffix. In other words, this endpoint is best used after your app has already placed the reference audio somewhere the API can fetch.
The response gives you a normalized audio object. The key field is data.audio_id, which is the song ID after upload. The response can also include extracted or generated context such as lyric, style, image_url, image_large_url, audio_url, title, and duration.
Step 1: Make the upload request
Here is the complete cURL call from the integration shape:
curl -X POST 'https://api.acedata.cloud/suno/upload' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
"audio_url": "https://cdn.acedata.cloud/suno_demo.mp3"
}'
In a real application, replace the demo URL with a direct MP3 URL from your own storage or CDN. I would validate three things before calling the API:
- The URL is reachable without user authentication.
- The file is an MP3 URL, not a web page that embeds a player.
- Your backend stores the original source URL before sending the request.
That third point matters because the returned data tells you what the platform produced, while the source URL tells you what your user originally provided.
Step 2: Read the response as a workflow object
A successful response has this general shape:
{
"success": true,
"task_id": "058f8450-3df4-4f8b-8b64-ebc2e59ed3bc",
"data": {
"audio_id": "00135f7d-cda1-4d70-b007-779f07143586",
"lyric": "[Intro]\nHa-ha-ha-ha-ha-ha...",
"style": "Upbeat bubblegum pop track with a high-energy electronic production style...",
"image_url": "https://cdn2.suno.ai/image_00135f7d-cda1-4d70-b007-779f07143586.jpeg",
"image_large_url": "https://cdn2.suno.ai/image_large_00135f7d-cda1-4d70-b007-779f07143586.jpeg",
"audio_url": "https://cdn1.suno.ai/00135f7d-cda1-4d70-b007-779f07143586.mp3",
"title": "up-d6c3970d-6db1-41e3-b966-90539c93678a",
"duration": 131.16
}
}
The fields I would persist are:
-
task_idfor tracking the upload request -
data.audio_idfor later music generation or extension flows -
data.audio_urlfor playback -
data.durationfor UI display and validation -
data.lyricanddata.styleif your product lets users review or edit the extracted musical context
Treat the upload response as the “asset registration” step. After this, your app has an ID it can pass to later music-generation operations.
Step 3: Connect it to secondary creation
The document notes that once you have the song ID, you can use the Suno Audios Generation API to generate custom songs. The specific handoff is to pass action as upload_extend and use the returned audio_id as the reference song ID.
A clean backend abstraction might look like this:
uploadReferenceAudio({ audio_url }) -> { task_id, audio_id, lyric, style, audio_url, duration }
Then the next workflow step can accept audio_id without needing to know where the original file came from.
This separation helps a lot in product code. Uploading reference audio, reviewing extracted context, and generating a derivative song are different user actions. Keeping them separate makes the interface easier to debug and easier to retry.
Step 4: Design the user flow around constraints
Because the API expects a public MP3 URL, your user-facing flow should make that constraint obvious. A practical flow is:
- User uploads an MP3 to your app.
- Your backend stores it on a CDN or object storage bucket.
- Your backend calls
POST /suno/uploadwith the publicaudio_url. - Your app displays the returned title, duration, cover image, lyric, and style.
- The user confirms whether to continue with a secondary creation step using
audio_id.
If the upload fails, keep the original user file and source URL so the user does not have to start again. If the upload succeeds but later generation fails, you still have audio_id and can retry the downstream step.
A small but useful primitive
This endpoint is deliberately narrow, and that is what makes it useful. It does not ask you to model the entire music workflow in one request. It gives you one reliable bridge from an existing MP3 reference to an audio_id that can be used later.
For builders, that is a good boundary: one API call to register the reference, one stored ID for future work, and enough metadata to show users what was understood from their audio.
The full field reference is in the Suno Upload API documentation: https://platform.acedata.cloud/documents/suno-upload-integration

Top comments (0)