> ## Documentation Index
> Fetch the complete documentation index at: https://docs.snapgen.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Suno Extend

> Continue one of your Suno tracks from a chosen second. $0.075 per request, $0.15 in Max mode.

`suno-extend` continues one of your Suno tracks from a chosen second. It keeps the song's sound and adds a new part from your lyrics or a description. The extension is a new track that starts at `continue_at`; join it with the original into one full-length song with [`suno-concat`](/api-manual/audio/suno-concat).

| Property | Value |
| - | - |
| Model ID | `suno-extend` |
| Endpoint | `POST /v1/music/generations` (asynchronous task) |
| Group | Suno > Edit |
| Input | A track from one of your earlier tasks, a start second, and lyrics or a description |
| Result | Tracks in `result.tracks` with `audio_url` |
| Price | \$0.075 per request (7.5 credits); \$0.15 with `max_mode: true` |

Confirm live rates on the [SnapGen models page](https://snapgen.org/models). Failed tasks are not charged.

<ParamField body="model" type="string" required>
  Set to `suno-extend`.
</ParamField>

<ParamField body="source_task_id" type="string" required>
  The `id` of your earlier task that holds the source track. It must be your own task, must have succeeded, and must come from a model listed in [Source tracks](#source-tracks).
</ParamField>

<ParamField body="source_index" type="integer" default="1">
  Position of the source track in that task's `result.tracks`, counting from `1` (up to `8`).
</ParamField>

<ParamField body="continue_at" type="number" required>
  Second in the source track where the new part starts, from 1 to 3,600. Keep it below the track's length.
</ParamField>

<ParamField body="version" type="string" default="v6">
  Suno model version: `v6`, `v6-wild`, or `v6-mini`. Omit it when you send `custom_model_task_id`.
</ParamField>

<ParamField body="custom_model_task_id" type="string">
  The `id` of a succeeded [`suno-custom-model`](/api-manual/audio/suno-custom-model) task. Generates with that custom model instead of a public `version`, so don't send `version` or `persona_task_id`.
</ParamField>

<ParamField body="custom" type="boolean">
  `true` is custom mode: `prompt` holds the lyrics and the style fields apply. `false` is description mode: `gpt_description` guides the result and is required, and `max_mode` and `duration` aren't allowed. The provider treats an omitted value as `true`.
</ParamField>

<ParamField body="prompt" type="string">
  Lyrics for the continuation, up to 5,000 characters. Applies in custom mode.
</ParamField>

<ParamField body="gpt_description" type="string">
  Description-mode prompt, up to 3,000 characters. Required when `custom` is `false`.
</ParamField>

<ParamField body="title" type="string">
  Track title, up to 80 characters. Applies in custom mode.
</ParamField>

<ParamField body="tags" type="string">
  Style tags, up to 1,000 characters. Applies in custom mode.
</ParamField>

<ParamField body="negative_tags" type="string">
  Styles to avoid, up to 1,000 characters. Applies in custom mode.
</ParamField>

<ParamField body="style_weight" type="number">
  Style weight, from 0 to 1. Applies in custom mode.
</ParamField>

<ParamField body="weirdness" type="number">
  Creativity, from 0 to 1. Higher values are more experimental.
</ParamField>

<ParamField body="audio_weight" type="number">
  Audio weight, from 0 to 1. Applies in custom mode.
</ParamField>

<ParamField body="vocal_gender" type="string">
  `male` or `female` vocals.
</ParamField>

<ParamField body="variety" type="string">
  Style variation: `off`, `normal`, `high`, `extra`, or `max`. It doesn't turn on Max mode or change the price.
</ParamField>

<ParamField body="max_mode" type="boolean" default="false">
  `true` turns on Suno Max mode and bills twice the request price. Not allowed with `custom: false`.
</ParamField>

<ParamField body="audio_format" type="string">
  Output format: `mp3`, `m4a`, or `wav`. The provider picks one if you omit it.
</ParamField>

<ParamField body="auto_lyrics" type="boolean">
  `true` rewrites the lyrics you send creatively. Applies in custom mode.
</ParamField>

<ParamField body="persona_task_id" type="string">
  The `id` of a succeeded [`suno-persona`](/api-manual/audio/suno-persona) task. The song is sung with that Persona. Applies in custom mode. Can't be combined with `custom_model_task_id`.
</ParamField>

<ParamField body="duration" type="integer">
  Target length in seconds, from 10 to 360. The finished track can be shorter or longer. Not allowed with `custom: false`.
</ParamField>

<ParamField body="webhook" type="string">
  Optional public `https` URL that receives one signed event when the task finishes. See [Task webhooks](/api-reference/webhooks).
</ParamField>

<ParamField body="webhook_secret" type="string">
  Required with `webhook`: 16 to 256 characters, used to sign the delivery.
</ParamField>

## Request rules

The gateway checks these before it reserves any balance:

* `custom: false` requires `gpt_description`.
* `max_mode` and `duration` aren't allowed with `custom: false`.
* Send either `version` or `custom_model_task_id`, not both.
* `persona_task_id` can't be combined with `custom_model_task_id`.

## Source tracks

The source task must be your own succeeded task from one of these models:

[`suno-music`](/api-manual/audio/suno-music), [`suno-inspo`](/api-manual/audio/suno-inspo), [`suno-sounds`](/api-manual/audio/suno-sounds), [`suno-upload`](/api-manual/audio/suno-upload), [`suno-upload-cover`](/api-manual/audio/suno-upload-cover), [`suno-upload-extend`](/api-manual/audio/suno-upload-extend), [`suno-extend`](/api-manual/audio/suno-extend), [`suno-cover`](/api-manual/audio/suno-cover), [`suno-remaster`](/api-manual/audio/suno-remaster), [`suno-add-vocals`](/api-manual/audio/suno-add-vocals), [`suno-add-instrumental`](/api-manual/audio/suno-add-instrumental), [`suno-add-stem`](/api-manual/audio/suno-add-stem), [`suno-replace-section`](/api-manual/audio/suno-replace-section), [`suno-remove-section`](/api-manual/audio/suno-remove-section), [`suno-crop`](/api-manual/audio/suno-crop), [`suno-fade-in`](/api-manual/audio/suno-fade-in), [`suno-fade-out`](/api-manual/audio/suno-fade-out), [`suno-speed`](/api-manual/audio/suno-speed), [`suno-concat`](/api-manual/audio/suno-concat), [`suno-mashup`](/api-manual/audio/suno-mashup), [`suno-sample`](/api-manual/audio/suno-sample).

Send the task `id` as `source_task_id` and pick the track with `source_index`. Never send provider track or clip IDs. See [Reference earlier tasks](/api-reference/music-generations#reference-earlier-tasks).

## Request

```bash theme={null}
curl https://api.snapgen.org/v1/music/generations \
  -H "Authorization: Bearer $SNAPGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-extend",
    "source_task_id": "task_2f8KcX1mQpR7vT0yZa9Lb3",
    "source_index": 1,
    "continue_at": 60,
    "prompt": "[Chorus]\nWe keep on driving through the night"
  }'
```

The response is HTTP `202` with a task object and a `Location: /v1/tasks/{id}` header. Poll [`GET /v1/tasks/{id}`](/api-reference/task-status) every 10 to 20 seconds until `status` is `succeeded` or `failed`.

## Extend and join a song

<Steps>
  <Step title="Generate or import the source">
    Run [`suno-music`](/api-manual/audio/suno-music), or import your own audio
    with [`suno-upload`](/api-manual/audio/suno-upload), and wait until the
    task succeeds. Note its `id` and the `index` of the track you want to
    continue.
  </Step>

  <Step title="Extend the track">
    Send `suno-extend` with that task as `source_task_id`, the track as
    `source_index`, and the second to continue from as `continue_at`. Pick a
    second inside the track, such as the end of a chorus. In custom mode,
    `prompt` holds the lyrics of the new part.
  </Step>

  <Step title="Join the parts">
    Send [`suno-concat`](/api-manual/audio/suno-concat) with the extension
    task as `source_task_id`. Its result is the full song, from the start of
    the source to the end of the extension.
  </Step>
</Steps>

```bash theme={null}
curl https://api.snapgen.org/v1/music/generations \
  -H "Authorization: Bearer $SNAPGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-concat",
    "source_task_id": "task_7hQmN2pX5rT8vW1yZc4Kd6",
    "source_index": 1
  }'
```

You can extend an extension again before joining. See the
[complete workflow with code](/api-reference/music-generations#workflow-generate-extend-and-join).

## Result

`result.tracks[]` lists every track in its original order, each with its `index` and `audio_url`, plus `title`, `image_url`, `duration_seconds`, `lyrics`, and `tags` when the provider returns them. `result.urls` lists the audio URLs.

```json theme={null}
{
  "urls": [
    "https://cdn.example.com/music/night-drive.mp3"
  ],
  "tracks": [
    {
      "index": 1,
      "id": "clip_8f3a2c",
      "title": "Night Drive",
      "audio_url": "https://cdn.example.com/music/night-drive.mp3",
      "image_url": "https://cdn.example.com/music/night-drive.jpg",
      "duration_seconds": 184.6,
      "tags": "lo-fi, soft piano, rain"
    }
  ]
}
```

<Note>
  Result URLs are kept for about 72 hours. Download the files you want to keep.
  See [Music generation tasks](/api-reference/music-generations) for the task lifecycle, result fields, webhooks, and errors.
</Note>
