# Vidu Q3 Pro Start-End-to-Video - 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-vidu-q3-pro-f2v

# Vidu Q3 Pro Start-End-to-Video

POST

/

v3

/

async

/

vidu-q3-pro-f2v

Vidu Q3 Pro Start-End-to-Video

cURL

```
curl --request POST \
--url https://api.novita.ai/v3/async/vidu-q3-pro-f2v \
--header 'Authorization: &#x3C;authorization>' \
--header 'Content-Type: &#x3C;content-type>' \
--data '
{
"seed": 123,
"audio": true,
"images": [
"&#x3C;string>"
],
"is_rec": true,
"prompt": "&#x3C;string>",
"wm_url": "&#x3C;string>",
"duration": 123,
"off_peak": true,
"watermark": true,
"resolution": "&#x3C;string>",
"wm_position": 123
}
'
```

```
import requestsurl = "https://api.novita.ai/v3/async/vidu-q3-pro-f2v"payload = { "seed": 123, "audio": True, "images": ["&#x3C;string>"], "is_rec": True, "prompt": "&#x3C;string>", "wm_url": "&#x3C;string>", "duration": 123, "off_peak": True, "watermark": True, "resolution": "&#x3C;string>", "wm_position": 123}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({ seed: 123, audio: true, images: ['&#x3C;string>'], is_rec: true, prompt: '&#x3C;string>', wm_url: '&#x3C;string>', duration: 123, off_peak: true, watermark: true, resolution: '&#x3C;string>', wm_position: 123 })};fetch('https://api.novita.ai/v3/async/vidu-q3-pro-f2v', 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/vidu-q3-pro-f2v", 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([ 'seed' => 123, 'audio' => true, 'images' => [ '&#x3C;string>' ], 'is_rec' => true, 'prompt' => '&#x3C;string>', 'wm_url' => '&#x3C;string>', 'duration' => 123, 'off_peak' => true, 'watermark' => true, 'resolution' => '&#x3C;string>', 'wm_position' => 123 ]), 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/vidu-q3-pro-f2v"	payload := strings.NewReader("{\n \"seed\": 123,\n \"audio\": true,\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"is_rec\": true,\n \"prompt\": \"&#x3C;string>\",\n \"wm_url\": \"&#x3C;string>\",\n \"duration\": 123,\n \"off_peak\": true,\n \"watermark\": true,\n \"resolution\": \"&#x3C;string>\",\n \"wm_position\": 123\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/vidu-q3-pro-f2v") .header("Content-Type", "&#x3C;content-type>") .header("Authorization", "&#x3C;authorization>") .body("{\n \"seed\": 123,\n \"audio\": true,\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"is_rec\": true,\n \"prompt\": \"&#x3C;string>\",\n \"wm_url\": \"&#x3C;string>\",\n \"duration\": 123,\n \"off_peak\": true,\n \"watermark\": true,\n \"resolution\": \"&#x3C;string>\",\n \"wm_position\": 123\n}") .asString();
```

```
require 'uri'require 'net/http'url = URI("https://api.novita.ai/v3/async/vidu-q3-pro-f2v")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 \"seed\": 123,\n \"audio\": true,\n \"images\": [\n \"&#x3C;string>\"\n ],\n \"is_rec\": true,\n \"prompt\": \"&#x3C;string>\",\n \"wm_url\": \"&#x3C;string>\",\n \"duration\": 123,\n \"off_peak\": true,\n \"watermark\": true,\n \"resolution\": \"&#x3C;string>\",\n \"wm_position\": 123\n}"response = http.request(request)puts response.read_body
```

200

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

Vidu Q3 Pro start-end-to-video generates high-quality videos from first and last frame images with text-guided motion interpolation, supporting up to 1080p resolution.

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-seed)

seed

integer

Random seed for reproducibility. 0 means random.

[​](#param-audio)

audio

boolean

default:true

Whether to generate audio simultaneously when generating video.

[​](#param-images)

images

string[]

required

Two image URLs or Base64 encoded images. First image as start frame, second as end frame. Supports png, jpeg, jpg, webp formats. Max 50MB per image, min 128x128 pixels, aspect ratio must be < 1:4 or 4:1. Both images must have similar resolution (ratio between 0.8-1.25).Array length: 2 - 2

[​](#param-is-rec)

is_rec

boolean

Whether to enable recommendation mode.

[​](#param-prompt)

prompt

string

Text description of desired video motion between start and end frames.Length limit: 0 - 1500

[​](#param-wm-url)

wm_url

string

Custom watermark image URL.

[​](#param-duration)

duration

integer

default:5

Video duration in seconds, range 1-16.Value range: [1, 16]

[​](#param-off-peak)

off_peak

boolean

default:false

Whether to use off-peak mode for lower pricing.

[​](#param-watermark)

watermark

boolean

Whether to add watermark to video.

[​](#param-resolution)

resolution

string

default:"720p"

Resolution of generated video.Optional values: `540p`, `720p`, `1080p`

[​](#param-wm-position)

wm_position

integer

default:3

Watermark position: 1=top-left, 2=top-right, 3=bottom-right, 4=bottom-left.Value range: [1, 4]

##

[​](#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
