# Kling-o1 Reference Video Generation - Documentation

> For the complete documentation index, see [llms.txt](/llms.txt). Markdown is available with `Accept: text/markdown` and `.md` URL variants.

Source: /docs/api-reference/model-apis-kling-o1-ref2v

# Kling-o1 Reference Video Generation

POST

/

v3

/

async

/

kling-o1-ref2v

Kling-o1 Reference Video Generation

cURL

```
curl --request POST \
--url https://api.novita.ai/v3/async/kling-o1-ref2v \
--header 'Authorization: &#x3C;authorization>' \
--header 'Content-Type: &#x3C;content-type>' \
--data '
{
"video": "&#x3C;string>",
"images": [
"&#x3C;string>"
],
"prompt": "&#x3C;string>",
"duration": 123,
"aspect_ratio": "&#x3C;string>",
"keep_original_sound": true
}
'
```

```
import requestsurl = "https://api.novita.ai/v3/async/kling-o1-ref2v"payload = { "video": "&#x3C;string>", "images": ["&#x3C;string>"], "prompt": "&#x3C;string>", "duration": 123, "aspect_ratio": "&#x3C;string>", "keep_original_sound": True}headers = { "Content-Type": "&#x3C;content-type>", "Authorization": "&#x3C;authorization>"}response = requests.post(url, json=payload, headers=headers)print(response.text)
```

```
const options = { method: 'POST', headers: {'Content-Type': '&#x3C;content-type>', Authorization: '&#x3C;authorization>'}, body: JSON.stringify({ video: '&#x3C;string>', images: ['&#x3C;string>'], prompt: '&#x3C;string>', duration: 123, aspect_ratio: '&#x3C;string>', keep_original_sound: true })};fetch('https://api.novita.ai/v3/async/kling-o1-ref2v', options) .then(res => res.json()) .then(res => console.log(res)) .catch(err => console.error(err));
```

```
&#x3C;?php$curl = curl_init();curl_setopt_array($curl, [ CURLOPT_URL => "https://api.novita.ai/v3/async/kling-o1-ref2v", 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([ 'video' => '&#x3C;string>', 'images' => [ '&#x3C;string>' ], 'prompt' => '&#x3C;string>', 'duration' => 123, 'aspect_ratio' => '&#x3C;string>', 'keep_original_sound' => true ]), CURLOPT_HTTPHEADER => [ "Authorization: &#x3C;authorization>", "Content-Type: &#x3C;content-type>" ],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;}
```

```
package mainimport (	"fmt"	"strings"	"net/http"	"io")func main() {	url := "https://api.novita.ai/v3/async/kling-o1-ref2v"	payload := strings.NewReader("{\n \"video\": \"&#x3C;string>\",\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"prompt\": \"&#x3C;string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"&#x3C;string>\",\n \"keep_original_sound\": true\n}")	req, _ := http.NewRequest("POST", url, payload)	req.Header.Add("Content-Type", "&#x3C;content-type>")	req.Header.Add("Authorization", "&#x3C;authorization>")	res, _ := http.DefaultClient.Do(req)	defer res.Body.Close()	body, _ := io.ReadAll(res.Body)	fmt.Println(string(body))}
```

```
HttpResponse&#x3C;String> response = Unirest.post("https://api.novita.ai/v3/async/kling-o1-ref2v") .header("Content-Type", "&#x3C;content-type>") .header("Authorization", "&#x3C;authorization>") .body("{\n \"video\": \"&#x3C;string>\",\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"prompt\": \"&#x3C;string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"&#x3C;string>\",\n \"keep_original_sound\": true\n}") .asString();
```

```
require 'uri'require 'net/http'url = URI("https://api.novita.ai/v3/async/kling-o1-ref2v")http = Net::HTTP.new(url.host, url.port)http.use_ssl = truerequest = Net::HTTP::Post.new(url)request["Content-Type"] = '&#x3C;content-type>'request["Authorization"] = '&#x3C;authorization>'request.body = "{\n \"video\": \"&#x3C;string>\",\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"prompt\": \"&#x3C;string>\",\n \"duration\": 123,\n \"aspect_ratio\": \"&#x3C;string>\",\n \"keep_original_sound\": true\n}"response = http.request(request)puts response.read_body
```

200

```
{
"task_id": "&#x3C;string>"
}
```

Kling Omni Video O1 reference video generation feature leverages character, prop, or scene references to generate creative videos from multiple perspectives. It extracts subject features and creates new video content while maintaining consistency between frames.

This is an asynchronous API; only the task_id will be returned. You should use the task_id to request the [Task Result API](/docs/api-reference/model-apis-task-result) to retrieve the video generation results.

##

[​](#request-headers)

Request Headers

[​](#param-content-type)

Content-Type

string

required

Supports: `application/json`

[​](#param-authorization)

Authorization

string

required

Bearer authentication format, for example: Bearer {{API Key}}.

##

[​](#request-body)

Request Body

[​](#param-video)

video

string

The video URL.

[​](#param-images)

images

string[]

default:"[]"

Including reference images of the element, scene, style, etc. Max 7.Array length: 0 - 7

[​](#param-prompt)

prompt

string

required

The positive prompt for the generation.

[​](#param-duration)

duration

integer

default:5

The duration of the generated media in seconds.Optional values: `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`

[​](#param-aspect-ratio)

aspect_ratio

string

default:"16:9"

The aspect ratio of the generated video.Optional values: `16:9`, `9:16`, `1:1`

[​](#param-keep-original-sound)

keep_original_sound

boolean

default:true

Select whether to keep the video original sound through the parameter.

##

[​](#response)

Response

[​](#param-task-id)

task_id

string

required

Use the task_id to request the [Task Result API](/docs/api-reference/model-apis-task-result) to retrieve the generated outputs.

Last modified on July 3, 2026
