curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-stem-split",
"audio_url": "https://example.com/my-song.mp3",
"mode": "vocals"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-stem-split",
"audio_url": "https://example.com/my-song.mp3",
"mode": "vocals"
}
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-stem-split',
audio_url: 'https://example.com/my-song.mp3',
mode: 'vocals'
})
};
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-stem-split',
'audio_url' => 'https://example.com/my-song.mp3',
'mode' => 'vocals'
]),
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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 3.25
}
}Suno Stem Split
Separate a song into stems. Pick exactly one source: task_id + audio_id (one of your Suno songs) or audio_url (any audio, up to 20 MB). Works best on clean mixes such as AI-generated songs.
Pricing (per request, by mode):
| Option | Tokens | USD |
|---|---|---|
| vocals · 2 stems | 3.25 | $0.065 |
| single · 1 instrument | 6.5 | $0.130 |
| stems · up to 12 stems | 16.25 | $0.325 |
Separating the same audio again is charged again, so keep the results.
Result: json holds one item per stem, e.g. { "type": "audio", "value": "https://...mp3", "stem": "vocal" }. stem is one of vocal, instrumental, backing_vocals, drums, bass, guitar, keyboard, strings, brass, woodwinds, percussion, synth, fx. Stems the song doesn’t contain are not returned. Result links expire (see link_expired_at).
curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-stem-split",
"audio_url": "https://example.com/my-song.mp3",
"mode": "vocals"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-stem-split",
"audio_url": "https://example.com/my-song.mp3",
"mode": "vocals"
}
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-stem-split',
audio_url: 'https://example.com/my-song.mp3',
mode: 'vocals'
})
};
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-stem-split',
'audio_url' => 'https://example.com/my-song.mp3',
'mode' => 'vocals'
]),
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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\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-stem-split\",\n \"audio_url\": \"https://example.com/my-song.mp3\",\n \"mode\": \"vocals\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 3.25
}
}Headers
Body
Model name. Must be suno-stem-split.
suno-stem-split The img_uuid of one of your earlier successful Suno tasks that produced songs (suno-v6, suno-extend, suno-cover, suno-add-vocals, suno-add-instrumental, suno-replace-section or suno-mashup). Must be sent together with audio_id.
The audio_id of the song to use, taken from that task's result (json[].audio_id). Must be sent together with task_id.
Alternative to task_id + audio_id: a public URL of any audio file, up to 20 MB.
vocals (default): 2 stems, vocals + instrumental (vocal remover / karaoke). stems: up to 12 stems. single: extract one instrument named in stem_name.
vocals, stems, single Required when mode is single (case-insensitive), not allowed otherwise. The instrument to extract.
Lead Vocal, Drum Kit, Kick, Snare, Risers, Bass, Backing Vocals, Piano, Electric Guitar, Percussion, String Section, Synth, Acoustic Guitar, Sound Effects, Synth Pad, Synth Bass, Guitar, Brass Section, Organ, Electronic Drum Kit, Lead Electric Guitar, Synth Keys, Rhythm Electric Guitar, Electric Piano, Upright Bass, Keyboards, Distorted Electric Guitar, Synth Strings, Synth Lead, Woodwinds, Rhythm Acoustic Guitar, Flute, Harp, Tambourine, Trumpet, Arpeggiator, Accordion, Fiddle, Pedal Steel Guitar, Synth Voice, Violin, Digital Piano, Synth Brass, Mandolin, Choir, Banjo, Bells, Clarinet, Tenor Saxophone, Trombone, Shaker, French Horn, Glockenspiel, Electric Bass, Cello, Timpani, Harmonica, Marimba, Vibraphone, Lap Steel Guitar, Saxophone, Orchestra, Horns, Cymbals, Hand Clap, Oboe, Celesta, Congas, Drone, Alto Saxophone, Double Bass, Ukulele, Harpsichord, Baritone Saxophone, Xylophone, Tuba, Bass Guitar, Whistle, Lead Guitar, Rhodes, 808, Bongos, Bassoon, Cowbell, Viola, Sitar, Steel Drums, Piccolo, Theremin, Bagpipes, Hi-Hat, Music Box, Melodica, Tabla, Koto, Djembe, Taiko, Didgeridoo Optional. 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"
