curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"model": "suno-extend",
"task_id": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"audio_id": "e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11",
"continue_at": 60,
"lyrics": "[Bridge]\nThe road keeps rolling on\n[Chorus]\nWe'll sing until the dawn"
}
EOFimport requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-extend",
"task_id": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"audio_id": "e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11",
"continue_at": 60,
"lyrics": "[Bridge]
The road keeps rolling on
[Chorus]
We'll sing until the dawn"
}
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-extend',
task_id: 'c12b656c-747a-44fd-9c80-add79b0c52d5',
audio_id: 'e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11',
continue_at: 60,
lyrics: '[Bridge]\nThe road keeps rolling on\n[Chorus]\nWe\'ll sing until the dawn'
})
};
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-extend',
'task_id' => 'c12b656c-747a-44fd-9c80-add79b0c52d5',
'audio_id' => 'e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11',
'continue_at' => 60,
'lyrics' => '[Bridge]
The road keeps rolling on
[Chorus]
We\'ll sing until the dawn'
]),
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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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 Extend
Continue a song from a chosen point. Each request returns 2 versions.
Pick exactly one source:
task_id+audio_id: one of your earlier Suno songsaudio_url: your own audio file (up to 8 minutes)
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 @- <<EOF
{
"model": "suno-extend",
"task_id": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"audio_id": "e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11",
"continue_at": 60,
"lyrics": "[Bridge]\nThe road keeps rolling on\n[Chorus]\nWe'll sing until the dawn"
}
EOFimport requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "suno-extend",
"task_id": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"audio_id": "e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11",
"continue_at": 60,
"lyrics": "[Bridge]
The road keeps rolling on
[Chorus]
We'll sing until the dawn"
}
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-extend',
task_id: 'c12b656c-747a-44fd-9c80-add79b0c52d5',
audio_id: 'e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11',
continue_at: 60,
lyrics: '[Bridge]\nThe road keeps rolling on\n[Chorus]\nWe\'ll sing until the dawn'
})
};
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-extend',
'task_id' => 'c12b656c-747a-44fd-9c80-add79b0c52d5',
'audio_id' => 'e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11',
'continue_at' => 60,
'lyrics' => '[Bridge]
The road keeps rolling on
[Chorus]
We\'ll sing until the dawn'
]),
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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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-extend\",\n \"task_id\": \"c12b656c-747a-44fd-9c80-add79b0c52d5\",\n \"audio_id\": \"e231a3f0-6c1d-4a8b-9f10-2b8cadc7dc11\",\n \"continue_at\": 60,\n \"lyrics\": \"[Bridge]\\nThe road keeps rolling on\\n[Chorus]\\nWe'll sing until the dawn\"\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-extend.
suno-extend 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 your own audio to extend (up to 8 minutes).
Optional. Second in the source where the continuation starts. Must be greater than 0 and less than the source length.
Optional. When extending one of your Suno songs, the source's variant is used automatically and a different value is rejected (Suno requires the same version). When extending an uploaded file, defaults to standard.
standard, mini, wild true = no vocals. When true, lyrics, vocal_gender and audio_weight must not be sent.
Optional. Song title. Max 100 characters.
100Optional. Music style, e.g. lofi hip hop, mellow piano, rainy night. Max 1000 characters.
1000Optional. Lyrics for the new part. Use section markers such as [Verse] and [Chorus]. Max 5000 characters.
5000Optional. 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"
