# LTX-2.3 22B · Extend Video API

> 根据提示词延续现有视频，支持生成音频和可选的结尾图像

接收 `video_url` 和 `prompt`，生成延续视频，帧数为 `num_frames`（9 到 481）。可选的 `end_image_url` 设置延续部分的结束画面。`match_input_fps` 保持源视频帧率，`generate_audio` 添加声音，`video_size` 默认为 auto。输出格式可以是 mp4、webm、mov 或 GIF。

- Model id: `ltx-2.3-22b/extend-video`
- Made by: Lightricks
- Category: Video to Video
- Output: video
- Price per megapixel of your output video: $0.00161 / megapixel of output video (cheapest run $0.002 (2 API credits))
- Run: `POST https://api.doitong.com/v1/run/ltx-2.3-22b/extend-video`
- Quote: `POST https://api.doitong.com/v1/quote/ltx-2.3-22b/extend-video`
- Docs page: https://doitong.com/zh/developers/models/ltx-2.3-22b/extend-video

## Pricing

Price: **$0.00161 / megapixel of output video**. Price per megapixel of your output video: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

The full example input below costs $0.18 = 180 API credits (112 MP output video × $0.001605).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/ltx-2.3-22b/extend-video` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | 作为视频生成基础的提示词。 |
| `video_url` | `video` | string (video URL) | yes |  |  | 指向待延长视频的 URL。 |
| `end_image_url` | `end_image` | string (image URL) \| null | no |  |  | 通过 URL 提供最后一帧图像，以定义延长视频的结尾。 |
| `num_frames` |  | integer | no | `121` | 9 – 481 | 生成输出的帧数。 |
| `video_size` |  | object {width, height} \| enum (string) | no | `auto` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | 生成视频的尺寸。 |
| `generate_audio` |  | boolean | no | `true` |  | 控制视频是否包含生成的音频。 |
| `use_multiscale` |  | boolean | no | `true` |  | 用于提升一致性和细节的多尺度生成开关。为 True 时，较小的初始视频会引导第二次生成，第二次生成的尺寸达到或超过请求尺寸。 |
| `match_input_fps` |  | boolean | no | `true` |  | 输出帧率覆盖值；启用时使用源视频的 FPS 替代默认目标 FPS。 |
| `fps` |  | number | no | `24` | 1 – 60 | 输出视频帧率，以每秒帧数表示。 |
| `num_inference_steps` |  | integer | no | `40` | 8 – 50 | 执行的推理步数。 |
| `video_cfg_scale` |  | number | no | `3` | 1 – 20 | 视频引导设置：提高该值可增强生成内容的一致性和聚焦程度。使用 classifier-free guidance (CFG)。 |
| `video_stg_scale` |  | number | no | `0` | 0 – 20 | 通过 Spatiotemporal Guidance (STG) 比例控制视频的一致性和聚焦程度；提高该设置可增强两者。 |
| `video_rescaling_scale` |  | number | no | `0.7` | 0 – 1 | 视频重缩放调整值，以比例形式平衡 classifier-free guidance 与时空引导。 |
| `video_modality_scale` |  | number | no | `3` | 0 – 10 | 视频模态调整值，以比例形式平衡视频和音频的贡献。 |
| `audio_cfg_scale` |  | number | no | `7` | 1 – 20 | 音频引导设置：提高该值可增强生成内容的一致性和聚焦程度。使用 classifier-free guidance (CFG)。 |
| `audio_stg_scale` |  | number | no | `0` | 0 – 20 | 通过 Spatiotemporal Guidance (STG) 比例控制音频的一致性和聚焦程度；提高该设置可增强两者。 |
| `audio_rescaling_scale` |  | number | no | `0.7` | 0 – 1 | 音频重缩放调整值，以比例形式平衡 classifier-free guidance 与时空引导。 |
| `audio_modality_scale` |  | number | no | `3` | 0 – 10 | 音频模态调整值，以比例形式平衡视频和音频的贡献。 |
| `gradient_estimation_gamma` |  | number | no | `2` | 0 – 10 | 去噪梯度估计设置：0 会关闭估计；否则，该值指定 gamma。 |
| `use_restart_sampling` |  | boolean | no | `false` |  | 用于提升视频质量的重启采样开关：启用后会在每个去噪步骤加入少量噪声。 |
| `scheduler` |  | enum (string) | no | `ltx2` | `ltx2`, `linear_quadratic`, `beta` | 调度器选择。 |
| `acceleration` |  | enum (string) | no | `regular` | `none`, `regular`, `high`, `full` | 应用于处理的加速级别。 |
| `camera_lora` |  | enum (string) | no | `none` | `dolly_in`, `dolly_out`, `dolly_left`, `dolly_right`, `jib_up`, `jib_down`, `static`, `none` | 摄像机 LoRA 选择，用于比单独使用摄像机运动提示词更精确地控制生成视频中的运动。 |
| `camera_lora_scale` |  | number | no | `1` | 0 – 1 | 摄像机 LoRA 强度，用于比单独使用摄像机运动提示词更精确地控制生成视频中的运动。 |
| `negative_prompt` |  | string | no | `news broadcast, 3d animation, computer graphics, pc game, console game, video game, cartoon, childish, watermark, logo, text, on screen text, subtitles, titles, signature, slowmo, static` |  | 视频生成期间使用的负面提示词。 |
| `seed` |  | integer \| null | no |  |  | 用于初始化随机数生成的种子值。 |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | 控制是否启用提示词扩展。 |
| `enable_safety_checker` |  | boolean | no | `true` |  | 控制是否启用安全检查。 |
| `video_output_type` |  | enum (string) | no | `X264 (.mp4)` | `X264 (.mp4)`, `VP9 (.webm)`, `PRORES4444 (.mov)`, `GIF (.gif)` | 结果视频的输出类型。 |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | 结果视频的质量级别。 |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | 结果视频的写入模式。 |
| `distill_lora_first_pass_scale` |  | number | no | `0.2` | 0 – 1 | 控制第一轮 distill LoRA 缩放值，设为 0 可关闭。 |
| `distill_lora_second_pass_scale` |  | number | no | `0.5` | 0 – 1 | 控制第一轮之后每一轮的 distill LoRA 缩放值。 |
| `extend_direction` |  | enum (string) | no | `forward` | `forward`, `backward` | 要延长的视频一侧：选择 'backward' 在开头之前添加内容，或选择 'forward' 在结尾之后添加内容。 |
| `num_context_frames` |  | integer | no | `25` | 0 – 121 | 延长视频时用于提供上下文的帧数。 |
| `video_strength` |  | number | no | `1` | 0 – 1 | 此条件强度控制修改视频内容的自由度：设置越小，模型的发挥空间越大。 |
| `audio_strength` |  | number | no | `1` | 0 – 1 | 此条件强度控制修改音频内容的自由度：设置越小，模型的发挥空间越大。 |
| `end_image_strength` |  | number | no | `1` | 0 – 1 | 控制结束图像对生成视频的影响程度。 |

File parameters (`video`, `end_image`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/ltx-2.3-22b/extend-video?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/ltx-2.3-22b/extend-video?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/ltx-2.3-22b/extend-video", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "ltx-2.3-22b/extend-video",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "ltx-2.3-22b/extend-video",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 180,
    "usd": "0.18",
    "charged": 180,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200,
      "width": 1024,
      "height": 768,
      "fps": 1.0,
      "duration": 5,
      "num_frames": 1
    },
    "seed": 42,
    "prompt": "A woman stands still amid a busy neon-lit street at night. The camera slowly dollies in toward her face as people blur past, their motion emphasizing her calm presence. City lights flicker and reflections shift across her denim jacket."
  },
  "outputs": [
    {
      "type": "video",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_size": 1843200,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size, width, height, fps, duration, num_frames} | 模型生成的视频。 |
| `seed` | integer | 用于初始化随机数生成的种子值。 |
| `prompt` | string | 用于引导生成的提示词。 |

## Related models

- [LTX-2.3 22B · Text to Video](https://doitong.com/developers/models/ltx-2.3-22b/text-to-video.md) (`ltx-2.3-22b/text-to-video`): $0.00161 / megapixel of output video
- [LTX-2.3 22B · Text to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-22b/text-to-video/lora.md) (`ltx-2.3-22b/text-to-video/lora`): $0.00181 / megapixel of output video
- [LTX-2.3 22B · Image to Video](https://doitong.com/developers/models/ltx-2.3-22b/image-to-video.md) (`ltx-2.3-22b/image-to-video`): $0.00161 / megapixel of output video
- [LTX-2.3 22B · Image to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-22b/image-to-video/lora.md) (`ltx-2.3-22b/image-to-video/lora`): $0.00181 / megapixel of output video
- [LTX 2.3 22B](https://doitong.com/developers/models/ltx-2.3-22b/reference-video-to-video/lora.md) (`ltx-2.3-22b/reference-video-to-video/lora`): $0.00181 / megapixel of output video
- [LTX-2.3 22B · Extend Video · LoRA](https://doitong.com/developers/models/ltx-2.3-22b/extend-video/lora.md) (`ltx-2.3-22b/extend-video/lora`): $0.00181 / megapixel of output video
- [LTX-2.3 22B · Reference Video to Video](https://doitong.com/developers/models/ltx-2.3-22b/reference-video-to-video.md) (`ltx-2.3-22b/reference-video-to-video`): $0.00161 / megapixel of output video
- [LTX-2.3 22B · Video to Video](https://doitong.com/developers/models/ltx-2.3-22b/video-to-video.md) (`ltx-2.3-22b/video-to-video`): $0.00161 / megapixel of output video

## Links

- HTML page: https://doitong.com/developers/models/ltx-2.3-22b/extend-video
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=ltx-2.3-22b/extend-video
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/ltx-2.3-22b/extend-video
