---
title: "Run a follow-up action on a completed Udio job"
method: POST
path: "/v2/music/udio/action"
tags: ["Music"]
---

# Run a follow-up action on a completed Udio job

`POST /v2/music/udio/action`

## Request

- Base URL: `https://api.apiframe.ai`
- URL: `https://api.apiframe.ai/v2/music/udio/action`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Runs a follow-up action on a completed `udio` job, referenced by its job ID. Both actions select one of the parent's songs with `index` (1–2) or `trackId` (from the parent's `result.tracks[].id`). `extend` adds up to 32 seconds (`output_length`) to the song, placed before or after it (`placement`). One extension per call — to build a longer track, extend the result again. `remix` generates the song again: `remix_strength` (0.1–1.0, default 0.5) sets how far from the original it lands, and `crop_range` limits it to part of the track. Anything left out is inherited from the source song; the optional generation fields override it. Both return a fresh pair of Udio songs that can be acted on again. Extending is not available for songs generated with a `udio130-*` model or longer than 15 minutes. Returns 409 when the action is not available for the parent job.

## Headers

- `Idempotency-Key` string

## Request body

- union: Discriminated by `action`. Both actions select a song from a completed Udio job with `index` (1–2) or `trackId`. `extend` adds up to 32 seconds before or after it; `remix` generates it again, `remix_strength` away from the original.
  - object
    - `action` 'extend', required
    - `placement` 'after-add-section' | 'after-add-outro' | 'before-add-section' | 'before-add-intro'
    - `output_length` number
    - `prompt` string
    - `lyrics` string
    - `lyrics_prompt` string
    - `lyrics_type` 'generate' | 'user' | 'instrumental'
    - `negative_tags` string
    - `model` 'udio32-v1.5' | 'udio32-v1' | 'udio32-v2' | 'udio130-v1.5' | 'udio130-v1'
    - `seed` integer
    - `prompt_strength` number
    - `lyrics_strength` number
    - `clarity_strength` number
    - `generation_quality` number
    - `bpm` number
    - `voice` object
      - `name` string
      - `id` string
      - `file` string
      - `song` string
      - `similarity` integer
      - `cropStart` number
    - `style_ref` object
      - `name` string
      - `id` string
      - `file` string
      - `song` string
      - `similarity` integer
      - `cropStart` number
    - `parentJobId` string, uuid, required
    - `index` union
      - 1
      - 2
    - `trackId` string
    - `webhookUrl` string, uri
    - `webhookEvents` string[]
  - object
    - `action` 'remix', required
    - `remix_strength` number
    - `crop_range` unknown[]
      - unknown
    - `prompt` string
    - `lyrics` string
    - `lyrics_prompt` string
    - `lyrics_type` 'generate' | 'user' | 'instrumental'
    - `negative_tags` string
    - `model` 'udio32-v1.5' | 'udio32-v1' | 'udio32-v2' | 'udio130-v1.5' | 'udio130-v1'
    - `seed` integer
    - `prompt_strength` number
    - `lyrics_strength` number
    - `clarity_strength` number
    - `generation_quality` number
    - `bpm` number
    - `voice` object
      - `name` string
      - `id` string
      - `file` string
      - `song` string
      - `similarity` integer
      - `cropStart` number
    - `style_ref` object
      - `name` string
      - `id` string
      - `file` string
      - `song` string
      - `similarity` integer
      - `cropStart` number
    - `parentJobId` string, uuid, required
    - `index` union
      - 1
      - 2
    - `trackId` string
    - `webhookUrl` string, uri
    - `webhookEvents` string[]

## Response `202`

Job accepted and queued. Track via `GET /v2/jobs/{id}` or webhook.

- JobAccepted: Returned by every successful job submission.
  - `jobId` string, uuid, required
  - `status` 'QUEUED' | 'PROCESSING' | 'COMPLETED' | 'FAILED', required: Status at the moment the job record was persisted. Almost always `QUEUED`; idempotent replays may return the original status.

## Other responses

- `400`: Request body failed validation.
- `401`: Authentication failed (missing / invalid API key).
- `402`: Team has insufficient credits to run this model.
- `403`: Authenticated but the API key is inactive or lacks permission.
- `429`: Rate limit exceeded. Retry after the `Retry-After` seconds.
- `503`: Service temporarily unavailable (queue / DB outage). Retry with backoff.

---

[API](https://skmtc.dev/apiframe/apis/apiframe-api.md) · [All operations](https://skmtc.dev/apiframe/apis/apiframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apiframe/apis/apiframe-api/revisions/ba1a4c26c86a?raw)
