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

Veo 3.1 API

Veo 3.1 video with sound: from a prompt, from frames or from references, three quality tiers.

Developer: GoogleModel key in the API: veo

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": "veo",
  "settings": {
    "mode": "text_to_video",
    "prompt": "Рыбацкая лодка выходит из тумана на рассвете, крики чаек",
    "tier": "lite",
    "aspect_ratio": "16:9",
    "resolution": "720p"
  }
}'

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": "veo",
    "settings": {
        "mode": "text_to_video",
        "prompt": "Рыбацкая лодка выходит из тумана на рассвете, крики чаек",
        "tier": "lite",
        "aspect_ratio": "16:9",
        "resolution": "720p",
    },
}

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": "veo",
  "settings": {
    "mode": "text_to_video",
    "prompt": "Рыбацкая лодка выходит из тумана на рассвете, крики чаек",
    "tier": "lite",
    "aspect_ratio": "16:9",
    "resolution": "720p"
  }
};

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 25 ₽. POST /v1/price shows the exact price of your settings.

ModePrice
From a promptfrom 25 ₽
Lite (budget) tier = litefrom 25 ₽
Fast tier = fastfrom 43 ₽
Quality (max quality) tier = qualityfrom 179 ₽
From framesfrom 25 ₽
Lite (budget) tier = litefrom 25 ₽
Fast tier = fastfrom 43 ₽
Quality (max quality) tier = qualityfrom 179 ₽
From referencesfrom 25 ₽
Lite (budget) tier = litefrom 25 ₽
Fast tier = fastfrom 43 ₽

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": "veo",
  "settings": {
    "mode": "text_to_video",
    "prompt": "Рыбацкая лодка выходит из тумана на рассвете, крики чаек",
    "tier": "lite",
    "aspect_ratio": "16:9",
    "resolution": "720p"
  }
}'
  • 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

Video from text alone, no pictures are sent.

Value of the mode field: text_to_video

Price in this mode from 25 ₽.

Parameters

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

promptRequired

What happens in the video. Lines and sounds can be described in words.

Type: StringMinimum characters: 1Maximum characters: 5000
tierOptional

Quality tier; the price depends on it.

Type: StringAllowed values: litefastqualityDefault: "lite"
aspect_ratioOptional

Landscape 16:9 or portrait 9:16.

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

Resolution of the finished video. The price depends on it.

Type: StringAllowed values: 720p1080p4kDefault: "720p"

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

Input

  • A clip is always 8 seconds long.

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": "veo",
  "settings": {
    "mode": "text_to_video",
    "prompt": "Рыбацкая лодка выходит из тумана на рассвете, крики чаек",
    "tier": "lite",
    "aspect_ratio": "16:9",
    "resolution": "720p"
  }
}

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

Complete generation example

Output

  • One MP4 video with sound.
  • Generation takes several minutes, 4K longer.
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

From frames

The first frame, or the first and the last one: the model animates them by the prompt.

Value of the mode field: frames_to_video

Price in this mode from 25 ₽.

Parameters

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

promptRequired

What happens in the video. Lines and sounds can be described in words.

Type: StringMinimum characters: 1Maximum characters: 5000
tierOptional

Quality tier; the price depends on it.

Type: StringAllowed values: litefastqualityDefault: "lite"
aspect_ratioOptional

Landscape 16:9 or portrait 9:16.

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

Resolution of the finished video. The price depends on it.

Type: StringAllowed values: 720p1080p4kDefault: "720p"
image_urlsRequired

One URL: the first frame. Two URLs: the first and the last frames.

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

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

Input

  • A clip is always 8 seconds long.
  • Images are URLs of JPEG, PNG or WebP files, up to 10 MB each.
FieldAcceptsFormatsFilesFile size up to
image_urlsImagesjpeg, jpg, png, webp210 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.

Animate a frame

JSON
{
  "model": "veo",
  "settings": {
    "mode": "frames_to_video",
    "prompt": "Камера медленно наезжает, листья шевелятся на ветру",
    "tier": "lite",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "image_urls": [
      "https://example.com/first-frame.jpg"
    ]
  }
}

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

Complete generation example

Output

  • One MP4 video with sound.
  • Generation takes several minutes, 4K longer.
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

From references

Characters and objects from your pictures in a new video. The Quality tier is not available here.

Value of the mode field: references_to_video

Price in this mode from 25 ₽.

Parameters

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

promptRequired

What happens in the video. Lines and sounds can be described in words.

Type: StringMinimum characters: 1Maximum characters: 5000
tierOptional

Quality tier; the price depends on it. Quality does not work with references.

Type: StringAllowed values: litefastDefault: "lite"
aspect_ratioOptional

Landscape 16:9 or portrait 9:16.

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

Resolution of the finished video. The price depends on it.

Type: StringAllowed values: 720p1080p4kDefault: "720p"
image_urlsRequired

One to three URLs of pictures with the characters or objects.

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

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

Input

  • A clip is always 8 seconds long.
  • Images are URLs of JPEG, PNG or WebP files, up to 10 MB each.
FieldAcceptsFormatsFilesFile size up to
image_urlsImagesjpeg, jpg, png, webp310 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.

A character from a picture

JSON
{
  "model": "veo",
  "settings": {
    "mode": "references_to_video",
    "prompt": "Этот персонаж идёт по ночному городу под дождём",
    "tier": "fast",
    "aspect_ratio": "9:16",
    "resolution": "1080p",
    "image_urls": [
      "https://example.com/character.png"
    ]
  }
}

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

Complete generation example

Output

  • One MP4 video with sound.
  • Generation takes several minutes, 4K longer.
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 Veo 3.1 through the API

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

Get an API key