Gemini Omni Video
curl --request POST \
--url https://whollyapi.com/api/v1/jobs/createTask \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": [
"<string>"
],
"video_list": [
{
"url": "<string>",
"start": 123,
"ends": 123
}
],
"duration": 123,
"aspect_ratio": "<string>",
"resolution": "<string>",
"seed": 123
}
}
'import requests
url = "https://whollyapi.com/api/v1/jobs/createTask"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": ["<string>"],
"video_list": [
{
"url": "<string>",
"start": 123,
"ends": 123
}
],
"duration": 123,
"aspect_ratio": "<string>",
"resolution": "<string>",
"seed": 123
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
image_urls: ['<string>'],
video_list: [{url: '<string>', start: 123, ends: 123}],
duration: 123,
aspect_ratio: '<string>',
resolution: '<string>',
seed: 123
}
})
};
fetch('https://whollyapi.com/api/v1/jobs/createTask', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://whollyapi.com/api/v1/jobs/createTask",
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([
'model' => '<string>',
'input' => [
'prompt' => '<string>',
'image_urls' => [
'<string>'
],
'video_list' => [
[
'url' => '<string>',
'start' => 123,
'ends' => 123
]
],
'duration' => 123,
'aspect_ratio' => '<string>',
'resolution' => '<string>',
'seed' => 123
]
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://whollyapi.com/api/v1/jobs/createTask"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\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(string(body))
}HttpResponse<String> response = Unirest.post("https://whollyapi.com/api/v1/jobs/createTask")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://whollyapi.com/api/v1/jobs/createTask")
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 \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\n }\n}"
response = http.request(request)
puts response.read_body{
"code": 123,
"msg": "<string>",
"data": {
"taskId": "<string>"
}
}Gemini
Gemini Omni Video
Create multimodal videos using text, images, video clips, and character references.
POST
/
api
/
v1
/
jobs
/
createTask
Gemini Omni Video
curl --request POST \
--url https://whollyapi.com/api/v1/jobs/createTask \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": [
"<string>"
],
"video_list": [
{
"url": "<string>",
"start": 123,
"ends": 123
}
],
"duration": 123,
"aspect_ratio": "<string>",
"resolution": "<string>",
"seed": 123
}
}
'import requests
url = "https://whollyapi.com/api/v1/jobs/createTask"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"image_urls": ["<string>"],
"video_list": [
{
"url": "<string>",
"start": 123,
"ends": 123
}
],
"duration": 123,
"aspect_ratio": "<string>",
"resolution": "<string>",
"seed": 123
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
image_urls: ['<string>'],
video_list: [{url: '<string>', start: 123, ends: 123}],
duration: 123,
aspect_ratio: '<string>',
resolution: '<string>',
seed: 123
}
})
};
fetch('https://whollyapi.com/api/v1/jobs/createTask', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://whollyapi.com/api/v1/jobs/createTask",
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([
'model' => '<string>',
'input' => [
'prompt' => '<string>',
'image_urls' => [
'<string>'
],
'video_list' => [
[
'url' => '<string>',
'start' => 123,
'ends' => 123
]
],
'duration' => 123,
'aspect_ratio' => '<string>',
'resolution' => '<string>',
'seed' => 123
]
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://whollyapi.com/api/v1/jobs/createTask"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\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(string(body))
}HttpResponse<String> response = Unirest.post("https://whollyapi.com/api/v1/jobs/createTask")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://whollyapi.com/api/v1/jobs/createTask")
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 \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"image_urls\": [\n \"<string>\"\n ],\n \"video_list\": [\n {\n \"url\": \"<string>\",\n \"start\": 123,\n \"ends\": 123\n }\n ],\n \"duration\": 123,\n \"aspect_ratio\": \"<string>\",\n \"resolution\": \"<string>\",\n \"seed\": 123\n }\n}"
response = http.request(request)
puts response.read_body{
"code": 123,
"msg": "<string>",
"data": {
"taskId": "<string>"
}
}Create a multimodal video generation task using the
Constraint:
Use the returned
gemini-omni-video model.
Create a Video Generation Task
POST /api/v1/jobs/createTask
Authentication
Authorization: Bearer YOUR_API_KEY
Quota
The system provides 7 quota units for content inputs.| Input | Cost | Limit |
|---|---|---|
Image (image_urls) | 1 unit each | 7 images |
Video (video_list) | 2 units each | 1 video |
(images) + (videos × 2) ≤ 7
Examples
- 1 video + leaving 2 image slots.
- With no videos, up to 7 images can be supplied.
Request
{
"model": "gemini-omni-video",
"input": {
"prompt": "Create a futuristic night city short film with a slow push-in shot as the character walks out from a neon-lit street.",
"image_urls": ["https://example.com/assets/scene-1.png"],
"video_list": [{"url": "https://example.com/assets/source-video.mp4", "start": 0, "ends": 10}],
"duration": "4",
"aspect_ratio": "16:9",
"resolution": "720p",
"seed": 0
}
}
Parameters
string
required
Must be
gemini-omni-video.input Parameters
object
required
The
input object contains the parameters used to generate the video.string
required
Use
prompt to describe the video content, style, camera and character action you want to generate in video.Maximum length: 20,000 characters.string[]
Use the provided image URLs for characters, scenes, styles, or storyboard guidance.
The
The
image_urls must contain the URL of an uploaded image. The value must be an uploaded file URL, not the file content itself.Supported image constraints:- Maximum file size: 20 MB
- Maximum file: 7
object[]
Use the provided each video url defines a source video and the trim range to use during generation. .
The
The
video_list must contain the URL of an uploaded video. The value must be an uploaded file URL, not the file content itself.- Each file maximum size: 100 MB.
- Total duration of all videos not exceeding
30seconds. endsshould be greater thanstart- Trim range must not exceed 10 seconds.
- Maximum 1 video.
string
required
Video URL for the generation.
number
required
Start time in seconds.
- Must be
>=0.
number
required
End time in seconds.Note: It should be greater than start.The difference between the end time and the start time must not exceed 10s
- Must be
>=0.
number
When video input is provided, the model determines the output duration automatically and
duration does not take effect.Allowed values: 4, 6, 8, 10.string
default:"16:9"
The aspect ratio of the generated video.Supported values:
16:9 and 9:16. Default: 16:9string
Specify the resolution of the generated video.Supported values:
720p1080p4k
720pnumber
The seed can be used to reproduce results.
- Minimum:
0 - Maximum:
2147483647
Successful Response
number
Response status code.
string
Response message. Contains the error description when the request fails.Example:
successobject
required
The task data object containing task id.
string
required
The unique identifier for this task.Example:
task_123456taskId with the unified Get Task Details endpoint to check progress and retrieve results.
Get Task Details
Check task status, monitor generation progress, and retrieve results.
