{
  "aboutHtml": "<p>Veo 3.1 Lite est le membre Lite de la gamme de génération vidéo Veo 3 de Google. Il synthétise une vidéo avec audio à partir d’une description en langage naturel ou d’une image d’entrée. La sortie est un clip généré, pas une analyse textuelle d’un enregistrement existant. La fiche Lite du fabricant renvoie à Veo 3 pour l’architecture sous-jacente, les données d’entraînement et les limitations connues, tandis que la documentation propre à Lite définit ses fonctions et limites de génération.</p><p>L’architecture citée utilise la diffusion latente sur des représentations audio temporelles et vidéo spatio-temporelles. Le modèle de base a été entraîné sur de l’audio, des vidéos et des images, avec des légendes de niveaux de détail différents, et des données filtrées et dédupliquées. Cela explique sa finalité de génération conjointe d’image et d’audio. Cela ne divulgue pas un nombre de paramètres propre à Lite ni ne prouve que chaque mouvement généré respecte la réalité physique. Pour une scène pratique, décidez ensemble de l’action visible et du son correspondant.</p><p>La documentation exacte de Lite indique une limite d’entrée textuelle de 1 024 tokens et une vidéo en sortie. La colonne Lite du guide de génération répertorie des durées de 4, 6 et 8 secondes, avec 720p par défaut et 1080p nécessitant un clip de 8 secondes. Le rapport paysage 16:9 est celui par défaut et le portrait 9:16 est également proposé ; la sortie est documentée à 24 images par seconde. L’audio natif est toujours actif dans ce processus. Ces valeurs appartiennent au processus Lite nommé du producteur, pas à une autre édition Veo ni à une réponse d’application mesurée séparément.</p><p>Lite ne prend pas en charge la sortie 4K ni l’extension vidéo. Le tableau des paramètres indique aussi comme indisponibles dans la colonne Lite la fonction multiréférence referenceImages et l’entrée vidéo d’extension. Une image initiale peut établir la première image du clip ; le tableau répertorie une image lastFrame associée à cette image initiale pour une transition. Distinguez cette voie de contrôle des images limites du mélange de plusieurs références de style ou de sujet. Les réglages de génération de personnes du producteur dépendent du mode : le tableau Lite indique allow_all pour texte-vers-vidéo et allow_adult pour image-vers-vidéo et l’interpolation, tandis que des règles régionales peuvent restreindre davantage ce profil documenté. Choisissez une image de départ correspondant à la première scène réellement souhaitée, avec le sujet, le cadrage et les détails visibles préparés avant de demander du mouvement.</p><p>Pour texte-vers-vidéo, décrivez le sujet, son action, l’environnement et le style prévu. Ajoutez la position et le mouvement de caméra, le cadrage, la mise au point et la lumière lorsqu’ils comptent. Une scène produit originale pourrait garder l’objet centré pendant que la caméra s’approche d’un détail de matériau et que la lumière environnante change doucement. Identifiez l’état initial, l’action principale et le dernier instant pour que le court clip exprime une idée cohérente. Une longue suite d’actions sans rapport constitue une autre tâche qu’un plan ciblé.</p><p>Pour image-vers-vidéo, fournissez une image initiale claire et expliquez ce qui doit bouger et ce qui doit rester stable. Précisez séparément le mouvement du sujet et tout mouvement de caméra. Si vous utilisez une contrainte d’image finale, préparez une composition finale compatible et décrivez la transition entre les deux. Examinez le résultat au lieu de supposer que l’identité, la position ou la forme demandées restent identiques tout au long du clip. La fiche citée du modèle reconnaît la cohérence complète dans les scènes complexes et les mouvements complexes comme une difficulté persistante.</p><p>Le guide de rédaction prend en charge des indications explicites de dialogue, d’effets sonores et d’ambiance. Placez les paroles exactes entre guillemets, identifiez la personne qui parle et décrivez les sons en lien avec l’action visible. Un effet sonore et une atmosphère de fond ne doivent pas être confondus avec une réplique. L’anglais est documenté comme pleinement pris en charge pour les prompts, tandis que les autres langues n’ont pas été évaluées dans ce guide. Vérifiez les mots audibles, leur synchronisation et la qualité sonore comme parties du même livrable que la vidéo, au lieu de considérer l’audio comme une transcription garantie fidèle du prompt.</p><p>Le processus du producteur est asynchrone : une requête de génération renvoie une opération, et le résultat terminé est récupéré après que son statut indique la fin. Conservez l’identité de l’opération et examinez le clip renvoyé. Le guide décrit une conservation de deux jours côté producteur et un marquage SynthID ; un livrable conservé doit donc comprendre le résultat téléchargé, le prompt, les images sources et les réglages choisis. Une graine peut améliorer la répétabilité sans garantir le déterminisme. Vérifiez la continuité du sujet, l’action, le cadrage, le son et le point d’arrivée prévu avant d’utiliser le clip dans un montage ; la fin du traitement ne prouve pas à elle seule que les exigences créatives sont remplies.</p>",
  "aboutText": "Veo 3.1 Lite est le membre Lite de la gamme de génération vidéo Veo 3 de Google. Il synthétise une vidéo avec audio à partir d’une description en langage naturel ou d’une image d’entrée. La sortie est un clip généré, pas une analyse textuelle d’un enregistrement existant. La fiche Lite du fabricant renvoie à Veo 3 pour l’architecture sous-jacente, les données d’entraînement et les limitations connues, tandis que la documentation propre à Lite définit ses fonctions et limites de génération.\n\nL’architecture citée utilise la diffusion latente sur des représentations audio temporelles et vidéo spatio-temporelles. Le modèle de base a été entraîné sur de l’audio, des vidéos et des images, avec des légendes de niveaux de détail différents, et des données filtrées et dédupliquées. Cela explique sa finalité de génération conjointe d’image et d’audio. Cela ne divulgue pas un nombre de paramètres propre à Lite ni ne prouve que chaque mouvement généré respecte la réalité physique. Pour une scène pratique, décidez ensemble de l’action visible et du son correspondant.\n\nLa documentation exacte de Lite indique une limite d’entrée textuelle de 1 024 tokens et une vidéo en sortie. La colonne Lite du guide de génération répertorie des durées de 4, 6 et 8 secondes, avec 720p par défaut et 1080p nécessitant un clip de 8 secondes. Le rapport paysage 16:9 est celui par défaut et le portrait 9:16 est également proposé ; la sortie est documentée à 24 images par seconde. L’audio natif est toujours actif dans ce processus. Ces valeurs appartiennent au processus Lite nommé du producteur, pas à une autre édition Veo ni à une réponse d’application mesurée séparément.\n\nLite ne prend pas en charge la sortie 4K ni l’extension vidéo. Le tableau des paramètres indique aussi comme indisponibles dans la colonne Lite la fonction multiréférence referenceImages et l’entrée vidéo d’extension. Une image initiale peut établir la première image du clip ; le tableau répertorie une image lastFrame associée à cette image initiale pour une transition. Distinguez cette voie de contrôle des images limites du mélange de plusieurs références de style ou de sujet. Les réglages de génération de personnes du producteur dépendent du mode : le tableau Lite indique allow_all pour texte-vers-vidéo et allow_adult pour image-vers-vidéo et l’interpolation, tandis que des règles régionales peuvent restreindre davantage ce profil documenté. Choisissez une image de départ correspondant à la première scène réellement souhaitée, avec le sujet, le cadrage et les détails visibles préparés avant de demander du mouvement.\n\nPour texte-vers-vidéo, décrivez le sujet, son action, l’environnement et le style prévu. Ajoutez la position et le mouvement de caméra, le cadrage, la mise au point et la lumière lorsqu’ils comptent. Une scène produit originale pourrait garder l’objet centré pendant que la caméra s’approche d’un détail de matériau et que la lumière environnante change doucement. Identifiez l’état initial, l’action principale et le dernier instant pour que le court clip exprime une idée cohérente. Une longue suite d’actions sans rapport constitue une autre tâche qu’un plan ciblé.\n\nPour image-vers-vidéo, fournissez une image initiale claire et expliquez ce qui doit bouger et ce qui doit rester stable. Précisez séparément le mouvement du sujet et tout mouvement de caméra. Si vous utilisez une contrainte d’image finale, préparez une composition finale compatible et décrivez la transition entre les deux. Examinez le résultat au lieu de supposer que l’identité, la position ou la forme demandées restent identiques tout au long du clip. La fiche citée du modèle reconnaît la cohérence complète dans les scènes complexes et les mouvements complexes comme une difficulté persistante.\n\nLe guide de rédaction prend en charge des indications explicites de dialogue, d’effets sonores et d’ambiance. Placez les paroles exactes entre guillemets, identifiez la personne qui parle et décrivez les sons en lien avec l’action visible. Un effet sonore et une atmosphère de fond ne doivent pas être confondus avec une réplique. L’anglais est documenté comme pleinement pris en charge pour les prompts, tandis que les autres langues n’ont pas été évaluées dans ce guide. Vérifiez les mots audibles, leur synchronisation et la qualité sonore comme parties du même livrable que la vidéo, au lieu de considérer l’audio comme une transcription garantie fidèle du prompt.\n\nLe processus du producteur est asynchrone : une requête de génération renvoie une opération, et le résultat terminé est récupéré après que son statut indique la fin. Conservez l’identité de l’opération et examinez le clip renvoyé. Le guide décrit une conservation de deux jours côté producteur et un marquage SynthID ; un livrable conservé doit donc comprendre le résultat téléchargé, le prompt, les images sources et les réglages choisis. Une graine peut améliorer la répétabilité sans garantir le déterminisme. Vérifiez la continuité du sujet, l’action, le cadrage, le son et le point d’arrivée prévu avant d’utiliser le clip dans un montage ; la fin du traitement ne prouve pas à elle seule que les exigences créatives sont remplies.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "9690a86d9e1e983da4c62119696a7f44e9d9e422816655b32ec97d5bb756d77e",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fr-be",
  "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=\"Fermer\">×</button></div><div class=\"idline\"><span>Google /</span><code>google/veo-3.1-lite</code><button type=\"button\" id=\"copy-id\">Copier l’ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Rubriques de la fiche modèle\"><button type=\"button\" data-card-jump=\"overview\">Premiers pas</button><button type=\"button\" data-card-jump=\"methods\">Entrées et méthodes</button><button type=\"button\" data-card-jump=\"pricing\">Tarifs</button><button type=\"button\" data-card-jump=\"examples\">Exemples</button><button type=\"button\" data-card-jump=\"results\">Résultats</button><button type=\"button\" data-card-jump=\"aliases\">Alias</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Méthodes 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\">Vidéo</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\">Premiers pas</h3><p class=\"mdesc-full\">Transformez la description d’une scène en une vidéo de 4, 6 ou 8 secondes en 720p.</p><ul class=\"card-best-for\"><li>Montrez un produit en mouvement</li><li>Créez une scène qui situe l’action</li><li>Essayez un bref mouvement de caméra</li></ul><dl class=\"card-io\" data-card-io><div><dt>Entrées acceptées</dt><dd>Texte · Images</dd></div><div><dt>Résultats</dt><dd>Vidéo</dd></div></dl><details class=\"card-about\"><summary>À propos du modèle</summary><p class=\"note-s\" data-model-method-boundary>Cette description présente les capacités du modèle. Les entrées, sorties et options disponibles dans Ailoot pour la méthode sélectionnée figurent ci-dessous.</p><div class=\"mabout\" id=\"m-about\"><p>Veo 3.1 Lite est le membre Lite de la gamme de génération vidéo Veo 3 de Google. Il synthétise une vidéo avec audio à partir d’une description en langage naturel ou d’une image d’entrée. La sortie est un clip généré, pas une analyse textuelle d’un enregistrement existant. La fiche Lite du fabricant renvoie à Veo 3 pour l’architecture sous-jacente, les données d’entraînement et les limitations connues, tandis que la documentation propre à Lite définit ses fonctions et limites de génération.</p><p>L’architecture citée utilise la diffusion latente sur des représentations audio temporelles et vidéo spatio-temporelles. Le modèle de base a été entraîné sur de l’audio, des vidéos et des images, avec des légendes de niveaux de détail différents, et des données filtrées et dédupliquées. Cela explique sa finalité de génération conjointe d’image et d’audio. Cela ne divulgue pas un nombre de paramètres propre à Lite ni ne prouve que chaque mouvement généré respecte la réalité physique. Pour une scène pratique, décidez ensemble de l’action visible et du son correspondant.</p><p>La documentation exacte de Lite indique une limite d’entrée textuelle de 1 024 tokens et une vidéo en sortie. La colonne Lite du guide de génération répertorie des durées de 4, 6 et 8 secondes, avec 720p par défaut et 1080p nécessitant un clip de 8 secondes. Le rapport paysage 16:9 est celui par défaut et le portrait 9:16 est également proposé ; la sortie est documentée à 24 images par seconde. L’audio natif est toujours actif dans ce processus. Ces valeurs appartiennent au processus Lite nommé du producteur, pas à une autre édition Veo ni à une réponse d’application mesurée séparément.</p><p>Lite ne prend pas en charge la sortie 4K ni l’extension vidéo. Le tableau des paramètres indique aussi comme indisponibles dans la colonne Lite la fonction multiréférence referenceImages et l’entrée vidéo d’extension. Une image initiale peut établir la première image du clip ; le tableau répertorie une image lastFrame associée à cette image initiale pour une transition. Distinguez cette voie de contrôle des images limites du mélange de plusieurs références de style ou de sujet. Les réglages de génération de personnes du producteur dépendent du mode : le tableau Lite indique allow_all pour texte-vers-vidéo et allow_adult pour image-vers-vidéo et l’interpolation, tandis que des règles régionales peuvent restreindre davantage ce profil documenté. Choisissez une image de départ correspondant à la première scène réellement souhaitée, avec le sujet, le cadrage et les détails visibles préparés avant de demander du mouvement.</p><p>Pour texte-vers-vidéo, décrivez le sujet, son action, l’environnement et le style prévu. Ajoutez la position et le mouvement de caméra, le cadrage, la mise au point et la lumière lorsqu’ils comptent. Une scène produit originale pourrait garder l’objet centré pendant que la caméra s’approche d’un détail de matériau et que la lumière environnante change doucement. Identifiez l’état initial, l’action principale et le dernier instant pour que le court clip exprime une idée cohérente. Une longue suite d’actions sans rapport constitue une autre tâche qu’un plan ciblé.</p><p>Pour image-vers-vidéo, fournissez une image initiale claire et expliquez ce qui doit bouger et ce qui doit rester stable. Précisez séparément le mouvement du sujet et tout mouvement de caméra. Si vous utilisez une contrainte d’image finale, préparez une composition finale compatible et décrivez la transition entre les deux. Examinez le résultat au lieu de supposer que l’identité, la position ou la forme demandées restent identiques tout au long du clip. La fiche citée du modèle reconnaît la cohérence complète dans les scènes complexes et les mouvements complexes comme une difficulté persistante.</p><p>Le guide de rédaction prend en charge des indications explicites de dialogue, d’effets sonores et d’ambiance. Placez les paroles exactes entre guillemets, identifiez la personne qui parle et décrivez les sons en lien avec l’action visible. Un effet sonore et une atmosphère de fond ne doivent pas être confondus avec une réplique. L’anglais est documenté comme pleinement pris en charge pour les prompts, tandis que les autres langues n’ont pas été évaluées dans ce guide. Vérifiez les mots audibles, leur synchronisation et la qualité sonore comme parties du même livrable que la vidéo, au lieu de considérer l’audio comme une transcription garantie fidèle du prompt.</p><p>Le processus du producteur est asynchrone : une requête de génération renvoie une opération, et le résultat terminé est récupéré après que son statut indique la fin. Conservez l’identité de l’opération et examinez le clip renvoyé. Le guide décrit une conservation de deux jours côté producteur et un marquage SynthID ; un livrable conservé doit donc comprendre le résultat téléchargé, le prompt, les images sources et les réglages choisis. Une graine peut améliorer la répétabilité sans garantir le déterminisme. Vérifiez la continuité du sujet, l’action, le cadrage, le son et le point d’arrivée prévu avant d’utiliser le clip dans un montage ; la fin du traitement ne prouve pas à elle seule que les exigences créatives sont remplies.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Disponible dans Ailoot · entrées et méthodes</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Vidéo</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Entrée</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Sortie</dt><dd><code>video</code></dd></div><div><dt>Format de sortie</dt><dd>mp4</dd></div><div><dt>Nombre de sorties</dt><dd>Jusqu’à 4 sorties</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Champ</th><th>Type</th><th>Exigence</th><th>Valeurs et limites</th><th>Par défaut</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>google/veo-3.1-lite</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Longueur minimale: 1</div><div>Nombre maximal d’octets: 10 000</div><div>Unité: octets UTF8</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>4, 6, 8</div><div>Unité: secondes</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>720p</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>16:9, 9:16</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">generate_audio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>false</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">frame_images</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>array</code></td><td data-cell-label=\"Exigence\"><span class=\"card-cell-label\">Exigence</span>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Conditions: Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {&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;} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=&quot;720p&quot;,aspect_ratio=&quot;16:9&quot;,generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.</div></td><td data-cell-label=\"Par défaut\" data-default=\"unspecified\"><span class=\"card-cell-label\">Par défaut</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinaisons d’éléments d’entrée</summary><p class=\"note-s\"><b>Texte vers vidéo</b> · Obligatoire : prompt</p><p class=\"note-s\"><b>Image vers vidéo</b> · Obligatoire : prompt, frame_images</p></details><details class=\"note-s\" data-method-contract><summary>Paramètres et cycle de vie de la méthode</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Paramètre</th><th>Contrat</th></tr></thead><tbody><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>content_type</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>application/json</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>required</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>model, prompt, duration, resolution, aspect_ratio, generate_audio</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>other_options</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>false</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>resolution</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>720p</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>prompt_max_bytes</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>10000</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>duration</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>4, 6, 8</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>aspect_ratio</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>16:9, 9:16</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>generate_audio</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>false</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>material_types</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>text, image</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>parameters</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</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;octets 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;secondes&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;Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {\\&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;} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=\\&quot;720p\\&quot;,aspect_ratio=\\&quot;16:9\\&quot;,generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.&quot;}</td></tr></tbody></table></div><p>Alias de méthode : <code>/v1/videos/generations</code>, <code>/videos</code>, <code>/videos/generations</code></p><p>Cycle de vie : <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\">Créez une seule fois et enregistrez l’ID renvoyé.</p><p class=\"note-s\">Interrogez périodiquement l’état d’origine ; conservez chaque ressource terminée et sa durée.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarifs</h3><div class=\"card-result-process\" data-billing-basis><h5>Calcul du coût final</h5><p class=\"note-s\">Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Les tarifs n’ajoutent pas d’options de requête. Les paramètres pris en charge figurent dans la méthode sélectionnée.</p><dl data-price-conditions><dt>Mode rapide</dt><dd>Non précisé <span class=\"note-s\">Lorsque le mode rapide est sélectionné</span></dd><dt>Mode Flex</dt><dd>Non précisé <span class=\"note-s\">Lorsque le mode flex est sélectionné</span></dd><dt>Effort de raisonnement maximal</dt><dd>Non précisé <span class=\"note-s\">Lorsque l’effort de raisonnement maximal utilise l’ajustement par défaut (default)</span></dd></dl></div><div data-declared-tariff-pricing><h4>Tarifs estimés à des fins de comparaison</h4><h4>Prix par configuration</h4><p class=\"note-s\">Associez chaque coût aux conditions indiquées. Utilisez un seul tarif pour chaque ensemble de configurations alternatives.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuration</th><th>Barème tarifaire</th><th>Quantité prévisionnelle</th><th>Générer de l’audio</th><th>Résolution</th><th>Unité de facturation</th><th>Conditions de facturation</th><th>Coût</th></tr></thead><tbody><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarifs de base des jetons</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>Tarif de base</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>—</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>—</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>—</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Entrée · Tokens en entrée · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Sortie · Tokens en sortie · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Lecture du cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Écriture dans le cache · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrée · Écriture dans le cache, 1 h · Estimation à des fins de comparaison uniquement</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>—</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par seconde de vidéo</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : with_audio</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo · Estimation à des fins de comparaison uniquement</span> <b>$0.16</b> <span class=\"price-unit\">par seconde de vidéo</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>—</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par seconde de vidéo</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : with_audio ; résolution : 720p</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo · Estimation à des fins de comparaison uniquement</span> <b>$0.1</b> <span class=\"price-unit\">par seconde de vidéo</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>—</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>—</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par seconde de vidéo</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : without_audio</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo · Estimation à des fins de comparaison uniquement</span> <b>$0.1</b> <span class=\"price-unit\">par seconde de vidéo</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Ultra</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>Configuration demandée ; estimation uniquement.</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>Sans audio</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>720p</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par seconde de vidéo en sortie</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>—</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Seconde estimée de vidéo en sortie · Estimation à des fins de comparaison uniquement</span> <b>$0.06</b> <span class=\"price-unit\">par seconde de vidéo en sortie</span></div><p class=\"note-s\">Le tarif affiché estime le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée physique de la vidéo ne constitue pas la quantité facturable.</p></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Coût estimé de la génération</th><td data-cell-label=\"Barème tarifaire\"><span class=\"card-cell-label\">Barème tarifaire</span>—</td><td data-cell-label=\"Quantité prévisionnelle\"><span class=\"card-cell-label\">Quantité prévisionnelle</span>Estimation pour une génération</td><td data-cell-label=\"Générer de l’audio\"><span class=\"card-cell-label\">Générer de l’audio</span>—</td><td data-cell-label=\"Résolution\"><span class=\"card-cell-label\">Résolution</span>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>—</td><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>—</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Coût estimé de génération · Estimation à des fins de comparaison uniquement</span> <b>$0.24</b> <span class=\"price-unit\">estimation avant génération</span></div><p class=\"note-s\">Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot réserve un montant estimé avant une requête. Après le résultat, le montant final est débité selon l’utilisation mesurée. Pour le streaming, le montant final à débiter est calculé à partir du relevé final d’utilisation. <a href=\"/docs/fr-be/billing/reserve/\">Fonctionnement de la réservation et du débit →</a></p><div data-declared-reference-pricing><h4>Détails du tarif de référence</h4><p class=\"note-s\">Les barèmes de référence du modèle ne modifient ni la sélection de méthode, ni les devis, ni les coûts. Les frais actifs utilisent les tarifs de la méthode Ailoot sélectionnée.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Références tarifaires des configurations vidéo</summary><h4>Prix par configuration</h4><p class=\"note-s\">Associez chaque coût aux conditions indiquées. Utilisez un seul tarif pour chaque ensemble de configurations alternatives.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuration</th><th>Conditions de facturation</th><th>Coût</th></tr></thead><tbody><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : with_audio</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo</span> <b>$0.16</b> <span class=\"price-unit\">par seconde de vidéo</span></div><p class=\"note-s\">Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.</p></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : without_audio</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo</span> <b>$0.1</b> <span class=\"price-unit\">par seconde de vidéo</span></div><p class=\"note-s\">Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.</p></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : with_audio ; résolution : 720p</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo</span> <b>$0.1</b> <span class=\"price-unit\">par seconde de vidéo</span></div><p class=\"note-s\">Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.</p></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Tarif vidéo</th><td data-cell-label=\"Conditions de facturation\"><span class=\"card-cell-label\">Conditions de facturation</span>audio : without_audio ; résolution : 720p</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Tarif vidéo</span> <b>$0.06</b> <span class=\"price-unit\">par seconde de vidéo</span></div><p class=\"note-s\">Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exemples de requêtes</h3><h4>Ailoot Ultra · Vidéo</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><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 · animer votre première image</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><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\">Recevoir et enregistrer les résultats</h3><h4>Ailoot Ultra · Vidéo</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>Vérifier l’état de la tâche</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><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\">GET état</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><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>Enregistrer toutes les ressources terminées</h5><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><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\">GET toutes les ressources terminées</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><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>Autres lectures de contenu</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes du code\"><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\">GET contenu</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copier le code\"><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>Conserver tous les résultats terminés</h5><p class=\"note-s\">Enregistrez chaque vidéo terminée ou fichier renvoyé ; récupérez chaque URL de ressource effectivement renvoyée.</p><p class=\"note-s\">Une fois la tâche terminée, data[] contient toutes les URL de contenu signées dont vous êtes propriétaire. Récupérez chaque URL renvoyée, ou utilisez le point de terminaison de contenu avec index défini sur un index de sortie réel. Une tâche d’origine échouée peut renvoyer charge_pending_check ; vérifiez cette tâche d’origine au lieu de la créer à nouveau. Une piste audio AAC valide peut être présente même avec generate_audio=false ; conservez le MP4 d’origine complet, y compris cette piste audio.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Si la réponse d’origine doit être vérifiée</h5><p class=\"note-s\">Consultez la tâche d’origine existante ; ne soumettez jamais de nouveau un envoi dont l’issue est inconnue.</p></div><p class=\"note-s\">Nombre maximal de sorties : 4.</p><details class=\"card-about\" data-output-fields><summary>Champs de la réponse</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Champ</th><th>Type</th><th>Signification</th></tr></thead><tbody><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">object</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">status</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">data[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>signed content URL</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">charge_pending_check</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>boolean</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">error.code</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">error.message</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>—</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">operation_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>Réponse HTTP503 result_pending_check de l’état ou du contenu d’origine : le même ID vidéo public d’origine est renvoyé dans id.</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">error.type</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td><td data-cell-label=\"Signification\"><span class=\"card-cell-label\">Signification</span>server_error en cas de HTTP503 result_pending_check.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Erreurs et étapes suivantes</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Réponse</th><th>Condition</th><th>Étape suivante</th></tr></thead><tbody><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Champs obligatoires, représentation des contenus ou valeur de paramètre non valides</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Corrigez les champs indiqués avant une nouvelle requête de création.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>409 · <code>video_not_ready</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Le contenu du résultat d’origine n’est pas encore disponible</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Interrogez périodiquement l’ID d’origine renvoyé et respectez Retry-After.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span><code>server_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>GET de l’état ou du contenu d’origine : la tâche n’est pas publiée, la tâche d’origine n’est ni failed, ni cancelled, ni expired, et l’état local est unknown ou l’état de la tâche d’origine est completed.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Conservez id et operation_id d’origine, qui correspondent au même ID vidéo public, ainsi que la réponse et les en-têtes ; consultez uniquement l’état ou le contenu d’origine. Ne soumettez jamais de nouvelle requête de génération.</td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>422 · <code>price_unavailable</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>L’analyse d’un objet frame_images fourni ou de son profil conditionnel échoue, ou le profil entièrement analysé ne dispose d’aucune fiche tarifaire exacte prête à l’emploi.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span>Conservez model, prompt, duration, resolution, aspect_ratio et generate_audio. Ajoutez frame_images contenant exactement un élément first_frame au format d’objet précisé. Définissez duration=4, resolution=&quot;720p&quot;, aspect_ratio=&quot;16:9&quot; et generate_audio=false. Cette validation s’exécute avant l’envoi de la requête.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Alias</h3><h4>Alias du modèle</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 des chemins de méthode</h4><p class=\"note-s\"><code>/v1/videos/generations</code>, <code>/videos</code>, <code>/videos/generations</code></p><h4>ID d’appel associés</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": "Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.",
          "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": "Champs obligatoires, représentation des contenus ou valeur de paramètre non valides",
                "http_status": 400,
                "recovery": "Corrigez les champs indiqués avant une nouvelle requête de création.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Le contenu du résultat d’origine n’est pas encore disponible",
                "http_status": 409,
                "recovery": "Interrogez périodiquement l’ID d’origine renvoyé et respectez Retry-After.",
                "type": "video_not_ready"
              },
              {
                "code": null,
                "condition": "La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification",
                "http_status": null,
                "recovery": "Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.",
                "type": "server_error"
              },
              {
                "absent_fields": [
                  "status",
                  "object",
                  "model",
                  "data"
                ],
                "code": "result_pending_check",
                "condition": "GET de l’état ou du contenu d’origine : la tâche n’est pas publiée, la tâche d’origine n’est ni failed, ni cancelled, ni expired, et l’état local est unknown ou l’état de la tâche d’origine est 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": "Conservez id et operation_id d’origine, qui correspondent au même ID vidéo public, ainsi que la réponse et les en-têtes ; consultez uniquement l’état ou le contenu d’origine. Ne soumettez jamais de nouvelle requête de génération.",
                "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": "L’analyse d’un objet frame_images fourni ou de son profil conditionnel échoue, ou le profil entièrement analysé ne dispose d’aucune fiche tarifaire exacte prête à l’emploi.",
                "http_status": 422,
                "message": "The complete video request cannot be priced",
                "recovery": "Conservez model, prompt, duration, resolution, aspect_ratio et generate_audio. Ajoutez frame_images contenant exactement un élément first_frame au format d’objet précisé. Définissez duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" et generate_audio=false. Cette validation s’exécute avant l’envoi de la requête.",
                "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": "Consultez la tâche d’origine existante ; ne soumettez jamais de nouveau un envoi dont l’issue est inconnue.",
              "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": "Une fois la tâche terminée, data[] contient toutes les URL de contenu signées dont vous êtes propriétaire. Récupérez chaque URL renvoyée, ou utilisez le point de terminaison de contenu avec index défini sur un index de sortie réel. Une tâche d’origine échouée peut renvoyer charge_pending_check ; vérifiez cette tâche d’origine au lieu de la créer à nouveau. Une piste audio AAC valide peut être présente même avec generate_audio=false ; conservez le MP4 d’origine complet, y compris cette piste 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": "Réponse HTTP503 result_pending_check de l’état ou du contenu d’origine : le même ID vidéo public d’origine est renvoyé dans id.",
                  "name": "operation_id",
                  "type": "string"
                },
                {
                  "description": "server_error en cas de 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": "octets UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              },
              {
                "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": "Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.",
                "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": [
            "Créez une seule fois et enregistrez l’ID renvoyé.",
            "Interrogez périodiquement l’état d’origine ; conservez chaque ressource terminée et sa durée."
          ],
          "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": "octets UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              },
              {
                "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": "Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.",
                "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": "Tarif vidéo",
            "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 ; résolution : 720p",
              "quoted_unit": "per video second"
            },
            "label": "Tarif vidéo",
            "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": "Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coût estimé de la génération",
            "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": "8f528ab92c9a74c9324256fb7b0af3ade2929751322b35c5c56f9fc04810ea60",
    "input_html_sha256": "315e031d46f414d3bcd7f8063c057e3a0ab7ec72ff07ea05ea2a76ec371b134c",
    "private_audit_sha256": "a19242b499cd7497722a930948460c9bdd79c13b271a846bb2ee7e7e0209da3c",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fr-be/google-veo-3-1-lite/",
    "description": "Veo 3.1 Lite génère une vidéo avec audio natif à partir d’une description textuelle ou d’une image initiale. Son processus Lite documenté produit un clip de 4, 6 ou 8 secondes, au format paysage ou portrait, avec des limites propres qui diffèrent de Veo 3.1 et de Fast.",
    "locale": "fr-be",
    "md_url": "https://ailoot.ai/models/fr-be/google-veo-3-1-lite/index.md",
    "title": "Google: Veo 3.1 Lite — Ailoot",
    "url": "https://ailoot.ai/models/fr-be/google-veo-3-1-lite/"
  },
  "rawModel": {
    "about": "Veo 3.1 Lite est le membre Lite de la gamme de génération vidéo Veo 3 de Google. Il synthétise une vidéo avec audio à partir d’une description en langage naturel ou d’une image d’entrée. La sortie est un clip généré, pas une analyse textuelle d’un enregistrement existant. La fiche Lite du fabricant renvoie à Veo 3 pour l’architecture sous-jacente, les données d’entraînement et les limitations connues, tandis que la documentation propre à Lite définit ses fonctions et limites de génération.\n\nL’architecture citée utilise la diffusion latente sur des représentations audio temporelles et vidéo spatio-temporelles. Le modèle de base a été entraîné sur de l’audio, des vidéos et des images, avec des légendes de niveaux de détail différents, et des données filtrées et dédupliquées. Cela explique sa finalité de génération conjointe d’image et d’audio. Cela ne divulgue pas un nombre de paramètres propre à Lite ni ne prouve que chaque mouvement généré respecte la réalité physique. Pour une scène pratique, décidez ensemble de l’action visible et du son correspondant.\n\nLa documentation exacte de Lite indique une limite d’entrée textuelle de 1 024 tokens et une vidéo en sortie. La colonne Lite du guide de génération répertorie des durées de 4, 6 et 8 secondes, avec 720p par défaut et 1080p nécessitant un clip de 8 secondes. Le rapport paysage 16:9 est celui par défaut et le portrait 9:16 est également proposé ; la sortie est documentée à 24 images par seconde. L’audio natif est toujours actif dans ce processus. Ces valeurs appartiennent au processus Lite nommé du producteur, pas à une autre édition Veo ni à une réponse d’application mesurée séparément.\n\nLite ne prend pas en charge la sortie 4K ni l’extension vidéo. Le tableau des paramètres indique aussi comme indisponibles dans la colonne Lite la fonction multiréférence referenceImages et l’entrée vidéo d’extension. Une image initiale peut établir la première image du clip ; le tableau répertorie une image lastFrame associée à cette image initiale pour une transition. Distinguez cette voie de contrôle des images limites du mélange de plusieurs références de style ou de sujet. Les réglages de génération de personnes du producteur dépendent du mode : le tableau Lite indique allow_all pour texte-vers-vidéo et allow_adult pour image-vers-vidéo et l’interpolation, tandis que des règles régionales peuvent restreindre davantage ce profil documenté. Choisissez une image de départ correspondant à la première scène réellement souhaitée, avec le sujet, le cadrage et les détails visibles préparés avant de demander du mouvement.\n\nPour texte-vers-vidéo, décrivez le sujet, son action, l’environnement et le style prévu. Ajoutez la position et le mouvement de caméra, le cadrage, la mise au point et la lumière lorsqu’ils comptent. Une scène produit originale pourrait garder l’objet centré pendant que la caméra s’approche d’un détail de matériau et que la lumière environnante change doucement. Identifiez l’état initial, l’action principale et le dernier instant pour que le court clip exprime une idée cohérente. Une longue suite d’actions sans rapport constitue une autre tâche qu’un plan ciblé.\n\nPour image-vers-vidéo, fournissez une image initiale claire et expliquez ce qui doit bouger et ce qui doit rester stable. Précisez séparément le mouvement du sujet et tout mouvement de caméra. Si vous utilisez une contrainte d’image finale, préparez une composition finale compatible et décrivez la transition entre les deux. Examinez le résultat au lieu de supposer que l’identité, la position ou la forme demandées restent identiques tout au long du clip. La fiche citée du modèle reconnaît la cohérence complète dans les scènes complexes et les mouvements complexes comme une difficulté persistante.\n\nLe guide de rédaction prend en charge des indications explicites de dialogue, d’effets sonores et d’ambiance. Placez les paroles exactes entre guillemets, identifiez la personne qui parle et décrivez les sons en lien avec l’action visible. Un effet sonore et une atmosphère de fond ne doivent pas être confondus avec une réplique. L’anglais est documenté comme pleinement pris en charge pour les prompts, tandis que les autres langues n’ont pas été évaluées dans ce guide. Vérifiez les mots audibles, leur synchronisation et la qualité sonore comme parties du même livrable que la vidéo, au lieu de considérer l’audio comme une transcription garantie fidèle du prompt.\n\nLe processus du producteur est asynchrone : une requête de génération renvoie une opération, et le résultat terminé est récupéré après que son statut indique la fin. Conservez l’identité de l’opération et examinez le clip renvoyé. Le guide décrit une conservation de deux jours côté producteur et un marquage SynthID ; un livrable conservé doit donc comprendre le résultat téléchargé, le prompt, les images sources et les réglages choisis. Une graine peut améliorer la répétabilité sans garantir le déterminisme. Vérifiez la continuité du sujet, l’action, le cadrage, le son et le point d’arrivée prévu avant d’utiliser le clip dans un montage ; la fin du traitement ne prouve pas à elle seule que les exigences créatives sont remplies.",
    "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": "La tarification complète de la configuration figure dans les détails."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "0cef71ecc22628ae52e06dd5",
        "label": "Références tarifaires des configurations vidéo",
        "profiles": [
          {
            "basis": "Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.",
            "dimensions": {
              "conditions": "audio : with_audio"
            },
            "label": "Tarif vidéo",
            "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": "Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.",
            "dimensions": {
              "conditions": "audio : without_audio"
            },
            "label": "Tarif vidéo",
            "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": "Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.",
            "dimensions": {
              "conditions": "audio : with_audio ; résolution : 720p"
            },
            "label": "Tarif vidéo",
            "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": "Tarif publié de référence pour la configuration affichée. Les frais définitifs correspondent à la configuration réellement facturée.",
            "dimensions": {
              "conditions": "audio : without_audio ; résolution : 720p"
            },
            "label": "Tarif vidéo",
            "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": "Les tarifs affichés servent à estimer le coût avant la génération. Le montant final est calculé à partir du coût enregistré pour la génération d’origine. La durée mesurée du résultat et les quantités prévisionnelles ne constituent pas la quantité finale facturable.",
          "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": "Champs obligatoires, représentation des contenus ou valeur de paramètre non valides",
                "http_status": 400,
                "recovery": "Corrigez les champs indiqués avant une nouvelle requête de création.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Le contenu du résultat d’origine n’est pas encore disponible",
                "http_status": 409,
                "recovery": "Interrogez périodiquement l’ID d’origine renvoyé et respectez Retry-After.",
                "type": "video_not_ready"
              },
              {
                "code": null,
                "condition": "La réponse renvoyée indique que l’opération ou le résultat nécessite une vérification",
                "http_status": null,
                "recovery": "Conservez l’identifiant d’opération/de tâche initialement renvoyé, les en-têtes de la requête et la réponse ; poursuivez les lectures prises en charge de cette opération d’origine. Ne soumettez pas à nouveau la requête de création.",
                "type": "server_error"
              },
              {
                "absent_fields": [
                  "status",
                  "object",
                  "model",
                  "data"
                ],
                "code": "result_pending_check",
                "condition": "GET de l’état ou du contenu d’origine : la tâche n’est pas publiée, la tâche d’origine n’est ni failed, ni cancelled, ni expired, et l’état local est unknown ou l’état de la tâche d’origine est 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": "Conservez id et operation_id d’origine, qui correspondent au même ID vidéo public, ainsi que la réponse et les en-têtes ; consultez uniquement l’état ou le contenu d’origine. Ne soumettez jamais de nouvelle requête de génération.",
                "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": "L’analyse d’un objet frame_images fourni ou de son profil conditionnel échoue, ou le profil entièrement analysé ne dispose d’aucune fiche tarifaire exacte prête à l’emploi.",
                "http_status": 422,
                "message": "The complete video request cannot be priced",
                "recovery": "Conservez model, prompt, duration, resolution, aspect_ratio et generate_audio. Ajoutez frame_images contenant exactement un élément first_frame au format d’objet précisé. Définissez duration=4, resolution=\"720p\", aspect_ratio=\"16:9\" et generate_audio=false. Cette validation s’exécute avant l’envoi de la requête.",
                "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": "Consultez la tâche d’origine existante ; ne soumettez jamais de nouveau un envoi dont l’issue est inconnue.",
              "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": "Une fois la tâche terminée, data[] contient toutes les URL de contenu signées dont vous êtes propriétaire. Récupérez chaque URL renvoyée, ou utilisez le point de terminaison de contenu avec index défini sur un index de sortie réel. Une tâche d’origine échouée peut renvoyer charge_pending_check ; vérifiez cette tâche d’origine au lieu de la créer à nouveau. Une piste audio AAC valide peut être présente même avec generate_audio=false ; conservez le MP4 d’origine complet, y compris cette piste 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": "Réponse HTTP503 result_pending_check de l’état ou du contenu d’origine : le même ID vidéo public d’origine est renvoyé dans id.",
                  "name": "operation_id",
                  "type": "string"
                },
                {
                  "description": "server_error en cas de 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": "octets UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              },
              {
                "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": "Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.",
                "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": [
            "Créez une seule fois et enregistrez l’ID renvoyé.",
            "Interrogez périodiquement l’état d’origine ; conservez chaque ressource terminée et sa durée."
          ],
          "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": "octets UTF8"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  4,
                  6,
                  8
                ],
                "enum_known": true,
                "name": "duration",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              },
              {
                "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": "Omettez ce champ pour text_to_video. Lorsqu’il est présent : exactement un élément {\"type\":\"image_url\",\"image_url\":{\"url\":\"<actual HTTPS URL>\"},\"frame_type\":\"first_frame\"} ; l’élément contient exactement type,image_url,frame_type ; image_url contient exactement url. Aucune clé supplémentaire ou en double. Uniquement duration=4,resolution=\"720p\",aspect_ratio=\"16:9\",generate_audio=false. L’URL doit être analysable avec le schéma https, un nom d’hôte non vide, sans userinfo ni caractère # littéral ; la chaîne de requête signée et le chemin encodé sont conservés. Le code source ne vérifie ni le type MIME d’entrée, ni la taille du fichier, ni les dimensions en pixels.",
                "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": "Tarif vidéo",
            "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 ; résolution : 720p",
              "quoted_unit": "per video second"
            },
            "label": "Tarif vidéo",
            "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": "Cette estimation ne constitue ni des frais supplémentaires ni un tarif fixe pour la génération terminée.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Coût estimé de la génération",
            "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 génère une vidéo avec audio natif à partir d’une description textuelle ou d’une image initiale. Son processus Lite documenté produit un clip de 4, 6 ou 8 secondes, au format paysage ou portrait, avec des limites propres qui diffèrent de Veo 3.1 et de 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 génère une vidéo avec audio natif à partir d’une description textuelle ou d’une image initiale. Son processus Lite documenté produit un clip de 4, 6 ou 8 secondes, au format paysage ou portrait, avec des limites propres qui diffèrent de Veo 3.1 et de Fast.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "4c324d204fc364ad8183ff4773e5be6b4c79360aba97707a84662340e5bc006d",
    "renderer_sha256": "9d578ff8df69ef70403308c9943a1179a11b94114c10b333bf1c012005d4a7f4"
  },
  "sourceRevision": "605e49d91db5cf7eafdff7cf098fc0bb2810ea1cf2e990d0bbaee687ed898fad"
}
