> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apimart.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Geração de vídeo gemini-omni-1.2-flash-ext

>  - gemini-omni-1.2-flash-ext, modelo unificado de geração de vídeo
- Suporta texto para vídeo, vídeo a partir do primeiro quadro, vídeo a partir do primeiro e último quadro, referência com várias imagens e edição e extensão de vídeo
- Suporta resoluções 360p/720p/1080p/4k e duração de 3 a 15 segundos, com cobrança por segundo
- API de tarefas assíncrona: envie a tarefa primeiro e depois consulte o resultado pelo ID da tarefa 

```bash cURL theme={null}
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.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'
```

```python Python theme={null}
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "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())
```

```javascript JavaScript theme={null}
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "gemini-omni-1.2-flash-ext",
  prompt: "Aerial shot over a misty mountain lake at sunrise.",
  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));
```

```go Go theme={null}
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.2-flash-ext",
        "prompt":       "Aerial shot over a misty mountain lake at sunrise.",
        "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))
}
```

```json 200 theme={null}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
    }
  ]
}
```

```json 400 theme={null}
{
  "error": {
    "code": 400,
    "message": "Parâmetros da requisição inválidos",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "Falha na autenticação. Verifique sua chave de API",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Saldo da conta insuficiente. Recarregue e tente novamente",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Muitas requisições. Tente novamente mais tarde",
    "type": "rate_limit_error"
  }
}
```

## Autenticação

