# Ltx 2.3 Quality · Outpaint · LoRA API

> 최대 3개의 커스텀 LoRA를 적용하는 화면 비율 기반 비디오 아웃페인팅

동영상을 더 큰 캔버스로 아웃페인팅하며 최대 3개의 사용자 지정 LoRAs(각 3 GB)가 포함된 `loras` 목록이 필요합니다. `aspect_ratio`(21:9~9:21)와 `output_resolution`(480p, 720p 또는 1080p), 새 영역을 위한 `prompt`를 설정합니다. `source_scale`은 0.25~1이며 `video_strength`는 원본 콘텐츠를 유지합니다.

- Model id: `ltx-2.3-quality/outpaint/lora`
- Made by: Lightricks
- Category: Video to Video
- Output: video
- Price per megapixel of your output video: $0.00271 / megapixel of output video (cheapest run $0.003 (3 API credits))
- Run: `POST https://api.doitong.com/v1/run/ltx-2.3-quality/outpaint/lora`
- Quote: `POST https://api.doitong.com/v1/quote/ltx-2.3-quality/outpaint/lora`
- Docs page: https://doitong.com/ko/developers/models/ltx-2.3-quality/outpaint/lora

## Pricing

Price: **$0.00271 / 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.304 = 304 API credits (112 MP output video × $0.002708).

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-quality/outpaint/lora` 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 |  |  | 아웃페인팅으로 공간 경계를 확장할 소스 동영상입니다. |
| `aspect_ratio` |  | enum (string) | no | `16:9` | `21:9`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `9:21` | 아웃페인팅 종횡비입니다. 예를 들어 4:3 입력을 16:9로 확장할 수 있습니다. 프레임을 깔끔하게 확장하려면 소스와 다른 비율을 선택하세요. |
| `output_resolution` |  | enum (string) | no | `720p` | `480p`, `720p`, `1080p` | 출력 해상도 등급입니다. 기본값은 균형 잡힌 720p 옵션입니다. 더 빠른 생성에는 480p를, 더 큰 캔버스에는 1080p를 선택할 수 있으며 LTX 제한을 충족해야 합니다. |
| `resolution` |  | object {width, height} \| enum (string) | no | `landscape_16_9` | `auto`, `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | 이전 버전 설정을 사용하는 정확한 캔버스 크기이며, 이전 버전과의 호환성을 위해 유지됩니다. 새 요청에서는 대신 `aspect_ratio`를 `output_resolution`과 함께 사용해야 합니다. |
| `source_scale` |  | number | no | `1` | 0.25 – 1 | 아웃페인팅 전에 대상 캔버스 안에서 소스 동영상에 적용할 크기 조정 비율입니다. 값을 줄이면 줌아웃 테두리가 생기고 결과의 안정성이 낮아집니다. 4:3에서 16:9로 변경하는 것과 같은 실제 화면비 확장에서는 권장값 1.0을 사용하면 캔버스 안에 소스를 가능한 가장 큰 크기로 맞춥니다. |
| `video_strength` |  | number | no | `1` | 0 – 1 | IC-LoRA 동영상 가이던스를 통해 아웃페인팅된 캔버스에서 원본 동영상을 얼마나 유지할지 제어합니다. 값을 높이면 소스를 더 가깝게 보존합니다. |
| `num_frames` |  | integer | no | `121` | 9 – 481 | 생성된 출력의 프레임 수입니다. |
| `frames_per_second` |  | number | no | `24` | 1 – 60 | 초당 프레임 수로 측정한 출력 동영상 프레임 속도입니다. |
| `num_inference_steps` |  | integer | no | `15` | 8 – 30 | 실행할 추론 단계를 최대 30까지 설정합니다. 변경하지 않으면 15를 사용합니다. |
| `guidance_scale` |  | number | no | `1` | 1 – 20 | 이 배율로 classifier-free guidance를 조정합니다. 기본 조정은 높은 품질과 빠른 생성을 모두 목표로 합니다. |
| `generate_audio` |  | boolean | no | `true` |  | 반환되는 MP4의 오디오 트랙 토글입니다. 끄면 동영상 전용 파일을 만들고, 켜면 오디오를 포함합니다. |
| `negative_prompt` |  | string | no | `color distortion, overexposure, static, blurry details, subtitles, style, artwork, painting, frame, still, dim overall tone, worst quality, low quality, JPEG compression artifacts, ugly, mutilated, extra fingers, poorly drawn hands, poorly drawn face, deformed, disfigured, malformed limbs, fused fingers, motionless frame, cluttered background, three legs, crowded background, walking backwards` |  | 생성에서 피해야 할 항목을 지정하는 부정 프롬프트입니다. |
| `seed` |  | integer \| null | no |  |  | 생성을 재현 가능하게 하는 시드입니다. None으로 설정하면 무작위로 선택됩니다. |
| `enable_prompt_expansion` |  | boolean | no | `true` |  | 프롬프트 확장 활성화 여부를 제어합니다. |
| `enable_safety_checker` |  | boolean | no | `true` |  | 안전 검사를 활성화할지 제어합니다. |
| `video_quality` |  | enum (string) | no | `high` | `low`, `medium`, `high`, `maximum` | 출력 동영상에 적용되는 품질 프리셋입니다. |
| `video_write_mode` |  | enum (string) | no | `balanced` | `fast`, `balanced`, `small` | 결과 동영상의 기록 모드입니다. |
| `loras` |  | array of object {path, scale, transformer} | yes |  | ≤ 3 items | LTX-2.3용 LoRA 추가 항목입니다. 각각 3 GB로 제한되며 최대 3개까지 허용됩니다. 레지스트리의 SSRF 안전 다운로더가 각 경로를 가져온 후에만 로드됩니다. |
| `loras[].path` |  | string | yes |  | ≤ 2048 characters | 3 GB 이하의 LoRA .safetensors 파일에 대한 직접 HTTP(S) URL입니다. 로드 전에 SSRF 안전 다운로더로 가져옵니다. |
| `loras[].scale` |  | number | no | `1` | 0 – 2 | 0.0–2.0 범위에서 이 강도가 높을수록 생성 동영상에 대한 LoRA 영향이 커집니다. |
| `loras[].transformer` |  | enum (string) | no | `both` | `high`, `low`, `both` | Transformer 선택 플래그입니다. LTX-2.3은 transformer가 하나뿐이므로 거의 모든 사용자에게 'both'가 적합합니다. 여러 transformer를 사용하는 향후 아키텍처를 지원하기 위해 존재합니다. |

