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
Geração de vídeo gemini-omni-1.1-flash-ext
- Modelo unificado de geração de vídeo gemini-omni-1.1-flash-ext
- Suporta Text-to-Video, Image-to-Video com imagem única, vídeo de referência e fusão de 3 imagens de referência
- Suporta resoluções 720p/1080p/4k e durações de 4/6/8/10 segundos
- API de tarefa assíncrona. Submeta uma tarefa primeiro e, em seguida, consulte o resultado pelo ID da tarefa
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"
}
}
Autenticação
string
obrigatório
Todas as requisições exigem autenticação via Bearer Token.Obtenha uma chave de API:Acesse a página de gerenciamento de chaves de API para obter sua chave de API.Adicione o seguinte cabeçalho ao fazer requisições:
Authorization: Bearer YOUR_API_KEY
Parâmetros da requisição
string
obrigatório
Nome do modelo de geração de vídeo. Deve ser
gemini-omni-1.1-flash-ext.boolean
padrão:"false"
Define se o conteúdo deve ser moderado antes do envio da tarefa de vídeo.
true: verificar prompts e imagens de entrada comomni-moderation-latestfalseou omitido: não enviar solicitação de moderação, sem custo nem latência adicionais de moderação (padrão)
string
obrigatório
Descrição do conteúdo do vídeo. Recomendamos descrever a cena, o sujeito, a ação, o ambiente, o movimento de câmera, o estilo visual e as indicações de áudio em detalhes.Exemplo:
"a girl is dancing happily in a sunny garden"integer
padrão:"6"
Duração do vídeo em segundos.Valores suportados:
4, 6, 8, 10.Outros valores, como
5 ou 7, retornarão um erro invalid_duration.Não envie
duration ao fazer upload de um vídeo de referência. duration e video_urls não podem ser enviados ao mesmo tempo.string
padrão:"720p"
Resolução do vídeo. Os valores não diferenciam maiúsculas de minúsculas.Valores suportados:
360p720p1080p4k
Outras resoluções retornarão um erro
invalid_resolution.string
padrão:"16:9"
Proporção do vídeo. Use-a para controlar a saída em paisagem ou retrato.Valores comuns:
16:9- paisagem9:16- retrato
16:9string
Campo de compatibilidade. Tem o mesmo significado que
aspect_ratio. Se ambos forem fornecidos, mantenha-os consistentes.string
Tipo de geração, usado para especificar como as imagens são usadas.Opções:
frame- Modo de primeiro frame.image_urlspode conter apenas 1 imagem, usada como o primeiro frame do vídeo.reference- Modo de referência.image_urlspode conter 1 ou 3 imagens, usadas como imagens de referência.
Quando
generation_type é frame, image_urls suporta apenas 1 imagem; passar qualquer outra quantidade retorna um erro unsupported_image_count.array<url>
Array de URLs de imagens de referência. Você pode omiti-lo, fornecer 1 imagem ou fornecer 3 imagens, dependendo de
generation_type:- Omitido ou array vazio: Text-to-Video
- 1 imagem: Image-to-Video com imagem única
- 3 imagens: fusão de imagens de referência (suportado apenas quando
generation_typeéreference)
generation_type:generation_typeéframe: apenas 1 imagem pode ser enviada.generation_typeéreference: 1 ou 3 imagens podem ser enviadas.
O modo de primeiro frame mais último frame com 2 imagens não é suportado. Passar 2 imagens retorna um erro
unsupported_image_count. 4 imagens ou mais não foram totalmente verificadas e não são recomendadas.array<url>
Array de URLs de vídeos de referência. Você pode omiti-lo ou fornecer 1 vídeo de referência.Apenas URLs de vídeo HTTP/HTTPS publicamente acessíveis são suportadas. Você pode enviá-lo junto com
image_urls: as imagens são usadas como referência de identidade ou composição, enquanto o vídeo é usado como referência de movimento.gemini-omni-1.1-flash-ext suporta apenas 0 ou 1 vídeo de referência. Enviar 2 ou mais vídeos retorna um erro unsupported_video_count.Não envie
duration ao enviar video_urls. video_urls e duration não podem ser enviados ao mesmo tempo.Resposta
integer
Código de status da resposta. Requisições bem-sucedidas retornam
200.array
Consultar o resultado da tarefa
A geração de vídeo é assíncrona. Após a submissão, a API retorna umtask_id. Use o endpoint Obter status da tarefa para consultar o progresso e os resultados.
cURL
curl --request GET \
--url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
--header 'Authorization: Bearer <token>'
Exemplo de resultado bem-sucedido
{
"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
}
]
}
}
}
Exemplo de resultado com falha
{
"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"
}
}
}
Casos de uso
Cenário 1: Texto para vídeo
{
"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"
}
Cenário 2: Vídeo com imagem única
{
"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"]
}
Cenário 3: Fusão com 3 imagens de referência
{
"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"
]
}
Cenário 4: Vídeo curto em 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"
}
Cenário 5: Geração com vídeo de referência
{
"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"]
}
Códigos de erro
| HTTP | Tipo de erro | Significado | Ação sugerida |
|---|---|---|---|
| 400 | invalid_request_error | model não é gemini-omni-1.1-flash-ext, prompt está vazio ou o formato JSON é inválido | Verifique o corpo da requisição |
| 400 | invalid_duration | duration não é 4, 6, 8 ou 10 | Use uma duração suportada |
| 400 | invalid_resolution | resolution não é 720p, 1080p ou 4k | Use uma resolução suportada |
| 400 | unsupported_image_count | A quantidade de image_urls não é suportada, comumente causada pela passagem de 2 imagens | Use 0, 1 ou 3 imagens |
| 400 | unsupported_video_count | A quantidade de video_urls não é suportada, comumente causada pelo envio de 2 ou mais vídeos | Use 0 ou 1 vídeo de referência |
| 401 | authentication_error | Token inválido | Verifique o Bearer Token |
| 402 | payment_required | Saldo insuficiente | Recarregue e tente novamente |
| 429 | rate_limit_error | Limite de taxa excedido | Reduza a concorrência ou tente novamente mais tarde |
data.error. Causas comuns incluem esgotamento temporário da cota upstream, falha na moderação de conteúdo ou timeout do upstream.