**Authorization** `string` *required*

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](https://apimart.ai/keys) 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

**model** `string` *required*

Nome do modelo de geração de vídeo. Fixo em `gemini-omni-1.2-flash-ext`.

**prompt** `string` *required*

Descrição do vídeo ou instrução de edição. Não pode ficar vazio após remover os espaços no início e no fim. Em texto para vídeo, descreva a cena, os personagens, as ações, a câmera e o som; com imagens ou vídeo, descreva o movimento, o estilo ou as alterações desejadas.

Exemplo: `"Aerial shot over a misty mountain lake at sunrise."`

> [!WARNING]
>
> `prompt` é obrigatório em todos os modos, incluindo primeiro quadro, referência com várias imagens, edição e extensão. Se estiver ausente, é retornado um erro 400.

**duration** `integer` (default: 10)

Duração do vídeo em segundos. Deve ser um número inteiro.

* Texto para vídeo / primeiro quadro / referência com várias imagens: duração da saída, `3`–`15`
* Primeiro e último quadro: duração da saída, `3`–`10`
* Extensão (`extend`): duração do **trecho adicionado**, `3`–`10`
* Edição (`edit`): não deve ser enviado; a duração da saída acompanha o vídeo de origem

O alias `seconds` também é aceito. Se ambos forem enviados, devem ter o mesmo valor.

> [!WARNING]
>
> Enviar `duration` no modo de edição retorna o erro `video edit does not accept duration`.

**resolution** `string` (default: 720p)

Resolução do vídeo, sem distinção entre maiúsculas e minúsculas. Define o preço por segundo.

Valores permitidos:

* `360p`
* `720p`
* `1080p`
* `4k` (`2160p` também é aceito)

> [!WARNING]
>
> Qualquer outra resolução retorna um erro 400.

**aspect\_ratio** `string` (default: 16:9)

Somente `16:9` (horizontal, padrão) e `9:16` (vertical) são suportados; outros valores retornam um erro 400.

**omni\_reference\_task\_type** `string`

Tipo de tarefa, que define como o material de entrada é usado.

Valores permitidos:

* `edit` - Editar um vídeo; use com `video_urls` ou `extend_from_task_id`
* `extend` - Estender um vídeo adicionando novo conteúdo ao final; use com `video_urls` ou `extend_from_task_id`
* `reference` - Referência com várias imagens; use com `image_urls`
* `text_to_video` / `image_to_video` / `reference_to_video` - Texto para vídeo / primeiro quadro / imagens de referência
* `auto` - Detectado automaticamente pela entrada; tratado como `edit` quando há vídeo

Opcional quando não há vídeo; o modo é detectado automaticamente pela entrada.

> [!WARNING]
>
> Ao enviar `video_urls` ou `extend_from_task_id`, o tipo de tarefa é obrigatório (`omni_reference_task_type` ou o campo compatível `generation_type`); se for omitido, é retornado um erro 400. Recomenda-se enviar explicitamente `edit` ou `extend`; `auto` é tratado como `edit`.

**generation\_type** `string`

Campo de compatibilidade, equivalente a `omni_reference_task_type`. Valores permitidos: `frame` (igual a `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` e `omni_reference_task_type` não podem ser enviados juntos.

**image\_urls** `array\<url\>`

Array de imagens de referência para referência com várias imagens (personagens, produtos, estilos etc.). Suporta de 1 a 10 imagens.

Somente URLs de imagem HTTP/HTTPS acessíveis publicamente são suportadas. Envie primeiro as imagens locais para obter uma URL pública e depois informe essa URL; Data URLs Base64 não são suportadas no momento e retornam um erro 400.

Quando apenas 1 imagem é enviada, o uso depende do tipo de tarefa:

* `omni_reference_task_type` omitido: usada como imagem de referência
* `omni_reference_task_type` igual a `auto` ou `image_to_video`: usada como primeiro quadro

Para gerar a partir do primeiro quadro, use diretamente `first_frame_image` em vez de depender da quantidade de imagens.

> [!WARNING]
>
> `image_urls` não pode ser enviado junto com `first_frame_image` ou `last_frame_image`, e as imagens de `image_urls` nunca são tratadas como primeiro quadro; também não é possível enviar imagens ao editar ou estender.

**first\_frame\_image** `string`

Imagem do primeiro quadro: o primeiro quadro do vídeo gerado será esta imagem. Somente URLs de imagem HTTP/HTTPS acessíveis publicamente são suportadas; Data URLs Base64 não são suportadas.

Enviado junto com `last_frame_image`, gera um vídeo a partir do primeiro e último quadro.

**last\_frame\_image** `string`

Imagem do último quadro, para a geração a partir do primeiro e último quadro: o vídeo transita do primeiro quadro para esta imagem. Somente URLs de imagem HTTP/HTTPS acessíveis publicamente são suportadas; Data URLs Base64 não são suportadas.

No modo de primeiro e último quadro:

* `duration` aceita `3`–`10`; 10 segundos se omitido
* `system_prompt` e `negative_prompt` não podem ser enviados

> [!WARNING]
>
> `last_frame_image` deve ser enviado junto com `first_frame_image`; enviar apenas o último quadro retorna o erro `last_frame_image requires first_frame_image`. Não pode ser enviado junto com `image_urls`.

**image\_with\_roles** `array\<object\>`

Array de imagens com papéis, forma equivalente de `first_frame_image` / `last_frame_image` / `image_urls`.

**Item do array**

**url** `string` *required*

URL de imagem HTTP/HTTPS acessível publicamente. Data URLs Base64 não são suportadas.

**role** `string`

`first_frame` é o primeiro quadro e `last_frame` é o último quadro (apenas 1 imagem cada); qualquer outro valor ou papel vazio é tratado como imagem de referência.

**video\_urls** `array\<url\>`

Array com o vídeo a ser editado ou estendido; apenas 1 vídeo é suportado. Também é possível usar o campo de valor único `video_url`; envie apenas um dos dois.

Somente URLs de vídeo HTTP/HTTPS acessíveis publicamente são suportadas. Formato MP4 / MOV / WebM, até 15 segundos e 64 MB.

> [!WARNING]
>
> Ao enviar `video_urls`, o tipo de tarefa é obrigatório; recomenda-se definir `omni_reference_task_type` como `edit` ou `extend` (`auto` é tratado como `edit`). Se for omitido, é retornado um erro 400. Enviar 2 ou mais vídeos retorna um erro 400.

**extend\_from\_task\_id** `string`

ID de tarefa desta plataforma (`task_01…`). Permite continuar editando ou estendendo uma de suas tarefas `gemini-omni-1.2-flash-ext` já concluídas, sem reenviar o vídeo.

Requisitos:

* A tarefa pertence à conta atual
* O modelo da tarefa é `gemini-omni-1.2-flash-ext`
* O status da tarefa é `completed`
* O canal que gerou a tarefa original continua disponível; caso contrário, é retornado 503 `source_channel_unavailable`
* O vídeo original tem até 15 segundos (vale para edição e extensão); no modo de edição, sua duração também precisa ser identificável

Se o canal estiver indisponível ou a duração do vídeo original não puder ser identificada, baixe o vídeo original e envie-o por `video_urls`. Se o vídeo original tiver mais de 15 segundos, corte-o para no máximo 15 segundos antes de enviar.

> [!WARNING]
>
> `extend_from_task_id` não pode ser enviado junto com `video_urls`, e o tipo de tarefa é obrigatório; recomenda-se definir `omni_reference_task_type` como `edit` ou `extend` (`auto` é tratado como `edit`).

**negative\_prompt** `string`

Conteúdo que você não quer que apareça no vídeo.

Exemplo: `"people, cars, color"`

> [!WARNING]
>
> `negative_prompt` não pode ser enviado no modo de primeiro e último quadro.

**system\_prompt** `string`

Instrução de sistema, como fixar o estilo visual ou proibir texto na tela. Deve ser uma string.

Exemplo: `"Render as a black-and-white silent film."`

> [!WARNING]
>
> `system_prompt` não pode ser enviado no modo de primeiro e último quadro.

## Resposta

**code** `integer`

Código de status da resposta. Requisições bem-sucedidas retornam `200`.

**data** `array`

Array de tarefas retornado.

**Item do array**

**status** `string`

Status inicial da tarefa. É `submitted` após uma submissão bem-sucedida.

**task\_id** `string`

ID único da tarefa para consultar status e resultado.

## Consultar o resultado da tarefa

A geração de vídeo é assíncrona. Após o envio, é retornado um `task_id`. Use a API [Obter status da tarefa](https://docs.apimart.ai/pt/api-reference/tasks/status.md) para consultar o progresso e o resultado.

```bash cURL theme={null}
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
```

Consulte a cada 5-10 segundos e defina o timeout do cliente para pelo menos 10 minutos. Tempos de geração de referência (incluindo fila): cerca de 46 segundos para um vídeo de 15 segundos em 360p, cerca de 99 segundos para 15 segundos em 1080p e cerca de 4-5 minutos para 15 segundos em 4k. Durante a geração, o progresso pode ficar em 10% por bastante tempo até a conclusão.

### Exemplo de resultado bem-sucedido

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "actual_time": 99,
    "cost": 0.695,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/videos/abc.mp4"]
        }
      ]
    }
  }
}
```

A URL do vídeo é `data.result.videos[0].url[0]`. `data.actual_time` é o tempo de processamento da tarefa em segundos, não a duração do vídeo. A saída é MP4 (H.264, 24fps) com faixa de áudio AAC e marca d'água invisível SynthID; em 4k, ocasionalmente não há faixa de áudio.

### Exemplo de resultado com falha

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "failed",
    "progress": 100,
    "cost": 0,
    "error": {
      "code": "task_failed",
      "message": "content_rejected",
      "type": "task_failed"
    }
  }
}
```