File parameters (`video`) 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
{
  "loras": [
    {
      "path": "https://example.com/your-file.safetensors"
    }
  ],
  "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
{
  "loras": [
    {
      "path": "https://example.com/your-file.safetensors"
    }
  ],
  "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-quality/outpaint/lora?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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-quality/outpaint/lora?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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 = {
    "loras": [
        {
            "path": "https://example.com/your-file.safetensors",
        },
    ],
    "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-quality/outpaint/lora", 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-quality/outpaint/lora",
      "input": {
        "loras": [
          {
            "path": "https://example.com/your-file.safetensors"
          }
        ],
        "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-quality/outpaint/lora",
  "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": 304,
    "usd": "0.304",
    "charged": 304,
    "refunded": 0
  },
  "input": {
    "loras": [
      {
        "path": "https://example.com/your-file.safetensors"
      }
    ],
    "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
    },
    "seed": 42,
    "prompt": "string"
  },
  "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} | 모델이 생성한 동영상입니다. |
| `seed` | integer | 생성에 실제로 적용된 시드입니다. |
| `prompt` | string | 사용 전에 적용된 확장을 포함한 생성 프롬프트입니다. |

## Related models

- [Ltx 2.3 Quality · Text to Video](https://doitong.com/developers/models/ltx-2.3-quality/text-to-video.md) (`ltx-2.3-quality/text-to-video`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Text to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-quality/text-to-video/lora.md) (`ltx-2.3-quality/text-to-video/lora`): $0.00271 / megapixel of output video
- [Ltx 2.3 Quality · Image to Video](https://doitong.com/developers/models/ltx-2.3-quality/image-to-video.md) (`ltx-2.3-quality/image-to-video`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Image to Video · LoRA](https://doitong.com/developers/models/ltx-2.3-quality/image-to-video/lora.md) (`ltx-2.3-quality/image-to-video/lora`): $0.00271 / megapixel of output video
- [Ltx 2.3 Quality · Ingredient](https://doitong.com/developers/models/ltx-2.3-quality/ingredient.md) (`ltx-2.3-quality/ingredient`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Clean Plate](https://doitong.com/developers/models/ltx-2.3-quality/clean-plate.md) (`ltx-2.3-quality/clean-plate`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Colorization](https://doitong.com/developers/models/ltx-2.3-quality/colorization.md) (`ltx-2.3-quality/colorization`): $0.00241 / megapixel of output video
- [Ltx 2.3 Quality · Cross Eyed](https://doitong.com/developers/models/ltx-2.3-quality/cross-eyed.md) (`ltx-2.3-quality/cross-eyed`): $0.00241 / megapixel of output video

## Links

- HTML page: https://doitong.com/developers/models/ltx-2.3-quality/outpaint/lora
- 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-quality/outpaint/lora
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/ltx-2.3-quality/outpaint/lora
