API de generación de video
Crea tareas Veo 3.1 de texto a video e imagen a video con tu clave de API y consulta el resultado con el mismo endpoint /api/status que usas para imágenes.
Autenticación
Envía tu clave de API como token Bearer en cada solicitud. Usa la misma clave para crear una tarea y para consultar su estado. Puedes crear claves en la página API Keys de tu panel.
Authorization: Bearer YOUR_API_KEYModelos y créditos
Asigna al campo model uno de los valores siguientes. Cualquier otro valor se rechaza con HTTP 400 y no se cobra nada.
| valor de model | Modelo | Texto a video (créditos) | Imagen a video (créditos) |
|---|---|---|---|
veo3_fast | Veo 3.1 Fast (predeterminado) | 25 | 35 |
veo3 | Veo 3.1 Quality | 180 | 180 |
veo3-fast se acepta como alias de veo3_fast. Si omites model, se usa veo3_fast. El precio de imagen a video se aplica cuando image_urls contiene al menos una URL.
Crear una tarea de video
Valida la solicitud, cobra los créditos y devuelve un task_id. El video se genera de forma asíncrona: consulta /api/status o define callback_url para recibir el resultado.
Descripción en texto del video que quieres generar.
veo3_fast (alias veo3-fast) o veo3. Cualquier otro valor devuelve HTTP 400. Valor predeterminado veo3_fast.
URL públicas de imágenes para imagen a video. Con 1 imagen, el video se construye en torno a ella. Con 2 imágenes, se usan como primer y último fotograma. También se acepta el alias imageUrls (camelCase). Si envías ambos campos, se usa image_urls.
16:9, 9:16 o Auto. Auto recorta el video según la imagen subida. Valor predeterminado 16:9.
Si es true, el prompt se traduce al inglés antes de generar. Valor predeterminado true.
Texto de marca de agua que se añade al video.
URL pública que recibe una solicitud POST con el resultado final cuando termina la tarea.
Campos no admitidos
duration, resolution e image_url (en singular) no forman parte de esta API y se ignoran. La duración del video la decide el modelo. Envía las imágenes en un array image_urls.
curl -X POST "https://nanobnana.com/api/video/generate" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": ["https://example.com/first-frame.jpg"],
"aspect_ratio": "16:9"
}'{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv"
}
}Consultar el estado de una tarea
Los ID de tareas de video empiezan por veo y terminan en bksv. /api/status los detecta automáticamente y devuelve la URL del video cuando la tarea termina.
El task_id que devolvió POST /api/video/generate.
Usa veo3 para forzar la consulta de video si el task_id no sigue el formato veo…bksv.
curl "https://nanobnana.com/api/status?task_id=veo24223f74e4f445ec9c4403b532cc328fbksv" \
-H "Authorization: Bearer YOUR_API_KEY"{
"code": 200,
"message": "success",
"data": {
"task_id": "veo24223f74e4f445ec9c4403b532cc328fbksv",
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": null,
"status": "IN_PROGRESS",
"status_code": 3,
"status_text": "IN_PROGRESS",
"consumed_credits": 35,
"created_at": "2026-10-04 17:05:12",
"model": "veo3"
},
"model": "veo3"
}Valores de estado
IN_PROGRESS·status_code: 3— el video todavía se está generando. Sigue consultando.COMPLETED·status_code: 1— el video está listo. response contiene la URL del video.FAILED·status_code: 2— la generación falló. error_message explica el motivo y los créditos se reembolsan automáticamente.
Cobros y reembolsos
- Los créditos se cobran al crear la tarea, antes de que empiece la generación.
- Si la solicitud de creación no devuelve HTTP 200, no existe ninguna tarea y los créditos cobrados se reembolsan de inmediato. La respuesta indica cuántos créditos se reembolsaron.
- Si una tarea creada termina después en FAILED, sus créditos se reembolsan automáticamente y consumed_credits pasa a 0 en la respuesta de estado.
Ejemplo de consulta periódica
La generación de video suele tardar unos minutos. Consulta cada 10 segundos mientras status_code sea 3 y detente cuando sea 1 o 2.
async function waitForVideo(taskId) {
while (true) {
const res = await fetch(`https://nanobnana.com/api/status?task_id=${taskId}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
const payload = await res.json();
if (!res.ok) throw new Error(payload.message);
const task = payload.data;
if (task.status_code === 1) return task.response[0];
if (task.status_code === 2) throw new Error(task.error_message || 'Video generation failed');
await new Promise((resolve) => setTimeout(resolve, 10000));
}
}Callback
Si defines callback_url, enviaremos una solicitud POST con este JSON cuando la tarea termine o falle. La URL debe ser accesible desde internet.
{
"code": 200,
"message": "success",
"data": {
"request": {
"prompt": "The camera slowly pushes in as the city lights turn on at dusk",
"model": "veo3_fast",
"image_urls": [
"https://example.com/first-frame.jpg"
],
"aspect_ratio": "16:9"
},
"response": [
"https://example.com/generated-video.mp4"
],
"status": "COMPLETED",
"created_at": "2026-10-04 17:05:12"
}
}Errores frecuentes
{
"code": 400,
"message": "prompt is required",
"data": null
}