> ## 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.

# Generación de video gemini-omni-1.2-flash-ext

>  - gemini-omni-1.2-flash-ext, modelo unificado de generación de video
- Admite texto a video, video a partir del primer fotograma, video a partir del primer y último fotograma, referencia con varias imágenes y edición y extensión de video
- Admite resoluciones 360p/720p/1080p/4k y una duración de 3 a 15 segundos, con facturación por segundo
- API de tareas asíncrona: primero envíe la tarea y luego consulte el resultado con el ID de la tarea 

```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 de solicitud no válidos",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "Error de autenticación. Compruebe su API key",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "Saldo de la cuenta insuficiente. Recargue e inténtelo de nuevo",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "Demasiadas solicitudes. Inténtelo de nuevo más tarde",
    "type": "rate_limit_error"
  }
}
```

## Autenticación

**Authorization** `string` *required*

Todas las solicitudes requieren autenticación mediante Bearer Token.

Obtener una API key:

Visite la [página de gestión de API Keys](https://apimart.ai/keys) para obtener su API key.

Añada el siguiente encabezado al realizar solicitudes:

```
Authorization: Bearer YOUR_API_KEY
```

## Parámetros de la solicitud

**model** `string` *required*

Nombre del modelo de generación de video. Siempre `gemini-omni-1.2-flash-ext`.

**prompt** `string` *required*

Descripción del video o instrucción de edición. No puede quedar vacío tras eliminar los espacios al inicio y al final. En texto a video, describa la escena, los personajes, las acciones, la cámara y el sonido; con imágenes o video, describa el movimiento, el estilo o los cambios deseados.

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

> [!WARNING]
>
> `prompt` es obligatorio en todos los modos, incluidos primer fotograma, referencia con varias imágenes, edición y extensión. Si falta, se devuelve un error 400.

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

Duración del video en segundos. Debe ser un número entero.

* Texto a video / primer fotograma / referencia con varias imágenes: duración de salida, `3`–`15`
* Primer y último fotograma: duración de salida, `3`–`10`
* Extensión (`extend`): duración del **fragmento añadido**, `3`–`10`
* Edición (`edit`): no debe enviarse; la duración de salida sigue la del video de origen

También se acepta el alias `seconds`. Si se envían ambos, sus valores deben coincidir.

> [!WARNING]
>
> Enviar `duration` en modo de edición devuelve el error `video edit does not accept duration`.

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

Resolución del video, sin distinguir mayúsculas y minúsculas. Determina el precio por segundo.

Valores admitidos:

* `360p`
* `720p`
* `1080p`
* `4k` (también se acepta `2160p`)

> [!WARNING]
>
> Cualquier otra resolución devuelve un error 400.

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

Solo se admiten `16:9` (horizontal, predeterminado) y `9:16` (vertical); otros valores devuelven un error 400.

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

Tipo de tarea, que indica cómo se usa el material de entrada.

Valores admitidos:

* `edit` - Editar un video; se usa con `video_urls` o `extend_from_task_id`
* `extend` - Extender un video añadiendo contenido nuevo al final; se usa con `video_urls` o `extend_from_task_id`
* `reference` - Referencia con varias imágenes; se usa con `image_urls`
* `text_to_video` / `image_to_video` / `reference_to_video` - Texto a video / primer fotograma / imágenes de referencia
* `auto` - Se determina automáticamente según la entrada; con video se trata como `edit`

Es opcional cuando no hay video; el modo se determina automáticamente según la entrada.

> [!WARNING]
>
> Al enviar `video_urls` o `extend_from_task_id`, el tipo de tarea es obligatorio (`omni_reference_task_type`, o el campo compatible `generation_type`); si se omite, se devuelve un error 400. Se recomienda enviar explícitamente `edit` o `extend`; `auto` se trata como `edit`.

**generation\_type** `string`

Campo de compatibilidad, equivalente a `omni_reference_task_type`. Valores admitidos: `frame` (igual que `image_to_video`), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type` y `omni_reference_task_type` no pueden enviarse juntos.

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

Array de imágenes de referencia para la referencia con varias imágenes (personajes, productos, estilos, etc.). Admite de 1 a 10 imágenes.

Solo se admiten URL de imagen HTTP/HTTPS de acceso público. Suba primero las imágenes locales para obtener una URL pública y luego envíe esa URL; las Data URL Base64 no se admiten actualmente y devuelven un error 400.

Si solo se envía 1 imagen, su uso depende del tipo de tarea:

* `omni_reference_task_type` omitido: se usa como imagen de referencia
* `omni_reference_task_type` es `auto` o `image_to_video`: se usa como primer fotograma

Para generar a partir del primer fotograma, use directamente `first_frame_image` en lugar de depender del número de imágenes.

> [!WARNING]
>
> `image_urls` no puede enviarse junto con `first_frame_image` ni con `last_frame_image`, y las imágenes de `image_urls` nunca se tratan como primer fotograma; tampoco se pueden enviar imágenes al editar o extender.

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

Imagen del primer fotograma: el primer fotograma del video generado será esta imagen. Solo se admiten URL de imagen HTTP/HTTPS de acceso público; no se admiten Data URL Base64.

Si se envía junto con `last_frame_image`, se genera un video a partir del primer y último fotograma.

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

Imagen del último fotograma, para la generación a partir del primer y último fotograma: el video pasa del primer fotograma a esta imagen. Solo se admiten URL de imagen HTTP/HTTPS de acceso público; no se admiten Data URL Base64.

En el modo de primer y último fotograma:

* `duration` admite `3`–`10`; 10 segundos si se omite
* No se pueden enviar `system_prompt` ni `negative_prompt`

> [!WARNING]
>
> `last_frame_image` debe enviarse junto con `first_frame_image`; enviar solo el último fotograma devuelve el error `last_frame_image requires first_frame_image`. No puede enviarse junto con `image_urls`.

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

Array de imágenes con roles, forma equivalente de `first_frame_image` / `last_frame_image` / `image_urls`.

**Elemento del array**

**url** `string` *required*

URL de imagen HTTP/HTTPS de acceso público. No se admiten Data URL Base64.

**role** `string`

`first_frame` es el primer fotograma y `last_frame` el último fotograma (solo 1 imagen cada uno); cualquier otro valor o un rol vacío se trata como imagen de referencia.

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

Array con el video que se va a editar o extender; solo se admite 1 video. También puede usar el campo de valor único `video_url`; envíe solo uno de los dos.

Solo se admiten URL de video HTTP/HTTPS de acceso público. Formato MP4 / MOV / WebM, hasta 15 segundos y 64 MB.

> [!WARNING]
>
> Al enviar `video_urls`, el tipo de tarea es obligatorio; se recomienda establecer `omni_reference_task_type` en `edit` o `extend` (`auto` se trata como `edit`). Si se omite, se devuelve un error 400. Enviar 2 o más videos devuelve un error 400.

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

ID de tarea de esta plataforma (`task_01…`). Permite seguir editando o extendiendo una de sus tareas `gemini-omni-1.2-flash-ext` ya completadas sin volver a subir el video.

Requisitos:

* La tarea pertenece a la cuenta actual
* El modelo de la tarea es `gemini-omni-1.2-flash-ext`
* El estado de la tarea es `completed`
* El canal que generó la tarea original sigue disponible; de lo contrario, se devuelve 503 `source_channel_unavailable`
* El video original dura como máximo 15 segundos (se aplica tanto a la edición como a la extensión); en modo de edición, además, su duración debe poder determinarse

Si el canal no está disponible o no se puede determinar la duración del video original, descargue el video original y súbalo mediante `video_urls`. Si el video original dura más de 15 segundos, recórtelo a 15 segundos como máximo antes de subirlo.

> [!WARNING]
>
> `extend_from_task_id` no puede enviarse junto con `video_urls`, y el tipo de tarea es obligatorio; se recomienda establecer `omni_reference_task_type` en `edit` o `extend` (`auto` se trata como `edit`).

**negative\_prompt** `string`

Contenido que no desea que aparezca en el video.

Ejemplo: `"people, cars, color"`

> [!WARNING]
>
> No se puede enviar `negative_prompt` en el modo de primer y último fotograma.

**system\_prompt** `string`

Instrucción del sistema, por ejemplo para fijar el estilo visual o prohibir texto en pantalla. Debe ser una cadena.

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

> [!WARNING]
>
> No se puede enviar `system_prompt` en el modo de primer y último fotograma.

## Respuesta

**code** `integer`

Código de estado de la respuesta. Las solicitudes exitosas devuelven `200`.

**data** `array`

Array de tareas devuelto.

**Elemento del array**

**status** `string`

Estado inicial de la tarea. Es `submitted` tras una solicitud exitosa.

**task\_id** `string`

ID único de la tarea para consultar su estado y resultado.

## Consultar el resultado de la tarea

La generación de video es asíncrona. Tras el envío se devuelve un `task_id`. Use la API [Obtener estado de la tarea](https://docs.apimart.ai/es/api-reference/tasks/status.md) para consultar el progreso y el resultado.

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

Consulte cada 5-10 segundos y configure el tiempo de espera del cliente en al menos 10 minutos. Tiempos de generación orientativos (incluida la cola): unos 46 segundos para un video de 15 segundos en 360p, unos 99 segundos para 15 segundos en 1080p y unos 4-5 minutos para 15 segundos en 4k. Durante la generación, el progreso puede quedarse en 10% durante bastante tiempo hasta completarse.

### Ejemplo de resultado exitoso

```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"]
        }
      ]
    }
  }
}
```

La URL del video es `data.result.videos[0].url[0]`. `data.actual_time` es el tiempo de procesamiento de la tarea en segundos, no la duración del video. La salida es MP4 (H.264, 24fps) con pista de audio AAC y marca de agua invisible SynthID; en 4k, ocasionalmente no hay pista de audio.

### Ejemplo de resultado fallido

```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"
    }
  }
}
```

Las tareas fallidas se reembolsan íntegramente.

## Facturación

Facturación por segundo: costo = precio por segundo de la resolución elegida × segundos facturados. Todos los modos se facturan según el nivel de resolución solicitado. Consulte la [página de precios](https://apimart.ai/pricing) para conocer los precios reales.

| Modo | Segundos facturados |
| - | - |
| Texto a video / primer fotograma / referencia con varias imágenes | `duration`; 10 segundos si se omite |
| Primer y último fotograma | `duration` (máximo 10 segundos); 10 segundos si se omite |
| Edición | Duración del video de origen (se restan 0,15 segundos de tolerancia del contenedor y se redondea hacia arriba, mínimo 1 segundo; p. ej., 8,019 segundos se facturan como 8 segundos y 8,3 segundos como 9 segundos) |
| Extensión | Segundos añadidos `duration`; 10 segundos si se omite. El video original no se factura |

## Casos de uso

### Escenario 1: Texto a video

```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"
}
```

### Escenario 2: Video a partir del primer fotograma

```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"
}
```

### Escenario 3: Video a partir del primer y último fotograma

```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"
}
```

En el modo de primer y último fotograma, `duration` admite de 3 a 10 segundos (10 segundos si se omite) y no se pueden enviar `system_prompt` / `negative_prompt`.

### Escenario 4: Referencia con varias imágenes

```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"
  ]
}
```

### Escenario 5: Edición de video

```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"
}
```

No envíe `duration` al editar; la duración de salida sigue la del video de origen.

### Escenario 6: Extensión de video

```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
}
```

### Escenario 7: Extender una tarea 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
}
```

### Escenario 8: Instrucción del sistema y 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.