{
  "aboutHtml": "<p>Veo 3.1 Lite es el miembro Lite de Google dentro de la línea de generación de vídeo Veo 3. Sintetiza un vídeo con audio a partir de una descripción en lenguaje natural o una imagen de entrada. El resultado es un clip generado, no un análisis textual de una grabación existente. La ficha Lite del fabricante remite a Veo 3 para la arquitectura subyacente, el material de entrenamiento y las limitaciones conocidas, mientras que la documentación específica de Lite define sus propias funciones y límites de generación.</p><p>La arquitectura referenciada utiliza difusión latente sobre representaciones temporales de audio y representaciones espaciotemporales de vídeo. El modelo base se entrenó con audio, vídeo e imágenes, con descripciones de distinto nivel de detalle y material de entrenamiento filtrado y deduplicado. Esto explica su finalidad de generación conjunta de imagen y audio. No revela un número de parámetros específico de Lite ni demuestra que cada movimiento generado respete la realidad física. Para una escena práctica, decide conjuntamente la acción visible y el sonido correspondiente.</p><p>La documentación exacta de Lite establece un límite de entrada textual de 1024 tokens y un vídeo de salida. La columna Lite de la guía de generación enumera duraciones de 4, 6 y 8 segundos, con 720p como valor predeterminado y 1080p disponible solo para clips de 8 segundos. La relación de aspecto horizontal 16:9 es la predeterminada y también se enumera la vertical 9:16; la salida se documenta a 24 fotogramas por segundo. El audio nativo está siempre activado en ese flujo. Estos valores pertenecen al flujo denominado Lite del productor, no a otra edición de Veo ni a una respuesta de aplicación medida por separado.</p><p>Lite no admite salida 4K ni extensión de vídeo. La tabla de parámetros también marca como no disponibles en la columna Lite la función de múltiples referencias referenceImages y la entrada de vídeo para extensión. Una imagen inicial puede establecer el primer fotograma; la tabla enumera una imagen lastFrame junto con esa imagen inicial para una transición. Mantén esta vía de control de fotogramas separada de la mezcla de varias referencias de estilo o sujeto. Los ajustes del productor para generar personas dependen del modo: la tabla Lite enumera allow_all para texto a vídeo y allow_adult para imagen a vídeo e interpolación, mientras que las reglas regionales pueden restringir aún más ese perfil documentado. Elige la imagen inicial de acuerdo con la primera escena que realmente quieres, con el sujeto, el encuadre y los detalles visibles preparados antes de pedir movimiento.</p><p>Para texto a vídeo, describe el sujeto, su acción, el entorno y el estilo previsto. Añade la posición y el movimiento de cámara, el encuadre, el enfoque y la luz cuando sean relevantes. Una escena original de producto podría mantener el objeto centrado mientras la cámara se acerca a un detalle del material y la luz circundante cambia suavemente. Identifica el estado inicial, la acción principal y el momento final para que el clip breve resuelva una idea coherente. Una larga colección de acciones inconexas es una tarea distinta de un plano centrado en una sola acción.</p><p>Para imagen a vídeo, proporciona un fotograma inicial claro y explica qué debe moverse y qué debe permanecer estable. Especifica por separado el movimiento del sujeto y cualquier movimiento de cámara. Si utilizas una restricción de fotograma final, prepara una composición final compatible y describe la transición entre ambas. Inspecciona el resultado en lugar de suponer que una identidad, posición o forma solicitadas se mantienen idénticas durante todo el clip. La ficha referenciada identifica la coherencia completa en escenas complejas y el movimiento complejo como dificultades aún presentes.</p><p>La guía de prompts admite indicaciones explícitas para diálogo, efectos de sonido y ambiente. Pon el discurso exacto entre comillas, identifica al hablante y describe los sonidos en relación con la acción visible. Un efecto sonoro y el ambiente de fondo no deben confundirse con una frase hablada. El inglés está documentado como plenamente compatible para los prompts, mientras que otros idiomas no se han evaluado en esa guía. Revisa las palabras audibles, la sincronización y la calidad del sonido como parte del mismo recurso que el vídeo, en lugar de tratar el audio como una transcripción fiel garantizada del prompt.</p><p>El flujo del productor es asíncrono: una solicitud de generación devuelve una operación y el resultado terminado se obtiene cuando su estado informa de la finalización. Conserva la identidad de la operación e inspecciona el clip devuelto. La guía describe una retención de dos días por parte del productor y marcado SynthID, por lo que un recurso conservado debe incluir el resultado descargado, el prompt, las imágenes de origen y los ajustes seleccionados. Una semilla puede mejorar la repetibilidad, pero no garantiza el determinismo. Comprueba la continuidad del sujeto, la acción, el encuadre, el sonido y el final previsto de la escena antes de utilizar el clip en una edición; la finalización del procesamiento por sí sola no demuestra que se cumplan los requisitos creativos.</p>",
  "aboutText": "Veo 3.1 Lite es el miembro Lite de Google dentro de la línea de generación de vídeo Veo 3. Sintetiza un vídeo con audio a partir de una descripción en lenguaje natural o una imagen de entrada. El resultado es un clip generado, no un análisis textual de una grabación existente. La ficha Lite del fabricante remite a Veo 3 para la arquitectura subyacente, el material de entrenamiento y las limitaciones conocidas, mientras que la documentación específica de Lite define sus propias funciones y límites de generación.\n\nLa arquitectura referenciada utiliza difusión latente sobre representaciones temporales de audio y representaciones espaciotemporales de vídeo. El modelo base se entrenó con audio, vídeo e imágenes, con descripciones de distinto nivel de detalle y material de entrenamiento filtrado y deduplicado. Esto explica su finalidad de generación conjunta de imagen y audio. No revela un número de parámetros específico de Lite ni demuestra que cada movimiento generado respete la realidad física. Para una escena práctica, decide conjuntamente la acción visible y el sonido correspondiente.\n\nLa documentación exacta de Lite establece un límite de entrada textual de 1024 tokens y un vídeo de salida. La columna Lite de la guía de generación enumera duraciones de 4, 6 y 8 segundos, con 720p como valor predeterminado y 1080p disponible solo para clips de 8 segundos. La relación de aspecto horizontal 16:9 es la predeterminada y también se enumera la vertical 9:16; la salida se documenta a 24 fotogramas por segundo. El audio nativo está siempre activado en ese flujo. Estos valores pertenecen al flujo denominado Lite del productor, no a otra edición de Veo ni a una respuesta de aplicación medida por separado.\n\nLite no admite salida 4K ni extensión de vídeo. La tabla de parámetros también marca como no disponibles en la columna Lite la función de múltiples referencias referenceImages y la entrada de vídeo para extensión. Una imagen inicial puede establecer el primer fotograma; la tabla enumera una imagen lastFrame junto con esa imagen inicial para una transición. Mantén esta vía de control de fotogramas separada de la mezcla de varias referencias de estilo o sujeto. Los ajustes del productor para generar personas dependen del modo: la tabla Lite enumera allow_all para texto a vídeo y allow_adult para imagen a vídeo e interpolación, mientras que las reglas regionales pueden restringir aún más ese perfil documentado. Elige la imagen inicial de acuerdo con la primera escena que realmente quieres, con el sujeto, el encuadre y los detalles visibles preparados antes de pedir movimiento.\n\nPara texto a vídeo, describe el sujeto, su acción, el entorno y el estilo previsto. Añade la posición y el movimiento de cámara, el encuadre, el enfoque y la luz cuando sean relevantes. Una escena original de producto podría mantener el objeto centrado mientras la cámara se acerca a un detalle del material y la luz circundante cambia suavemente. Identifica el estado inicial, la acción principal y el momento final para que el clip breve resuelva una idea coherente. Una larga colección de acciones inconexas es una tarea distinta de un plano centrado en una sola acción.\n\nPara imagen a vídeo, proporciona un fotograma inicial claro y explica qué debe moverse y qué debe permanecer estable. Especifica por separado el movimiento del sujeto y cualquier movimiento de cámara. Si utilizas una restricción de fotograma final, prepara una composición final compatible y describe la transición entre ambas. Inspecciona el resultado en lugar de suponer que una identidad, posición o forma solicitadas se mantienen idénticas durante todo el clip. La ficha referenciada identifica la coherencia completa en escenas complejas y el movimiento complejo como dificultades aún presentes.\n\nLa guía de prompts admite indicaciones explícitas para diálogo, efectos de sonido y ambiente. Pon el discurso exacto entre comillas, identifica al hablante y describe los sonidos en relación con la acción visible. Un efecto sonoro y el ambiente de fondo no deben confundirse con una frase hablada. El inglés está documentado como plenamente compatible para los prompts, mientras que otros idiomas no se han evaluado en esa guía. Revisa las palabras audibles, la sincronización y la calidad del sonido como parte del mismo recurso que el vídeo, en lugar de tratar el audio como una transcripción fiel garantizada del prompt.\n\nEl flujo del productor es asíncrono: una solicitud de generación devuelve una operación y el resultado terminado se obtiene cuando su estado informa de la finalización. Conserva la identidad de la operación e inspecciona el clip devuelto. La guía describe una retención de dos días por parte del productor y marcado SynthID, por lo que un recurso conservado debe incluir el resultado descargado, el prompt, las imágenes de origen y los ajustes seleccionados. Una semilla puede mejorar la repetibilidad, pero no garantiza el determinismo. Comprueba la continuidad del sujeto, la acción, el encuadre, el sonido y el final previsto de la escena antes de utilizar el clip en una edición; la finalización del procesamiento por sí sola no demuestra que se cumplan los requisitos creativos.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "f257028515f87b7d4daa284f360f95c15f1277088daf66088f18728d901df601",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "es",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">G</span><h2 id=\"sheet-title\">Google: Veo 3.1 Lite</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Cerrar\">×</button></div><div class=\"idline\"><span>Google /</span><code>google/veo-3.1-lite</code><button type=\"button\" id=\"copy-id\">Copiar ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Secciones de la ficha del modelo\"><button type=\"button\" data-card-jump=\"overview\">Primeros pasos</button><button type=\"button\" data-card-jump=\"methods\">Entradas y métodos</button><button type=\"button\" data-card-jump=\"pricing\">Planes</button><button type=\"button\" data-card-jump=\"examples\">Ejemplos</button><button type=\"button\" data-card-jump=\"results\">Resultados</button><button type=\"button\" data-card-jump=\"aliases\">Alias</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Métodos de API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|google%2Fveo-3.1-lite\">Vídeo</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Primeros pasos</h3><p class=\"mdesc-full\">Convertir la descripción de una escena en un vídeo de 4, 6 u 8 segundos a 720p.</p><ul class=\"card-best-for\"><li>Mostrar un producto en movimiento</li><li>Crear una escena introductoria</li><li>Probar un movimiento breve de cámara</li></ul><dl class=\"card-io\" data-card-io><div><dt>Entradas aceptadas</dt><dd>Texto · Imágenes</dd></div><div><dt>Resultados</dt><dd>Vídeo</dd></div></dl><details class=\"card-about\"><summary>Sobre el modelo</summary><p class=\"note-s\" data-model-method-boundary>Esta descripción cubre las capacidades del modelo. Las entradas, salidas y opciones disponibles en Ailoot se indican a continuación para el método seleccionado.</p><div class=\"mabout\" id=\"m-about\"><p>Veo 3.1 Lite es el miembro Lite de Google dentro de la línea de generación de vídeo Veo 3. Sintetiza un vídeo con audio a partir de una descripción en lenguaje natural o una imagen de entrada. El resultado es un clip generado, no un análisis textual de una grabación existente. La ficha Lite del fabricante remite a Veo 3 para la arquitectura subyacente, el material de entrenamiento y las limitaciones conocidas, mientras que la documentación específica de Lite define sus propias funciones y límites de generación.</p><p>La arquitectura referenciada utiliza difusión latente sobre representaciones temporales de audio y representaciones espaciotemporales de vídeo. El modelo base se entrenó con audio, vídeo e imágenes, con descripciones de distinto nivel de detalle y material de entrenamiento filtrado y deduplicado. Esto explica su finalidad de generación conjunta de imagen y audio. No revela un número de parámetros específico de Lite ni demuestra que cada movimiento generado respete la realidad física. Para una escena práctica, decide conjuntamente la acción visible y el sonido correspondiente.</p><p>La documentación exacta de Lite establece un límite de entrada textual de 1024 tokens y un vídeo de salida. La columna Lite de la guía de generación enumera duraciones de 4, 6 y 8 segundos, con 720p como valor predeterminado y 1080p disponible solo para clips de 8 segundos. La relación de aspecto horizontal 16:9 es la predeterminada y también se enumera la vertical 9:16; la salida se documenta a 24 fotogramas por segundo. El audio nativo está siempre activado en ese flujo. Estos valores pertenecen al flujo denominado Lite del productor, no a otra edición de Veo ni a una respuesta de aplicación medida por separado.</p><p>Lite no admite salida 4K ni extensión de vídeo. La tabla de parámetros también marca como no disponibles en la columna Lite la función de múltiples referencias referenceImages y la entrada de vídeo para extensión. Una imagen inicial puede establecer el primer fotograma; la tabla enumera una imagen lastFrame junto con esa imagen inicial para una transición. Mantén esta vía de control de fotogramas separada de la mezcla de varias referencias de estilo o sujeto. Los ajustes del productor para generar personas dependen del modo: la tabla Lite enumera allow_all para texto a vídeo y allow_adult para imagen a vídeo e interpolación, mientras que las reglas regionales pueden restringir aún más ese perfil documentado. Elige la imagen inicial de acuerdo con la primera escena que realmente quieres, con el sujeto, el encuadre y los detalles visibles preparados antes de pedir movimiento.</p><p>Para texto a vídeo, describe el sujeto, su acción, el entorno y el estilo previsto. Añade la posición y el movimiento de cámara, el encuadre, el enfoque y la luz cuando sean relevantes. Una escena original de producto podría mantener el objeto centrado mientras la cámara se acerca a un detalle del material y la luz circundante cambia suavemente. Identifica el estado inicial, la acción principal y el momento final para que el clip breve resuelva una idea coherente. Una larga colección de acciones inconexas es una tarea distinta de un plano centrado en una sola acción.</p><p>Para imagen a vídeo, proporciona un fotograma inicial claro y explica qué debe moverse y qué debe permanecer estable. Especifica por separado el movimiento del sujeto y cualquier movimiento de cámara. Si utilizas una restricción de fotograma final, prepara una composición final compatible y describe la transición entre ambas. Inspecciona el resultado en lugar de suponer que una identidad, posición o forma solicitadas se mantienen idénticas durante todo el clip. La ficha referenciada identifica la coherencia completa en escenas complejas y el movimiento complejo como dificultades aún presentes.</p><p>La guía de prompts admite indicaciones explícitas para diálogo, efectos de sonido y ambiente. Pon el discurso exacto entre comillas, identifica al hablante y describe los sonidos en relación con la acción visible. Un efecto sonoro y el ambiente de fondo no deben confundirse con una frase hablada. El inglés está documentado como plenamente compatible para los prompts, mientras que otros idiomas no se han evaluado en esa guía. Revisa las palabras audibles, la sincronización y la calidad del sonido como parte del mismo recurso que el vídeo, en lugar de tratar el audio como una transcripción fiel garantizada del prompt.</p><p>El flujo del productor es asíncrono: una solicitud de generación devuelve una operación y el resultado terminado se obtiene cuando su estado informa de la finalización. Conserva la identidad de la operación e inspecciona el clip devuelto. La guía describe una retención de dos días por parte del productor y marcado SynthID, por lo que un recurso conservado debe incluir el resultado descargado, el prompt, las imágenes de origen y los ajustes seleccionados. Una semilla puede mejorar la repetibilidad, pero no garantiza el determinismo. Comprueba la continuidad del sujeto, la acción, el encuadre, el sonido y el final previsto de la escena antes de utilizar el clip en una edición; la finalización del procesamiento por sí sola no demuestra que se cumplan los requisitos creativos.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Disponible en Ailoot · entradas y métodos</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Vídeo</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Tipos de entrada</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Tipos de salida</dt><dd><code>video</code></dd></div><div><dt>Formato de salida</dt><dd>mp4</dd></div><div><dt>Número de salidas</dt><dd>Hasta 4 salidas</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Campo</th><th>Tipo</th><th>Requisito</th><th>Valores y límites</th><th>Predeterminado</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>google/veo-3.1-lite</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>Longitud mínima: 1</div><div>Máximo de bytes: 10.000</div><div>Unidad: bytes UTF8</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>integer</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>4, 6, 8</div><div>Unidad: segundos</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>720p</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>16:9, 9:16</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">generate_audio</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>boolean</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obligatorio</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>false</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">frame_images</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>array</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Opcional</td><td data-cell-label=\"Valores y límites\"><span class=\"card-cell-label\">Valores y límites</span><div>Condiciones: Omítelo para text_to_video. Si se incluye: exactamente un elemento {&quot;type&quot;:&quot;image_url&quot;,&quot;image_url&quot;:{&quot;url&quot;:&quot;&lt;actual HTTPS URL&gt;&quot;},&quot;frame_type&quot;:&quot;first_frame&quot;}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=&quot;720p&quot;,aspect_ratio=&quot;16:9&quot;,generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.</div></td><td data-cell-label=\"Predeterminado\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predeterminado</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinaciones de materiales de entrada</summary><p class=\"note-s\"><b>Texto a vídeo</b> · Obligatorio: prompt</p><p class=\"note-s\"><b>Imagen a vídeo</b> · Obligatorio: prompt, frame_images</p></details><details class=\"note-s\" data-method-contract><summary>Parámetros del método y ciclo de vida</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parámetro</th><th>Contrato</th></tr></thead><tbody><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>content_type</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>application/json</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>required</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>model, prompt, duration, resolution, aspect_ratio, generate_audio</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>other_options</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>false</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>resolution</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>720p</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>prompt_max_bytes</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>10000</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>duration</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>4, 6, 8</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>aspect_ratio</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>16:9, 9:16</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>generate_audio</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>false</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>material_types</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>text, image</td></tr><tr><th data-cell-label=\"Parámetro\" scope=\"row\"><span class=\"card-cell-label\">Parámetro</span><code>parameters</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>{&quot;name&quot;:&quot;model&quot;,&quot;type&quot;:&quot;string&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:true,&quot;enum&quot;:[&quot;google/veo-3.1-lite&quot;],&quot;availability&quot;:&quot;source_interface&quot;}, {&quot;name&quot;:&quot;prompt&quot;,&quot;type&quot;:&quot;string&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:false,&quot;enum&quot;:null,&quot;availability&quot;:&quot;source_interface&quot;,&quot;min_length&quot;:1,&quot;maximum_bytes&quot;:10000,&quot;maximum_length&quot;:null,&quot;unit&quot;:&quot;bytes UTF8&quot;}, {&quot;name&quot;:&quot;duration&quot;,&quot;type&quot;:&quot;integer&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:true,&quot;enum&quot;:[4,6,8],&quot;availability&quot;:&quot;source_interface&quot;,&quot;unit&quot;:&quot;segundos&quot;}, {&quot;name&quot;:&quot;resolution&quot;,&quot;type&quot;:&quot;string&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:true,&quot;enum&quot;:[&quot;720p&quot;],&quot;availability&quot;:&quot;source_interface&quot;}, {&quot;name&quot;:&quot;aspect_ratio&quot;,&quot;type&quot;:&quot;string&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:true,&quot;enum&quot;:[&quot;16:9&quot;,&quot;9:16&quot;],&quot;availability&quot;:&quot;source_interface&quot;}, {&quot;name&quot;:&quot;generate_audio&quot;,&quot;type&quot;:&quot;boolean&quot;,&quot;required&quot;:true,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:true,&quot;enum&quot;:[false],&quot;availability&quot;:&quot;source_interface&quot;}, {&quot;name&quot;:&quot;frame_images&quot;,&quot;type&quot;:&quot;array&quot;,&quot;required&quot;:false,&quot;default_known&quot;:false,&quot;default&quot;:null,&quot;enum_known&quot;:false,&quot;enum&quot;:null,&quot;availability&quot;:&quot;source_interface&quot;,&quot;conditions&quot;:&quot;Omítelo para text_to_video. Si se incluye: exactamente un elemento {\\&quot;type\\&quot;:\\&quot;image_url\\&quot;,\\&quot;image_url\\&quot;:{\\&quot;url\\&quot;:\\&quot;&lt;actual HTTPS URL&gt;\\&quot;},\\&quot;frame_type\\&quot;:\\&quot;first_frame\\&quot;}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=\\&quot;720p\\&quot;,aspect_ratio=\\&quot;16:9\\&quot;,generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.&quot;}</td></tr></tbody></table></div><p>Alias de método: <code>/v1/videos/generations</code>, <code>/videos</code>, <code>/videos/generations</code></p><p>Ciclo de vida: <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/generations/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_id}/content</code></p><p class=\"note-s\"><code>GET /v1/videos/generations/{request_id}/content</code></p><p class=\"note-s\">Crea una sola vez y guarda el ID devuelto.</p><p class=\"note-s\">Consulta periódicamente el estado original; conserva todos los recursos completados y sus duraciones.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Planes</h3><div class=\"card-result-process\" data-billing-basis><h5>Cómo se calcula el cargo definitivo</h5><p class=\"note-s\">Las tarifas mostradas estiman el coste antes de la generación. El cargo final se calcula a partir del coste registrado para la generación original. La duración medida del resultado y las cantidades previstas no constituyen la cantidad facturable final.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Las referencias tarifarias no añaden opciones a la solicitud. Los parámetros admitidos se indican en el método seleccionado.</p><dl data-price-conditions><dt>Modo rápido</dt><dd>Sin especificar <span class=\"note-s\">Cuando se selecciona el modo rápido</span></dd><dt>Modo flex</dt><dd>Sin especificar <span class=\"note-s\">Cuando se selecciona el modo flex</span></dd><dt>Esfuerzo máximo de razonamiento</dt><dd>Sin especificar <span class=\"note-s\">Cuando el esfuerzo máximo de razonamiento utiliza el ajuste predeterminado (default)</span></dd></dl></div><div data-declared-tariff-pricing><h4>Tarifas estimadas para comparar</h4><h4>Precios por configuración</h4><p class=\"note-s\">Relaciona cada cargo con las condiciones mostradas. Usa una tarifa para cada conjunto de configuraciones alternativas.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuración</th><th>Tabla de tarifas</th><th>Cantidad prevista</th><th>Generar audio</th><th>Resolución</th><th>Unidad de facturación</th><th>Condiciones de facturación</th><th>Cargo</th></tr></thead><tbody><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Tarifas base por token</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>Tarifa base</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>—</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>—</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>—</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>—</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>—</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Entrada · Tokens de entrada · Estimación solo para comparar</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Salida · Tokens de salida · Estimación solo para comparar</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Lectura de caché · Estimación solo para comparar</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Escritura en caché · Estimación solo para comparar</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Escritura en caché, 1 hora · Estimación solo para comparar</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>—</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>—</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>—</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>—</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>por segundo de vídeo</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>sonido: with_audio</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo · Estimación solo para comparar</span> <b>$0.16</b> <span class=\"price-unit\">por segundo de vídeo</span></div></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>—</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>—</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>—</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>—</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>por segundo de vídeo</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>audio: with_audio; resolución: 720p</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo · Estimación solo para comparar</span> <b>$0.1</b> <span class=\"price-unit\">por segundo de vídeo</span></div></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>—</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>—</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>—</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>—</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>por segundo de vídeo</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>sonido: without_audio</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo · Estimación solo para comparar</span> <b>$0.1</b> <span class=\"price-unit\">por segundo de vídeo</span></div></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Ultra</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>—</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>Configuración solicitada; solo una estimación.</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>Sin audio</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>720p</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>por segundo de vídeo de salida</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>—</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Segundo estimado de vídeo de salida · Estimación solo para comparar</span> <b>$0.06</b> <span class=\"price-unit\">por segundo de vídeo de salida</span></div><p class=\"note-s\">La tarifa mostrada estima el coste antes de la generación. El cargo definitivo se calcula a partir del coste registrado para la generación original. La duración física del vídeo no es la cantidad facturable.</p></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Coste estimado de generación</th><td data-cell-label=\"Tabla de tarifas\"><span class=\"card-cell-label\">Tabla de tarifas</span>—</td><td data-cell-label=\"Cantidad prevista\"><span class=\"card-cell-label\">Cantidad prevista</span>estimación para una generación</td><td data-cell-label=\"Generar audio\"><span class=\"card-cell-label\">Generar audio</span>—</td><td data-cell-label=\"Resolución\"><span class=\"card-cell-label\">Resolución</span>—</td><td data-cell-label=\"Unidad de facturación\"><span class=\"card-cell-label\">Unidad de facturación</span>—</td><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>—</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Coste estimado de generación · Estimación solo para comparar</span> <b>$0.24</b> <span class=\"price-unit\">estimación previa a la generación</span></div><p class=\"note-s\">Esta estimación no es un cargo adicional ni una tarifa fija para la generación completada.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot reserva un importe estimado antes de la solicitud. Tras obtener el resultado, liquida el cargo definitivo según el uso medido. En las respuestas en flujo, la liquidación usa el registro de uso final. <a href=\"/docs/es/billing/reserve/\">Cómo funcionan la reserva y la liquidación →</a></p><div data-declared-reference-pricing><h4>Detalles de la tarifa de referencia</h4><p class=\"note-s\">Las tablas de referencia del modelo no cambian la selección del método, las estimaciones de coste ni los cargos. Los cargos aplicados usan las tarifas del método Ailoot seleccionado.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Referencias de precios de configuraciones de vídeo</summary><h4>Precios por configuración</h4><p class=\"note-s\">Relaciona cada cargo con las condiciones mostradas. Usa una tarifa para cada conjunto de configuraciones alternativas.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuración</th><th>Condiciones de facturación</th><th>Cargo</th></tr></thead><tbody><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>sonido: with_audio</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo</span> <b>$0.16</b> <span class=\"price-unit\">por segundo de vídeo</span></div><p class=\"note-s\">Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.</p></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>sonido: without_audio</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo</span> <b>$0.1</b> <span class=\"price-unit\">por segundo de vídeo</span></div><p class=\"note-s\">Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.</p></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>audio: with_audio; resolución: 720p</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo</span> <b>$0.1</b> <span class=\"price-unit\">por segundo de vídeo</span></div><p class=\"note-s\">Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.</p></td></tr><tr><th data-cell-label=\"Configuración\" scope=\"row\"><span class=\"card-cell-label\">Configuración</span>Precio del vídeo</th><td data-cell-label=\"Condiciones de facturación\"><span class=\"card-cell-label\">Condiciones de facturación</span>audio: without_audio; resolución: 720p</td><td data-cell-label=\"Cargo\"><span class=\"card-cell-label\">Cargo</span><div><span>Salida · Precio del vídeo</span> <b>$0.06</b> <span class=\"price-unit\">por segundo de vídeo</span></div><p class=\"note-s\">Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Solicitudes de ejemplo</h3><h4>Ailoot Ultra · Vídeo</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes del código\"><button class=\"cg-tab\" id=\"model-code-1511-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1511-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-1511-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1511-panel-1\" aria-selected=\"false\" tabindex=\"-1\">curl · anima tu primer fotograma</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copiar código\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1511-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1511-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;google/veo-3.1-lite&quot;, &quot;prompt&quot;: &quot;A cat in a spacesuit walking on the Moon&quot;, &quot;duration&quot;: 4, &quot;resolution&quot;: &quot;720p&quot;, &quot;aspect_ratio&quot;: &quot;16:9&quot;, &quot;generate_audio&quot;: false}&#39;)\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1511-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1511-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_IMAGE_URL:?Set the actual HTTPS URL of your first-frame image}&quot;\nexport AILOOT_IMAGE_URL\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os,re\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nimage=os.environ[&quot;AILOOT_IMAGE_URL&quot;]\ntry:\n    parsed=urlsplit(image)\n    valid=(image.startswith(&quot;https://&quot;) and parsed.scheme==&quot;https&quot; and bool(parsed.hostname)\n           and parsed.username is None and parsed.password is None and &quot;#&quot; not in image\n           and not any(ord(c)&lt;32 or ord(c)==127 for c in image)\n           and re.search(r&quot;%(?![0-9A-Fa-f]{2})&quot;,image) is None)\nexcept ValueError:\n    valid=False\nif not valid:\n    raise SystemExit(&quot;Use your actual HTTPS image URL with a hostname, no userinfo and no fragment&quot;)\np={&quot;model&quot;:&quot;google/veo-3.1-lite&quot;,&quot;prompt&quot;:&quot;The subject makes a slow, natural movement. Keep the opening composition.&quot;,&quot;duration&quot;:4,&quot;resolution&quot;:&quot;720p&quot;,&quot;aspect_ratio&quot;:&quot;16:9&quot;,&quot;generate_audio&quot;:False,&quot;frame_images&quot;:[{&quot;type&quot;:&quot;image_url&quot;,&quot;image_url&quot;:{&quot;url&quot;:image},&quot;frame_type&quot;:&quot;first_frame&quot;}]}\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False),encoding=&quot;utf-8&quot;)\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&quot;result.json&quot;).read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(&quot;Keep the complete JSON, headers and original returned id. Use the existing GET status tab for that original operation, then save every completed owned output. Never resubmit an unknown generation.&quot;)\nPY_RESULT\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Recibir y guardar resultados</h3><h4>Ailoot Ultra · Vídeo</h4><p class=\"note-s\">mp4</p><ul class=\"card-result-paths\"><li><code>GET /v1/videos/{request_id}</code></li><li><code>GET /v1/videos/generations/{request_id}</code></li><li><code>GET /v1/videos/{request_id}/content</code></li><li><code>GET /v1/videos/generations/{request_id}/content</code></li></ul><h5>Consultar el estado de la tarea</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes del código\"><button class=\"cg-tab\" id=\"model-code-1512-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1512-panel-0\" aria-selected=\"true\" tabindex=\"0\">Obtener estado con GET</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copiar código\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1512-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1512-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}&quot;\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_OPERATION_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/videos/$operation_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o status.json\npython3 - &lt;&lt;&#39;PY_STATUS&#39;\nimport json\nfrom pathlib import Path\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nprint(json.dumps(r))\nif r.get(&quot;status&quot;)==&quot;completed&quot;:\n    for x in r.get(&quot;data&quot;,[]):print(x)\nPY_STATUS\n</code></pre></div></div></div><h5>Guarda todos los archivos completados</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes del código\"><button class=\"cg-tab\" id=\"model-code-1513-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1513-panel-0\" aria-selected=\"true\" tabindex=\"0\">Obtener todos los archivos completados con GET</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copiar código\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1513-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1513-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}&quot;\nexport AILOOT_STATUS_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\nfrom urllib.parse import urlsplit,urljoin\nf=Path(os.environ[&quot;AILOOT_STATUS_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose the actual completed status file&quot;)\nr=json.loads(f.read_text())\nif r.get(&quot;status&quot;)!=&quot;completed&quot; or not isinstance(r.get(&quot;data&quot;),list) or not r[&quot;data&quot;]:raise SystemExit(&quot;Wait for a completed status with asset paths&quot;)\nurls=[]\nfor x in r[&quot;data&quot;]:\n    if not isinstance(x,str) or &quot;\\n&quot; in x or &quot;\\r&quot; in x:raise SystemExit(&quot;Invalid asset path&quot;)\n    u=urljoin(&quot;https://api.ailoot.ai&quot;,x)\n    z=urlsplit(u)\n    if z.scheme!=&quot;https&quot; or z.netloc!=&quot;api.ailoot.ai&quot; or z.username or z.password:raise SystemExit(&quot;Use the actual Ailoot asset paths from status&quot;)\n    urls.append(u)\nPath(&quot;asset-urls.txt&quot;).write_text(&quot;\\n&quot;.join(urls)+&quot;\\n&quot;)\nPY_REQUEST\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error &quot;$asset_url&quot; \\\n    -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o &quot;video-${index}.mp4&quot;\n  index=$((index + 1))\ndone &lt; asset-urls.txt\n</code></pre></div></div></div><details class=\"card-about\"><summary>Otras consultas de contenido</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes del código\"><button class=\"cg-tab\" id=\"model-code-1514-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1514-panel-0\" aria-selected=\"true\" tabindex=\"0\">Obtener contenido con GET</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copiar código\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1514-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1514-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}&quot;\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_OPERATION_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/videos/$operation_id/content&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o video.mp4\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Conserva todos los resultados completados</h5><p class=\"note-s\">Guarda todos los vídeos completados o archivos recibidos; descarga cada URL de archivo que se haya devuelto.</p><p class=\"note-s\">data[] completado contiene todas las URL firmadas de contenido bajo tu titularidad. Recupera cada URL devuelta o utiliza el endpoint de contenido con index establecido en un índice real de salida. Un trabajo original fallido puede devolver charge_pending_check; comprueba ese trabajo original en lugar de crearlo de nuevo. Puede haber una pista de audio AAC válida incluso con generate_audio=false; conserva el MP4 original completo, incluido ese audio.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Si es necesario revisar la respuesta original</h5><p class=\"note-s\">Consulta el trabajo original existente; no vuelvas a enviar nunca un envío de resultado desconocido.</p></div><p class=\"note-s\">Máximo de salidas: 4.</p><details class=\"card-about\" data-output-fields><summary>Campos de respuesta</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Campo</th><th>Tipo</th><th>Significado</th></tr></thead><tbody><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">object</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">status</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">data[]</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>signed content URL</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">charge_pending_check</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>boolean</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">error.code</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">error.message</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>—</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">operation_id</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>Respuesta HTTP503 result_pending_check del estado o contenido original: el mismo ID público de vídeo original como id.</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">error.type</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td><td data-cell-label=\"Significado\"><span class=\"card-cell-label\">Significado</span>server_error con HTTP503 result_pending_check.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Errores y siguientes pasos</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Respuesta</th><th>Condición</th><th>Siguiente paso</th></tr></thead><tbody><tr><th data-cell-label=\"Respuesta\" scope=\"row\"><span class=\"card-cell-label\">Respuesta</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Condición\"><span class=\"card-cell-label\">Condición</span>Campos obligatorios, representación del material o valor del parámetro no válidos</td><td data-cell-label=\"Siguiente paso\"><span class=\"card-cell-label\">Siguiente paso</span>Corrige los campos indicados antes de una nueva solicitud de creación.</td></tr><tr><th data-cell-label=\"Respuesta\" scope=\"row\"><span class=\"card-cell-label\">Respuesta</span>409 · <code>video_not_ready</code></th><td data-cell-label=\"Condición\"><span class=\"card-cell-label\">Condición</span>El contenido del resultado original aún no está disponible</td><td data-cell-label=\"Siguiente paso\"><span class=\"card-cell-label\">Siguiente paso</span>Consulta periódicamente el ID original devuelto y respeta Retry-After.</td></tr><tr><th data-cell-label=\"Respuesta\" scope=\"row\"><span class=\"card-cell-label\">Respuesta</span><code>server_error</code></th><td data-cell-label=\"Condición\"><span class=\"card-cell-label\">Condición</span>La respuesta devuelta indica que la operación o el resultado requiere una comprobación</td><td data-cell-label=\"Siguiente paso\"><span class=\"card-cell-label\">Siguiente paso</span>Conserva el ID original de operación o tarea devuelto, las cabeceras de la solicitud y la respuesta; continúa con las lecturas admitidas de esa operación original. No vuelvas a enviar la solicitud de creación.</td></tr><tr><th data-cell-label=\"Respuesta\" scope=\"row\"><span class=\"card-cell-label\">Respuesta</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"Condición\"><span class=\"card-cell-label\">Condición</span>GET del estado o contenido original: la tarea no está publicada, el trabajo original no está en failed/cancelled/expired y el estado local es unknown o el estado del trabajo original es completed.</td><td data-cell-label=\"Siguiente paso\"><span class=\"card-cell-label\">Siguiente paso</span>Conserva el id y el operation_id originales (el mismo ID público de vídeo), la respuesta y las cabeceras; consulta solo el estado o contenido original. No envíes nunca una nueva solicitud de generación.</td></tr><tr><th data-cell-label=\"Respuesta\" scope=\"row\"><span class=\"card-cell-label\">Respuesta</span>422 · <code>price_unavailable</code></th><td data-cell-label=\"Condición\"><span class=\"card-cell-label\">Condición</span>No se puede analizar un objeto frame_images proporcionado o su perfil condicional, o el perfil completo analizado no tiene una ficha de precios exacta lista para usar.</td><td data-cell-label=\"Siguiente paso\"><span class=\"card-cell-label\">Siguiente paso</span>Conserva model, prompt, duration, resolution, aspect_ratio y generate_audio. Añade frame_images con exactamente un elemento first_frame en el formato de objeto especificado. Establece duration=4, resolution=&quot;720p&quot;, aspect_ratio=&quot;16:9&quot; y generate_audio=false. Esta validación se ejecuta antes de enviar la solicitud.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Alias</h3><h4>Alias del modelo</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=google%2Fveo-3.1-lite&amp;route=Ultra&amp;caller=google%2Fveo-3.1-lite&amp;fmt=videos\"><code>google/veo-3.1-lite</code></a></span></p><h4>Alias de rutas de métodos</h4><p class=\"note-s\"><code>/v1/videos/generations</code>, <code>/videos</code>, <code>/videos/generations</code></p><h4>ID de modelo relacionados</h4><p class=\"note-s\"><a href=\"#m=google%2Fveo-3.1-lite&amp;route=Ultra&amp;caller=google%2Fveo-3.1-lite&amp;fmt=videos\"><code>google/veo-3.1-lite</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "google/veo-3.1-lite",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "google/veo-3.1-lite",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|google%2Fveo-3.1-lite",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Las tarifas mostradas estiman el coste antes de la generación. El cargo final se calcula a partir del coste registrado para la generación original. La duración medida del resultado y las cantidades previstas no constituyen la cantidad facturable final.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Completeddata[] contains all owned signedcontentURLs. FetcheachactualURL,orusecontent?index=actualindex. Failedoriginaljobs maycarrycharge_pending_check; do not recreate.",
            "errors": [
              {
                "code": null,
                "condition": "Campos obligatorios, representación del material o valor del parámetro no válidos",
                "http_status": 400,
                "recovery": "Corrige los campos indicados antes de una nueva solicitud de creación.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "El contenido del resultado original aún no está disponible",
                "http_status": 409,
                "recovery": "Consulta periódicamente el ID original devuelto y respeta Retry-After.",
                "type": "video_not_ready"
              },
              {
                "code": null,
                "condition": "La respuesta devuelta indica que la operación o el resultado requiere una comprobación",
                "http_status": null,
                "recovery": "Conserva el ID original de operación o tarea devuelto, las cabeceras de la solicitud y la respuesta; continúa con las lecturas admitidas de esa operación original. No vuelvas a enviar la solicitud de creación.",
                "type": "server_error"
              },
              {
                "absent_fields": [
                  "status",
                  "object",
                  "model",
                  "data"
                ],
                "code": "result_pending_check",
                "condition": "GET del estado o contenido original: la tarea no está publicada, el trabajo original no está en failed/cancelled/expired y el estado local es unknown o el estado del trabajo original es completed.",
                "friendly_fields": "error.reason=result_pending_check,error.param=null; error.operation_id and error.request_id when the existing context supplies them. error.message is rewritten/localized.",
                "headers": {
                  "Retry-After": null,
                  "X-Should-Retry": "false"
                },
                "http_status": 503,
                "recovery": "Conserva el id y el operation_id originales (el mismo ID público de vídeo), la respuesta y las cabeceras; consulta solo el estado o contenido original. No envíes nunca una nueva solicitud de generación.",
                "response_fields": {
                  "charge_pending_check": true,
                  "error.code": "result_pending_check",
                  "error.type": "server_error",
                  "id": "original public video ID",
                  "operation_id": "same as id"
                },
                "type": "server_error"
              },
              {
                "code": null,
                "condition": "No se puede analizar un objeto frame_images proporcionado o su perfil condicional, o el perfil completo analizado no tiene una ficha de precios exacta lista para usar.",
                "http_status": 422,
                "message": "The complete video request cannot be priced",
                "recovery": "Conserva model, prompt, duration, resolution, aspect_ratio y generate_audio. Añade frame_images con exactamente un elemento first_frame en el formato de objeto especificado. Establece duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" y generate_audio=false. Esta validación se ejecuta antes de enviar la solicitud.",
                "type": "price_unavailable"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "content": [
                {
                  "http": "GET",
                  "parameters": [
                    {
                      "availability": "source_interface",
                      "conditions": "Must be less than the actual returned output count.",
                      "default": 0,
                      "default_known": true,
                      "enum": null,
                      "enum_known": false,
                      "maximum": null,
                      "maximum_known": false,
                      "minimum": 0,
                      "name": "index",
                      "required": false,
                      "type": "integer"
                    }
                  ],
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default0"
                  }
                },
                {
                  "http": "GET",
                  "parameters": [
                    {
                      "availability": "source_interface",
                      "conditions": "Must be less than the actual returned output count.",
                      "default": 0,
                      "default_known": true,
                      "enum": null,
                      "enum_known": false,
                      "maximum": null,
                      "maximum_known": false,
                      "minimum": 0,
                      "name": "index",
                      "required": false,
                      "type": "integer"
                    }
                  ],
                  "path": "/v1/videos/generations/{request_id}/content"
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "id_source": "Actualreturnedpublicid; opaque URLencodeit forGET. On HTTP503 result_pending_check from original status/content GET, operation_id equals id: use that same original public video ID for polling. Do not substitute unrelated operation IDs from other responses.",
              "mode": "submit_once_poll_original",
              "multioutputs": "retain every completed data output; index0 alone is not all outputs",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 202,
              "unknown": "Consulta el trabajo original existente; no vuelvas a enviar nunca un envío de resultado desconocido.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_video",
                "required": [
                  "prompt"
                ]
              },
              {
                "conditions": "The required fields are model, prompt, duration, resolution, aspect_ratio and generate_audio. For image_to_video, also provide frame_images and use duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" and generate_audio=false.",
                "content_type": "application/json",
                "mode": "image_to_video",
                "required": [
                  "prompt",
                  "frame_images"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "Use actual returned task_id or original public video id from response/media library. On HTTP503 result_pending_check from original video status/content GET, operation_id equals that original public video id. Do not assume unrelated operation IDs name media tasks.",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_video",
              "image_to_video"
            ],
            "outputs": {
              "all_results": "data[] completado contiene todas las URL firmadas de contenido bajo tu titularidad. Recupera cada URL devuelta o utiliza el endpoint de contenido con index establecido en un índice real de salida. Un trabajo original fallido puede devolver charge_pending_check; comprueba ese trabajo original en lugar de crearlo de nuevo. Puede haber una pista de audio AAC válida incluso con generate_audio=false; conserva el MP4 original completo, incluido ese audio.",
              "create_status": 202,
              "family": "video",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "object",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "status",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[]",
                  "type": "signed content URL"
                },
                {
                  "description": null,
                  "name": "charge_pending_check",
                  "type": "boolean"
                },
                {
                  "description": null,
                  "name": "error.code",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "error.message",
                  "type": "string"
                },
                {
                  "description": "Respuesta HTTP503 result_pending_check del estado o contenido original: el mismo ID público de vídeo original como id.",
                  "name": "operation_id",
                  "type": "string"
                },
                {
                  "description": "server_error con HTTP503 result_pending_check.",
                  "name": "error.type",
                  "type": "string"
                }
              ],
              "format": "mp4",
              "maximum_outputs": 4,
              "status_enum": [
                "in_progress",
                "completed",
                "failed"
              ]
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "google/veo-3.1-lite"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_bytes": 10000,
                "maximum_length": null,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string",
                "unit": "bytes UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "segundos"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Omítelo para text_to_video. Si se incluye: exactamente un elemento {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "frame_images",
                "required": false,
                "type": "array"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "Every field outside the original six required fields plus optional frame_images; last_frame, reference frames, multiple frames, non-HTTPS URLs, URL userinfo, URL fragments and other first-frame profiles are rejected."
            ]
          },
          "hints": [
            "Crea una sola vez y guarda el ID devuelto.",
            "Consulta periódicamente el estado original; conserva todos los recursos completados y sus duraciones."
          ],
          "input": {
            "aspect_ratio": [
              "16:9",
              "9:16"
            ],
            "content_type": "application/json",
            "duration": [
              4,
              6,
              8
            ],
            "generate_audio": [
              false
            ],
            "material_types": [
              "text",
              "image"
            ],
            "other_options": false,
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "google/veo-3.1-lite"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_bytes": 10000,
                "maximum_length": null,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string",
                "unit": "bytes UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "segundos"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Omítelo para text_to_video. Si se incluye: exactamente un elemento {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "frame_images",
                "required": false,
                "type": "array"
              }
            ],
            "prompt_max_bytes": 10000,
            "required": [
              "model",
              "prompt",
              "duration",
              "resolution",
              "aspect_ratio",
              "generate_audio"
            ],
            "resolution": [
              "720p"
            ]
          },
          "lifecycle": {
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content"
              }
            ],
            "id_source": "Actualreturnedpublicid; opaque URLencodeit forGET. On HTTP503 result_pending_check from original status/content GET, operation_id equals id: use that same original public video ID for polling. Do not substitute unrelated operation IDs from other responses.",
            "mode": "submit_once_poll_original",
            "multioutputs": "retain every completed data output; index0 alone is not all outputs",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 202,
            "unknown": "Read existing original job; never resubmit unknown send."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations",
            "/videos",
            "/videos/generations"
          ],
          "operation_modes": [
            "text_to_video",
            "image_to_video"
          ],
          "output": {
            "family": "video",
            "format": "mp4",
            "max_outputs": 4,
            "result": "all actual owned validated complete MP4 outputs"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio",
              "quoted_unit": "per video second"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.16",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.16",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio; resolución: 720p",
              "quoted_unit": "per video second"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio_720p",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "The displayed rate estimates the cost before generation. The final charge is calculated from the cost recorded for the original generation. Physical video duration is not the billable quantity.",
            "dimensions": {
              "forecast_quantity": "Requested configuration; estimate only.",
              "generate_audio": false,
              "quoted_unit": "per output video second",
              "resolution": "720p"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.06",
                "amount_unit": "usd_per_exact_physical_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio_720p",
                "label": "Estimated output video second",
                "native_amount_usd_per_unit": "0.06",
                "native_quantity": 1,
                "public_unit_label": "per output video second",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_video_second"
              }
            ]
          },
          {
            "basis": "Esta estimación no es un cargo adicional ni una tarifa fija para la generación completada.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coste estimado de generación",
            "units": [
              {
                "amount": "0.24",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.24",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"google/veo-3.1-lite\", \"prompt\": \"A cat in a spacesuit walking on the Moon\", \"duration\": 4, \"resolution\": \"720p\", \"aspect_ratio\": \"16:9\", \"generate_audio\": false}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_IMAGE_URL:?Set the actual HTTPS URL of your first-frame image}\"\nexport AILOOT_IMAGE_URL\npython3 - <<'PY_REQUEST'\nimport json,os,re\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nimage=os.environ[\"AILOOT_IMAGE_URL\"]\ntry:\n    parsed=urlsplit(image)\n    valid=(image.startswith(\"https://\") and parsed.scheme==\"https\" and bool(parsed.hostname)\n           and parsed.username is None and parsed.password is None and \"#\" not in image\n           and not any(ord(c)<32 or ord(c)==127 for c in image)\n           and re.search(r\"%(?![0-9A-Fa-f]{2})\",image) is None)\nexcept ValueError:\n    valid=False\nif not valid:\n    raise SystemExit(\"Use your actual HTTPS image URL with a hostname, no userinfo and no fragment\")\np={\"model\":\"google/veo-3.1-lite\",\"prompt\":\"The subject makes a slow, natural movement. Keep the opening composition.\",\"duration\":4,\"resolution\":\"720p\",\"aspect_ratio\":\"16:9\",\"generate_audio\":False,\"frame_images\":[{\"type\":\"image_url\",\"image_url\":{\"url\":image},\"frame_type\":\"first_frame\"}]}\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False),encoding=\"utf-8\")\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path(\"result.json\").read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(\"Keep the complete JSON, headers and original returned id. Use the existing GET status tab for that original operation, then save every completed owned output. Never resubmit an unknown generation.\")\nPY_RESULT\n",
            "label": "curl · animate your first frame",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}\"\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_OPERATION_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/videos/$operation_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o status.json\npython3 - <<'PY_STATUS'\nimport json\nfrom pathlib import Path\nr=json.loads(Path(\"status.json\").read_text())\nprint(json.dumps(r))\nif r.get(\"status\")==\"completed\":\n    for x in r.get(\"data\",[]):print(x)\nPY_STATUS\n",
            "label": "GET status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}\"\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_OPERATION_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/videos/$operation_id/content\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o video.mp4\n",
            "label": "GET content",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}\"\nexport AILOOT_STATUS_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\nfrom urllib.parse import urlsplit,urljoin\nf=Path(os.environ[\"AILOOT_STATUS_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose the actual completed status file\")\nr=json.loads(f.read_text())\nif r.get(\"status\")!=\"completed\" or not isinstance(r.get(\"data\"),list) or not r[\"data\"]:raise SystemExit(\"Wait for a completed status with asset paths\")\nurls=[]\nfor x in r[\"data\"]:\n    if not isinstance(x,str) or \"\\n\" in x or \"\\r\" in x:raise SystemExit(\"Invalid asset path\")\n    u=urljoin(\"https://api.ailoot.ai\",x)\n    z=urlsplit(u)\n    if z.scheme!=\"https\" or z.netloc!=\"api.ailoot.ai\" or z.username or z.password:raise SystemExit(\"Use the actual Ailoot asset paths from status\")\n    urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_REQUEST\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" \\\n    -H \"Authorization: Bearer $AILOOT_API_KEY\" -o \"video-${index}.mp4\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "GET all completed assets",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and save returned ID.",
          "Poll original status; retain every completed asset and duration."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations",
          "/videos",
          "/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.16",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.16",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio; resolution: 720p",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio_720p",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "The displayed rate estimates the cost before generation. The final charge is calculated from the cost recorded for the original generation. Physical video duration is not the billable quantity.",
            "dimensions": {
              "forecast_quantity": "Requested configuration; estimate only.",
              "generate_audio": false,
              "quoted_unit": "per output video second",
              "resolution": "720p"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.06",
                "amount_unit": "usd_per_exact_physical_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio_720p",
                "label": "Estimated output video second",
                "native_amount_usd_per_unit": "0.06",
                "native_quantity": 1,
                "public_unit_label": "per output video second",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_video_second"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.24",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.24",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "google/veo-3.1-lite",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.16",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_with_audio",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.16",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.1",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_with_audio_720p",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.1",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.1",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_without_audio",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.1",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.06",
            "amount_unit": "usd_per_exact_physical_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_without_audio_720p",
            "label": "Estimated output video second",
            "native_amount_usd_per_unit": "0.06",
            "native_quantity": 1,
            "public_unit_label": "per output video second",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_video_second"
          },
          {
            "amount": "0.24",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.24",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "google/veo-3.1-lite",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "29b600d0a0abb1aad2c5e4df55e149d4e087183b15710aaffdbd8af9e10e1bfd",
    "input_html_sha256": "5525fad37ba2785b2980b38d5132d85e962b468ff45fb943049e084abe1a8a0e",
    "private_audit_sha256": "187927162669cb0b92f38e9c9280a78811f8e53510ffdd971c52556b2f8f15fa",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/es/google-veo-3-1-lite/",
    "description": "Veo 3.1 Lite genera un vídeo con audio nativo a partir de una descripción textual o una imagen inicial. Su flujo Lite documentado produce un clip, con duraciones de 4, 6 u 8 segundos, encuadre horizontal o vertical y límites específicos distintos de los de Veo 3.1 y Fast.",
    "locale": "es",
    "md_url": "https://ailoot.ai/models/es/google-veo-3-1-lite/index.md",
    "title": "Google: Veo 3.1 Lite — Ailoot",
    "url": "https://ailoot.ai/models/es/google-veo-3-1-lite/"
  },
  "rawModel": {
    "about": "Veo 3.1 Lite es el miembro Lite de Google dentro de la línea de generación de vídeo Veo 3. Sintetiza un vídeo con audio a partir de una descripción en lenguaje natural o una imagen de entrada. El resultado es un clip generado, no un análisis textual de una grabación existente. La ficha Lite del fabricante remite a Veo 3 para la arquitectura subyacente, el material de entrenamiento y las limitaciones conocidas, mientras que la documentación específica de Lite define sus propias funciones y límites de generación.\n\nLa arquitectura referenciada utiliza difusión latente sobre representaciones temporales de audio y representaciones espaciotemporales de vídeo. El modelo base se entrenó con audio, vídeo e imágenes, con descripciones de distinto nivel de detalle y material de entrenamiento filtrado y deduplicado. Esto explica su finalidad de generación conjunta de imagen y audio. No revela un número de parámetros específico de Lite ni demuestra que cada movimiento generado respete la realidad física. Para una escena práctica, decide conjuntamente la acción visible y el sonido correspondiente.\n\nLa documentación exacta de Lite establece un límite de entrada textual de 1024 tokens y un vídeo de salida. La columna Lite de la guía de generación enumera duraciones de 4, 6 y 8 segundos, con 720p como valor predeterminado y 1080p disponible solo para clips de 8 segundos. La relación de aspecto horizontal 16:9 es la predeterminada y también se enumera la vertical 9:16; la salida se documenta a 24 fotogramas por segundo. El audio nativo está siempre activado en ese flujo. Estos valores pertenecen al flujo denominado Lite del productor, no a otra edición de Veo ni a una respuesta de aplicación medida por separado.\n\nLite no admite salida 4K ni extensión de vídeo. La tabla de parámetros también marca como no disponibles en la columna Lite la función de múltiples referencias referenceImages y la entrada de vídeo para extensión. Una imagen inicial puede establecer el primer fotograma; la tabla enumera una imagen lastFrame junto con esa imagen inicial para una transición. Mantén esta vía de control de fotogramas separada de la mezcla de varias referencias de estilo o sujeto. Los ajustes del productor para generar personas dependen del modo: la tabla Lite enumera allow_all para texto a vídeo y allow_adult para imagen a vídeo e interpolación, mientras que las reglas regionales pueden restringir aún más ese perfil documentado. Elige la imagen inicial de acuerdo con la primera escena que realmente quieres, con el sujeto, el encuadre y los detalles visibles preparados antes de pedir movimiento.\n\nPara texto a vídeo, describe el sujeto, su acción, el entorno y el estilo previsto. Añade la posición y el movimiento de cámara, el encuadre, el enfoque y la luz cuando sean relevantes. Una escena original de producto podría mantener el objeto centrado mientras la cámara se acerca a un detalle del material y la luz circundante cambia suavemente. Identifica el estado inicial, la acción principal y el momento final para que el clip breve resuelva una idea coherente. Una larga colección de acciones inconexas es una tarea distinta de un plano centrado en una sola acción.\n\nPara imagen a vídeo, proporciona un fotograma inicial claro y explica qué debe moverse y qué debe permanecer estable. Especifica por separado el movimiento del sujeto y cualquier movimiento de cámara. Si utilizas una restricción de fotograma final, prepara una composición final compatible y describe la transición entre ambas. Inspecciona el resultado en lugar de suponer que una identidad, posición o forma solicitadas se mantienen idénticas durante todo el clip. La ficha referenciada identifica la coherencia completa en escenas complejas y el movimiento complejo como dificultades aún presentes.\n\nLa guía de prompts admite indicaciones explícitas para diálogo, efectos de sonido y ambiente. Pon el discurso exacto entre comillas, identifica al hablante y describe los sonidos en relación con la acción visible. Un efecto sonoro y el ambiente de fondo no deben confundirse con una frase hablada. El inglés está documentado como plenamente compatible para los prompts, mientras que otros idiomas no se han evaluado en esa guía. Revisa las palabras audibles, la sincronización y la calidad del sonido como parte del mismo recurso que el vídeo, en lugar de tratar el audio como una transcripción fiel garantizada del prompt.\n\nEl flujo del productor es asíncrono: una solicitud de generación devuelve una operación y el resultado terminado se obtiene cuando su estado informa de la finalización. Conserva la identidad de la operación e inspecciona el clip devuelto. La guía describe una retención de dos días por parte del productor y marcado SynthID, por lo que un recurso conservado debe incluir el resultado descargado, el prompt, las imágenes de origen y los ajustes seleccionados. Una semilla puede mejorar la repetibilidad, pero no garantiza el determinismo. Comprueba la continuidad del sujeto, la acción, el encuadre, el sonido y el final previsto de la escena antes de utilizar el clip en una edición; la finalización del procesamiento por sí sola no demuestra que se cumplan los requisitos creativos.",
    "alias_of": null,
    "aliases": [],
    "author": "Google",
    "available": null,
    "canonical_model": "google/veo-3.1-lite",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.24",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.24",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Consulta los precios completos de la configuración en los detalles."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "0cef71ecc22628ae52e06dd5",
        "label": "Referencias de precios de configuraciones de vídeo",
        "profiles": [
          {
            "basis": "Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.",
            "dimensions": {
              "conditions": "sonido: with_audio"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.16",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "key": "video_second",
                "label": "Video price",
                "public_unit_label": "per video second",
                "quantity": 1,
                "rate_role": "typed_video_second_reference",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.",
            "dimensions": {
              "conditions": "sonido: without_audio"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "key": "video_second",
                "label": "Video price",
                "public_unit_label": "per video second",
                "quantity": 1,
                "rate_role": "typed_video_second_reference",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.",
            "dimensions": {
              "conditions": "audio: with_audio; resolución: 720p"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "key": "video_second",
                "label": "Video price",
                "public_unit_label": "per video second",
                "quantity": 1,
                "rate_role": "typed_video_second_reference",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "Referencia de precios publicada para la configuración mostrada. Los cargos finales se calculan según la configuración realmente facturada.",
            "dimensions": {
              "conditions": "audio: without_audio; resolución: 720p"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.06",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "key": "video_second",
                "label": "Video price",
                "public_unit_label": "per video second",
                "quantity": 1,
                "rate_role": "typed_video_second_reference",
                "side": "out",
                "unit": "video_second"
              }
            ]
          }
        ]
      }
    ],
    "entity_type": "model",
    "formats": [
      "videos"
    ],
    "id": "google/veo-3.1-lite",
    "input": [
      "text",
      "image"
    ],
    "kind": "video",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Las tarifas mostradas estiman el coste antes de la generación. El cargo final se calcula a partir del coste registrado para la generación original. La duración medida del resultado y las cantidades previstas no constituyen la cantidad facturable final.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Completeddata[] contains all owned signedcontentURLs. FetcheachactualURL,orusecontent?index=actualindex. Failedoriginaljobs maycarrycharge_pending_check; do not recreate.",
            "errors": [
              {
                "code": null,
                "condition": "Campos obligatorios, representación del material o valor del parámetro no válidos",
                "http_status": 400,
                "recovery": "Corrige los campos indicados antes de una nueva solicitud de creación.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "El contenido del resultado original aún no está disponible",
                "http_status": 409,
                "recovery": "Consulta periódicamente el ID original devuelto y respeta Retry-After.",
                "type": "video_not_ready"
              },
              {
                "code": null,
                "condition": "La respuesta devuelta indica que la operación o el resultado requiere una comprobación",
                "http_status": null,
                "recovery": "Conserva el ID original de operación o tarea devuelto, las cabeceras de la solicitud y la respuesta; continúa con las lecturas admitidas de esa operación original. No vuelvas a enviar la solicitud de creación.",
                "type": "server_error"
              },
              {
                "absent_fields": [
                  "status",
                  "object",
                  "model",
                  "data"
                ],
                "code": "result_pending_check",
                "condition": "GET del estado o contenido original: la tarea no está publicada, el trabajo original no está en failed/cancelled/expired y el estado local es unknown o el estado del trabajo original es completed.",
                "friendly_fields": "error.reason=result_pending_check,error.param=null; error.operation_id and error.request_id when the existing context supplies them. error.message is rewritten/localized.",
                "headers": {
                  "Retry-After": null,
                  "X-Should-Retry": "false"
                },
                "http_status": 503,
                "recovery": "Conserva el id y el operation_id originales (el mismo ID público de vídeo), la respuesta y las cabeceras; consulta solo el estado o contenido original. No envíes nunca una nueva solicitud de generación.",
                "response_fields": {
                  "charge_pending_check": true,
                  "error.code": "result_pending_check",
                  "error.type": "server_error",
                  "id": "original public video ID",
                  "operation_id": "same as id"
                },
                "type": "server_error"
              },
              {
                "code": null,
                "condition": "No se puede analizar un objeto frame_images proporcionado o su perfil condicional, o el perfil completo analizado no tiene una ficha de precios exacta lista para usar.",
                "http_status": 422,
                "message": "The complete video request cannot be priced",
                "recovery": "Conserva model, prompt, duration, resolution, aspect_ratio y generate_audio. Añade frame_images con exactamente un elemento first_frame en el formato de objeto especificado. Establece duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" y generate_audio=false. Esta validación se ejecuta antes de enviar la solicitud.",
                "type": "price_unavailable"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "content": [
                {
                  "http": "GET",
                  "parameters": [
                    {
                      "availability": "source_interface",
                      "conditions": "Must be less than the actual returned output count.",
                      "default": 0,
                      "default_known": true,
                      "enum": null,
                      "enum_known": false,
                      "maximum": null,
                      "maximum_known": false,
                      "minimum": 0,
                      "name": "index",
                      "required": false,
                      "type": "integer"
                    }
                  ],
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default0"
                  }
                },
                {
                  "http": "GET",
                  "parameters": [
                    {
                      "availability": "source_interface",
                      "conditions": "Must be less than the actual returned output count.",
                      "default": 0,
                      "default_known": true,
                      "enum": null,
                      "enum_known": false,
                      "maximum": null,
                      "maximum_known": false,
                      "minimum": 0,
                      "name": "index",
                      "required": false,
                      "type": "integer"
                    }
                  ],
                  "path": "/v1/videos/generations/{request_id}/content"
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "id_source": "Actualreturnedpublicid; opaque URLencodeit forGET. On HTTP503 result_pending_check from original status/content GET, operation_id equals id: use that same original public video ID for polling. Do not substitute unrelated operation IDs from other responses.",
              "mode": "submit_once_poll_original",
              "multioutputs": "retain every completed data output; index0 alone is not all outputs",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 202,
              "unknown": "Consulta el trabajo original existente; no vuelvas a enviar nunca un envío de resultado desconocido.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_video",
                "required": [
                  "prompt"
                ]
              },
              {
                "conditions": "The required fields are model, prompt, duration, resolution, aspect_ratio and generate_audio. For image_to_video, also provide frame_images and use duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" and generate_audio=false.",
                "content_type": "application/json",
                "mode": "image_to_video",
                "required": [
                  "prompt",
                  "frame_images"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "Use actual returned task_id or original public video id from response/media library. On HTTP503 result_pending_check from original video status/content GET, operation_id equals that original public video id. Do not assume unrelated operation IDs name media tasks.",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_video",
              "image_to_video"
            ],
            "outputs": {
              "all_results": "data[] completado contiene todas las URL firmadas de contenido bajo tu titularidad. Recupera cada URL devuelta o utiliza el endpoint de contenido con index establecido en un índice real de salida. Un trabajo original fallido puede devolver charge_pending_check; comprueba ese trabajo original en lugar de crearlo de nuevo. Puede haber una pista de audio AAC válida incluso con generate_audio=false; conserva el MP4 original completo, incluido ese audio.",
              "create_status": 202,
              "family": "video",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "object",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "model",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "status",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[]",
                  "type": "signed content URL"
                },
                {
                  "description": null,
                  "name": "charge_pending_check",
                  "type": "boolean"
                },
                {
                  "description": null,
                  "name": "error.code",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "error.message",
                  "type": "string"
                },
                {
                  "description": "Respuesta HTTP503 result_pending_check del estado o contenido original: el mismo ID público de vídeo original como id.",
                  "name": "operation_id",
                  "type": "string"
                },
                {
                  "description": "server_error con HTTP503 result_pending_check.",
                  "name": "error.type",
                  "type": "string"
                }
              ],
              "format": "mp4",
              "maximum_outputs": 4,
              "status_enum": [
                "in_progress",
                "completed",
                "failed"
              ]
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "google/veo-3.1-lite"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_bytes": 10000,
                "maximum_length": null,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string",
                "unit": "bytes UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "segundos"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Omítelo para text_to_video. Si se incluye: exactamente un elemento {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "frame_images",
                "required": false,
                "type": "array"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "Every field outside the original six required fields plus optional frame_images; last_frame, reference frames, multiple frames, non-HTTPS URLs, URL userinfo, URL fragments and other first-frame profiles are rejected."
            ]
          },
          "hints": [
            "Crea una sola vez y guarda el ID devuelto.",
            "Consulta periódicamente el estado original; conserva todos los recursos completados y sus duraciones."
          ],
          "input": {
            "aspect_ratio": [
              "16:9",
              "9:16"
            ],
            "content_type": "application/json",
            "duration": [
              4,
              6,
              8
            ],
            "generate_audio": [
              false
            ],
            "material_types": [
              "text",
              "image"
            ],
            "other_options": false,
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "google/veo-3.1-lite"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_bytes": 10000,
                "maximum_length": null,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string",
                "unit": "bytes UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "segundos"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "720p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  false
                ],
                "enum_known": true,
                "name": "generate_audio",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "conditions": "Omítelo para text_to_video. Si se incluye: exactamente un elemento {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"}; el elemento contiene exactamente type,image_url,frame_type; image_url contiene exactamente url. Sin claves adicionales ni duplicadas. Solo duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. La URL debe poder analizarse con el esquema https, un nombre de host no vacío, sin userinfo ni el carácter literal #; se conservan la consulta firmada y la ruta codificada. El código fuente no comprueba el MIME de entrada, el tamaño del archivo ni las dimensiones en píxeles.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "frame_images",
                "required": false,
                "type": "array"
              }
            ],
            "prompt_max_bytes": 10000,
            "required": [
              "model",
              "prompt",
              "duration",
              "resolution",
              "aspect_ratio",
              "generate_audio"
            ],
            "resolution": [
              "720p"
            ]
          },
          "lifecycle": {
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content"
              }
            ],
            "id_source": "Actualreturnedpublicid; opaque URLencodeit forGET. On HTTP503 result_pending_check from original status/content GET, operation_id equals id: use that same original public video ID for polling. Do not substitute unrelated operation IDs from other responses.",
            "mode": "submit_once_poll_original",
            "multioutputs": "retain every completed data output; index0 alone is not all outputs",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 202,
            "unknown": "Read existing original job; never resubmit unknown send."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations",
            "/videos",
            "/videos/generations"
          ],
          "operation_modes": [
            "text_to_video",
            "image_to_video"
          ],
          "output": {
            "family": "video",
            "format": "mp4",
            "max_outputs": 4,
            "result": "all actual owned validated complete MP4 outputs"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio",
              "quoted_unit": "per video second"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.16",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.16",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio; resolución: 720p",
              "quoted_unit": "per video second"
            },
            "label": "Precio del vídeo",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio_720p",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "The displayed rate estimates the cost before generation. The final charge is calculated from the cost recorded for the original generation. Physical video duration is not the billable quantity.",
            "dimensions": {
              "forecast_quantity": "Requested configuration; estimate only.",
              "generate_audio": false,
              "quoted_unit": "per output video second",
              "resolution": "720p"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.06",
                "amount_unit": "usd_per_exact_physical_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio_720p",
                "label": "Estimated output video second",
                "native_amount_usd_per_unit": "0.06",
                "native_quantity": 1,
                "public_unit_label": "per output video second",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_video_second"
              }
            ]
          },
          {
            "basis": "Esta estimación no es un cargo adicional ni una tarifa fija para la generación completada.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coste estimado de generación",
            "units": [
              {
                "amount": "0.24",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.24",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"google/veo-3.1-lite\", \"prompt\": \"A cat in a spacesuit walking on the Moon\", \"duration\": 4, \"resolution\": \"720p\", \"aspect_ratio\": \"16:9\", \"generate_audio\": false}')\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_IMAGE_URL:?Set the actual HTTPS URL of your first-frame image}\"\nexport AILOOT_IMAGE_URL\npython3 - <<'PY_REQUEST'\nimport json,os,re\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nimage=os.environ[\"AILOOT_IMAGE_URL\"]\ntry:\n    parsed=urlsplit(image)\n    valid=(image.startswith(\"https://\") and parsed.scheme==\"https\" and bool(parsed.hostname)\n           and parsed.username is None and parsed.password is None and \"#\" not in image\n           and not any(ord(c)<32 or ord(c)==127 for c in image)\n           and re.search(r\"%(?![0-9A-Fa-f]{2})\",image) is None)\nexcept ValueError:\n    valid=False\nif not valid:\n    raise SystemExit(\"Use your actual HTTPS image URL with a hostname, no userinfo and no fragment\")\np={\"model\":\"google/veo-3.1-lite\",\"prompt\":\"The subject makes a slow, natural movement. Keep the opening composition.\",\"duration\":4,\"resolution\":\"720p\",\"aspect_ratio\":\"16:9\",\"generate_audio\":False,\"frame_images\":[{\"type\":\"image_url\",\"image_url\":{\"url\":image},\"frame_type\":\"first_frame\"}]}\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False),encoding=\"utf-8\")\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nr=json.loads(Path(\"result.json\").read_text())\nprint(json.dumps(r,ensure_ascii=False,indent=2))\nprint(\"Keep the complete JSON, headers and original returned id. Use the existing GET status tab for that original operation, then save every completed owned output. Never resubmit an unknown generation.\")\nPY_RESULT\n",
            "label": "curl · animate your first frame",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}\"\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_OPERATION_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/videos/$operation_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o status.json\npython3 - <<'PY_STATUS'\nimport json\nfrom pathlib import Path\nr=json.loads(Path(\"status.json\").read_text())\nprint(json.dumps(r))\nif r.get(\"status\")==\"completed\":\n    for x in r.get(\"data\",[]):print(x)\nPY_STATUS\n",
            "label": "GET status",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}\"\nexport AILOOT_OPERATION_ID\noperation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_OPERATION_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/videos/$operation_id/content\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o video.mp4\n",
            "label": "GET content",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}\"\nexport AILOOT_STATUS_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\nfrom urllib.parse import urlsplit,urljoin\nf=Path(os.environ[\"AILOOT_STATUS_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose the actual completed status file\")\nr=json.loads(f.read_text())\nif r.get(\"status\")!=\"completed\" or not isinstance(r.get(\"data\"),list) or not r[\"data\"]:raise SystemExit(\"Wait for a completed status with asset paths\")\nurls=[]\nfor x in r[\"data\"]:\n    if not isinstance(x,str) or \"\\n\" in x or \"\\r\" in x:raise SystemExit(\"Invalid asset path\")\n    u=urljoin(\"https://api.ailoot.ai\",x)\n    z=urlsplit(u)\n    if z.scheme!=\"https\" or z.netloc!=\"api.ailoot.ai\" or z.username or z.password:raise SystemExit(\"Use the actual Ailoot asset paths from status\")\n    urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_REQUEST\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" \\\n    -H \"Authorization: Bearer $AILOOT_API_KEY\" -o \"video-${index}.mp4\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "GET all completed assets",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and save returned ID.",
          "Poll original status; retain every completed asset and duration."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Видео",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations",
          "/videos",
          "/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.16",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.16",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: with_audio; resolution: 720p",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_with_audio_720p",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "dimensions": {
              "conditions": "audio: without_audio",
              "quoted_unit": "per video second"
            },
            "label": "Video price",
            "units": [
              {
                "amount": "0.1",
                "amount_unit": "usd_per_video_second",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio",
                "label": "Video price",
                "native_amount_usd_per_unit": "0.1",
                "native_quantity": 1,
                "public_unit_label": "per video second",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_second"
              }
            ]
          },
          {
            "basis": "The displayed rate estimates the cost before generation. The final charge is calculated from the cost recorded for the original generation. Physical video duration is not the billable quantity.",
            "dimensions": {
              "forecast_quantity": "Requested configuration; estimate only.",
              "generate_audio": false,
              "quoted_unit": "per output video second",
              "resolution": "720p"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.06",
                "amount_unit": "usd_per_exact_physical_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "duration_seconds_without_audio_720p",
                "label": "Estimated output video second",
                "native_amount_usd_per_unit": "0.06",
                "native_quantity": 1,
                "public_unit_label": "per output video second",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_video_second"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.24",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.24",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "google/veo-3.1-lite",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.16",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_with_audio",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.16",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.1",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_with_audio_720p",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.1",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.1",
            "amount_unit": "usd_per_video_second",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_without_audio",
            "label": "Video price",
            "native_amount_usd_per_unit": "0.1",
            "native_quantity": 1,
            "public_unit_label": "per video second",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_second"
          },
          {
            "amount": "0.06",
            "amount_unit": "usd_per_exact_physical_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "duration_seconds_without_audio_720p",
            "label": "Estimated output video second",
            "native_amount_usd_per_unit": "0.06",
            "native_quantity": 1,
            "public_unit_label": "per output video second",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_video_second"
          },
          {
            "amount": "0.24",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.24",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "google/veo-3.1-lite",
        "request_model_id": "google/veo-3.1-lite",
        "route_label": "Ultra"
      }
    ],
    "name": "Google: Veo 3.1 Lite",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.24,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.24,
      "varies": false
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "audio": true,
          "native_model_id": "veo-3.1-lite-generate-preview",
          "resolution": "720p"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.10",
            "amount_unit": "usd_per_output_second",
            "conditions": {
              "audio": true,
              "native_model_id": "veo-3.1-lite-generate-preview",
              "resolution": "720p"
            },
            "key": "output_video_audio",
            "label": "output video audio",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "output_second"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "audio": true,
          "native_model_id": "veo-3.1-lite-generate-preview",
          "resolution": "1080p"
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.16",
            "amount_unit": "usd_per_output_second",
            "conditions": {
              "audio": true,
              "native_model_id": "veo-3.1-lite-generate-preview",
              "resolution": "1080p"
            },
            "key": "output_video_audio",
            "label": "output video audio",
            "profile_index": 1,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "output_second"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "no_method_admission_claim": true,
          "scope": "supplier_tariff_reference"
        },
        "dimensions": {},
        "label": "Ailoot Ultra · Tariff components",
        "units": [
          {
            "amount": "0.16",
            "amount_unit": "usd_per_exact_physical_unit",
            "basis": "audio=true Source-only tariff component.",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.16",
            "key": "duration_seconds_with_audio",
            "label": "output second",
            "native_amount_usd_per_unit": "0.16",
            "native_quantity": 1,
            "quantity": 1,
            "side": "out",
            "unit": "output_second"
          },
          {
            "amount": "0.10",
            "amount_unit": "usd_per_exact_physical_unit",
            "basis": "audio=false Source-only tariff component.",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.10",
            "key": "duration_seconds_without_audio",
            "label": "output second",
            "native_amount_usd_per_unit": "0.10",
            "native_quantity": 1,
            "quantity": 1,
            "side": "out",
            "unit": "output_second"
          },
          {
            "amount": "0.10",
            "amount_unit": "usd_per_exact_physical_unit",
            "basis": "resolution=720p · audio=true Source-only tariff component.",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.10",
            "key": "duration_seconds_with_audio_720p",
            "label": "output second",
            "native_amount_usd_per_unit": "0.10",
            "native_quantity": 1,
            "quantity": 1,
            "side": "out",
            "unit": "output_second"
          },
          {
            "amount": "0.06",
            "amount_unit": "usd_per_exact_physical_unit",
            "basis": "resolution=720p · audio=false",
            "billing_original_currency": "USD",
            "billing_original_rate": "0.06",
            "key": "duration_seconds_without_audio_720p",
            "label": "output second",
            "native_amount_usd_per_unit": "0.06",
            "native_quantity": 1,
            "quantity": 1,
            "side": "out",
            "unit": "output_second"
          }
        ]
      }
    ],
    "public_id": "google/veo-3.1-lite",
    "short": "Veo 3.1 Lite genera un vídeo con audio nativo a partir de una descripción textual o una imagen inicial. Su flujo Lite documentado produce un clip, con duraciones de 4, 6 u 8 segundos, encuadre horizontal o vertical y límites específicos distintos de los de Veo 3.1 y Fast."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Veo 3.1 Lite genera un vídeo con audio nativo a partir de una descripción textual o una imagen inicial. Su flujo Lite documentado produce un clip, con duraciones de 4, 6 u 8 segundos, encuadre horizontal o vertical y límites específicos distintos de los de Veo 3.1 y Fast.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "801e57f6f5f75db957a2bea20fa9ba6789c5d6756acfd8b6b1994c91f9431074",
    "renderer_sha256": "b6d488b4bdee68568e5b17d2d4871b2ba1885e1032091b635a7a58ad2ca224e7"
  },
  "sourceRevision": "c2a0d7446c79144bb9d903f42ac227ec025bbd07923e38f7361867ee9f8adab4"
}
