curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-add-instrumental",
"audio_url": "https://example.com/acapella.mp3",
"title": "Morning Song",
"style": "acoustic pop, piano, light percussion"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-add-instrumental",
"audio_url": "https://example.com/acapella.mp3",
"title": "Morning Song",
"style": "acoustic pop, piano, light percussion"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'suno-add-instrumental',
audio_url: 'https://example.com/acapella.mp3',
title: 'Morning Song',
style: 'acoustic pop, piano, light percussion'
})
};
fetch('https://api.goenhance.ai/api/v1/audio/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.goenhance.ai/api/v1/audio/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' => 'suno-add-instrumental',
'audio_url' => 'https://example.com/acapella.mp3',
'title' => 'Morning Song',
'style' => 'acoustic pop, piano, light percussion'
]),
CURLOPT_HTTPHEADER => [
"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.goenhance.ai/api/v1/audio/generations"
payload := strings.NewReader("{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.goenhance.ai/api/v1/audio/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/audio/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 3.9
}
}Suno Add Instrumental
Add a full backing track to a vocal-only recording (a cappella, humming, singing). Each request returns 2 versions.
Pricing (per request):
| Option | Tokens | USD |
|---|---|---|
| Per request (2 versions) | 3.9 | $0.078 |
Returns an img_uuid; poll GET /api/v1/jobs/detail (or use custom_callback_url) for the result. On success, json holds one item per song (normally 2):
{
"type": "audio",
"value": "https://cdn4.goenhance.ai/source2/.../output.mp3",
"audio_id": "e231a3f0-...",
"title": "Rainy Night",
"audio_duration": 187.4,
"style": "lofi hip hop, mellow piano",
"lyrics": "[Verse] ..."
}
Keep the task’s img_uuid and each song’s audio_id: that pair is how you extend the song, export WAV, make a music video, split stems or get timestamped lyrics later. Result links expire (see link_expired_at), so download the files you want to keep.
curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-add-instrumental",
"audio_url": "https://example.com/acapella.mp3",
"title": "Morning Song",
"style": "acoustic pop, piano, light percussion"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-add-instrumental",
"audio_url": "https://example.com/acapella.mp3",
"title": "Morning Song",
"style": "acoustic pop, piano, light percussion"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'suno-add-instrumental',
audio_url: 'https://example.com/acapella.mp3',
title: 'Morning Song',
style: 'acoustic pop, piano, light percussion'
})
};
fetch('https://api.goenhance.ai/api/v1/audio/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.goenhance.ai/api/v1/audio/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' => 'suno-add-instrumental',
'audio_url' => 'https://example.com/acapella.mp3',
'title' => 'Morning Song',
'style' => 'acoustic pop, piano, light percussion'
]),
CURLOPT_HTTPHEADER => [
"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.goenhance.ai/api/v1/audio/generations"
payload := strings.NewReader("{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.goenhance.ai/api/v1/audio/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/audio/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"suno-add-instrumental\",\n \"audio_url\": \"https://example.com/acapella.mp3\",\n \"title\": \"Morning Song\",\n \"style\": \"acoustic pop, piano, light percussion\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 3.9
}
}Headers
Body
Model name. Must be suno-add-instrumental.
suno-add-instrumental Required. Public URL of the vocal-only recording.
Required. Song title. Max 80 characters.
80Required. Style of the backing track, e.g. lofi, jazzy chords, soft drums. Max 1000 characters.
1000Optional. The lyrics sung in the recording, to help align the arrangement. Use section markers such as [Verse] and [Chorus]. Max 5000 characters.
5000Suno V6 flavor. standard = V6 (natural vocals, rich detail), mini = V6 Mini (lighter and faster), wild = V6 Wild (bolder, more experimental). All three cost the same.
standard, mini, wild Optional. Styles or traits to avoid, e.g. heavy metal, screaming. Max 200 characters.
200Optional. Preferred singer gender (m / f also accepted). This raises the probability; it is not guaranteed.
male, female Optional. How strictly to follow style, from 0 to 1 (rounded to 2 decimals).
0 <= x <= 1Optional. How experimental the result may be, from 0 to 1 (rounded to 2 decimals).
0 <= x <= 1Optional. How much the result follows the audio features of the source, from 0 to 1 (rounded to 2 decimals). Not available when instrumental is true.
0 <= x <= 1Optional. How different the versions are from each other: 0 off, 1 normal (default), 2 high, 3 extra, 4 max.
0 <= x <= 4Optional. A publicly accessible HTTPS URL. When the task status changes (processing / success / failed), GoEnhance sends a POST request to this URL. The request body is identical to the response of GET /api/v1/jobs/detail. If your server does not respond with HTTP 200, the notification is retried up to 3 times, with a 3-second timeout per attempt.
"https://your-server.com/goenhance/callback"
