TL;DR
La API de texto a video de Grok convierte un prompt de texto en un video. Llama a POST /v1/videos/generations para iniciar la generación y recibe un request_id de inmediato. Luego, haz polling con GET /v1/videos/{request_id} hasta que el estado sea "done". El modelo es grok-imagine-video, con precios desde $0.05 por segundo a 480p. El SDK de Python de xAI automatiza el polling.
Introducción
xAI generó 1.2 mil millones de videos en enero de 2026, el primer mes tras el lanzamiento de la API de texto a video de Grok (28 de enero de 2026). El modelo lideró el ranking de Artificial Analysis de ese mes, demostrando que la infraestructura escala.
Esta guía cubre cómo hacer tu primera solicitud, hacer polling, ajustar parámetros, escribir mejores prompts, usar imágenes de referencia, extender o editar videos y cuándo elegir texto a video.
💡 La API es asíncrona. Tu frontend no puede esperar el video antes de renderizar. Si construyes una UI para generación de video, necesitas mockear el flujo de polling sin gastar créditos. Smart Mock de Apidog permite simular tanto el endpoint de generación como el de polling. Así tu equipo puede avanzar en la UI mientras el backend está en desarrollo. Descarga Apidog gratis para seguir la sección de pruebas más adelante.
¿Qué es la API de texto a video de Grok?
La API de texto a video de Grok es parte del paquete de generación de medios de xAI en https://api.x.ai. Envía un prompt de texto y el modelo grok-imagine-video genera un clip de video desde cero, sin requerir imagen de origen.
Comparte espacio con el endpoint de generación de imágenes síncrono (POST /v1/images/generations, modelo grok-imagine-image, $0.02 por imagen) y endpoints para extender o editar videos.
La diferencia clave con imagen a video: aquí solo envías texto, y el modelo crea la escena, movimiento y estilo desde tu descripción. Si tienes una imagen de origen y quieres animarla, consulta la guía de la API de imagen a video de Grok.
Cómo funciona la generación de texto a video (patrón asíncrono)
La mayoría de APIs esperan la respuesta antes de continuar. Para video, la generación puede tardar de segundos a minutos, así que Grok usa un flujo asíncrono:
- Envía un POST con tu prompt.
- Recibes un
request_id(en menos de 1 segundo). - El video se genera en los servidores de xAI.
- Haz polling con GET usando ese
request_idrepetidamente. - Cuando el estado sea
"done", la respuesta trae la URL del video.
Este patrón mantiene conexiones HTTP cortas y permite verificar progreso a tu ritmo. Tu frontend debe manejar el estado intermedio y mostrar un loading hasta que llegue la URL.
Requisitos previos
Antes de programar:
- Cuenta xAI: Regístrate en console.x.ai. Agrega facturación para habilitar la generación.
- Clave API: En la consola, ve a Claves API y crea una. Guárdala de forma segura. Úsala como token Bearer en el header de cada request.
export XAI_API_KEY="your_api_key_here"
Opcional: instala el SDK de Python de xAI para integración rápida:
pip install xai-sdk
Tu primera solicitud de texto a video
El endpoint es POST https://api.x.ai/v1/videos/generations. Solo necesitas los campos model y prompt.
Usando curl
curl -X POST https://api.x.ai/v1/videos/generations \
-H "Authorization: Bearer $XAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video",
"prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting"
}'
Respuesta inmediata:
{
"request_id": "d97415a1-5796-b7ec-379f-4e6819e08fdf"
}
Ese UUID sirve para consultar el video cuando esté listo.
Usando Python y requests
import requests
import os
API_KEY = os.environ["XAI_API_KEY"]
BASE_URL = "https://api.x.ai"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "grok-imagine-video",
"prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting"
}
response = requests.post(
f"{BASE_URL}/v1/videos/generations",
headers=headers,
json=payload
)
data = response.json()
request_id = data["request_id"]
print(f"Generación iniciada. ID de solicitud: {request_id}")
Sondeo para el resultado del video
Con tu request_id, haz polling a GET /v1/videos/{request_id} hasta que el estado sea "done".
Estados posibles:
-
"processing": generando -
"done": completo, URL disponible -
"failed": error
Bucle de polling en Python:
import requests
import time
import os
API_KEY = os.environ["XAI_API_KEY"]
BASE_URL = "https://api.x.ai"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
def poll_video(request_id: str, interval: int = 5, max_attempts: int = 60) -> dict:
"""Sondea hasta que la generación de video esté completa."""
url = f"{BASE_URL}/v1/videos/{request_id}"
for attempt in range(max_attempts):
response = requests.get(url, headers=headers)
data = response.json()
status = data.get("status")
progress = data.get("progress", 0)
print(f"Intento {attempt + 1}: estado={status}, progreso={progress}%")
if status == "done":
return data
elif status == "failed":
raise RuntimeError(f"La generación de video falló: {data}")
time.sleep(interval)
raise TimeoutError(f"Video no listo después de {max_attempts} intentos")
# Flujo de trabajo completo: generar y luego sondear
def generate_video(prompt: str) -> str:
"""Genera un video y devuelve su URL."""
response = requests.post(
f"{BASE_URL}/v1/videos/generations",
headers={**headers, "Content-Type": "application/json"},
json={"model": "grok-imagine-video", "prompt": prompt}
)
request_id = response.json()["request_id"]
print(f"ID de solicitud: {request_id}")
result = poll_video(request_id)
video_url = result["video"]["url"]
print(f"Video listo: {video_url}")
return video_url
video_url = generate_video(
"A timelapse of a city skyline at sunset transitioning to night, aerial view"
)
Respuesta de polling cuando está listo:
{
"status": "done",
"video": {
"url": "https://vidgen.x.ai/....mp4",
"duration": 8,
"respect_moderation": true
},
"progress": 100,
"usage": {
"cost_in_usd_ticks": 500000000
}
}
Usando el SDK de Python de xAI
El SDK gestiona el polling automáticamente. El método client.video.generate() espera hasta que el video esté listo.
from xai_sdk import Client
import os
client = Client(api_key=os.environ["XAI_API_KEY"])
result = client.video.generate(
model="grok-imagine-video",
prompt="A golden retriever running through autumn leaves in slow motion",
duration=8,
resolution="720p",
aspect_ratio="16:9"
)
print(f"Video URL: {result.video.url}")
print(f"Duration: {result.video.duration}s")
El SDK es la vía más rápida para prototipos funcionales. Usa requests manuales solo si necesitas controlar lógica de reintentos o intervalos personalizados.
Escribiendo prompts efectivos para video
El prompt es la clave para resultados óptimos. Sé específico y estructurado.
Descripción de la escena
Incluye sujeto y entorno:
"Una taza de café de cerámica blanca sobre una mesa de madera junto a una ventana empapada por la lluvia"
Movimiento
Indica qué se mueve y cómo:
"La cámara orbita lentamente la taza mientras el vapor se eleva"
Estilo de cámara
Usa términos de cine:
"primer plano", "plano de seguimiento", "vista de dron aérea", "cámara en mano", "dolly zoom"
Iluminación y ambiente
Ejemplos útiles:
"hora dorada", "nublado", "iluminado con neones", "atmósfera melancólica"
Referencias de estilo
Nombra estilos visuales:
"cinemático", "documental", "anime", "stop-motion", "hyperlapse"
Estructura recomendada de prompt
Empieza con el sujeto, añade movimiento, describe la cámara, termina con el estilo y el ambiente:
A lone astronaut floats past the International Space Station,
tether drifting behind them. The camera tracks slowly
alongside, showing Earth below. Cinematic, IMAX quality,
warm sunrise light reflecting off the visor.
Controlando resolución, duración y relación de aspecto
El endpoint acepta parámetros opcionales para controlar salida, duración y calidad.
Duración
"duration": 10
Rango: 1–15 segundos. Default: 6s. Más segundos = mayor costo.
Resolución
"resolution": "720p"
Opciones: "480p" (default), "720p". Usa 480p para pruebas y 720p para producción.
Relación de aspecto
"aspect_ratio": "9:16"
Relaciones válidas:
| Relación | Uso recomendado |
|---|---|
16:9 |
Escritorio, YouTube (default) |
9:16 |
TikTok, Instagram Reels, móvil |
1:1 |
Instagram feed, tarjetas sociales |
4:3 |
Video clásico, presentaciones |
3:4 |
Contenido móvil vertical |
3:2 |
Foto estándar |
2:3 |
Fotografía vertical |
Ejemplo completo
curl -X POST https://api.x.ai/v1/videos/generations \
-H "Authorization: Bearer $XAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video",
"prompt": "A coastal town at dawn, waves breaking gently on a rocky shore",
"duration": 10,
"resolution": "720p",
"aspect_ratio": "16:9"
}'
Usando imágenes de referencia para guiar el estilo
El parámetro reference_images acepta hasta 7 URLs de imágenes. No se usan como sujeto, sino para guiar el estilo visual del video.
{
"model": "grok-imagine-video",
"prompt": "A coastal town at dawn, waves breaking gently on a rocky shore",
"reference_images": [
{"url": "https://example.com/my-style-reference.jpg"},
{"url": "https://example.com/color-palette-reference.jpg"}
]
}
Usa imágenes de referencia con estética coherente para influir fuertemente en el resultado. No es lo mismo que imagen a video: aquí el prompt sigue dirigiendo la escena.
Extendiendo y editando videos generados
xAI ofrece dos endpoints extra:
Extender un video
POST /v1/videos/extensions agrega más duración a un video ya generado. Envía el request_id original y un nuevo prompt para continuar la animación.
Editar un video
POST /v1/videos/edits modifica un video existente según una instrucción de texto: cambia el estilo, efectos o la escena.
Ambos endpoints usan el mismo patrón asíncrono: devuelven un request_id y haces polling con GET /v1/videos/{request_id}.
Leyendo el costo en la respuesta de la API
El campo usage en la respuesta incluye el costo en ticks:
"usage": {
"cost_in_usd_ticks": 500000000
}
Divide entre 10,000,000 para convertir a dólares:
cost_in_usd = result["usage"]["cost_in_usd_ticks"] / 10_000_000
print(f"Costo: ${cost_in_usd:.4f}")
# Ejemplo de salida: Costo: $0.0500
Referencia de precios
| Resolución | Precio por segundo | 10s de video |
|---|---|---|
| 480p | $0.05 | $0.50 |
| 720p | $0.07 | $0.70 |
Controla tus costos leyendo el campo cost_in_usd_ticks de cada respuesta.
Cómo probar tu API de video de Grok con Apidog
El polling asíncrono requiere que tu frontend maneje tres estados: cargando, éxito y error. Simular este flujo con la API real es costoso y lento. Smart Mock de Apidog lo resuelve simulando ambos endpoints.
Caso de uso 1: Smart Mock para desarrollo frontend
Con Smart Mock de Apidog:
-
Simula POST /v1/videos/generations: Define el esquema de respuesta con un campo
request_idtipo string. Apidog genera un UUID falso automáticamente.
Ejemplo de respuesta mock:
{
"request_id": "d97415a1-5796-b7ec-379f-4e6819e08fdf"
}
-
Simula GET /v1/videos/{request_id}: Define el esquema completo con
status,video.url,video.duration,progressyusage.cost_in_usd_ticks. Configura una respuesta mock personalizada con"status": "done"y una URL de MP4 genérica.
Ejemplo de respuesta mock:
{
"status": "done",
"video": {
"url": "https://vidgen.x.ai/mock-video-12345.mp4",
"duration": 8,
"respect_moderation": true
},
"progress": 100,
"usage": {
"cost_in_usd_ticks": 400000000
}
}
Los desarrolladores frontend pueden construir y probar toda la UI del reproductor de video contra este servidor mock. Pueden simular estados de carga, éxito y error modificando el mock. No se gastan créditos reales de la API.
Caso de uso 2: Escenarios de prueba para el bucle de polling
Con los Escenarios de Prueba de Apidog automatiza la validación:
Paso 1: Añade la solicitud POST /v1/videos/generations. Usa una Variable de Extracción para capturar el request_id con JSONPath ($.request_id).
Paso 2: Añade el GET /v1/videos/{{videoRequestId}} en un bucle For, con condición de salida: response.body.status == "done". Añade un delay de 5s entre iteraciones.
Paso 3: Agrega una aserción para que $.video.url no esté vacío en la última respuesta.
Esto asegura una cobertura repetible del flujo asíncrono y ayuda a detectar regresiones en tu lógica de polling.
Texto a video vs imagen a video: ¿cuándo usar cada uno?
Ambos usan grok-imagine-video, pero tienen usos distintos:
Texto a video:
- Genera contenido original desde un prompt/concepto.
- El modelo tiene control creativo total.
- Útil para herramientas donde el usuario solo escribe un prompt.
- No tienes una imagen fuente.
Imagen a video:
- Tienes una imagen/ilustración/foto de producto a animar.
- Necesitas preservar detalles visuales exactos.
- Quieres animaciones consistentes desde varias imágenes.
Texto a video crea la escena desde cero; imagen a video anima una imagen existente. Para una guía completa de imagen a video, revisa la guía de la API de imagen a video de Grok.
En productos que soportan ambos modos, decide en tiempo de ejecución: si el usuario sube una imagen, usa /v1/images/generations; si solo escribe texto, usa /v1/videos/generations.
Errores comunes y cómo solucionarlos
-
401 No Autorizado: Falta la clave API, está caducada o mal formateada. Verifica el header
Authorization: Bearer YOUR_XAI_API_KEYy que la clave esté activa. - 429 Too Many Requests: Excediste el rate limit (60 req/min, 1 req/seg). Espacia tus llamadas, especialmente en polling (mínimo 5s entre requests).
-
status: "failed"en polling: El prompt fue rechazado por moderación. El camporespect_moderationserátrue. Revisa y ajusta el prompt. - La URL del video arroja 404: Las URLs caducan. Descarga el video apenas recibas la URL.
- Video vacío o congelado: Prompts vagos o sin instrucciones de movimiento. Sé explícito sobre qué se mueve y cómo.
- Polling lento: 720p y duraciones largas tardan más. Usa 480p y clips cortos para desarrollo y prototipado.
Conclusión
La API de texto a video de Grok es directa: envías un prompt, recibes un request_id, haces polling y descargas tu MP4. Domina el patrón asíncrono y el resto (duración, resolución, relación de aspecto, imágenes de referencia) es parametrizable.
Para producción, monitorea el costo leyendo cost_in_usd_ticks tras cada generación. Simula endpoints en Apidog para que el frontend avance sin bloqueos. Usa Escenarios de Prueba para mantener fiable tu lógica de polling.
Descarga Apidog gratis para configurar mocks y escenarios de prueba para la API de video de Grok.
Preguntas Frecuentes
¿Qué nombre de modelo uso para la generación de texto a video?
Usa grok-imagine-video como valor de model en tu POST a /v1/videos/generations.
¿Cuánto tarda la generación de video?
Depende de duración y resolución. 480p corto: <30s. 720p largo: varios minutos. Haz polling cada 5-10s.
¿Puedo generar videos de más de 15 segundos?
No en una sola solicitud. duration máximo: 15s. Para videos más largos, encadena clips y usa POST /v1/videos/extensions.
¿Cómo descargo el video generado?
Usa la URL result.video.url del polling. Descarga el MP4 de inmediato; la URL caduca.
¿Qué sucede si mi prompt viola la moderación de contenido?
El estado será "failed". respect_moderation indicará si hubo moderación. Ajusta el prompt.
¿Hay un nivel gratuito para la API de video?
No hay free tier específico para video. Consulta console.x.ai para créditos de bienvenida.
¿En qué se diferencian las reference_images de una imagen de origen?
reference_images guían el estilo visual del video generado desde texto. Una imagen de origen en imagen a video se convierte en el primer fotograma real.
¿Cómo pruebo el bucle de polling sin gastar créditos?
Usa Smart Mock de Apidog para simular los endpoints de generación y polling. Define los esquemas y estados mock para cubrir todos los casos en tus test.


Top comments (0)