upload audio for custom model
curl --request POST \
--url https://api.mountsea.ai/suno/v2/customModel/upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"audioUrl": "https://example.com/song.mp3"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/customModel/upload"
payload = {
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"audioUrl": "https://example.com/song.mp3"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sessionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
audioUrl: 'https://example.com/song.mp3'
})
};
fetch('https://api.mountsea.ai/suno/v2/customModel/upload', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mountsea.ai/suno/v2/customModel/upload",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sessionId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'audioUrl' => 'https://example.com/song.mp3'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mountsea.ai/suno/v2/customModel/upload"
payload := strings.NewReader("{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mountsea.ai/suno/v2/customModel/upload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/customModel/upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}"
response = http.request(request)
puts response.read_body{
"taskId": "15c257ff-43f7-4678-bd41-202ad6b8488b"
}Custom Model
Custom Model Upload
Upload training audio for custom model
POST
/
suno
/
v2
/
customModel
/
upload
upload audio for custom model
curl --request POST \
--url https://api.mountsea.ai/suno/v2/customModel/upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"audioUrl": "https://example.com/song.mp3"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/customModel/upload"
payload = {
"sessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"audioUrl": "https://example.com/song.mp3"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sessionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
audioUrl: 'https://example.com/song.mp3'
})
};
fetch('https://api.mountsea.ai/suno/v2/customModel/upload', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mountsea.ai/suno/v2/customModel/upload",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sessionId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'audioUrl' => 'https://example.com/song.mp3'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mountsea.ai/suno/v2/customModel/upload"
payload := strings.NewReader("{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mountsea.ai/suno/v2/customModel/upload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/customModel/upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"audioUrl\": \"https://example.com/song.mp3\"\n}"
response = http.request(request)
puts response.read_body{
"taskId": "15c257ff-43f7-4678-bd41-202ad6b8488b"
}This is Step 2 of the Custom Model workflow. You must complete Step 1: Prepare first. See the full workflow guide.
id field — collect these as clipIds for the create step.
You need at least 6 successful uploads before proceeding to create.
Multiple upload requests can run in parallel with the same
sessionId. Each returns its own taskId for independent polling.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Response
201 - application/json
task id. Use this id to query task status.
Example:
"15c257ff-43f7-4678-bd41-202ad6b8488b"