ApiframeApiframe Docs
Follow-up ActionsSuno

Extend

Continue a completed Suno song from a chosen track and timestamp.

POST /v2/music/suno/actionaction: "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

ParameterTypeRequiredDescription
parentJobIdstring (uuid)YesID of the completed suno job to act on
actionstringYes"extend"
indexnumberOne of index/trackIdWhich of the parent's tracks to extend: 1 or 2
trackIdstringOne of index/trackIdTrack ID from the parent's result.tracks[].id
continueAtnumberNoTimestamp (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)
promptstringNoContent 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
titlestringNoTitle for the extension (max 80 characters). Defaults to the source track's title
stylestringNoStyle/genre tags for the extension (max 1,000 characters). Defaults to the source track's tags
negative_tagsstringNoStyles to avoid (max 500 characters)
webhookUrlstringNoHTTPS URL that receives a JSON POST when the job reaches a subscribed event — see Webhooks for payload formats
webhookEventsstring[]NoEvents 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 continueAt and 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

POST/v2/music/suno/actionTry it

On this page