> ## 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 Custom Model

> Train a custom Suno model on 6 to 24 reference tracks. $1.44 per request.

`suno-custom-model` trains a custom Suno model on 6 to 24 of your reference tracks. Later generations can use it through `custom_model_task_id`.

| Property | Value |
| - | - |
| Model ID | `suno-custom-model` |
| Endpoint | `POST /v1/music/generations` (asynchronous task) |
| Group | Suno > Upload |
| Input | A name and 6 to 24 public audio URLs |
| Result | A custom model in `result.custom_model` |
| Price | \$1.44 per request (144 credits) |

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-custom-model`.
</ParamField>

<ParamField body="name" type="string" required>
  Name of the custom model, up to 100 characters.
</ParamField>

<ParamField body="audio_urls" type="string[]" required>
  6 to 24 public `http` or `https` audio URLs to learn from, without repeats. MP3, WAV, and M4A work best; one unreadable file can fail the whole task.
</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

```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-custom-model",
    "name": "Warm folk",
    "audio_urls": [
      "https://example.com/ref-01.mp3",
      "https://example.com/ref-02.mp3",
      "https://example.com/ref-03.mp3",
      "https://example.com/ref-04.mp3",
      "https://example.com/ref-05.mp3",
      "https://example.com/ref-06.mp3"
    ]
  }'
```

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`.

## Result

`result.custom_model` holds the model `id` and `name`. To generate with the model, pass this task's `id` as `custom_model_task_id`; you never send the model `id` itself.

```json theme={null}
{
  "urls": [],
  "custom_model": {
    "id": "b7c1e2d4-5f60-4a8b-9c0d-1e2f3a4b5c6d",
    "name": "Warm folk"
  }
}
```

## Use it in later requests

Pass this task's `id` as `custom_model_task_id` to any of these models: [`suno-music`](/api-manual/audio/suno-music), [`suno-inspo`](/api-manual/audio/suno-inspo), [`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-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-mashup`](/api-manual/audio/suno-mashup), [`suno-sample`](/api-manual/audio/suno-sample). Omit `version` when you send it.

<Note>
  See [Music generation tasks](/api-reference/music-generations) for the task lifecycle, result fields, webhooks, and errors.
</Note>
