CyHUB
РусскийGet an API key

Gemini Omni API

Gemini Omni video from a prompt: with pictures, a source video and a voice, or from the first frame to the last one.

Developer: GoogleModel key in the API: gemeni_omni

For AI assistants:Download .mdAll documentation .mdOpen as text

Connect in three steps

  1. Get a keyCreate a key in the dashboard after you confirm your email. One key opens every model.
  2. Check the pricePOST /v1/price shows the cost of a run in advance, without charging you.
  3. Run a task and collect the resultPOST /v1/tasks starts a task, GET /v1/tasks/{id} shows its status and files.

Ready-to-use code

Replace YOUR_API_KEY with your key. The code starts a task and waits for the result. In cURL, repeat the second request with the id from the first response instead of TASK_ID until status becomes succeeded.

cURL
curl -X POST "https://api.cyhub.ai/v1/tasks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Рыжий кот в шляпе идёт по осенней улице, камера медленно едет следом",
    "duration": "6",
    "aspect_ratio": "9:16",
    "resolution": "720p",
    "voice": "achernar"
  }
}'

curl "https://api.cyhub.ai/v1/tasks/TASK_ID" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
import time

import requests

API = "https://api.cyhub.ai/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

body = {
    "model": "gemeni_omni",
    "settings": {
        "mode": "materials",
        "prompt": "Рыжий кот в шляпе идёт по осенней улице, камера медленно едет следом",
        "duration": "6",
        "aspect_ratio": "9:16",
        "resolution": "720p",
        "voice": "achernar",
    },
}

response = requests.post(f"{API}/tasks", json=body, headers=HEADERS, timeout=60)
response.raise_for_status()
task = response.json()
while task["status"] in ("queued", "running"):
    time.sleep(5)
    task = requests.get(f"{API}/tasks/{task['id']}", headers=HEADERS, timeout=30).json()
print(task["status"], task["result"])
Node.js
const API = "https://api.cyhub.ai/v1";
const HEADERS = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };

const body = {
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Рыжий кот в шляпе идёт по осенней улице, камера медленно едет следом",
    "duration": "6",
    "aspect_ratio": "9:16",
    "resolution": "720p",
    "voice": "achernar"
  }
};

async function main() {
  let response = await fetch(`${API}/tasks`, { method: "POST", headers: HEADERS, body: JSON.stringify(body) });
  if (!response.ok) throw new Error(await response.text());
  let task = await response.json();
  while (task.status === "queued" || task.status === "running") {
    await new Promise((resolve) => setTimeout(resolve, 5000));
    response = await fetch(`${API}/tasks/${task.id}`, { headers: HEADERS });
    task = await response.json();
  }
  console.log(task.status, task.result);
}

main();
Get a key

Price before the run

Prices as of 15.10.2026: from 46 ₽. POST /v1/price shows the exact price of your settings.

Send the same settings to POST /v1/price: the response shows the price of the run without charging you.

cURL
curl -X POST "https://api.cyhub.ai/v1/price" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Рыжий кот в шляпе идёт по осенней улице, камера медленно едет следом",
    "duration": "6",
    "aspect_ratio": "9:16",
    "resolution": "720p",
    "voice": "achernar"
  }
}'
  • amount_minor: the price of the run in minor units (kopecks for rubles)
  • currency: the wallet currency
  • available_minor: how much your balance has for new tasks right now

Modes

Each mode has its own parameters and examples. The mode is set by the mode field.

From a prompt and materials

Video from a prompt. You can attach pictures and a source video and pick a voice, all of it optional. Materials take at most seven slots: a picture takes one, a video two.

Value of the mode field: materials

Price in this mode from 46 ₽.

Parameters

Model parameters go inside settings. Omitted optional fields take their default values.

promptRequired

What happens in the video: who acts, where, how the camera moves.

Type: StringMinimum characters: 1Maximum characters: 5000
durationOptional

Clip length in seconds; the price depends on it.

Type: StringAllowed values: 46810Default: "4"
aspect_ratioOptional

Portrait 9:16 or landscape 16:9.

Type: StringAllowed values: 9:1616:9Default: "9:16"
resolutionOptional

Resolution of the finished video. 360p, 720p and 1080p cost the same, 4K costs more.

Type: StringAllowed values: 360p720p1080p4kDefault: "720p"
image_urlsOptional

Up to seven picture URLs: people, objects, places, style. No more than five with a source video. The model sees them itself, so the prompt can simply say, for example, "the woman from the photo walks down the street".

Type: List (String, uri)Maximum items: 7
video_urlOptional

One URL of a source video no longer than 30 seconds. The model takes its first 10 seconds. With a video, duration is ignored: the model picks the length of the new clip, and the price is the same for any length.

Type: List (String, uri)Maximum items: 1
voiceOptional

Optional: a voice from the ready-made set that speaks in the video. The voices are English-speaking and may have an accent in other languages.

