> ## Documentation Index
> Fetch the complete documentation index at: https://docs.omnimux.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Public hosts only: console https://omnimux.ai/dashboard · API https://api.omnimux.ai · docs https://docs.omnimux.ai.
> Gateway auth is Authorization: Bearer sk-… on https://api.omnimux.ai/v1 (OpenAI-compatible Chat Completions and related paths).
> Discover pages from /llms.txt; full site dump /llms-full.txt; product skill /skill.md; docs search MCP /mcp. Prefer .md page URLs for Markdown.
> Default docs locale is en; zh mirrors the same relative paths. Do not invent model ids not present on live pricing or the complete API pages.

# LTX digital human

> GxgenAI LTX 2.3 photo lip-sync · model `ltx-2-3-kj`

* Create: `POST /v1/video/generations` with `model` `ltx-2-3-kj`
* Poll: `GET /v1/video/generations/{task_id}` (do **not** use `*-async` / `*-query` names)
* This is **photo + audio lip-sync**, not text-to-video. `metadata.nodeInfoList` is required
* Upload image/audio to a public URL or an upstream file name first. Raw `data:` URIs fail
* Persist result URLs promptly (upstream links expire)

## Identity

| Field  | Value         |
| ------ | ------------- |
| Series | Video         |
| Brand  | LTX / GxgenAI |
| model  | `ltx-2-3-kj`  |

## Endpoint

| Method | Path                              |
| ------ | --------------------------------- |
| `POST` | `/v1/video/generations`           |
| `GET`  | `/v1/video/generations/{task_id}` |

Base URL: `https://api.omnimux.ai`

## Authorizations

| Name            | In     | Type   | Required | Description               |
| --------------- | ------ | ------ | -------- | ------------------------- |
| `Authorization` | header | string | yes      | `Bearer sk-...` (API key) |

## Body

| Field                   | Type   | Required | Description                        |
| ----------------------- | ------ | -------- | ---------------------------------- |
| `model`                 | string | yes      | Must be `ltx-2-3-kj`               |
| `prompt`                | string | no       | Action hint; also send node `1624` |
| `metadata.nodeInfoList` | array  | **yes**  | Image + audio + duration nodes     |

Required nodes:

| nodeId | fieldName | Meaning                                       |
| ------ | --------- | --------------------------------------------- |
| `444`  | `image`   | Portrait still (9:16 or 16:9)                 |
| `1755` | `audio`   | Speech or song                                |
| `1583` | `value`   | Duration seconds (`0` = full audio; keep ≤35) |
| `1776` | `value`   | Audio start second                            |
| `1624` | `value`   | Motion prompt                                 |
| `1606` | `value`   | Max resolution (`<1600`)                      |
| `1586` | `value`   | FPS                                           |

## Response

### 200 (create)

| Field            | Type   | Description                            |
| ---------------- | ------ | -------------------------------------- |
| `id` / `task_id` | string | Task id                                |
| `status`         | string | `queued` / `in_progress` / `completed` |

Poll [Video task](/en/api-reference/tasks/video-task). Errors: [Error codes](/en/faqs/connection-usage).

<Panel>
  <RequestExample>
    ```bash cURL theme={null}
    curl --request POST \
      --url https://api.omnimux.ai/v1/video/generations \
      --header 'Authorization: Bearer <token>' \
      --header 'Content-Type: application/json' \
      --data '{
      "model": "ltx-2-3-kj",
      "prompt": "Look at camera and speak naturally. Locked shot.",
      "metadata": {
        "nodeInfoList": [
          { "nodeId": "444", "fieldName": "image", "fieldValue": "https://example.com/face.jpg" },
          { "nodeId": "1755", "fieldName": "audio", "fieldValue": "https://example.com/speech.mp3" },
          { "nodeId": "1583", "fieldName": "value", "fieldValue": "10" },
          { "nodeId": "1776", "fieldName": "value", "fieldValue": "0" },
          { "nodeId": "1624", "fieldName": "value", "fieldValue": "Look at camera and speak naturally. Locked shot." },
          { "nodeId": "1606", "fieldName": "value", "fieldValue": "1280" },
          { "nodeId": "1586", "fieldName": "value", "fieldValue": "25" }
        ]
      }
    }'
    ```
  </RequestExample>

  <ResponseExample>
    ```json 200 theme={null}
    {
      "id": "task_xxx",
      "status": "in_progress",
      "model": "ltx-2-3-kj"
    }
    ```

    ```json 400 theme={null}
    { "error": { "message": "metadata.nodeInfoList is required for model ltx-2-3-kj", "type": "invalid_request_error", "code": "bad_request" } }
    ```

    ```json 401 theme={null}
    { "error": { "message": "Invalid token", "type": "authentication_error", "code": "unauthorized" } }
    ```

    ```json 402 theme={null}
    {
      "error": {
        "message": "Insufficient quota. Please top up your account.",
        "type": "insufficient_quota",
        "code": "insufficient_quota"
      }
    }
    ```

    ```json 403 theme={null}
    { "error": { "message": "Forbidden", "type": "permission_error", "code": "forbidden" } }
    ```

    ```json 429 theme={null}
    { "error": { "message": "Rate limit exceeded", "type": "rate_limit_error", "code": "rate_limit_exceeded" } }
    ```

    ```json 500 theme={null}
    { "error": { "message": "Internal server error", "type": "server_error", "code": "internal_error" } }
    ```
  </ResponseExample>
</Panel>
