# LTX Video 2.3 Quality Outpaint

VIDEOFeaturedlightricks-ltx-v2-3-quality-outpaint

**LTX Video 2.3 Quality Outpaint** is a spatial video outpainting model from [Lightricks](https://www.lightricks.com/ltx-studio) that extends a source clip onto a larger canvas. It supports 480p, 720p, and 1080p output at 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, or 9:21, with optional native audio and clips up to 20 seconds. Built for reframing existing footage into new aspect ratios without a hard crop.

Best for

Reframe clips to 480p, 720p, or 1080p canvases, Extend 4:3 or 9:16 footage into 16:9 or 21:9

POST

/v2/workspaces/{workspace\_id}/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences

```bash
curl --request POST \
  --url https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "prompt": "a knight standing in a snowy forest",
  "aspect_ratio": "LANDSCAPE_16_9_1080p",
  "quality": "XHIGH",
  "duration_seconds": 5,
  "fps": "24",
  "generate_audio": false,
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ]
}'
```

```python
import requests


url = "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences"


payload = {
    "prompt": "a knight standing in a snowy forest",
    "aspect_ratio": "LANDSCAPE_16_9_1080p",
    "quality": "XHIGH",
    "duration_seconds": 5,
    "fps": "24",
    "generate_audio": False,
    "guidance_file_init_video": [{ "url": "<file_url>" }]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}


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


print(response.json())
```

```js
const url = 'https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"prompt":"a knight standing in a snowy forest","aspect_ratio":"LANDSCAPE_16_9_1080p","quality":"XHIGH","duration_seconds":5,"fps":"24","generate_audio":false,"guidance_file_init_video":[{"url":"<file_url>"}]}'
};


try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main


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


func main() {


  url := "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences"


  payload := strings.NewReader("{\n  \"prompt\": \"a knight standing in a snowy forest\",\n  \"aspect_ratio\": \"LANDSCAPE_16_9_1080p\",\n  \"quality\": \"XHIGH\",\n  \"duration_seconds\": 5,\n  \"fps\": \"24\",\n  \"generate_audio\": false,\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\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))


}
```

```php
<?php


$curl = curl_init();


curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'prompt' => 'a knight standing in a snowy forest',
    'aspect_ratio' => 'LANDSCAPE_16_9_1080p',
    'quality' => 'XHIGH',
    'duration_seconds' => 5,
    'fps' => '24',
    'generate_audio' => null,
    'guidance_file_init_video' => [
        [
                'url' => '<file_url>'
        ]
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
  ],
]);


$response = curl_exec($curl);
$err = curl_error($curl);


curl_close($curl);


if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
```

```java
OkHttpClient client = new OkHttpClient();


MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"prompt\": \"a knight standing in a snowy forest\",\n  \"aspect_ratio\": \"LANDSCAPE_16_9_1080p\",\n  \"quality\": \"XHIGH\",\n  \"duration_seconds\": 5,\n  \"fps\": \"24\",\n  \"generate_audio\": false,\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}");
Request request = new Request.Builder()
  .url("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences")
  .post(body)
  .addHeader("Authorization", "Bearer <token>")
  .addHeader("Content-Type", "application/json")
  .build();


Response response = client.newCall(request).execute();
```

```ruby
require 'uri'
require 'net/http'


url = URI("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences")


http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true


request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"prompt\": \"a knight standing in a snowy forest\",\n  \"aspect_ratio\": \"LANDSCAPE_16_9_1080p\",\n  \"quality\": \"XHIGH\",\n  \"duration_seconds\": 5,\n  \"fps\": \"24\",\n  \"generate_audio\": false,\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}"


response = http.request(request)
puts response.read_body
```

```csharp
var client = new RestClient("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/lightricks-ltx-v2-3-quality-outpaint/inferences");
var request = new RestRequest("", Method.Post);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"prompt\": \"a knight standing in a snowy forest\",\n  \"aspect_ratio\": \"LANDSCAPE_16_9_1080p\",\n  \"quality\": \"XHIGH\",\n  \"duration_seconds\": 5,\n  \"fps\": \"24\",\n  \"generate_audio\": false,\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}", ParameterType.RequestBody);
var response = client.Execute(request);
```

* Layer API

## Authorizations

* **[bearerAuth](/docs/v2/rest-api#bearerauth)**
* **[oauth2](/docs/v2/rest-api#oauth2)**

## Parameters

### Path Parameters

**workspace\_id**

required

_Workspace Id_

Id of the workspace that owns the resource.

string format: uuid

Id of the workspace that owns the resource.

### Query Parameters

**session\_name**

_Session Name_

Organize this run under a named session. A new session is created if none matches.

string

nullable

Organize this run under a named session. A new session is created if none matches.

### Header Parameters

**Idempotency-Key**

string

<= 255 characters

Opaque key making this request safe to retry. The first request with a given key executes; a later request with the same key returns that first response with `Idempotent-Replayed: true` instead of executing again. The key covers the method, path, query, and body it was first used with; reusing it for a different request is rejected with 422\. Replayable for 24 hours.

## Request Bodyrequired

_LTX Video 2.3 Quality Outpaint_object

**prompt**

_Prompt_

string

""

**negative\_prompt**

_Negative Prompt_

_Advanced field._

string

""

**aspect\_ratio**

_Aspect Ratio_

string

default: LANDSCAPE\_16\_9\_1080p

Allowed values: LANDSCAPE\_21\_9\_1080p PORTRAIT\_9\_21\_1080p LANDSCAPE\_16\_9\_1080p PORTRAIT\_9\_16\_1080p LANDSCAPE\_4\_3\_1080p PORTRAIT\_3\_4\_1080p SQUARE\_1080p LANDSCAPE\_21\_9\_720p PORTRAIT\_9\_21\_720p LANDSCAPE\_16\_9\_720p PORTRAIT\_9\_16\_720p LANDSCAPE\_4\_3\_720p PORTRAIT\_3\_4\_720p SQUARE\_720p LANDSCAPE\_21\_9\_480p PORTRAIT\_9\_21\_480p LANDSCAPE\_16\_9\_480p PORTRAIT\_9\_16\_480p LANDSCAPE\_4\_3\_480p PORTRAIT\_3\_4\_480p SQUARE\_480p

**quality**

_Quality_

string

default: XHIGH

Allowed values: LOW MEDIUM HIGH XHIGH

**seed**

_Seed_

_Advanced field._

integer

nullable

**guidance\_scale**

_Guidance Scale_

_Advanced field._

number

default: 1 \>= 1 <= 20 multiple of 0.5

**inference\_steps**

_Inference Steps_

_Advanced field._

integer

default: 15 \>= 8 <= 30 multiple of 1

**duration\_seconds**

_Duration_

integer

default: 5

**fps**

_FPS_

string

default: 24

Allowed value: 24

**generate\_audio**

_Generate Audio_

boolean

**guidance\_file\_init\_video**

required

_Source video_

The video to modify

Array<object>

\>= 1 items

_InferenceFormFileRef_

A single guidance/reference file supplied to a `reference_image_list` field.

The slot’s guidance `type` is fixed by the field it’s attached to; the caller supplies the file URL and, where the model supports per-file weighting, a weight.

object

**url**

required

_Url_

string

**weight**

_Weight_

number

nullable

**prompt\_language**

_Prompt Language_

_Advanced field._

string

nullable

##### Example

```json
{
  "prompt": "a knight standing in a snowy forest",
  "aspect_ratio": "LANDSCAPE_16_9_1080p",
  "quality": "XHIGH",
  "duration_seconds": 5,
  "fps": "24",
  "generate_audio": false,
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ]
}
```

## Responses

### 202

Successful Response

_ExecuteForgeOutput_object

**inference\_id**

required

_Inference Id_

Unique identifier for this forge run.

string format: uuid

**status**

required

_InferenceStatus_

Current status: IN\_PROGRESS.

string

Allowed values: in\_progress complete failed cancelled deleted

**estimated\_price\_creative\_units**

_Estimated Price Creative Units_

Estimated price in Creative Units.

number

nullable

**poll\_interval\_seconds**

required

_Poll Interval Seconds_

Suggested polling interval in seconds.

integer

**created\_at**

required

_Created At_

Timestamp of when the run was created.

string format: date-time

**session\_id**

_Session Id_

Session ID the run was added to, if a session was specified.

string format: uuid

nullable

**normalized\_parameters**

Any of:

**NormalizedInferenceParameters**

_NormalizedInferenceParameters_

Inference parameters after model-specific normalization.

These reflect the actual values used for generation, including model defaults applied for any parameters not explicitly set.

object

**width**

_Width_

Resolved output width in pixels.

integer

nullable

**height**

_Height_

Resolved output height in pixels.

integer

nullable

**batch\_size**

_Batch Size_

Number of outputs to generate.

integer

nullable

**num\_inference\_steps**

_Num Inference Steps_

Resolved number of diffusion steps.

integer

nullable

**guidance\_scale**

_Guidance Scale_

Resolved guidance scale.

number

nullable

**duration\_seconds**

_Duration Seconds_

Resolved output length in seconds — video duration or audio clip length.

number

nullable

**fps**

_Fps_

Resolved FPS.

integer

nullable

**null**

null

##### Example

```json
{
  "status": "in_progress"
}
```

### 401

Unauthenticated — missing or invalid Bearer token.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 403

Forbidden — insufficient permissions, or the access token lacks the scope the operation requires.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 404

Resource not found.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 409

The request with this `Idempotency-Key` is still running — retry after the number of seconds in `Retry-After`.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 422

Invalid input parameters, or an `Idempotency-Key` reused for a different request.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 429

Rate limited — retry after the number of seconds in `Retry-After`.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 500

Internal server error.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```
