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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
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",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
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": "Parámetros de solicitud no válidos",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Error de autenticación. Comprueba tu clave de API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Saldo insuficiente. Añade fondos e inténtalo de nuevo",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Demasiadas solicitudes. Inténtalo de nuevo más tarde",
"type": "rate_limit_error"
}
}
Gemini Omni 1.1 Flash
Generación de video Gemini Omni 1.1 Flash
- Modelo oficial de Google Gemini Omni 1.1 Flash para generación de video multimodal todo en uno
- Admite texto a video, imagen a video, referencias de varios sujetos, interpolación del primer y último fotograma, edición y extensión de video
- Admite 360p / 720p / 1080p / 4K, 24 fps y salidas de 3–10 segundos con audio generado
- API de tareas asíncronas; consulta el resultado por ID de tarea después del envío
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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
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",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
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": "Parámetros de solicitud no válidos",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Error de autenticación. Comprueba tu clave de API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Saldo insuficiente. Añade fondos e inténtalo de nuevo",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Demasiadas solicitudes. Inténtalo de nuevo más tarde",
"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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "gemini-omni-1.1-flash",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p"
}
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",
prompt: "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
aspect_ratio: "16:9",
resolution: "1080p"
};
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",
"prompt": "A marble rolling fast on a chain reaction style track, continuous smooth shot.",
"aspect_ratio": "16:9",
"resolution": "1080p",
}
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": "Parámetros de solicitud no válidos",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Error de autenticación. Comprueba tu clave de API",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Saldo insuficiente. Añade fondos e inténtalo de nuevo",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Demasiadas solicitudes. Inténtalo de nuevo más tarde",
"type": "rate_limit_error"
}
}
Autenticación
string
requerido
Todas las API requieren autenticación mediante Bearer Token.Obtener una clave de API:Visita la página de gestión de claves de API para obtener tu clave.Añádela al encabezado de la solicitud:
Authorization: Bearer YOUR_API_KEY
Parámetros de solicitud
string
requerido
Nombre del modelo de generación de video. Debe ser
gemini-omni-1.1-flash.string
Instrucción de texto. Para texto a video, describe la escena. Para imagen a video, edición o extensión, describe el movimiento, el estilo o el cambio solicitado.
Proporciona al menos
prompt o contenido multimedia (image_urls, imágenes del primer/último fotograma o video_urls).string
predeterminado:"720p"
Resolución del video de salida. No distingue entre mayúsculas y minúsculas.Valores disponibles:
360p720p(predeterminado)1080p4k
2160p se trata como 4k. La resolución determina el nivel del depósito retenido y el coste principal de la salida de video.Una resolución no compatible devuelve el error
invalid_resolution.string
predeterminado:"16:9"
Relación de aspecto del video para seleccionar salida horizontal o vertical.Compatible:
16:9- Horizontal (predeterminado)9:16- Vertical
16:9.Al proporcionar
video_urls, la salida suele seguir la relación de aspecto del video de entrada, por lo que aspect_ratio puede no aplicarse.array<string>
Array de imágenes de referencia. Solo se admiten URL HTTP/HTTPS de acceso público.
- Proporcionar 1 imagen: se usa como fotograma inicial del video de forma predeterminada
- Proporcionar varias imágenes: se usan como referencias de sujetos o estilo; describe la función y relación de cada imagen en
prompt
image_urls y las imágenes del primer/último fotograma admiten un máximo total de 10 imágenes.string
Imagen del primer fotograma. Solo se admite una URL HTTP/HTTPS de acceso público.
- Proporcionada sola: usa la imagen como fotograma inicial del video
- Proporcionada con
last_frame_image: genera una transición suave del primer al último fotograma
string
Imagen del último fotograma. Solo se admite una URL HTTP/HTTPS de acceso público y debe proporcionarse con
first_frame_image.Proporcionar solo
last_frame_image devuelve invalid_frame_images. Usa la misma relación en ambas imágenes y haz que coincida con aspect_ratio.Para un primer fotograma o un par de primer/último fotograma, los siguientes métodos tienen el mismo efecto. Elige uno y no proporciones ambos:
- Usar
first_frame_image/last_frame_image - Usar
image_with_rolesconroleestablecido enfirst_frame/last_frame
array<object>
Array de imágenes con roles. Es una alternativa equivalente a
Ejemplo:
first_frame_image / last_frame_image y también permite declarar imágenes de referencia.Mostrar Elemento de image_with_roles
Mostrar Elemento de image_with_roles
string
requerido
URL HTTP/HTTPS de imagen de acceso público.
string
requerido
Rol de la imagen:
first_frame: primer fotogramalast_frame: último fotograma; también debe existir un primer fotogramareference: imagen de referencia; los demás roles que no sean primer o último fotograma también se tratan como referencias
[
{"url": "https://example.com/start.jpg", "role": "first_frame"},
{"url": "https://example.com/end.jpg", "role": "last_frame"}
]
Si también se proporciona
image_urls, este tiene prioridad para las referencias y no se combina con las referencias de image_with_roles. Todas las imágenes utilizadas, incluidos los fotogramas inicial y final, están limitadas a 10 en total.array<string>
Array de videos para editar o extender. Actualmente se admite un máximo de un video de hasta 10 segundos.Solo se admiten URL directas HTTP/HTTPS de video de acceso público. No se admiten enlaces de YouTube.
video_urls y extend_from_task_id son mutuamente excluyentes. Proporciona solo uno.object
Objeto de parámetros adicionales para indicar explícitamente la intención de generación.
Mostrar Campos de metadata
Mostrar Campos de metadata
string
Tipos de tarea disponibles:
text_to_video: texto a videoimage_to_video: imagen a videoreference_to_video: referencia a videoedit: edición de videoextend: extensión de video
Para la interpolación del primer y último fotograma, el modelo deduce la tarea automáticamente y la plataforma no envía
metadata.task.string
task_id local de la tarea de generación anterior. Úsalo para edición conversacional o extensiones posteriores sin volver a cargar el video anterior.La tarea referenciada debe pertenecer al usuario actual, haber finalizado correctamente y usar un modelo Gemini Omni.extend_from_task_id y video_urls son mutuamente excluyentes. Proporciona solo uno.Este modelo no tiene el parámetro
duration. La duración de cada salida se determina automáticamente según el contenido, normalmente entre 3 y 10 segundos. Para controlar el ritmo, descríbelo en prompt con lenguaje natural o intervalos de tiempo.Respuesta
integer
Código de respuesta.
200 indica éxito.array
Consultar el resultado de la tarea
La generación de video es asíncrona. Tras recibir eltask_id, usa la API Obtener estado de la tarea para consultar el progreso y el resultado.
cURL
curl --request GET \
--url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
--header 'Authorization: Bearer <token>'
completed o failed. Se recomienda un tiempo de espera total del cliente de 10 minutos.
Ejemplo de resultado correcto
{
"code": 200,
"data": {
"id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
"status": "completed",
"progress": 100,
"cost": 1.52,
"credits_cost": 15.2,
"result": {
"videos": [
{
"url": ["https://cdn.example.com/gemini_omni_xxx.mp4"],
"expires_at": 1788518400
}
]
}
}
}
Casos de uso
Caso 1: texto a video (4K)
{
"model": "gemini-omni-1.1-flash",
"prompt": "a blue butterfly landing on a flower, macro, soft light, no dialogue",
"aspect_ratio": "9:16",
"resolution": "4k"
}
Caso 2: interpolación del primer y último fotograma
{
"model": "gemini-omni-1.1-flash",
"prompt": "smooth transition, camera slowly pushes in",
"first_frame_image": "https://example.com/start.jpg",
"last_frame_image": "https://example.com/end.jpg",
"resolution": "720p"
}
Caso 3: referencias de varios sujetos
{
"model": "gemini-omni-1.1-flash",
"prompt": "the cat playfully bats at the ball of yarn",
"image_urls": [
"https://example.com/cat.png",
"https://example.com/yarn.png"
],
"resolution": "720p"
}
Caso 4: declarar el primer y último fotograma mediante roles de imagen
{
"model": "gemini-omni-1.1-flash",
"prompt": "a smooth cinematic transition from sunrise to a starry night",
"image_with_roles": [
{"url": "https://example.com/sunrise.jpg", "role": "first_frame"},
{"url": "https://example.com/night.jpg", "role": "last_frame"}
],
"resolution": "1080p"
}
Caso 5: edición de video
{
"model": "gemini-omni-1.1-flash",
"prompt": "Make the violin invisible. Keep everything else the same.",
"video_urls": ["https://example.com/clip.mp4"]
}
Keep everything else the same y conserva la coherencia del resto.
Caso 6: extensión conversacional
{
"model": "gemini-omni-1.1-flash",
"prompt": "Extend this video: the camera pans across the mountains.",
"extend_from_task_id": "task_01AAA"
}