sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08, and sora-2-pro-2025-10-06. See the deprecations page for details.Descripción general
Sora es el avance más reciente de OpenAI en la generación de contenido multimedia: un modelo de video de última generación capaz de crear clips dinámicos, con gran riqueza de detalles y audio, a partir de lenguaje natural o imágenes. Desarrollado a partir de años de investigación sobre difusión multimodal y entrenado con datos visuales diversos, Sora aporta una comprensión profunda del espacio 3D, el movimiento y la continuidad de las escenas a la generación de video a partir de texto.
La API de videos pone estas capacidades a disposición de los desarrolladores por primera vez y permite crear, extender, editar y administrar videos de forma programática.
Puedes usarla para:
- Crear videos nuevos a partir de prompts.
- Guiar una generación con una imagen de referencia.
- Reutilizar recursos de personajes en varias generaciones para lograr una mayor coherencia visual.
- Continuar un clip terminado con extensiones de video.
- Editar un video existente con cambios específicos.
- Descargar videos terminados y recursos complementarios.
- Enviar grandes colas de renderizado para procesamiento diferido a través de la API de procesamiento por lotes.
Modelos
El modelo Sora de segunda generación está disponible en dos variantes, cada una adaptada a distintos casos de uso.
Sora 2
sora-2 está diseñado para ofrecer velocidad y flexibilidad. Es ideal para la fase de exploración, cuando experimentas con el tono, la estructura o el estilo visual y necesitas evaluar resultados rápidamente, más que lograr una fidelidad perfecta.
Genera resultados de buena calidad con rapidez, por lo que es adecuado para iterar rápidamente, desarrollar conceptos y crear montajes preliminares. sora-2 suele ser más que suficiente para contenido de redes sociales, prototipos y situaciones en las que el tiempo de entrega importa más que una fidelidad extremadamente alta.
Sora 2 Pro
sora-2-pro produce resultados de mayor calidad. Es la mejor opción cuando necesitas resultados con calidad de producción.
sora-2-pro tarda más en renderizar y cuesta más ejecutarlo, pero produce resultados más pulidos y estables. Es ideal para secuencias cinematográficas de alta resolución, materiales de marketing y cualquier situación en la que la precisión visual sea fundamental.
Usa sora-2-pro cuando necesites exportar en 1080p con dimensiones de 1920x1080 o 1080x1920.
Tanto sora-2 como sora-2-pro permiten generar videos de 16 y 20 segundos.
Generar un video
Generar un video es un proceso asíncrono :
-
Cuando llamas al punto de acceso
POST /videos, la API devuelve un objeto de trabajo con unidde trabajo y unstatusinicial. -
Puedes consultar periódicamente el punto de acceso
GET /videos/{video_id}hasta que el estado cambie a completado o, como alternativa más eficiente, usar webhooks (consulta la sección sobre webhooks más adelante) para recibir una notificación automática cuando termine el trabajo. -
Una vez que el trabajo alcance el estado
completed, puedes obtener el archivo MP4 final conGET /videos/{video_id}/content.
Iniciar un trabajo de renderizado
Para empezar, llama a POST /videos con un prompt de texto y los parámetros necesarios. El prompt define el aspecto y el estilo visual, incluidos los sujetos, la cámara, la iluminación y el movimiento, mientras que parámetros como size y seconds controlan la resolución y la duración del video.
import OpenAI from "openai";
const openai = new OpenAI();
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log("Video generation started: ", video);La respuesta es un objeto JSON con un identificador único y un estado inicial como queued o in_progress. Esto significa que el trabajo de renderizado ha comenzado.
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "queued",
"model": "sora-2-pro",
"progress": 0,
"seconds": "8",
"size": "1280x720"
}
Elegir el tamaño y la duración
Elige el formato más pequeño que satisfaga tus necesidades de producción:
- Usa clips más cortos cuando estés haciendo ajustes al prompt, el movimiento o la composición.
- Genera videos de hasta
20segundos cuando necesites momentos más largos, escenas más completas o anuncios más desarrollados. - Usa
sora-2-propara exportar videos de mayor resolución en1920x1080o1080x1920.
Los trabajos de mayor duración y los de 1080p pueden tardar considerablemente más en completarse que los renderizados cortos de 720p o 480p, así que prevé una mayor latencia en los flujos que usan los usuarios.
Medidas de protección y restricciones
La API aplica varias restricciones de contenido:
- Solo se permite contenido apto para menores de 18 años (en el futuro habrá una opción para omitir esta restricción).
- Se rechazarán los personajes y la música protegidos por derechos de autor.
- No se pueden generar personas reales, incluidas las figuras públicas.
- Las cargas de personajes con apariencia humana están bloqueadas de forma predeterminada.
- Actualmente se rechazan las imágenes de entrada con rostros humanos.
Asegúrate de que los prompts, las imágenes de referencia y las transcripciones respeten estas reglas para evitar errores en la generación.
Diseño de prompts eficaces
Para obtener los mejores resultados, describe el tipo de plano, el sujeto, la acción, el entorno y la iluminación. Por ejemplo:
- “Plano general de un niño volando una cometa roja en un parque con césped, luz del sol durante la hora dorada, la cámara hace una panorámica lenta hacia arriba”.
- “Primer plano de una taza de café humeante sobre una mesa de madera, luz matutina que entra por las persianas, profundidad de campo suave”.
Este nivel de detalle ayuda al modelo a producir resultados consistentes sin inventar detalles no deseados. Para conocer técnicas más avanzadas de diseño de prompts, consulta nuestra guía de diseño de prompts específica para Sora 2.
Monitorear el progreso
La generación de video lleva tiempo. Según el modelo, la carga de la API y la resolución, un solo renderizado puede tardar varios minutos.
Para gestionar esto de manera eficiente, puedes consultar periódicamente la API para obtener actualizaciones de estado o recibir notificaciones mediante un webhook.
Consultar periódicamente el punto de acceso de estado
Llama a GET /videos/{video_id} con el ID que devuelve la llamada de creación. La respuesta muestra el estado actual del trabajo, el porcentaje de progreso (si está disponible) y cualquier error.
Los estados habituales son queued, in_progress, completed y failed. Consulta el estado a intervalos razonables (por ejemplo, cada 10–20 segundos), aplica una espera exponencial entre reintentos si es necesario e informa a los usuarios que el trabajo sigue en curso.
import OpenAI from "openai";
import { setTimeout as sleep } from "node:timers/promises";
const openai = new OpenAI();
async function main() {
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
while (video.status === "queued" || video.status === "in_progress") {
await sleep(2000);
video = await openai.videos.retrieve(video.id);
}
if (video.status === "completed") {
console.log("Video successfully completed: ", video);
} else {
console.log("Video creation failed. Status: ", video.status);
}
}
main();Ejemplo de respuesta:
{
"id": "video_68d7512d07848190b3e45da0ecbebcde004da08e1e0678d5",
"object": "video",
"created_at": 1758941485,
"status": "in_progress",
"model": "sora-2-pro",
"progress": 33,
"seconds": "8",
"size": "1280x720"
}
Usar webhooks para recibir notificaciones
En lugar de consultar repetidamente el estado del trabajo con GET, registra un webhook para recibir una notificación automática cuando la generación de un video se complete o falle.
Puedes configurar los webhooks en la página de configuración de webhooks. Cuando un trabajo termina, la API emite uno de dos tipos de eventos: video.completed y video.failed. Cada evento incluye el ID del trabajo que lo desencadenó.
Ejemplo de la carga útil de un webhook:
{
"id": "evt_abc123",
"object": "event",
"created_at": 1758941485,
"type": "video.completed", // or "video.failed"
"data": {
"id": "video_abc123"
}
}
Obtener los resultados
Descargar el MP4
Una vez que el trabajo alcance el estado completed, obtén el MP4 con GET /videos/{video_id}/content. Este punto de acceso transmite los datos binarios del video y devuelve encabezados de contenido estándar, por lo que puedes guardar el archivo directamente en el disco o canalizarlo a un servicio de almacenamiento en la nube.
import { writeFileSync } from "node:fs";
import OpenAI from "openai";
const openai = new OpenAI();
let video = await openai.videos.create({
model: "sora-2",
prompt: "A video of the words 'Thank you' in sparkling letters",
});
console.log("Video generation started: ", video);
let progress = video.progress ?? 0;
while (video.status === "in_progress" || video.status === "queued") {
video = await openai.videos.retrieve(video.id);
progress = video.progress ?? 0;
// Display progress bar
const barLength = 30;
const filledLength = Math.floor((progress / 100) * barLength);
// Simple ASCII progress visualization for terminal output
const bar = "=".repeat(filledLength) + "-".repeat(barLength - filledLength);
const statusText = video.status === "queued" ? "Queued" : "Processing";
process.stdout.write(`${statusText}: [${bar}] ${progress.toFixed(1)}%`);
await new Promise((resolve) => setTimeout(resolve, 2000));
}
// Clear the progress line and show completion
process.stdout.write("\n");
if (video.status === "failed") {
throw new Error("Video generation failed");
}
console.log("Video generation completed: ", video);
console.log("Downloading video content...");
const content = await openai.videos.downloadContent(video.id);
const body = content.arrayBuffer();
const buffer = Buffer.from(await body);
writeFileSync("video.mp4", buffer);
console.log("Wrote video.mp4");Ahora tienes el archivo de video final listo para reproducirlo, editarlo o distribuirlo. Las URL de descarga son válidas durante un máximo de 1 hora después de la generación. Si necesitas almacenamiento a largo plazo, copia el archivo a tu propio sistema de almacenamiento cuanto antes.
Descargar recursos complementarios
Para cada video completado, también puedes descargar una miniatura y una hoja de sprites. Estos recursos ligeros son útiles para vistas previas, controles de desplazamiento por el video o vistas de catálogo. Usa el parámetro de consulta variant para especificar qué quieres descargar. El valor predeterminado es variant=video para el MP4.
# Download a thumbnail
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=thumbnail" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output thumbnail.webp
# Download a spritesheet
curl -L "https://api.openai.com/v1/videos/video_abc123/content?variant=spritesheet" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
--output spritesheet.jpgUsar imágenes de referencia
Puedes guiar una generación con una imagen de entrada, que funciona como el primer fotograma de tu video. Esto resulta útil si necesitas que el video generado conserve la apariencia de un recurso de marca, un personaje o un entorno específico.
Elige el formato de input_reference según el tipo de solicitud:
- Usa
input_referencecon una imagen cargada en las solicitudesmultipart/form-data. - Usa
input_referencecon un objeto JSON en las solicitudesapplication/json, incluidas las de procesamiento por lotes. El formato JSON aceptafile_idoimage_url.
La imagen debe tener la misma resolución que el video de destino (size).
Los formatos de archivo compatibles son image/jpeg, image/png y image/webp.
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F prompt="She turns around and smiles, then slowly walks out of the frame." \
-F model="sora-2-pro" \
-F size="1280x720" \
-F seconds="8" \
-F input_reference="@sample_720p.jpeg;type=image/jpeg"| Imagen de entrada generada con OpenAI GPT Image | Video generado con Sora 2 (convertido a GIF) |
|---|---|
Descargar esta imagen | Prompt: “Ella se da vuelta y sonríe, luego camina lentamente hasta salir del encuadre”. |
Descargar esta imagen | Prompt: “La puerta del refrigerador se abre. De él sale un monstruo morado, tierno y regordete”. |
Usar personajes para mantener la consistencia
Los personajes te permiten cargar un sujeto no humano reutilizable y usarlo como referencia en varias generaciones. Esto resulta útil cuando quieres que un animal, una mascota o un objeto mantenga la misma apariencia básica, estilo y presencia en pantalla en varias tomas.
Actualmente, la carga de personajes funciona mejor con clips cortos de 2 a 4 segundos en
16:9 o 9:16, con una resolución de 720p a 1080p. Los videos de origen de los personajes funcionan mejor cuando
tienen la misma relación de aspecto que el resultado solicitado. Si las relaciones de aspecto
son diferentes, el personaje puede verse estirado o distorsionado. Un solo video puede
incluir hasta dos personajes.
Los personajes son distintos de input_reference. Una imagen de referencia condiciona
el fotograma inicial de una sola generación, mientras que un recurso de personaje se puede reutilizar
en futuras solicitudes de video.
Crea el personaje cargando un clip MP4 corto en POST /v1/videos/characters y luego incluye el ID de personaje devuelto en el arreglo characters cuando crees un video.
Las cargas de personajes con apariencia humana están bloqueadas de forma predeterminada. Contacta a tu gerente de cuenta o comunícate con nuestro equipo de ventas para conocer los requisitos para acceder al uso de personajes con apariencia humana.
curl -X POST "https://api.openai.com/v1/videos/characters" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@character.mp4;type=video/mp4" \
-F "name=Mossy"Menciona el nombre del personaje exactamente como está escrito en tu prompt. Pasar solo el ID del personaje no basta para conservarlo de forma confiable en la toma.
Los personajes se pueden combinar con input_reference. Las extensiones no admiten
personajes.
curl -X POST "https://api.openai.com/v1/videos" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-2",
"prompt": "A cinematic tracking shot of Mossy, a moss-covered teapot mascot, weaving through a lantern-lit market at dusk.",
"size": "1280x720",
"seconds": "8",
"characters": [
{ "id": "char_123" }
]
}'Extender videos completados
Las extensiones de video te permiten continuar un video ya completado y crear un nuevo resultado que une ambos segmentos. Proporciona el video de origen en el campo video de la solicitud a POST /v1/videos/extensions y agrega un prompt que describa cómo debe continuar la escena. La API genera el siguiente segmento usando todo el clip de origen como contexto.
Usa extensiones cuando quieras conservar el movimiento, la dirección de la cámara y la continuidad de la escena. Si solo necesitas controlar el primer fotograma de una nueva generación, usa input_reference en su lugar.
Cada extensión puede agregar hasta 20 segundos. Un mismo video se puede extender hasta
seis veces, con una duración total máxima de 120 segundos. Actualmente, las extensiones
solo aceptan un video de origen y un prompt. No admiten personajes
ni imágenes de referencia.
curl -X POST "https://api.openai.com/v1/videos/extensions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Continue the scene as the camera rises over the rooftops and reveals the sunrise.",
"seconds": "8"
}'Editar videos existentes
La edición te permite tomar un video existente y hacer ajustes específicos sin volver a generar todo desde cero. Envía una solicitud a POST /v1/videos/edits con un prompt y una referencia en video, y el sistema reutiliza la estructura, la continuidad y la composición originales al aplicar la modificación. Esto funciona mejor cuando haces un solo cambio bien definido, ya que las ediciones pequeñas y específicas conservan mejor la fidelidad al original y reducen el riesgo de introducir artefactos.
Antes, los videos generados se podían editar con el punto de acceso remix, que se está retirando. Usa el punto de acceso edits para las nuevas integraciones.
El campo video acepta un ID de video o un video cargado. Si pasas un
ID de video, la API infiere el modelo a partir del video de origen.
La edición de videos cargados solo está disponible para clientes que cumplen los requisitos. Contacta a tu gerente de cuenta o comunícate con nuestro equipo de ventas si necesitas este flujo de trabajo.
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"video": {
"id": "video_abc123"
},
"prompt": "Shift the color palette to teal, sand, and rust, with a warm backlight."
}'Si cargas un video nuevo en lugar de editar uno ya generado, establece
model explícitamente en la solicitud.
curl -X POST "https://api.openai.com/v1/videos/edits" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "video=@source.mp4;type=video/mp4" \
-F "model=sora-2-pro" \
-F "prompt=Shift the color palette to teal, sand, and rust, with a warm backlight."La edición es especialmente útil para iterar porque te permite perfeccionar el resultado sin descartar lo que ya funciona. Al limitar cada edición a un solo ajuste claro, mantienes el estilo visual, la coherencia del sujeto y el encuadre de la cámara, mientras exploras variaciones en la atmósfera, la paleta de colores o la puesta en escena. Así es mucho más fácil crear secuencias pulidas mediante pasos pequeños y confiables.
| Video original | Video generado editado |
|---|---|
![]() | Prompt: “Cambia el color del monstruo a naranja”. |
![]() | Prompt: “Un segundo monstruo sale justo después”. |
Ejecutar trabajos de video con la API de procesamiento por lotes
Usa la API de procesamiento por lotes cuando necesites poner en cola muchas renderizaciones de video para procesarlas sin conexión, incorporarlas a procesos de revisión o integrarlas en flujos de trabajo de estudio. Cada línea del archivo de entrada del lote usa el mismo cuerpo de solicitud JSON que enviarías a POST /v1/videos, lo que la hace adecuada para listas de tomas y colas de renderización programadas.
Para generar videos con el procesamiento por lotes:
- Actualmente, el procesamiento por lotes solo admite
POST /v1/videos. - Las solicitudes de procesamiento por lotes deben usar JSON, no multipart.
- Carga los recursos con anticipación y haz referencia a ellos desde el cuerpo de la solicitud JSON.
- Usa
input_referencepara las generaciones guiadas por imágenes en el procesamiento por lotes. En las solicitudes JSON, pasainput_referencecomo un objeto confile_idoimage_url. - El procesamiento por lotes no admite cargas multipart de
input_reference, incluidas las entradas de video de referencia. - Los videos generados mediante procesamiento por lotes están disponibles para su descarga durante un máximo de
24horas después de que se complete el lote.
{"custom_id":"shot-001","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Slow dolly shot through a miniature paper city at blue hour, soft fog, practical window lights flickering on.","size":"1920x1080","seconds":"20"}}
{"custom_id":"shot-002","method":"POST","url":"/v1/videos","body":{"model":"sora-2-pro","prompt":"Portrait close-up of a red panda chef plating noodles in a stainless-steel kitchen, shallow depth of field.","size":"1080x1920","seconds":"16"}}
Cuando un lote alcanza el estado completed, los trabajos de video incluidos en su salida ya han alcanzado un estado final, como completed, failed o expired. Usa valores estables de custom_id para poder asociar los resultados del lote con tus ID internos de tomas, tu cola de edición o tu flujo de procesamiento de recursos. Luego, descarga los recursos finales con los ID de video devueltos.
Administrar tu biblioteca
Usa GET /videos para obtener una lista de tus videos. El punto de acceso admite parámetros de consulta opcionales para paginar y ordenar los resultados.
curl "https://api.openai.com/v1/videos?limit=20&after=video_123&order=asc" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .Usa DELETE /videos/{video_id} para eliminar del almacenamiento de OpenAI los videos que ya no necesites.
curl -X DELETE "https://api.openai.com/v1/videos/REPLACE_WITH_YOUR_VIDEO_ID" \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq .












Prompt: “Ella se da vuelta y sonríe, luego camina lentamente hasta salir del encuadre”.
Prompt: “La puerta del refrigerador se abre. De él sale un monstruo morado, tierno y regordete”.
Prompt: “Cambia el color del monstruo a naranja”.
Prompt: “Un segundo monstruo sale justo después”.