Tarefas com falha são reembolsadas integralmente.

## Cobrança

Cobrança por segundo: custo = preço por segundo da resolução escolhida × segundos cobrados. Todos os modos são cobrados pela faixa de resolução solicitada. Consulte a [página de preços](https://apimart.ai/pricing) para os valores reais.

| Modo | Segundos cobrados |
| - | - |
| Texto para vídeo / primeiro quadro / referência com várias imagens | `duration`; 10 segundos se omitido |
| Primeiro e último quadro | `duration` (máximo de 10 segundos); 10 segundos se omitido |
| Edição | Duração do vídeo de origem (descontada a tolerância de contêiner de 0,15 segundo e arredondada para cima, mínimo de 1 segundo; ex.: 8,019 segundos → 8 segundos, 8,3 segundos → 9 segundos) |
| Extensão | Segundos adicionados `duration`; 10 segundos se omitido. O vídeo original não é cobrado |

## Casos de uso

### Cenário 1: Texto para vídeo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Aerial shot over a misty mountain lake at sunrise.",
  "duration": 15,
  "resolution": "1080p",
  "aspect_ratio": "9:16"
}
```

### Cenário 2: Vídeo a partir do primeiro quadro

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The camera slowly pushes in.",
  "duration": 6,
  "aspect_ratio": "9:16",
  "first_frame_image": "https://example.com/start.jpg"
}
```

### Cenário 3: Vídeo a partir do primeiro e último quadro

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The flower bud slowly opens into full bloom.",
  "duration": 8,
  "aspect_ratio": "16:9",
  "first_frame_image": "https://example.com/bud.jpg",
  "last_frame_image": "https://example.com/bloom.jpg"
}
```

No modo de primeiro e último quadro, `duration` aceita de 3 a 10 segundos (10 segundos se omitido), e `system_prompt` / `negative_prompt` não podem ser enviados.

### Cenário 4: Referência com várias imagens

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The cat bats at the ball of yarn.",
  "duration": 8,
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ]
}
```

### Cenário 5: Edição de vídeo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Make the violin invisible. Keep everything else the same.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "edit"
}
```

Não envie `duration` ao editar; a duração da saída acompanha o vídeo de origem.

### Cenário 6: Extensão de vídeo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Continue the scene: the dancer bows.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "extend",
  "duration": 4
}
```

### Cenário 7: Estender uma tarefa existente

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
  "omni_reference_task_type": "extend",
  "duration": 6
}
```

### Cenário 8: Instrução de sistema e prompt negativo

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "A busy city street at noon.",
  "system_prompt": "Render as a black-and-white silent film.",
  "negative_prompt": "people, cars, color",
  "duration": 6
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.