---
title: "Generate a sound effect for a previously generated spritesheet animation. Pass, as `spritesheet_video_url`, the `video_url` you received from `animateSprite`, `animateSpriteKeyframes`, `transferMotion`, or `editSpritesheet` - it must belong to a spritesheet you generated within the last 7 days; arbitrary external videos are not accepted. Spritesheets generated with the hydra model already come with `audio_url`, so only call this for forge / forge-pixel output or to replace hydra's sound. Optionally add a `prompt` describing the sound you want. The job result is the URL of the generated audio file only; no video is returned. The audio is also attached to the spritesheet, so it appears as `audio_url` in listGenerations (type spritesheet), where the spritesheet keeps the `request_id` it was generated with. Pass an optional `request_id` to make this call idempotent and to find its job again; it must not be one you already used for another generation. Requires an API key (user scope). The call returns 202 with a job id - poll getApiJob (pass wait 30 to long-poll) honouring poll_after_ms, until status is succeeded; its result field is exactly the response documented for this operation. Synchronous responses are deprecated but still supported: pass `async: false` to block until the result is ready and receive it as the response body. Synchronous calls run on the same queue: the response carries an X-Ludo-Job-Id header, and a job still running after 15 minutes comes back as 202 with the job instead of an error. Each account may have up to 50 generations queued or running at once via the API; a request beyond that returns 429 (code PENDING_JOBS_LIMIT)."
method: POST
path: "/assets/sprite/audio"
tags: ["Spritesheets"]
---

# Generate a sound effect for a previously generated spritesheet animation. Pass, as \`spritesheet_video_url\`, the \`video_url\` you received from \`animateSprite\`, \`animateSpriteKeyframes\`, \`transferMotion\`, or \`editSpritesheet\` - it must belong to a spritesheet you generated within the last 7 days; arbitrary external videos are not accepted. Spritesheets generated with the hydra model already come with \`audio_url\`, so only call this for forge / forge-pixel output or to replace hydra's sound. Optionally add a \`prompt\` describing the sound you want. The job result is the URL of the generated audio file only; no video is returned. The audio is also attached to the spritesheet, so it appears as \`audio_url\` in listGenerations (type spritesheet), where the spritesheet keeps the \`request_id\` it was generated with. Pass an optional \`request_id\` to make this call idempotent and to find its job again; it must not be one you already used for another generation. Requires an API key (user scope). The call returns 202 with a job id - poll getApiJob (pass wait 30 to long-poll) honouring poll_after_ms, until status is succeeded; its result field is exactly the response documented for this operation. Synchronous responses are deprecated but still supported: pass \`async: false\` to block until the result is ready and receive it as the response body. Synchronous calls run on the same queue: the response carries an X-Ludo-Job-Id header, and a job still running after 15 minutes comes back as 202 with the job instead of an error. Each account may have up to 50 generations queued or running at once via the API; a request beyond that returns 429 (code PENDING_JOBS_LIMIT).

`POST /assets/sprite/audio`

## Request body

- CreateSpriteAudioPayload — Payload for generating audio for a previously generated spritesheet animation.
  - `spritesheet_video_url` string, required — The video_url of a spritesheet you generated in the last 7 days (returned by animateSprite, animateSpriteKeyframes, transferMotion, or editSpritesheet). External URLs are not accepted.
  - `prompt` string — Optional description of the sound to generate.
  - `request_id` string — Optional client-provided identifier, unique per request. Re-sending the same request_id returns the existing job instead of generating again. It does not re-tag the spritesheet, which keeps the request_id it was generated with.
  - `async` boolean — Defaults to true: the call returns 202 immediately with a job id to poll with getApiJob. Set false for a synchronous response (deprecated but supported): the call then blocks until the result is ready.

## Response `200`

Success

- AudioResult
  - `url` string — URL to the generated audio file
  - `type` string
  - `duration` number, float
  - `request_id` string
  - `created_at` integer

## Other responses

- `202` — Accepted - the generation was queued; poll GET /assets/jobs/{id}. A synchronous (async: false) call still running after 15 minutes also receives this.
- `400` — Error

## Changes

- **2026-09-18** `a8adcc91fe6c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/ludo/apis/ludo-ai-api/changes/assets/sprite/audio/post.md)

---

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