curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-mashup",
"audio_urls": [
"https://example.com/track-a.mp3",
"https://example.com/track-b.mp3"
],
"style": "dance pop, 120 bpm",
"title": "Two Worlds"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-mashup",
"audio_urls": ["https://example.com/track-a.mp3", "https://example.com/track-b.mp3"],
"style": "dance pop, 120 bpm",
"title": "Two Worlds"
}
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-mashup',
audio_urls: ['https://example.com/track-a.mp3', 'https://example.com/track-b.mp3'],
style: 'dance pop, 120 bpm',
title: 'Two Worlds'
})
};
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-mashup',
'audio_urls' => [
'https://example.com/track-a.mp3',
'https://example.com/track-b.mp3'
],
'style' => 'dance pop, 120 bpm',
'title' => 'Two Worlds'
]),
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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\n}"
response = http.request(request)
puts response.read_bodySuno Mashup
Blend two audio tracks into one new song. 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-mashup",
"audio_urls": [
"https://example.com/track-a.mp3",
"https://example.com/track-b.mp3"
],
"style": "dance pop, 120 bpm",
"title": "Two Worlds"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-mashup",
"audio_urls": ["https://example.com/track-a.mp3", "https://example.com/track-b.mp3"],
"style": "dance pop, 120 bpm",
"title": "Two Worlds"
}
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-mashup',
audio_urls: ['https://example.com/track-a.mp3', 'https://example.com/track-b.mp3'],
style: 'dance pop, 120 bpm',
title: 'Two Worlds'
})
};
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-mashup',
'audio_urls' => [
'https://example.com/track-a.mp3',
'https://example.com/track-b.mp3'
],
'style' => 'dance pop, 120 bpm',
'title' => 'Two Worlds'
]),
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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\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-mashup\",\n \"audio_urls\": [\n \"https://example.com/track-a.mp3\",\n \"https://example.com/track-b.mp3\"\n ],\n \"style\": \"dance pop, 120 bpm\",\n \"title\": \"Two Worlds\"\n}"
response = http.request(request)
puts response.read_bodyHeaders
Body
Model name. Must be suno-mashup.
suno-mashup Required. Exactly 2 public audio URLs to blend.
2 elementsRequired. Music style, e.g. lofi hip hop, mellow piano, rainy night. Max 1000 characters.
1000Required. Song title. Max 80 characters.
80Optional. Lyrics for the mashup. 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. Target length in seconds, 10 to 360. Omit to let the model decide.
10 <= x <= 360Optional. 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"
