Suno Add Instrumental
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,
"version": "<string>",
"custom_model_task_id": "<string>",
"custom": true,
"prompt": "<string>",
"gpt_description": "<string>",
"title": "<string>",
"tags": "<string>",
"negative_tags": "<string>",
"style_weight": 123,
"weirdness": 123,
"audio_weight": 123,
"vocal_gender": "<string>",
"variety": "<string>",
"max_mode": true,
"audio_format": "<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,
"version": "<string>",
"custom_model_task_id": "<string>",
"custom": True,
"prompt": "<string>",
"gpt_description": "<string>",
"title": "<string>",
"tags": "<string>",
"negative_tags": "<string>",
"style_weight": 123,
"weirdness": 123,
"audio_weight": 123,
"vocal_gender": "<string>",
"variety": "<string>",
"max_mode": True,
"audio_format": "<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,
version: '<string>',
custom_model_task_id: '<string>',
custom: true,
prompt: '<string>',
gpt_description: '<string>',
title: '<string>',
tags: '<string>',
negative_tags: '<string>',
style_weight: 123,
weirdness: 123,
audio_weight: 123,
vocal_gender: '<string>',
variety: '<string>',
max_mode: true,
audio_format: '<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,
'version' => '<string>',
'custom_model_task_id' => '<string>',
'custom' => true,
'prompt' => '<string>',
'gpt_description' => '<string>',
'title' => '<string>',
'tags' => '<string>',
'negative_tags' => '<string>',
'style_weight' => 123,
'weirdness' => 123,
'audio_weight' => 123,
'vocal_gender' => '<string>',
'variety' => '<string>',
'max_mode' => true,
'audio_format' => '<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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyVocals & stems
Suno Add Instrumental
Add accompaniment to an uploaded vocal track with Suno. 0.075perrequest,0.15 in Max mode.
POST
/
v1
/
music
/
generations
Suno Add Instrumental
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,
"version": "<string>",
"custom_model_task_id": "<string>",
"custom": true,
"prompt": "<string>",
"gpt_description": "<string>",
"title": "<string>",
"tags": "<string>",
"negative_tags": "<string>",
"style_weight": 123,
"weirdness": 123,
"audio_weight": 123,
"vocal_gender": "<string>",
"variety": "<string>",
"max_mode": true,
"audio_format": "<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,
"version": "<string>",
"custom_model_task_id": "<string>",
"custom": True,
"prompt": "<string>",
"gpt_description": "<string>",
"title": "<string>",
"tags": "<string>",
"negative_tags": "<string>",
"style_weight": 123,
"weirdness": 123,
"audio_weight": 123,
"vocal_gender": "<string>",
"variety": "<string>",
"max_mode": True,
"audio_format": "<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,
version: '<string>',
custom_model_task_id: '<string>',
custom: true,
prompt: '<string>',
gpt_description: '<string>',
title: '<string>',
tags: '<string>',
negative_tags: '<string>',
style_weight: 123,
weirdness: 123,
audio_weight: 123,
vocal_gender: '<string>',
variety: '<string>',
max_mode: true,
audio_format: '<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,
'version' => '<string>',
'custom_model_task_id' => '<string>',
'custom' => true,
'prompt' => '<string>',
'gpt_description' => '<string>',
'title' => '<string>',
'tags' => '<string>',
'negative_tags' => '<string>',
'style_weight' => 123,
'weirdness' => 123,
'audio_weight' => 123,
'vocal_gender' => '<string>',
'variety' => '<string>',
'max_mode' => true,
'audio_format' => '<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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\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 \"version\": \"<string>\",\n \"custom_model_task_id\": \"<string>\",\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"gpt_description\": \"<string>\",\n \"title\": \"<string>\",\n \"tags\": \"<string>\",\n \"negative_tags\": \"<string>\",\n \"style_weight\": 123,\n \"weirdness\": 123,\n \"audio_weight\": 123,\n \"vocal_gender\": \"<string>\",\n \"variety\": \"<string>\",\n \"max_mode\": true,\n \"audio_format\": \"<string>\",\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodysuno-add-instrumental adds accompaniment to a vocal track you imported with suno-upload.
| Property | Value |
|---|---|
| Model ID | suno-add-instrumental |
| Endpoint | POST /v1/music/generations (asynchronous task) |
| Group | Suno > Vocals & stems |
| Input | A track from one of your earlier suno-upload tasks, plus style tags or a description |
| Result | Tracks in result.tracks with audio_url |
| Price | $0.075 per request (7.5 credits); $0.15 with max_mode: true |
string
required
Set to
suno-add-instrumental.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
default:"v6"
Suno model version:
v6, v6-wild, or v6-mini. Omit it when you send custom_model_task_id.string
The
id of a succeeded suno-custom-model task. Generates with that custom model instead of a public version, so don’t send version.boolean
true is custom mode: prompt holds the lyrics and the style fields apply. false is description mode: gpt_description guides the result and is required, and max_mode isn’t allowed. Send it explicitly; if you omit it, the provider infers the mode from the fields you send.string
Lyrics, up to 5,000 characters. Applies in custom mode.
string
Description-mode prompt, up to 3,000 characters. Required when
custom is false.string
Track title, up to 80 characters. Applies in custom mode.
string
Style tags, up to 1,000 characters. Applies in custom mode.
string
Styles to avoid, up to 1,000 characters. Applies in custom mode.
number
Style weight, from 0 to 1. Applies in custom mode.
number
Creativity, from 0 to 1. Higher values are more experimental.
number
Audio weight, from 0 to 1. Applies in custom mode.
string
male or female vocals.string
Style variation:
off, normal, high, extra, or max. It doesn’t turn on Max mode or change the price.boolean
default:"false"
true turns on Suno Max mode and bills twice the request price. Not allowed with custom: false.string
Output format:
mp3, m4a, or wav. The provider picks one if you omit it.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.Request rules
The gateway checks these before it reserves any balance:custom: falserequiresgpt_description.max_modeisn’t allowed withcustom: false.- Send either
versionorcustom_model_task_id, not both.
Source tracks
The source task must be your own succeeded task from one of these models:suno-upload.
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-add-instrumental",
"source_task_id": "task_2f8KcX1mQpR7vT0yZa9Lb3",
"source_index": 1,
"custom": true,
"tags": "lo-fi band, warm bass"
}'
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.tracks[] lists every track in its original order, each with its index and audio_url, plus title, image_url, duration_seconds, lyrics, and tags when the provider returns them. result.urls lists the audio URLs.
{
"urls": [
"https://cdn.example.com/music/night-drive.mp3"
],
"tracks": [
{
"index": 1,
"id": "clip_8f3a2c",
"title": "Night Drive",
"audio_url": "https://cdn.example.com/music/night-drive.mp3",
"image_url": "https://cdn.example.com/music/night-drive.jpg",
"duration_seconds": 184.6,
"tags": "lo-fi, soft piano, rain"
}
]
}
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.