Type: StringAllowed values: achernarachirdalgenibalgiebaalnilamaoedeautonoecallirrhoecharondespinaenceladuserinomefenrirgacruxiapetuskorelaomedeialedaoruspuckpulcherrimarasalgethisadachbiasadaltagerschedarsulafatumbrielvindemiatrixzephyrzubenelgenubi

Parameters not listed here are not accepted: the response is 422 unknown_setting.

Input

  • Pictures are URLs of JPEG, PNG or WebP files, up to 20 MB each.
  • A video is a URL of an MP4 or MOV file up to 100 MB and no longer than 30 seconds.
FieldAcceptsFormatsFilesFile size up to
image_urlsImagesjpeg, jpg, png, webp720 MB
video_urlVideomp4, mov1100 MB
How to send files

Request example

Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.

Video from a prompt

JSON
{
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Рыжий кот в шляпе идёт по осенней улице, камера медленно едет следом",
    "duration": "6",
    "aspect_ratio": "9:16",
    "resolution": "720p"
  }
}

Video from pictures

JSON
{
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Женщина с фото идёт по набережной на закате",
    "image_urls": [
      "https://example.com/woman.jpg",
      "https://example.com/embankment.jpg"
    ],
    "duration": "8",
    "aspect_ratio": "16:9"
  }
}

From a source video with a voice

JSON
{
  "model": "gemeni_omni",
  "settings": {
    "mode": "materials",
    "prompt": "Тот же танец на крыше под дождём, в конце танцор говорит «Поехали!»",
    "video_url": [
      "https://example.com/dance.mp4"
    ],
    "voice": "puck"
  }
}

The price is calculated when the task is accepted, currency RUB.

Complete generation example

Output

  • One MP4 video.
  • Generation usually takes 3 to 15 minutes.
KindFormatsHow manyNote
videomp41

A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.

JSON
{
  "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "status": "succeeded",
  "finished_at": "2026-10-01T12:03:41+00:00",
  "result": {
    "caption": "Caption of the result: the model and its settings",
    "texts": [],
    "files_expire_at": "2026-10-08T12:03:41+00:00",
    "files_expired": false,
    "artifacts": [
      {
        "index": 0,
        "kind": "video",
        "filename": "video.mp4",
        "size": 12582912,
        "caption": "",
        "download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
      }
    ]
  }
}
How to read the result and download files

First and last frame

The video runs from the first frame to the last one. The first frame is required, the last one is optional. The model takes no other materials in this mode.

Value of the mode field: frames

Price in this mode from 46 ₽.

Parameters

Model parameters go inside settings. Omitted optional fields take their default values.

promptRequired

What happens in the video: who acts, where, how the camera moves.

Type: StringMinimum characters: 1Maximum characters: 5000
durationOptional

Clip length in seconds; the price depends on it.

Type: StringAllowed values: 46810Default: "4"
aspect_ratioOptional

Portrait 9:16 or landscape 16:9.

Type: StringAllowed values: 9:1616:9Default: "9:16"
resolutionOptional

Resolution of the finished video. 360p, 720p and 1080p cost the same, 4K costs more.

Type: StringAllowed values: 360p720p1080p4kDefault: "720p"
first_frame_urlRequired

One picture URL: the first frame of the video.

Type: List (String, uri)Maximum items: 1
last_frame_urlOptional

One picture URL: the last frame of the video. Only together with the first one.

Type: List (String, uri)Maximum items: 1

Parameters not listed here are not accepted: the response is 422 unknown_setting.

Input

  • Pictures are URLs of JPEG, PNG or WebP files, up to 20 MB each.
FieldAcceptsFormatsFilesFile size up to
first_frame_urlImagesjpeg, jpg, png, webp120 MB
last_frame_urlImagesjpeg, jpg, png, webp120 MB
How to send files

Request example

Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.

From the first frame to the last one

JSON
{
  "model": "gemeni_omni",
  "settings": {
    "mode": "frames",
    "prompt": "Бутон медленно раскрывается в цветок, мягкий утренний свет",
    "first_frame_url": [
      "https://example.com/bud.png"
    ],
    "last_frame_url": [
      "https://example.com/flower.png"
    ],
    "duration": "4"
  }
}

The price is calculated when the task is accepted, currency RUB.

Complete generation example

Output

  • One MP4 video.
  • Generation usually takes 3 to 15 minutes.
KindFormatsHow manyNote
videomp41

A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.

JSON
{
  "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "status": "succeeded",
  "finished_at": "2026-10-01T12:03:41+00:00",
  "result": {
    "caption": "Caption of the result: the model and its settings",
    "texts": [],
    "files_expire_at": "2026-10-08T12:03:41+00:00",
    "files_expired": false,
    "artifacts": [
      {
        "index": 0,
        "kind": "video",
        "filename": "video.mp4",
        "size": 12582912,
        "caption": "",
        "download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
      }
    ]
  }
}
How to read the result and download files

See also

Try Gemini Omni through the API

One key opens every CyHUB model. Payment in rubles, and you see the price before the run.

Get an API key