Suno Download
curl --request POST \
--url https://api.snapgen.org/v1/music/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"formats": [
"<string>"
],
"webhook": "<string>",
"webhook_secret": "<string>"
}
'import requests
url = "https://api.snapgen.org/v1/music/generations"
payload = {
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"formats": ["<string>"],
"webhook": "<string>",
"webhook_secret": "<string>"
}
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({
model: '<string>',
source_task_id: '<string>',
source_index: 123,
formats: ['<string>'],
webhook: '<string>',
webhook_secret: '<string>'
})
};
fetch('https://api.snapgen.org/v1/music/generations', 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.snapgen.org/v1/music/generations",
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([
'model' => '<string>',
'source_task_id' => '<string>',
'source_index' => 123,
'formats' => [
'<string>'
],
'webhook' => '<string>',
'webhook_secret' => '<string>'
]),
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.snapgen.org/v1/music/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\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.snapgen.org/v1/music/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snapgen.org/v1/music/generations")
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 \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyAnalysis & export
Suno Download
Export a Suno track as MP3, M4A, or WAV files. $0.0024 per request.
POST
/
v1
/
music
/
generations
Suno Download
curl --request POST \
--url https://api.snapgen.org/v1/music/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"formats": [
"<string>"
],
"webhook": "<string>",
"webhook_secret": "<string>"
}
'import requests
url = "https://api.snapgen.org/v1/music/generations"
payload = {
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"formats": ["<string>"],
"webhook": "<string>",
"webhook_secret": "<string>"
}
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({
model: '<string>',
source_task_id: '<string>',
source_index: 123,
formats: ['<string>'],
webhook: '<string>',
webhook_secret: '<string>'
})
};
fetch('https://api.snapgen.org/v1/music/generations', 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.snapgen.org/v1/music/generations",
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([
'model' => '<string>',
'source_task_id' => '<string>',
'source_index' => 123,
'formats' => [
'<string>'
],
'webhook' => '<string>',
'webhook_secret' => '<string>'
]),
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.snapgen.org/v1/music/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\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.snapgen.org/v1/music/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snapgen.org/v1/music/generations")
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 \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"formats\": [\n \"<string>\"\n ],\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodysuno-download exports one of your tracks as MP3, M4A, or WAV files, one file per requested format.
| Property | Value |
|---|---|
| Model ID | suno-download |
| Endpoint | POST /v1/music/generations (asynchronous task) |
| Group | Suno > Analysis & export |
| Input | A track from one of your earlier tasks and one to three formats |
| Result | File URLs in result.files |
| Price | $0.0024 per request (0.24 credits) |
string
required
Set to
suno-download.string
required
The
id of your earlier task that holds the source track. It must be your own task, must have succeeded, and must come from a model listed in Source tracks.integer
default:"1"
Position of the source track in that task’s
result.tracks, counting from 1 (up to 8).string[]
required
1 to 3 formats from
mp3, m4a, and wav, without repeats. The result lists one file per format.string
Optional public
https URL that receives one signed event when the task finishes. See Task webhooks.string
Required with
webhook: 16 to 256 characters, used to sign the delivery.Source tracks
The source task must be your own succeeded task from one of these models:suno-music, suno-inspo, suno-sounds, suno-upload, suno-upload-cover, suno-upload-extend, suno-extend, suno-cover, suno-remaster, suno-add-vocals, suno-add-instrumental, suno-add-stem, suno-replace-section, suno-remove-section, suno-crop, suno-fade-in, suno-fade-out, suno-speed, suno-concat, suno-mashup, suno-sample.
Send the task id as source_task_id and pick the track with source_index. Never send provider track or clip IDs. See Reference earlier tasks.
Request
curl https://api.snapgen.org/v1/music/generations \
-H "Authorization: Bearer $SNAPGEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-download",
"source_task_id": "task_2f8KcX1mQpR7vT0yZa9Lb3",
"source_index": 1,
"formats": [
"mp3",
"wav"
]
}'
202 with a task object and a Location: /v1/tasks/{id} header. Poll GET /v1/tasks/{id} every 10 to 20 seconds until status is succeeded or failed.
Result
result.files[], one entry per requested format with format and url, in the order you asked for them. result.urls lists the same URLs.
{
"urls": [
"https://cdn.example.com/music/night-drive.mp3",
"https://cdn.example.com/music/night-drive.wav"
],
"files": [
{
"format": "mp3",
"url": "https://cdn.example.com/music/night-drive.mp3"
},
{
"format": "wav",
"url": "https://cdn.example.com/music/night-drive.wav"
}
]
}
Result URLs are kept for about 72 hours. Download the files you want to keep.
See Music generation tasks for the task lifecycle, result fields, webhooks, and errors.