Inicio rápido con los SDK oficiales
Los SDK oficiales encapsulan todo el flujo (crear → consultar → descargar) con claves de idempotencia automáticas y errores tipados. El SDK de Node no tiene dependencias; el de Python solo depende de httpx. De momento se distribuyen como repositorios de GitHub; su publicación en npm y PyPI se anunciará por separado.
Node
npm install github:openaiav/sdk-node # npm release to be announced
import { OpenAiav } from '@openaiav/sdk'
const client = new OpenAiav({ apiKey: process.env.OPENAIAV_API_KEY })
const task = await client.generations.createAndWait({
model: 'seedance-2.5-oa', prompt: 'She walks into the sunlight.',
resolution: '480p', aspectRatio: 'adaptive', durationSeconds: 4,
generateAudio: false
})
await client.generations.downloadToFile(task.id, './out.mp4')Python
pip install git+https://github.com/openaiav/sdk-python # PyPI release to be announced
from openaiav import OpenAiav
client = OpenAiav(os.environ["OPENAIAV_API_KEY"])
task = client.generations.create_and_wait({
"model": "seedance-2.5-oa", "prompt": "She walks into the sunlight.",
"resolution": "480p", "aspectRatio": "adaptive", "durationSeconds": 4,
"generateAudio": False,
})
client.generations.download_to_file(task["id"], "./out.mp4")Integración en cuatro pasos
- Usa la variable de entorno
OPENAIAV_API_KEYdel servidor para llamar a https://api.openaiav.com/v1/models y leer las claves de modelo, los precios y los reference_modes actuales. - Envía prompt, referenceMode y referenceImages con POST a /v1/generations. Las imágenes de referencia son URL HTTPS públicas y no requieren registro previo. Si todo va bien, se devuelve HTTP 201.
- Guarda el id devuelto y consulta el mismo GET /v1/generations/{id} tras poll_after_ms. Sigue esperando en processing, result_pending y submission_unknown; no crees otra tarea.
- Cuando el estado sea succeeded, descarga con GET /v1/generations/{id}/content. Una respuesta completa es HTTP 200 y un único rango de bytes, 206.
Autenticación e idempotencia
export OPENAIAV_API_KEY='oav_...'
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"Envía Authorization: Bearer oav_... en cada solicitud y guarda la clave en el servidor. La creación requiere generation:create; el sondeo y la descarga requieren generation:read. Genera una Idempotency-Key nueva (un UUID) para cada intención de creación, de modo que cada ejecución de un ejemplo obtenga una clave nueva; reutilízala solo al reintentar esa misma creación si el resultado de red es incierto y nunca uses una misma clave con cuerpos distintos.
Encabezados de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| Authorization | string | Obligatorio | Cada solicitud a /v1 usa Bearer oav_...; guarda la clave en tu servidor. |
| Idempotency-Key | string | Obligatorio al crear tareas | Genera un valor nuevo (por ejemplo, un UUID) para cada intención de creación y reutilízalo solo al reintentar esa misma creación; con el mismo valor y el mismo cuerpo no se crea ni se cobra nada dos veces. |
| Content-Type | string | Obligatorio en POST | La creación de generaciones usa application/json. |
Endpoints
| Método | Ruta | Éxito | Permiso | Descripción |
|---|---|---|---|---|
| GET | /v1/models | 200 | Cualquier clave de API válida | Lee los modelos disponibles a la venta, sus precios, resoluciones, duraciones y reference_modes. Comprueba las funciones en el catálogo antes de enviar. |
| POST | /v1/generation-quotes | 201 | generation:create | Previsualiza el precio actual sin fijarlo. La creación vuelve a calcularlo y cobra exactamente el reserved_usd de su respuesta como importe fijo; una tarea fallida se reembolsa por completo. Se sigue aceptando quoteId y expires_at solo indica cuándo actualizar. |
| POST | /v1/generations | 201 | generation:create | Crea una tarea asíncrona; envía las imágenes de referencia y referenceMode en la misma solicitud JSON. |
| GET | /v1/generations/{id} | 200 | generation:read | Consulta la misma tarea según poll_after_ms hasta que llegue a un estado final. |
| GET | /v1/generations/{id}/content | 200 / 206 | generation:read | Descarga el resultado cuando la tarea se completa; una solicitud con un único rango de bytes devuelve 206. |
Paso 1: consultar las funciones del modelo
No fijes en el código las funciones de los modelos. Envía solo los modos que aparezcan en reference_modes y oculta o bloquea las combinaciones incompatibles antes de enviar. El ejemplo mínimo muestra una solicitud de 4 segundos, 480p y sin audio con seedance-2.5-oa.
curl --fail-with-body 'https://api.openaiav.com/v1/models' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"Ejemplo mínimo de vídeo público
El ejemplo incluye todo el flujo: crear → consultar la misma tarea → descargar. first_frame usa una imagen de referencia y adaptive; generateAudio=false evita pedir audio. Los códigos de éxito son 201, 200 y 200/206; si algo falla, revisa primero el HTTP y después error.code.
# Keep OPENAIAV_API_KEY in an environment variable; do not paste secrets into shell history.
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"
# 1. Create — success: HTTP 201. On failure, the response body contains error.code.
# Lost response (timeout or dropped connection)? Re-run this same command in this shell:
# the unchanged $IDEMPOTENCY_KEY returns the original task instead of creating a second one.
curl --fail-with-body --request POST 'https://api.openaiav.com/v1/generations' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}'
# 2. Save the returned id as TASK_ID. Poll the same id — success: HTTP 200.
curl --fail-with-body 'https://api.openaiav.com/v1/generations/TASK_ID' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"
# Repeat step 2 after poll_after_ms until status is succeeded or failed.
# Never recreate a task whose status is submission_unknown.
# 3. After succeeded, download — success: HTTP 200 (or 206 with Range).
curl --fail-with-body --location 'https://api.openaiav.com/v1/generations/TASK_ID/content' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--output 'result.mp4'Parámetros de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| model | string | Obligatorio | Usa el valor model de GET /v1/models; el ejemplo mínimo de vídeo usa seedance-2.5-oa. |
| prompt | string | Obligatorio | De 1 a 4000 caracteres. La referencia omni puede aludir a las imágenes en el orden del array como @Image1, @Image2, etc. |
| resolution | string | Opcional | Debe figurar en las resolutions del modelo elegido; el ejemplo mínimo de vídeo usa 480p. |
| aspectRatio | string | Opcional | Debe figurar en las aspect_ratios del modelo seleccionado; usa adaptive cuando el modelo lo exija para solicitudes de primer fotograma. En los modelos de imagen que incluyen image_size_options, envía resolution y aspectRatio como un par de esa lista: no todas las relaciones de aspecto existen en todas las resoluciones. |
| durationSeconds | integer | Opcional | La duración del vídeo debe indicarse con durationSeconds como entero dentro de duration_seconds del catálogo; si se omite, se usa el mínimo del modelo. El ejemplo mínimo usa 4 segundos. |
| referenceMode | first_frame | omni_reference | Obligatorio con imágenes de referencia para vídeo | Úsalo solo con modelos de vídeo Seedance que incluyan el modo de forma explícita en reference_modes. Cada solicitud solo puede elegir un modo. |
| referenceImages | string[] | Indícalo junto con referenceMode | URL públicas de imágenes HTTPS. first_frame requiere exactamente una imagen; consulta el límite de omni_reference en reference_images_max. |
| inputImages | string[] | Opcional | Imágenes de entrada (imágenes de referencia) para imagen a imagen, solo en modelos de imagen. Cada elemento es una URL de imagen HTTPS pública o una data URL con la forma data:image/png;base64,…, data:image/jpeg;base64,… o data:image/webp;base64,…. Consulta los límites de cada modelo en GET /v1/models: input_images_max, input_image_max_bytes (por imagen, por URL o data URL) y input_image_mime_types. Las imágenes de referencia pueden aumentar el cobro. No las combines con un modo de referencia de vídeo. |
| generateAudio | boolean | Opcional | Por defecto es true en los modelos de vídeo con audio. El ejemplo más económico envía false de forma explícita; el catálogo actual no incluye ningún recargo de audio aparte, y GET /v1/models siempre manda en la facturación. |
| outputFormat | mp4 | mov | Opcional | Elige solo entre los output_formats del catálogo; el ejemplo mínimo usa mp4. |
Modos de referencia
first_frame
first_frame: la imagen de referencia se convierte en el primer fotograma y define la composición. Envía exactamente un elemento en referenceImages; aspectRatio sale de las aspect_ratios del modelo y queda fijado en adaptive cuando el catálogo lo ofrece (el resultado sigue a la imagen de referencia).
first_last_frame: envía exactamente 2 referenceImages. El orden del array es primer fotograma y después último fotograma, y el modelo genera lo que hay entre ambos. Las dos imágenes no tienen que tener las mismas dimensiones. Los modos de fotograma no se pueden combinar con omni_reference.
{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}omni_reference
omni_reference: los medios de referencia mantienen la coherencia del sujeto, el estilo y la escena sin convertirse en el primer fotograma. Además de referenceImages, los modelos compatibles aceptan referenceVideos y referenceAudios; los límites por tipo están en la tabla de abajo y cualquier tipo que el catálogo no declare devuelve un 400 al enviarse. Los prompts aluden a los elementos por su orden dentro de cada tipo: @Image1, @Video1, @Audio1.
{
"model": "seedance-2.5-oa",
"prompt": "Keep the identity and outfit from @Image1; a young woman walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "16:9",
"durationSeconds": 4,
"referenceMode": "omni_reference",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}Compatibilidad actual
Una sola integración para todos los modelos de vídeo: el mismo endpoint y los mismos campos. Cambiar de modelo solo implica cambiar model. El catálogo declara todas las diferencias, y la tabla de abajo es ese catálogo: para cada modelo, qué modos de referencia admite y cuántos medios de cada tipo acepta. Todo lo que el catálogo no declare se rechaza de forma explícita al enviarlo; nunca se ignora sin avisar.
Detalles del primer fotograma y encadenado con el último
Detalles del primer fotograma: first_frame y omni_reference son excluyentes, así que cada solicitud elige uno solo. Con la referencia omni puedes orientar una imagen de referencia hacia el plano inicial mediante el prompt, pero si el primer fotograma debe coincidir exactamente, envía esa imagen en modo first_frame. En Seedance 2.5, las tareas con primer fotograma fijan la relación de aspecto en adaptive (el resultado sigue al primer fotograma). Encadenar con el último fotograma: pasa returnLastFrame: true al crear la tarea y, si se completa, también devuelve last_frame_url (un PNG sin marca de agua del tamaño del vídeo, que se conserva 24 horas). Usa esa URL directamente como referenceImages del first_frame de la siguiente solicitud para encadenar varios planos, sin ningún registro previo.
Precios de vídeos de referencia
- Los vídeos de referencia con duración medible se facturan a precio fijo, que puedes consultar antes en una vista previa. Si no se puede medir la duración, no se ofrece la vista previa ni se cobra nada.
- Llama a
POST /v1/generation-quotespara ver el precio actual. Los vídeos URL se vuelven a medir y valorar al crear;reserved_usden la respuesta de creación es el importe real.quoteIdno fija el precio yexpires_atsolo indica cuándo actualizar. - El catálogo fija la duración por vídeo y total, la cantidad y el mínimo facturable. Cada vídeo de referencia debe durar entre 2 y 15 segundos en la serie Seedance 2.0 y entre 2 y 30 segundos en los demás modelos compatibles. Una duración medida fuera de los límites devuelve 422
REFERENCE_DURATION_OUT_OF_RANGEsin cargo. - Usa un enlace directo HTTPS público a MP4/MOV. Los archivos de tamaño conocido mayores de 200 MiB devuelven
REFERENCE_VIDEO_TOO_LARGE; se puede cotizar sin tamaño declarado. Las URL privadas devuelvenREFERENCE_URL_NOT_PUBLICy las mediciones ocupadas 429REFERENCE_PROBE_BUSY. Las subidas de consola se limitan a 32 MiB. - A cada tarea se le cobra el precio de su presupuesto,
reserved_usd, al crearla; si termina bien, ese es el cargo final, y si falla se reembolsa por completo. Elprice_usdde una vista previa equivale a lo que costaría crear la tarea en ese momento; indica la duración de salida, no -1. - Las URL públicas de vídeo se comprueban al previsualizar y de nuevo al crear, y luego se pasan directamente al servicio de generación sin almacenamiento ni registro. Mantén estable el contenido. Las subidas siguen otra ruta y siguen vigentes las restricciones sobre rostros reales.
Precios de los modelos de imagen
- Los modelos de imagen se cobran por imagen según
resolutionyaspectRatio(image_pricing.rates). En los modelosgpt-image-*ynano-banana-*, los precios indicados corresponden a un prompt corto sin imágenes de referencia. - En estos modelos, las imágenes de referencia y los prompts más largos aumentan el cobro. Antes de crear una tarea, llama a
POST /v1/generation-quotescon el mismo cuerpo:price_usdes el cobro de esa solicitud a los precios actuales. Las tareas fallidas se reembolsan por completo.
Sondeo y descarga
Solo succeeded y failed son estados finales. submission_unknown indica que la aceptación se está confirmando y result_pending se está finalizando: guarda el ID de la tarea original, sigue consultando y nunca repitas la creación. Tras completarse, usa la ruta autenticada /content en lugar de depender de direcciones ajenas a Open AIav. Los resultados se conservan 24 horas (la respuesta de detalle incluye output_expires_at; las descargas caducadas devuelven 410 OUTPUT_EXPIRED, así que guárdalos a tiempo).
| Estado | Final | Acción |
|---|---|---|
| processing | No | Aceptada; vuelve a consultar tras poll_after_ms. |
| result_pending | No | El resultado se está finalizando. Conserva el ID y sigue consultando la misma tarea; no la vuelvas a crear. |
| submission_unknown | No | Se está confirmando la aceptación; no repitas la creación. Guarda el ID de la tarea original y sigue consultándolo. |
| succeeded | Sí | Completada; descarga el resultado con /content. |
| failed | Sí | Ha fallado definitivamente y el importe se ha reembolsado por completo; revisa error_code. |
Migración de endpoints retirados
/v1/assets, /v1/assets/content, /v1/assets/{id}, /v1/asset-groups y /v1/asset-groups/{id} se han retirado; una clave válida con el scope antiguo correspondiente recibe HTTP 410 / ENDPOINT_RETIRED. Las nuevas integraciones no deben llamar a estas rutas; incluye referenceMode y referenceImages en la misma solicitud de generación.Referencia de códigos de error
Referencia completa: estado HTTP, código, significado, acción recomendada y clase de error del SDK. Esta tabla comparte la fuente de datos con la correspondencia de errores del SDK; los códigos nuevos que no conozca el SDK se tratan según su estado HTTP.
| HTTP | Código | Significado | Acción recomendada | SDK |
|---|---|---|---|---|
| 401 | UNAUTHENTICATED | Falta la clave de API o no se reconoce. | Envía Authorization: Bearer oav_…; guarda la clave en el servidor. | AuthenticationError |
| 401 | INVALID_API_KEY | La clave de API no es válida o se ha revocado. | Comprueba la clave en la consola; rótala para obtener una nueva si hace falta. | AuthenticationError |
| 403 | INSUFFICIENT_SCOPE | La clave no tiene el permiso (scope) que necesita esta operación. | La creación requiere generation:create; el sondeo y la descarga requieren generation:read. | PermissionError |
| 429 | RATE_LIMITED | Las solicitudes han superado el límite de la clave. | Espera según Retry-After / retryAfterSeconds antes de reintentar; el SDK lo hace automáticamente. | RateLimitError |
| 400 | IDEMPOTENCY_KEY_REQUIRED | La creación requiere el encabezado Idempotency-Key. | Genera una clave única para cada nueva solicitud y reutilízala en los reintentos. El SDK la genera automáticamente. | InvalidRequestError |
| 409 | IDEMPOTENCY_KEY_CONFLICT | Se ha usado la misma clave de idempotencia con otro cuerpo. | Usa una clave nueva para parámetros distintos; mantén idénticos la clave y el cuerpo en los reintentos. | InvalidRequestError |
| 400 | MODEL_NOT_FOUND | ID de modelo desconocido. | Usa los ID de GET /v1/models (p. ej., seedance-2.5-oa). | InvalidRequestError |
| 503 | MODEL_NOT_AVAILABLE | El modelo no se puede llamar en este momento. | No se ha cobrado nada. Revisa el status del modelo en GET /v1/models y vuelve a intentarlo más tarde. | ServerError |
| 400 | INVALID_PROMPT | El prompt está vacío o es demasiado largo. | Los prompts deben tener entre 1 y 4000 caracteres. | InvalidRequestError |
| 400 | INVALID_DURATION | durationSeconds está fuera del rango del modelo. | Indica la duración del vídeo como un entero durationSeconds dentro del rango del catálogo. | InvalidRequestError |
| 400 | INVALID_RESOLUTION | El modelo no admite esta resolución. | Elige un valor de las resolutions del catálogo. | InvalidRequestError |
| 400 | INVALID_ASPECT_RATIO | El modelo no admite esta relación de aspecto. | Elige entre las aspect_ratios del catálogo; first_frame suele fijar adaptive. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGES | referenceImages debe ser un array de URL HTTPS públicas. | Indica URL de imágenes https:// que se puedan leer durante toda la tarea. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGE | Un elemento de las imágenes de referencia no es una URL válida. | El mensaje incluye el índice (referenceImages[i]); corrige ese elemento. | InvalidRequestError |
| 400 | REFERENCE_IMAGE_URL_NOT_HTTPS | Una URL de imagen de referencia no es HTTPS pública. | Se rechazan las URL http, de red privada y data; publica la imagen por HTTPS. | InvalidRequestError |
| 400 | REFERENCE_MODE_REQUIRES_IMAGES | Se ha indicado referenceMode sin imágenes de referencia. | Indica referenceMode y referenceImages juntos. | InvalidRequestError |
| 400 | REFERENCE_MODE_NOT_SUPPORTED | El modelo no admite el modo de referencia solicitado. | Elige first_frame / omni_reference según los reference_modes del catálogo. | InvalidRequestError |
| 400 | FIRST_FRAME_REQUIRES_ONE_IMAGE | first_frame admite exactamente una imagen de referencia. | Envía exactamente una imagen; para varias, usa omni_reference. | InvalidRequestError |
| 400 | TOO_MANY_REFERENCES | El número de imágenes de referencia supera el límite del catálogo. | Consulta reference_images_max en el catálogo. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGES | inputImages debe ser un array. | Cada elemento es una URL HTTPS o un base64 data:image/*. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGE | Un elemento de las imágenes de entrada tiene un formato incorrecto. | Cada elemento debe ser una URL HTTPS o un base64 data:image/*; el mensaje incluye el índice. | InvalidRequestError |
| 400 | INPUT_IMAGE_URL_NOT_HTTPS | Una URL de imagen de entrada no usa HTTPS. | Usa una URL https:// o una data URL como data:image/png;base64,…. | InvalidRequestError |
| 400 | INPUT_IMAGE_TOO_LARGE | Una imagen incrustada supera los 10 MiB. | Comprímela por debajo de 10 MiB. Los modelos que indican input_image_max_bytes aplican el mismo límite a las URL HTTPS: una imagen demasiado grande hace fallar la tarea con REFERENCE_INPUT_INVALID y se reembolsa por completo. | InvalidRequestError |
| 400 | IMAGE_INPUT_NOT_SUPPORTED | El modelo no admite imágenes de entrada. | Solo los modelos de imagen con input_images_max>0 admiten inputImages. | InvalidRequestError |
| 400 | TOO_MANY_INPUT_IMAGES | Hay demasiadas imágenes de entrada. | Consulta input_images_max en el catálogo. | InvalidRequestError |
| 422 | REFERENCE_DURATION_OUT_OF_RANGE | La duración medida del vídeo de referencia supera los límites del modelo. | Consulta en el catálogo los límites por vídeo, de duración total y de cantidad, y vuelve a consultar el precio; no se realizó ningún cargo. | InvalidRequestError |
| 422 | REFERENCE_DURATION_UNVERIFIED | No se pudo medir la duración del vídeo de referencia. | Usa un MP4/MOV normal, preferiblemente faststart, alojado en un servidor que admita solicitudes Range. | InvalidRequestError |
| 422 | REFERENCE_URL_NOT_PUBLIC | La URL del vídeo de referencia no es una dirección HTTPS pública. | Usa una URL HTTPS pública de archivo en el puerto 443, accesible sin iniciar sesión. | InvalidRequestError |
| 422 | CONTENT_TYPE_MISMATCH | La URL del vídeo de referencia no devuelve el formato de vídeo requerido. | Comprueba que la URL devuelva los bytes de un MP4/MOV, no una página web ni una imagen. | InvalidRequestError |
| 422 | REFERENCE_VIDEO_TOO_LARGE | El vídeo de referencia supera el límite de tamaño. | Las URL públicas se limitan a 200 MiB y las subidas de consola a 32 MiB. Comprime o recorta el archivo y vuelve a consultar el precio. | InvalidRequestError |
| 429 | REFERENCE_PROBE_BUSY | Se están midiendo demasiados vídeos de referencia a la vez. | Vuelve a intentarlo después de retry_after_seconds; no se realizó ningún cargo. | RateLimitError |
| 400 | INSUFFICIENT_BALANCE | El saldo no es suficiente para esta tarea. | Recarga o canjea un código en el monedero y vuelve a intentarlo. | InvalidRequestError |
| 400 | LEGACY_ASSET_REFERENCE_RETIRED | Las referencias por ID de recurso se han retirado. | Envía referenceMode + referenceImages (HTTPS público) en la misma solicitud. | InvalidRequestError |
| 404 | NOT_FOUND | La tarea no existe o pertenece a otra cuenta. | Comprueba que el ID de la tarea y la clave pertenezcan a la misma cuenta. | InvalidRequestError |
| 409 | OUTPUT_NOT_READY | El resultado aún no está listo. | Sigue consultando la tarea según poll_after_ms hasta que llegue a un estado final. | InvalidRequestError |
| 410 | OUTPUT_EXPIRED | Ha terminado el plazo de descarga (24 h tras completarse). | Guarda los resultados a tiempo; cuando caducan hay que volver a generarlos. Usa output_expires_at para mostrar una cuenta atrás. | OutputExpiredError |
Códigos de fallo de tareas de imagen
Cuando una tarea de imagen termina con status=failed, lee error_code y búscalo en la tabla. Las tareas fallidas se reembolsan por completo. Los SDK lanzan GenerationFailedError con el mismo código.
| Código | Significado |
|---|---|
| CONTENT_POLICY_REJECTED | El contenido no ha superado la revisión. Modifícalo antes de volver a enviarlo. |
| REFERENCE_INPUT_INVALID | Revisa el formato y el tamaño de la referencia y los requisitos del modelo. |
| REFERENCE_SOURCE_UNREACHABLE | No se puede leer la URL de referencia. Comprueba si ha caducado o vuelve a subir el archivo. |
| REFERENCE_SERVICE_UNAVAILABLE | El procesamiento de referencias no está disponible. Contacta con el soporte indicando el ID de la tarea; no hace falta cambiar la imagen. |
| GENERATION_INPUT_INVALID | Los parámetros de generación no cumplen los requisitos de este modelo. |
| GENERATION_RATE_LIMITED | El servicio de generación tiene un límite de solicitudes temporal. Vuelve a intentarlo más tarde. |
| GENERATION_REJECTED | Se ha rechazado la solicitud de generación. Contacta con el soporte indicando el ID de la tarea para conocer el motivo. |
| GENERATION_SERVICE_UNAVAILABLE | El servicio de generación no está disponible temporalmente. |
| GENERATION_FAILED | La tarea no se ha podido completar. Contacta con el soporte indicando su ID. |
Códigos que solo devuelve la consola
| HTTP | Código | Significado | Acción recomendada |
|---|---|---|---|
| 400 | REFERENCE_UPLOAD_NOT_FOUND | La referencia de subida no existe, ha caducado o pertenece a otra cuenta. | Vuelve a subir el archivo en el Playground y ejecuta de nuevo (las subidas duran poco). |
| 429 | UPLOAD_QUOTA_EXCEEDED | Hay demasiadas subidas sin usar. | Ejecuta una tarea que use tus subidas o espera a que caduquen. |
| 429 | WEBHOOK_ENDPOINT_LIMIT | Se ha alcanzado el límite de endpoints de webhook. | Elimina o desactiva un endpoint que no uses. |
| 400 | INVALID_WEBHOOK_URL | La URL de devolución de llamada no es una dirección HTTPS accesible públicamente. | Usa una dirección HTTPS pública; se rechazan los hosts privados y de bucle local. |