Veo 3 y Sora sitúan el text-to-video en el mismo nivel de calidad en el que estaba el text-to-image hace dieciocho meses. El inconveniente: los proveedores restringen el acceso mediante listas de espera, limitaciones regionales y sistemas de facturación particulares que no encajan con el resto de tu stack de IA.
En Kunavo, el modelo de text-to-video disponible actualmente es Google Veo 3, servido mediante un único endpoint compatible con OpenAI: sin lista de espera, autenticación compatible con OpenAI, cobro por vídeo y resultados servidos desde una URL permanente. Sora (sora-2) está en la hoja de ruta: como el endpoint no depende del modelo, cambiar a él más adelante será cambiar una sola palabra, model. Esta guía pone en marcha tu primera llamada a Veo 3 en unos cinco minutos. Consulta la guía de la API de Sora para conocer el panorama completo.
Configuración
- Regístrate en kunavo.com/app/signup. Recarga desde $10 con pago por uso: suficiente para ejecutar varias veces cada ejemplo de esta guía, y tu saldo nunca caduca.
- Crea una clave en /app/keys. Empieza por
sk-kn-. - Expórtala:
export KUNAVO_API_KEY=sk-kn-....
Text-to-video con Veo 3
Actualmente, Veo 3 es el mejor modelo de text-to-video del mercado para escenas cinematográficas: entiende el lenguaje de cámara (dolly, push-in, rack focus), mantiene una iluminación estable entre cortes y gestiona correctamente el movimiento a 24 fps. Las generaciones tardan de 30 segundos a unos minutos; la respuesta HTTP es síncrona: configura un tiempo de espera largo en el cliente.
import requests, os, time
KEY = os.environ["KUNAVO_API_KEY"]
resp = requests.post(
"https://api.kunavo.com/v1/video/generations",
headers={"Authorization": f"Bearer {KEY}"},
json={
"model": "veo-3",
"prompt": "A drone shot pulling back from a quiet mountain lake at dawn, mist rising off the water. Cinematic, 24fps, soft golden light.",
"aspect_ratio": "16:9",
"resolution": "1080p",
},
timeout=600, # generations take 30s to several minutes
)
resp.raise_for_status()
data = resp.json()
print(data["data"][0]["url"])duration (en segundos) define la duración del clip en los modelos con facturación por segundo: los modelos Seedance y el modelo Wan 2.7. Los modelos Veo lo ignoran; cada clip de Veo dura 8 segundos y se factura por vídeo.
La respuesta sigue el estilo de OpenAI: { data: [{ url: '...' }] }. La URL es permanente y se sirve desde files.kunavo.com; si necesitas alojamiento a largo plazo, descárgala una vez a tu propio almacenamiento.
Imagen a vídeo
Anclar el vídeo con una imagen suele ser la forma de obtener resultados de calidad de producción. Veo 3 admite dos modos de imagen:
image_mode: "frame": una sola imagen es el primer fotograma; dos imágenes son el primer y el último fotograma. Valor predeterminado paraimage_url.image_mode: "reference": hasta 3 referencias de estilo para mantener la coherencia del personaje o el vestuario sin imponer fotogramas.
# image-to-video: pass an image_url to anchor the first frame.
resp = requests.post(
"https://api.kunavo.com/v1/video/generations",
headers={"Authorization": f"Bearer {KEY}"},
json={
"model": "veo-3",
"prompt": "She smiles, then walks out of frame to the left",
"image_url": "https://files.kunavo.com/<your-upload>.jpg",
"image_mode": "frame", # one image => first frame
"aspect_ratio": "9:16", # vertical, mobile-native
},
timeout=600,
)
print(resp.json()["data"][0]["url"])Si aún no tienes una URL pública para la imagen de referencia, envía los bytes a /v1/files y Kunavo alojará el archivo por ti en files.kunavo.com:
# If you don't have a public URL, upload bytes; Kunavo hosts the file.
with open("anchor.jpg", "rb") as f:
up = requests.post(
"https://api.kunavo.com/v1/files",
headers={"Authorization": f"Bearer {KEY}"},
files={"file": f},
)
image_url = up.json()["url"] # permanent files.kunavo.com URLSora y otros modelos
La misma estructura de endpoint funciona con todos los modelos de vídeo del catálogo: pasa el slug correspondiente del modelo:
veo-3: cinematográfico, 1080p, compatible con image-to-video. Disponible ahora.seedance-2,seedance-2-5: ByteDance, muy potente para el movimiento de personajes.
OpenAI Sora (sora-2) está en la hoja de ruta y todavía no se puede invocar en Kunavo. Como /v1/video/generations no depende del modelo, el día que llegue el único cambio en las llamadas anteriores será el campo model; hasta entonces, Veo 3 es el equivalente disponible en el mismo endpoint.
Consulta /models para ver la lista actual y el precio de cada modelo.
Desde Node / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.KUNAVO_API_KEY,
baseURL: "https://api.kunavo.com/v1",
});
// /v1/video/generations isn't in OpenAI's SDK shape, but the same auth
// header works — call it with fetch:
const resp = await fetch(
"https://api.kunavo.com/v1/video/generations",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.KUNAVO_API_KEY}`,
},
body: JSON.stringify({
model: "veo-3",
prompt: "A red origami crane unfolding into a paper plane and flying away through a window",
resolution: "1080p",
}),
},
);
const { data } = await resp.json();
console.log(data[0].url);Modelo de precios
Los modelos de vídeo cobran por vídeo o por segundo de salida, no por token: los modelos Veo por vídeo, y cada clip dura 8 segundos; los modelos Seedance y Wan 2.7, por segundo. Kunavo publica la tarifa de cada modelo en /pricing. Un clip de 8 segundos de Veo 3 en 1080p cuesta $0.42. Las generaciones fallidas (4xx / 5xx) nunca se cobran.
Lista de comprobación para producción
- Configura un tiempo de espera HTTP de 10 minutos. La pasarela consulta el proveedor durante un máximo de 540 s y devuelve 504 si el modelo sigue trabajando después de ese límite. Para trabajos muy largos, reintenta: las generaciones son idempotentes por prompt.
- Persiste la URL del resultado. Aunque las URL de files.kunavo.com son permanentes, tu producto debe conservar su propia copia en un almacenamiento bajo tu control.
- Gestiona los errores 429 con backoff. Los modelos de vídeo dependen de GPU; una breve contención es normal. Cuando está presente, se respeta el encabezado retry-after.
- Usa una caché basada en el hash del prompt cuando sea razonable. Enviar el mismo prompt dos veces genera dos clips y se cobra dos veces: la pasarela no reutiliza ningún resultado anterior ni envía ningún seed al modelo.
Preguntas: contact@kunavo.com. El equipo detrás de la pasarela lee todos los correos y responde en un plazo de 24 horas.