> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs-dev.ltx.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs-dev.ltx.io/_mcp/server.

# Generate video from audio

POST https://api.ltx.io/v2/audio-to-video
Content-Type: application/json

Generate a video driven by an audio track. Supply dialogue, music, or ambient sound and the model produces visuals synchronized to the audio. Optionally condition on a reference image for visual direction, a last frame for interpolation, and camera motion. Output frame rate defaults to 24 fps; its length is set by the audio.

Responds immediately with the job `id` and `created_at` timestamp. Poll `GET /v2/audio-to-video/{id}` until the status is `completed`, then download from `result.video_url`.

Billed per second of input audio. See [Pricing](/pricing).

Reference: https://docs-dev.ltx.io/api-documentation/api-reference/async-video-generation/submit-audio-to-video

## Authentication

- `Authorization` header (bearer token, required) — API key authentication

## Request

### Body (application/json)

This endpoint expects an AudioToVideoRequest.

- `audio_uri` (string, required) — Audio file to be used as the soundtrack for the video. The audio sets the length of the generated video, so its duration must not exceed the maximum the selected model supports at the chosen resolution. | Model | Resolution | Maximum audio duration | | --- | --- | --- | | `ltx-2-5-fast` | 720p, 1080p | 20 seconds | | `ltx-2-5-fast` | 1440p, 4K | 10 seconds | | `ltx-2-5-pro` | 720p, 1080p | 10 seconds | | `ltx-2-5-pro` | 1440p, 4K | 10 seconds | | `ltx-2-3-pro` | 720p, 1080p | 20 seconds | | `ltx-2-3-pro` | 1440p, 4K | 10 seconds | See [Input Formats](/input-formats#audio-input) for supported formats and size limits.
- `image_uri` (string, optional) — Input image to be used as the first frame of the video. Required if prompt is not provided. See [Input Formats](/input-formats#image-input) for supported formats and size limits.
- `prompt` (string, optional) — Text description of how the video should be generated. Required if image_uri is not provided. Can be empty string when image_uri is provided. If image_uri is provided, this describes how the image should be animated. If no image_uri is provided, this describes the video content.
- `resolution` (string, optional) — The resolution of the generated video in WIDTHxHEIGHT format. When omitted, the resolution is automatically determined based on the input image orientation — portrait images produce 1080x1920 video, landscape images produce 1920x1080 video. If no image is provided, defaults to 1920x1080. Supported resolutions depend on the model — see [Supported Models](/models) for the full matrix. `ltx-2-5-fast`, `ltx-2-5-pro`, and `ltx-2-3-pro` support 720p through 4K.
- `model` (enum, optional, default: ltx-2-3-pro) — Model to use for video generation.
  - Allowed values: `ltx-2-3-pro`, `ltx-2-5-fast`, `ltx-2-5-pro`
- `fps` (integer, optional, default: 24) — Frame rate in frames per second. See [Supported Models](/models) for available FPS per model and resolution.
- `last_frame_uri` (string, optional) — Image to be used as the last frame of the video. Requires `image_uri`. When provided, the video interpolates between the first and last frame. See [Input Formats](/input-formats#image-input) for supported formats and size limits.
- `camera_motion` (enum, optional) — Apply camera motion effects to the generated video.
  - Allowed values: `dolly_in`, `dolly_out`, `dolly_left`, `dolly_right`, `jib_up`, `jib_down`, `static`, `focus_shift`

## Response

### 202

Job submitted successfully

- `id` (string, required) — Unique job identifier. Use this to poll for status.
- `created_at` (datetime, required) — ISO 8601 timestamp of when the job was created.

## Errors

### 400 Bad Request Error

The request is invalid or malformed

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 401 Unauthorized Error

Authentication failed

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 402 Payment Required Error

Insufficient credits

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 422 Unprocessable Entity Error

Content rejected by safety filters

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 429 Too Many Requests Error

Concurrency or queue limit exceeded

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 500 Internal Server Error

An unexpected error occurred

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

### 503 Service Unavailable Error

Service temporarily unavailable

- `type` (enum, required) — Response type indicator
  - Allowed values: `error`
- `error` (ErrorError, required)

## Types

### ErrorError

- `type` (string, required) — Error type for programmatic handling
- `message` (string, required) — Human-readable error description

## Examples

**Request**

```json
{
  "audio_uri": "YOUR_AUDIO_URI",
  "image_uri": "YOUR_IMAGE_URI",
  "prompt": "A beautiful sunset over mountains",
  "resolution": "1920x1080",
  "model": "ltx-2-5-pro"
}
```

**SDK Code**

```python
import requests

url = "https://api.ltx.io/v2/audio-to-video"

payload = {
    "audio_uri": "YOUR_AUDIO_URI",
    "image_uri": "YOUR_IMAGE_URI",
    "prompt": "A beautiful sunset over mountains",
    "resolution": "1920x1080",
    "model": "ltx-2-5-pro"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.ltx.io/v2/audio-to-video"

	payload := strings.NewReader("{\n  \"audio_uri\": \"YOUR_AUDIO_URI\",\n  \"image_uri\": \"YOUR_IMAGE_URI\",\n  \"prompt\": \"A beautiful sunset over mountains\",\n  \"resolution\": \"1920x1080\",\n  \"model\": \"ltx-2-5-pro\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.ltx.io/v2/audio-to-video")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"audio_uri\": \"YOUR_AUDIO_URI\",\n  \"image_uri\": \"YOUR_IMAGE_URI\",\n  \"prompt\": \"A beautiful sunset over mountains\",\n  \"resolution\": \"1920x1080\",\n  \"model\": \"ltx-2-5-pro\"\n}")
  .asString();
```