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

# Generate video from image

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

Animate a still image with realistic motion, depth, and audio. Provide a reference image plus a prompt describing the desired motion. The output preserves the visual identity of the source image.

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

Billed per second of generated video. See [Pricing](/pricing).

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

## Authentication

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

## Request

### Body (application/json)

This endpoint expects an ImageToVideoRequest.

- `image_uri` (string, required) — Image to be used as the first frame of the video. See [Input Formats](/input-formats#image-input) for supported formats and size limits.
- `prompt` (string, required) — Text description of how the image should be animated, can relate to the details in the image
- `model` (enum, required) — Model to use for generation. See [Supported Models](/models) for details.
  - Allowed values: `ltx-2-3-fast`, `ltx-2-3-pro`, `ltx-2-5-fast`, `ltx-2-5-pro`
- `duration` (integer, required, nullable) — Video duration in seconds. See [Supported Models](/models) for available durations per model. Pass `null` to let `ltx-2-5-fast` or `ltx-2-5-pro` choose the length from your prompt — see [Automatic duration](/models/ltx-2-5#automatic-duration). Cannot be combined with `last_frame_uri`.
- `resolution` (string, required) — Output video resolution. See [Supported Models](/models) for available resolutions per model.
- `fps` (integer, optional, default: 24) — Frame rate in frames per second. See [Supported Models](/models) for available FPS per model and resolution.
- `generate_audio` (boolean, optional, default: true) — Generate audio for the video. When true, the generated video will include AI-generated audio matching the scene. When false, only silent video is generated.
- `last_frame_uri` (string, optional) — Image to be used as the last frame of the video. When provided, the video will interpolate between the first frame (image_uri) and this 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
{
  "image_uri": "YOUR_IMAGE_URI",
  "prompt": "Clouds drifting across the sky as the sun sets slowly",
  "model": "ltx-2-5-pro",
  "duration": 8,
  "resolution": "1920x1080"
}
```

**SDK Code**

```python
import requests

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

payload = {
    "image_uri": "YOUR_IMAGE_URI",
    "prompt": "Clouds drifting across the sky as the sun sets slowly",
    "model": "ltx-2-5-pro",
    "duration": 8,
    "resolution": "1920x1080"
}
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/image-to-video"

	payload := strings.NewReader("{\n  \"image_uri\": \"YOUR_IMAGE_URI\",\n  \"prompt\": \"Clouds drifting across the sky as the sun sets slowly\",\n  \"model\": \"ltx-2-5-pro\",\n  \"duration\": 8,\n  \"resolution\": \"1920x1080\"\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/image-to-video")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"image_uri\": \"YOUR_IMAGE_URI\",\n  \"prompt\": \"Clouds drifting across the sky as the sun sets slowly\",\n  \"model\": \"ltx-2-5-pro\",\n  \"duration\": 8,\n  \"resolution\": \"1920x1080\"\n}")
  .asString();
```