curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
duration: 10,
resolution: "1080p",
aspect_ratio: "9:16"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
gemini-omni-1.1-flash-ext
Генерация видео gemini-omni-1.1-flash-ext
- Единая модель генерации видео gemini-omni-1.1-flash-ext
- Поддерживает Text-to-Video, Image-to-Video по одному изображению, референсное видео и слияние трёх референсных изображений
- Поддерживает разрешения 720p / 1080p / 4k и длительности 4 / 6 / 8 / 10 секунд
- Асинхронный API задач. Сначала отправляется задача, затем результат запрашивается по идентификатору задачи
POST
/
v1
/
videos
/
generations
curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
duration: 10,
resolution: "1080p",
aspect_ratio: "9:16"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";
const payload = {
model: "gemini-omni-1.1-flash-ext",
prompt: "a girl is dancing happily in a sunny garden",
duration: 10,
resolution: "1080p",
aspect_ratio: "9:16"
};
const headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.apimart.ai/v1/videos/generations"
payload := map[string]interface{}{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a girl is dancing happily in a sunny garden",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient account balance. Please recharge and try again",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Too many requests. Please try again later",
"type": "rate_limit_error"
}
}
Аутентификация
string
обязательно
Все запросы требуют аутентификации по Bearer Token.Получение API-ключа:Перейдите на страницу управления API-ключами, чтобы получить свой API-ключ.При выполнении запросов добавляйте следующий заголовок:
Authorization: Bearer YOUR_API_KEY
Параметры запроса
string
обязательно
Название модели генерации видео. Должно быть
gemini-omni-1.1-flash-ext.boolean
по умолчанию:"false"
Выполнять ли проверку содержимого перед отправкой задачи генерации видео.
true: проверить промпты и входные изображения с помощьюomni-moderation-latestfalseили параметр не указан: не отправлять запрос на проверку, без дополнительных затрат и задержки (по умолчанию)
string
обязательно
Описание содержимого видео. Рекомендуем подробно описывать сцену, субъект, действие, окружение, движение камеры, визуальный стиль и звуковые подсказки.Пример:
"a girl is dancing happily in a sunny garden"integer
по умолчанию:"6"
Длительность видео в секундах.Поддерживаемые значения:
4, 6, 8, 10.Другие значения, такие как
5 или 7, вернут ошибку invalid_duration.Не передавайте
duration при загрузке референсного видео. duration и video_urls нельзя передавать одновременно.string
по умолчанию:"720p"
Разрешение видео. Значения нечувствительны к регистру.Поддерживаемые значения:
360p720p1080p4k
Другие разрешения вернут ошибку
invalid_resolution.string
по умолчанию:"16:9"
Соотношение сторон видео. Используется для выбора горизонтального или вертикального вывода.Распространённые значения:
16:9— горизонтальное9:16— вертикальное
16:9string
Поле совместимости. Имеет то же значение, что и
aspect_ratio. Если переданы оба, поддерживайте их согласованность.string
Тип генерации, определяющий способ использования изображений.Возможные значения:
frame- Режим первого кадра. Вimage_urlsможно загрузить только 1 изображение, которое используется как первый кадр видео.reference- Режим референса. Вimage_urlsможно загрузить 1 или 3 изображения, которые используются как референсные изображения.
Когда
generation_type равен frame, image_urls поддерживает только 1 изображение; передача любого другого количества вернёт ошибку unsupported_image_count.array<url>
Массив URL референсных изображений. В зависимости от
generation_type можно не указывать, передать 1 изображение или 3 изображения:- Не указан или пустой массив: Text-to-Video
- 1 изображение: Image-to-Video по одному изображению
- 3 изображения: слияние референсных изображений (поддерживается только при
generation_typeравномreference)
generation_type:generation_typeравенframe: можно загрузить только 1 изображение.generation_typeравенreference: можно загрузить 1 или 3 изображения.
Режим «первый кадр + последний кадр» с 2 изображениями не поддерживается. Передача 2 изображений вернёт ошибку
unsupported_image_count. 4 и более изображений полностью не проверены и не рекомендуются.array<url>
Массив URL референсных видео. Можно не указывать или передать 1 референсное видео.Поддерживаются только публично доступные HTTP/HTTPS URL видео. Можно передавать вместе с
image_urls: изображения используются как референс идентичности или композиции, а видео — как референс движения.gemini-omni-1.1-flash-ext поддерживает только 0 или 1 референсное видео. Передача 2 или более видео вернёт ошибку unsupported_video_count.Не передавайте
duration при передаче video_urls. video_urls и duration нельзя передавать одновременно.Ответ
integer
Код состояния ответа. Успешные запросы возвращают
200.array
Получение результата задачи
Генерация видео асинхронна. После отправки API возвращаетtask_id. Используйте эндпоинт Получить статус задачи, чтобы узнать прогресс и результаты.
cURL
curl --request GET \
--url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
--header 'Authorization: Bearer <token>'
Пример успешного результата
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "completed",
"progress": 100,
"created": 1779246294,
"completed": 1779246534,
"actual_time": 240,
"estimated_time": 600,
"cost": 0.4,
"credits_cost": 4,
"result": {
"videos": [
{
"url": ["https://cdn.example.com/videos/abc.mp4"],
"expires_at": 1779332760
}
]
}
}
}
Пример неудачного результата
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "failed",
"progress": 100,
"created": 1779246294,
"completed": 1779246534,
"actual_time": 240,
"estimated_time": 600,
"cost": 0,
"credits_cost": 0,
"error": {
"message": "invalid duration 7, must be one of 4/6/8/10",
"code": "task_failed"
}
}
}
Сценарии использования
Сценарий 1: Текст в видео
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a beautiful sunset over the ocean with seagulls flying",
"duration": 6,
"resolution": "720p",
"aspect_ratio": "16:9"
}
Сценарий 2: видео по одному изображению
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "make the character smile and slowly turn around, cinematic camera motion",
"duration": 6,
"resolution": "1080p",
"aspect_ratio": "9:16",
"image_urls": ["https://example.com/character.jpg"]
}
Сценарий 3: слияние 3 референсных изображений
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "a creative scene combining these elements with smooth camera motion",
"duration": 10,
"resolution": "1080p",
"aspect_ratio": "9:16",
"image_urls": [
"https://example.com/scene.jpg",
"https://example.com/character.jpg",
"https://example.com/product.jpg"
]
}
Сценарий 4: короткое видео 4K
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "close-up of a hummingbird hovering in front of a red flower",
"duration": 4,
"resolution": "4k",
"aspect_ratio": "16:9"
}
Сценарий 5: генерация с референсным видео
{
"model": "gemini-omni-1.1-flash-ext",
"prompt": "the same scene but at night with neon lights",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_urls": ["https://example.com/reference.mp4"]
}
Коды ошибок
| HTTP | Тип ошибки | Значение | Рекомендуемое действие |
|---|---|---|---|
| 400 | invalid_request_error | model не gemini-omni-1.1-flash-ext, prompt пустой или JSON-формат недопустим | Проверьте тело запроса |
| 400 | invalid_duration | duration не равен 4, 6, 8 или 10 | Используйте поддерживаемую длительность |
| 400 | invalid_resolution | resolution не равно 720p, 1080p или 4k | Используйте поддерживаемое разрешение |
| 400 | unsupported_image_count | Количество image_urls не поддерживается, чаще всего вызвано передачей 2 изображений | Используйте 0, 1 или 3 изображения |
| 400 | unsupported_video_count | Количество video_urls не поддерживается, чаще всего вызвано передачей 2 или более видео | Используйте 0 или 1 референсное видео |
| 401 | authentication_error | Недействительный токен | Проверьте Bearer Token |
| 402 | payment_required | Недостаточно средств | Пополните баланс и попробуйте снова |
| 429 | rate_limit_error | Превышен лимит частоты запросов | Уменьшите параллелизм или повторите попытку позже |
data.error. Распространённые причины включают временное исчерпание квоты у поставщика, провал модерации содержимого или таймаут со стороны поставщика.