const API_BASE = 'https://api.mountsea.ai';
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
};
async function pollTask(taskId) {
while (true) {
const res = await fetch(`${API_BASE}/suno/v2/status?taskId=${taskId}`, { headers });
const task = await res.json();
if (task.status === 'success') return task.data;
if (task.status === 'failed') throw new Error(task.failReason);
await new Promise(r => setTimeout(r, 3000));
}
}
// Step 1: Prepare session
const prepareRes = await fetch(`${API_BASE}/suno/v2/customModel/prepare`, {
method: 'POST',
headers
});
const { sessionId } = await prepareRes.json();
console.log('Session ID:', sessionId);
// Step 2: Upload audio files (at least 6, can run in parallel)
const audioUrls = [
'https://example.com/song1.mp3',
'https://example.com/song2.mp3',
'https://example.com/song3.mp3',
'https://example.com/song4.mp3',
'https://example.com/song5.mp3',
'https://example.com/song6.mp3',
];
const uploadPromises = audioUrls.map(async (audioUrl) => {
const res = await fetch(`${API_BASE}/suno/v2/customModel/upload`, {
method: 'POST',
headers,
body: JSON.stringify({ sessionId, audioUrl })
});
const { taskId } = await res.json();
const result = await pollTask(taskId);
return result.id; // clipId
});
const clipIds = await Promise.all(uploadPromises);
console.log('Uploaded clips:', clipIds);
// Step 3: Create custom model
const createRes = await fetch(`${API_BASE}/suno/v2/customModel/create`, {
method: 'POST',
headers,
body: JSON.stringify({
sessionId,
clipIds,
name: 'My Custom Model'
})
});
const { taskId: createTaskId } = await createRes.json();
const model = await pollTask(createTaskId);
console.log('Custom model created:', model);
// Use model.id (e.g. "chirp-custom:xxx") in /generate