curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno-v6",
"prompt": "An upbeat indie pop song about a summer road trip with friends",
"variant": "standard"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-v6",
"prompt": "An upbeat indie pop song about a summer road trip with friends",
"variant": "standard"
}
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-v6',
prompt: 'An upbeat indie pop song about a summer road trip with friends',
variant: 'standard'
})
};
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-v6',
'prompt' => 'An upbeat indie pop song about a summer road trip with friends',
'variant' => 'standard'
]),
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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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 V6
Generate full songs with Suno V6. Each request returns 2 songs.
- Simple mode (
custom_mode: false, default): describe what you want inprompt; the model writes the lyrics. You can also attach reference images, a video or audio (photo to music). - Custom mode (
custom_mode: true): send your owntitle,lyricsandstyle, and optionallyduration,negative_tagsand the fine-tuning parameters.
Parameters that belong to the other mode are rejected rather than silently ignored.
Pricing (per request, regardless of variant, length or mode):
| Option | Tokens | USD |
|---|---|---|
| Per request (2 songs) | 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-v6",
"prompt": "An upbeat indie pop song about a summer road trip with friends",
"variant": "standard"
}
'import requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-v6",
"prompt": "An upbeat indie pop song about a summer road trip with friends",
"variant": "standard"
}
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-v6',
prompt: 'An upbeat indie pop song about a summer road trip with friends',
variant: 'standard'
})
};
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-v6',
'prompt' => 'An upbeat indie pop song about a summer road trip with friends',
'variant' => 'standard'
]),
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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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-v6\",\n \"prompt\": \"An upbeat indie pop song about a summer road trip with friends\",\n \"variant\": \"standard\"\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-v6.
suno-v6 false (default, simple mode): describe the song in prompt and the model writes the lyrics. true (custom mode): you provide title and lyrics (or instrumental: true) and can set duration and the fine-tuning parameters.
Simple mode only. What the song should be about and sound like. Max 3000 characters. Required in simple mode unless you give style, lyrics or reference media.
3000true = no vocals. When true, lyrics, vocal_gender and audio_weight must not be sent.
Suno 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. Music style, e.g. lofi hip hop, mellow piano, rainy night. Max 1000 characters.
1000Optional. In custom mode: the exact lyrics to sing (required unless instrumental is true). In simple mode: optional lyric material the model may draw from. Use section markers such as [Verse] and [Chorus]. Max 5000 characters.
5000Custom mode only, and required there. Song title. Max 80 characters.
80Custom mode only. Styles or traits to avoid. Max 200 characters.
200Custom mode only. Target length in seconds, 10 to 360. Omit to let the model decide.
10 <= x <= 360Custom mode only. Preferred singer gender (m / f also accepted). This raises the probability; it is not guaranteed.
male, female Custom mode only. How strictly to follow style, from 0 to 1 (rounded to 2 decimals).
0 <= x <= 1Custom mode only. How experimental the result may be, from 0 to 1 (rounded to 2 decimals).
0 <= x <= 1Custom mode only. 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 <= 1Custom mode only. How different the versions are from each other: 0 off, 1 normal (default), 2 high, 3 extra, 4 max.
0 <= x <= 4Simple mode only. Up to 5 reference images (jpeg / png / webp / bmp, each up to 10 MB) that the song should be inspired by (photo to music).
5Simple mode only. Up to 1 reference video (mp4 / mov / webm, up to 100 MB and 241 seconds).
1Simple mode only. Reference audio (each 6 seconds to 30 minutes, up to 500 MB). style + lyrics + all reference media together must not exceed 10 items.
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"
