Extend
Continue a completed Suno song from a chosen track and timestamp.
POST /v2/music/suno/action — action: "extend"
Equivalent to Suno's Extend button: continues one of the parent job's tracks from a chosen timestamp, generating new music that picks up where the source left off. The result is a fresh pair of tracks — same shape as a generation — and can itself be extended again to build longer songs.
Select the track to extend with index (1 or 2) or with the trackId
from the parent's result.tracks[].id — exactly one of the two.
Request
| Parameter | Type | Required | Description |
|---|---|---|---|
parentJobId | string (uuid) | Yes | ID of the completed suno job to act on |
action | string | Yes | "extend" |
index | number | One of index/trackId | Which of the parent's tracks to extend: 1 or 2 |
trackId | string | One of index/trackId | Track ID from the parent's result.tracks[].id |
continueAt | number | No | Timestamp (seconds) in the source track where the extension starts. Defaults to the end of the track. Must be less than the track's duration (409 otherwise) |
prompt | string | No | Content of the extension — lyrics when the parent was generated with custom_mode: true, a description otherwise (max 5,000 characters). Omit to let Suno continue from the source material |
title | string | No | Title for the extension (max 80 characters). Defaults to the source track's title |
style | string | No | Style/genre tags for the extension (max 1,000 characters). Defaults to the source track's tags |
negative_tags | string | No | Styles to avoid (max 500 characters) |
webhookUrl | string | No | HTTPS URL that receives a JSON POST when the job reaches a subscribed event — see Webhooks for payload formats |
webhookEvents | string[] | No | Events to be notified about: "progress", "completed", "failed". Defaults to ["completed", "failed"] when webhookUrl is set |
The model version and generation mode (custom_mode, instrumental) are
always inherited from the parent — Suno requires extends to use the same
model the source was made with.
The result is the continuation segment, not the merged full song. The new tracks start at
continueAtand run forward; stitch them onto the source audio yourself if you need a single file.
Credits
11 credits per extend (same as a generation — it produces 2 new tracks).
Example result
Once the job is COMPLETED, the result object on
GET /v2/jobs/:id contains a fresh pair of tracks:
{
"tracks": [
{
"id": "2c9a7e51-8f4b-4d3a-b6e0-1f5d8c2a9b74",
"audioUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-0.mp3",
"imageUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-0.jpeg",
"title": "Neon Skyline",
"tags": "synthwave, electronic, upbeat",
"duration": 142.8
},
{
"id": "7e3b1d96-2a5c-4f8e-9c07-4b6a1e8d3f25",
"audioUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-1.mp3",
"imageUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-1.jpeg",
"title": "Neon Skyline",
"tags": "synthwave, electronic, upbeat",
"duration": 138.1
}
]
}Each of these tracks can be used as the parent of another extend.
Code examples
curl -X POST https://api.apiframe.ai/v2/music/suno/action \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"action": "extend",
"index": 1
}'import requests
response = requests.post(
"https://api.apiframe.ai/v2/music/suno/action",
headers={
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
json={
"parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"action": "extend",
"index": 1,
},
)
print(response.json())const response = await fetch("https://api.apiframe.ai/v2/music/suno/action", {
method: "POST",
headers: {
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
parentJobId: "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
action: "extend",
index: 1,
}),
});
console.log(await response.json());body := `{
"parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"action": "extend",
"index": 1
}`
req, _ := http.NewRequest("POST", "https://api.apiframe.ai/v2/music/suno/action",
strings.NewReader(body))
req.Header.Set("X-API-Key", "afk_your_api_key_here")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)Extend from a specific timestamp with new lyrics
curl -X POST https://api.apiframe.ai/v2/music/suno/action \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"action": "extend",
"trackId": "8b2f64d1-3c5e-4a7f-9d2b-6e1a0c4f8b3d",
"continueAt": 120,
"prompt": "[Bridge]\nCity fades into the dawn\n\n[Final Chorus]\nWe are the dreamers, we are the stars",
"title": "Neon Skyline (Extended)"
}'Try it
/v2/music/suno/actionTry it