{
  "aboutHtml": "<p>Seedance 1.0 Pro génère une vidéo à partir de texte ou d’une scène guidée par une image. Le sélecteur doubao-seedance-1-0-pro-250528 accepte les deux modes d’entrée : le point de départ peut donc être un concept écrit ou une composition visuelle existante. Utilisez un brief textuel pour créer une nouvelle scène, ou fournissez une image lorsque le sujet, sa disposition et la vue initiale doivent être établis visuellement. Ce profil 1.0 produit une vidéo sans son ; le son synchronisé relève du profil 1.5 Pro décrit séparément.</p><p>Pour la génération texte-vers-vidéo, précisez le sujet, l’environnement, le mouvement, le cadrage et la caméra dans une scène cohérente. L’exemple documenté passe progressivement d’un champ de marguerites à une vue rapprochée d’une fleur dont les pétales portent de la rosée. Cette structure convient à d’autres mises en valeur : présentez le décor, rapprochez-vous du sujet et terminez sur le détail important. Pour un concept de produit, décrivez la matière et l’éclairage ainsi que l’action, et donnez à la caméra un trajet réalisable pendant ce plan court.</p><p>Pour la génération image-vers-vidéo, placez la référence dans un élément de contenu image_url et expliquez ce qui doit changer par rapport à cette vue initiale. Un portrait préparé peut définir la personne et le cadrage, tandis que le brief décrit une légère rotation, des cheveux en mouvement ou un doux recul de caméra. Une photographie de produit peut établir l’objet et l’arrière-plan, tandis que le prompt demande une mise en valeur contrôlée. Gardez le mouvement demandé compatible avec la composition source ; l’image d’une face d’un objet ne fournit pas une vue exacte de toutes les autres faces non visibles.</p><p>Le champ image accepte une URL accessible ou une URL de données contenant des données d’image Base64. Les formats documentés sont JPEG, PNG, WEBP, BMP, TIFF et GIF. Les images doivent peser moins de 30 MB, avec un rapport largeur/hauteur strictement compris entre 0,4 et 2,5 et chaque dimension strictement comprise entre 300 et 6 000 pixels. Préparez une source nette avec le cadrage voulu plutôt que de vous appuyer sur une miniature dont les détails distinctifs manquent déjà. Pour la génération image-vers-vidéo, le guide recommande un cadrage adaptatif qui suit les proportions de la référence.</p><p>La durée documentée pour la version 1.0 va de deux à douze secondes, avec une cadence de 24 fps. Les réglages de sortie comprennent les niveaux 480p, 720p et 1080p, avec 1080p comme valeur par défaut de Pro ; le guide exclut 1080p dans le cas d’une image de référence. Les cadrages fixes comprennent 16:9, 4:3, 1:1, 3:4, 9:16 et 21:9. Choisissez une combinaison compatible avec les images pour un plan guidé par une image, au lieu de reprendre tous les réglages texte-vers-vidéo tels quels. Vérifiez le cadrage réellement renvoyé avant d’intégrer le clip dans une mise en page.</p><p>Les réglages de graine aléatoire et de filigrane sont documentés avec camerafixed. La consigne de caméra fixe n’est pas prise en charge dans le cas d’une image de référence et, lorsqu’elle s’applique, le guide ne garantit pas une caméra parfaitement immobile. Les instructions de paramètres intégrées au prompt prennent le pas sur les champs facultatifs distincts. Gardez un seul réglage faisant autorité pour la durée, la résolution et le rapport d’aspect, et faites concorder la description de caméra avec celui-ci. Cela évite que le brief de scène remplace silencieusement les réglages sélectionnés pour la requête.</p><p>L’utilisation est mesurée en tokens vidéo : largeur de sortie × hauteur de sortie × cadence d’images × durée de sortie / 1024. La tâche achevée rapporte cette quantité dans usage.completion_tokens. Conservez l’utilisation rapportée avec le clip achevé et les réglages demandés.</p><p>Le processus renvoie d’abord un identifiant de tâche, puis l’emplacement de la vidéo achevée après traitement. Conservez l’identifiant pendant la consultation des états en attente ou en cours ; une tâche réussie fournit content.video_url et les informations d’utilisation. La durée documentée de conservation des fichiers générés est de sept jours. Enregistrez le clip achevé, l’image source et le prompt exact comme historique de révision, puis vérifiez l’apparence du sujet, le mouvement, la continuité de l’image et la composition finale sur l’ensemble du résultat.</p>",
  "aboutText": "Seedance 1.0 Pro génère une vidéo à partir de texte ou d’une scène guidée par une image. Le sélecteur doubao-seedance-1-0-pro-250528 accepte les deux modes d’entrée : le point de départ peut donc être un concept écrit ou une composition visuelle existante. Utilisez un brief textuel pour créer une nouvelle scène, ou fournissez une image lorsque le sujet, sa disposition et la vue initiale doivent être établis visuellement. Ce profil 1.0 produit une vidéo sans son ; le son synchronisé relève du profil 1.5 Pro décrit séparément.\n\nPour la génération texte-vers-vidéo, précisez le sujet, l’environnement, le mouvement, le cadrage et la caméra dans une scène cohérente. L’exemple documenté passe progressivement d’un champ de marguerites à une vue rapprochée d’une fleur dont les pétales portent de la rosée. Cette structure convient à d’autres mises en valeur : présentez le décor, rapprochez-vous du sujet et terminez sur le détail important. Pour un concept de produit, décrivez la matière et l’éclairage ainsi que l’action, et donnez à la caméra un trajet réalisable pendant ce plan court.\n\nPour la génération image-vers-vidéo, placez la référence dans un élément de contenu image_url et expliquez ce qui doit changer par rapport à cette vue initiale. Un portrait préparé peut définir la personne et le cadrage, tandis que le brief décrit une légère rotation, des cheveux en mouvement ou un doux recul de caméra. Une photographie de produit peut établir l’objet et l’arrière-plan, tandis que le prompt demande une mise en valeur contrôlée. Gardez le mouvement demandé compatible avec la composition source ; l’image d’une face d’un objet ne fournit pas une vue exacte de toutes les autres faces non visibles.\n\nLe champ image accepte une URL accessible ou une URL de données contenant des données d’image Base64. Les formats documentés sont JPEG, PNG, WEBP, BMP, TIFF et GIF. Les images doivent peser moins de 30 MB, avec un rapport largeur/hauteur strictement compris entre 0,4 et 2,5 et chaque dimension strictement comprise entre 300 et 6 000 pixels. Préparez une source nette avec le cadrage voulu plutôt que de vous appuyer sur une miniature dont les détails distinctifs manquent déjà. Pour la génération image-vers-vidéo, le guide recommande un cadrage adaptatif qui suit les proportions de la référence.\n\nLa durée documentée pour la version 1.0 va de deux à douze secondes, avec une cadence de 24 fps. Les réglages de sortie comprennent les niveaux 480p, 720p et 1080p, avec 1080p comme valeur par défaut de Pro ; le guide exclut 1080p dans le cas d’une image de référence. Les cadrages fixes comprennent 16:9, 4:3, 1:1, 3:4, 9:16 et 21:9. Choisissez une combinaison compatible avec les images pour un plan guidé par une image, au lieu de reprendre tous les réglages texte-vers-vidéo tels quels. Vérifiez le cadrage réellement renvoyé avant d’intégrer le clip dans une mise en page.\n\nLes réglages de graine aléatoire et de filigrane sont documentés avec camerafixed. La consigne de caméra fixe n’est pas prise en charge dans le cas d’une image de référence et, lorsqu’elle s’applique, le guide ne garantit pas une caméra parfaitement immobile. Les instructions de paramètres intégrées au prompt prennent le pas sur les champs facultatifs distincts. Gardez un seul réglage faisant autorité pour la durée, la résolution et le rapport d’aspect, et faites concorder la description de caméra avec celui-ci. Cela évite que le brief de scène remplace silencieusement les réglages sélectionnés pour la requête.\n\nL’utilisation est mesurée en tokens vidéo : largeur de sortie × hauteur de sortie × cadence d’images × durée de sortie / 1024. La tâche achevée rapporte cette quantité dans usage.completion_tokens. Conservez l’utilisation rapportée avec le clip achevé et les réglages demandés.\n\nLe processus renvoie d’abord un identifiant de tâche, puis l’emplacement de la vidéo achevée après traitement. Conservez l’identifiant pendant la consultation des états en attente ou en cours ; une tâche réussie fournit content.video_url et les informations d’utilisation. La durée documentée de conservation des fichiers générés est de sept jours. Enregistrez le clip achevé, l’image source et le prompt exact comme historique de révision, puis vérifiez l’apparence du sujet, le mouvement, la continuité de l’image et la composition finale sur l’ensemble du résultat.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "bd2823058a5a5a994366e190fb5498983e74d92ac47237e91dc40244ceb76f34",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fr",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">ByteDance: Seedance 1.0 Pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Fermer\">×</button></div><div class=\"idline\"><span>ByteDance /</span><code>doubao-seedance-1-0-pro-250528</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|doubao-seedance-1-0-pro-250528\">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\">Seedance 1.0 Pro génère une vidéo sans son à partir de texte ou d’une image initiale. Décrivez l’action et la caméra, ou animez une composition existante, avec une durée de 2 à 12 secondes, 24 fps et des réglages explicites de cadrage et de résolution de sortie.</p><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>Seedance 1.0 Pro génère une vidéo à partir de texte ou d’une scène guidée par une image. Le sélecteur doubao-seedance-1-0-pro-250528 accepte les deux modes d’entrée : le point de départ peut donc être un concept écrit ou une composition visuelle existante. Utilisez un brief textuel pour créer une nouvelle scène, ou fournissez une image lorsque le sujet, sa disposition et la vue initiale doivent être établis visuellement. Ce profil 1.0 produit une vidéo sans son ; le son synchronisé relève du profil 1.5 Pro décrit séparément.</p><p>Pour la génération texte-vers-vidéo, précisez le sujet, l’environnement, le mouvement, le cadrage et la caméra dans une scène cohérente. L’exemple documenté passe progressivement d’un champ de marguerites à une vue rapprochée d’une fleur dont les pétales portent de la rosée. Cette structure convient à d’autres mises en valeur : présentez le décor, rapprochez-vous du sujet et terminez sur le détail important. Pour un concept de produit, décrivez la matière et l’éclairage ainsi que l’action, et donnez à la caméra un trajet réalisable pendant ce plan court.</p><p>Pour la génération image-vers-vidéo, placez la référence dans un élément de contenu image_url et expliquez ce qui doit changer par rapport à cette vue initiale. Un portrait préparé peut définir la personne et le cadrage, tandis que le brief décrit une légère rotation, des cheveux en mouvement ou un doux recul de caméra. Une photographie de produit peut établir l’objet et l’arrière-plan, tandis que le prompt demande une mise en valeur contrôlée. Gardez le mouvement demandé compatible avec la composition source ; l’image d’une face d’un objet ne fournit pas une vue exacte de toutes les autres faces non visibles.</p><p>Le champ image accepte une URL accessible ou une URL de données contenant des données d’image Base64. Les formats documentés sont JPEG, PNG, WEBP, BMP, TIFF et GIF. Les images doivent peser moins de 30 MB, avec un rapport largeur/hauteur strictement compris entre 0,4 et 2,5 et chaque dimension strictement comprise entre 300 et 6 000 pixels. Préparez une source nette avec le cadrage voulu plutôt que de vous appuyer sur une miniature dont les détails distinctifs manquent déjà. Pour la génération image-vers-vidéo, le guide recommande un cadrage adaptatif qui suit les proportions de la référence.</p><p>La durée documentée pour la version 1.0 va de deux à douze secondes, avec une cadence de 24 fps. Les réglages de sortie comprennent les niveaux 480p, 720p et 1080p, avec 1080p comme valeur par défaut de Pro ; le guide exclut 1080p dans le cas d’une image de référence. Les cadrages fixes comprennent 16:9, 4:3, 1:1, 3:4, 9:16 et 21:9. Choisissez une combinaison compatible avec les images pour un plan guidé par une image, au lieu de reprendre tous les réglages texte-vers-vidéo tels quels. Vérifiez le cadrage réellement renvoyé avant d’intégrer le clip dans une mise en page.</p><p>Les réglages de graine aléatoire et de filigrane sont documentés avec camerafixed. La consigne de caméra fixe n’est pas prise en charge dans le cas d’une image de référence et, lorsqu’elle s’applique, le guide ne garantit pas une caméra parfaitement immobile. Les instructions de paramètres intégrées au prompt prennent le pas sur les champs facultatifs distincts. Gardez un seul réglage faisant autorité pour la durée, la résolution et le rapport d’aspect, et faites concorder la description de caméra avec celui-ci. Cela évite que le brief de scène remplace silencieusement les réglages sélectionnés pour la requête.</p><p>L’utilisation est mesurée en tokens vidéo : largeur de sortie × hauteur de sortie × cadence d’images × durée de sortie / 1024. La tâche achevée rapporte cette quantité dans usage.completion_tokens. Conservez l’utilisation rapportée avec le clip achevé et les réglages demandés.</p><p>Le processus renvoie d’abord un identifiant de tâche, puis l’emplacement de la vidéo achevée après traitement. Conservez l’identifiant pendant la consultation des états en attente ou en cours ; une tâche réussie fournit content.video_url et les informations d’utilisation. La durée documentée de conservation des fichiers générés est de sept jours. Enregistrez le clip achevé, l’image source et le prompt exact comme historique de révision, puis vérifiez l’apparence du sujet, le mouvement, la continuité de l’image et la composition finale sur l’ensemble du résultat.</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>Types d’entrée</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Types de sortie</dt><dd><code>video</code></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>doubao-seedance-1-0-pro-250528</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\">content</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>Obligatoire</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Conditions: Objets natifs de texte ou de média ; le tableau externe doit être non vide. Les types des nœuds imbriqués ne sont pas validés par ce constructeur générique Ailoot.</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>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Minimum: 2</div><div>Maximum: 12</div><div>Conditions: Schéma principal 1.x : 2–12 ; une description commune ultérieure indique 4–12 ou -1 pour 1.5. L’exemple utilise 5, valeur documentée dans les deux cas.</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>5</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>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>Conditions: Les valeurs confirmées pour la génération de vidéo à partir de texte sont 480p et 1080p. L’entrée par image de référence exclut 1080p. L’énumération commune 720p contredit la description propre au modèle ; la prise en charge de 720p reste donc indéterminée dans les deux modes.</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>1080p</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\">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>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive</div><div>Conditions: Valeurs par défaut dépendant de la scène ou du modèle ; la documentation de l’entrée image recommande adaptive.</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\">service_tier</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>Facultatif</td><td data-cell-label=\"Valeurs et limites\"><span class=\"card-cell-label\">Valeurs et limites</span><div>default, flex</div><div>Conditions: default=online, flex=offline ; choisissez avant la création.</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>default</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\">seed</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>Minimum: -1</div><div>Maximum: 4 294 967 295</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>-1</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\">camerafixed</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>Conditions: Obligatoire pour Ailoot ; le contrôle de la caméra avec une image de référence est documenté comme non pris en charge et son effet n’est pas garanti.</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>false</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\">watermark</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></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>false</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\">execution_expires_after</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>Minimum: 3 600</div><div>Maximum: 259 200</div><div>Unité: secondes</div></td><td data-cell-label=\"Par défaut\" data-default=\"known\"><span class=\"card-cell-label\">Par défaut</span>172 800</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></b></p><p class=\"note-s\"><b></b></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>camerafixed, content, execution_expires_after, model, seed, watermark</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>optional</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>duration, resolution, ratio, service_tier</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>additional_properties</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>true</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>validation_scope</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>Ailoot vérifie les types des champs obligatoires ainsi qu’un champ model et un tableau content non vides. Les autres champs de requête sont conservés pour le modèle sélectionné.</td></tr><tr><th data-cell-label=\"Paramètre\" scope=\"row\"><span class=\"card-cell-label\">Paramètre</span><code>image_constraints</code></th><td data-cell-label=\"Contrat\"><span class=\"card-cell-label\">Contrat</span>{&quot;formats&quot;:[&quot;jpeg&quot;,&quot;png&quot;,&quot;webp&quot;,&quot;bmp&quot;,&quot;tiff&quot;,&quot;gif&quot;],&quot;aspect_ratio_exclusive&quot;:[0.4,2.5],&quot;dimensions_px_exclusive&quot;:[300,6000],&quot;file_size_mb_exclusive&quot;:30,&quot;mb_bytes_definition&quot;:null}</td></tr></tbody></table></div><p>Alias de méthode : <code>/v1/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 conservez les valeurs publiques id/polling_url renvoyées.</p><p class=\"note-s\">Interrogez la tâche d’origine ; téléchargez le contenu réel content.video_url vous appartenant après succeeded.</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>Unité 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 par jeton</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=\"Unité de facturation\"><span class=\"card-cell-label\">Unité 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>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>—</td><td data-cell-label=\"Unité de facturation\"><span class=\"card-cell-label\">Unité de facturation</span>par 1K tokens vidéo</td><td data-cell-label=\"Coût\"><span class=\"card-cell-label\">Coût</span><div><span>Sortie · Estimation à des fins de comparaison uniquement</span> <b>$0.0044</b> <span class=\"price-unit\">par 1K tokens vidéo</span></div></td></tr><tr><th data-cell-label=\"Configuration\" scope=\"row\"><span class=\"card-cell-label\">Configuration</span>Coût de génération estimé</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=\"Unité de facturation\"><span class=\"card-cell-label\">Unité 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.2112</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/billing/reserve/\">Fonctionnement de la réservation et du débit →</a></p></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-2776-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2776-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · créer une vidéo</button><button class=\"cg-tab\" id=\"model-code-2776-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2776-panel-1\" aria-selected=\"false\" tabindex=\"-1\">curl · lire la tâche d’origine</button><button class=\"cg-tab\" id=\"model-code-2776-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2776-panel-2\" aria-selected=\"false\" tabindex=\"-1\">curl · télécharger votre vidéo</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-2776-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2776-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncat &gt; request.json &lt;&lt;&#39;JSON_REQUEST&#39;\n{&quot;model&quot;:&quot;doubao-seedance-1-0-pro-250528&quot;,&quot;content&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;text&quot;:&quot;女孩抱着狐狸，女孩睁开眼，温柔地看向镜头，狐狸友善地抱着，镜头缓缓拉出，女孩的头发被风吹动&quot;}],&quot;resolution&quot;:&quot;480p&quot;,&quot;ratio&quot;:&quot;1:1&quot;,&quot;duration&quot;:5,&quot;service_tier&quot;:&quot;default&quot;,&quot;seed&quot;:-1,&quot;camerafixed&quot;:false,&quot;watermark&quot;:false,&quot;execution_expires_after&quot;:172800}\nJSON_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-2776-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2776-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_POLL&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(&quot;result.json&quot;).read_text())\ni=r.get(&quot;id&quot;)\nif not isinstance(i,str) or not i.startswith(&quot;native302_&quot;):raise SystemExit(&quot;Keep original response/headers/id; do not resubmit creation.&quot;)\nu=urljoin(&quot;https://api.ailoot.ai&quot;,r.get(&quot;polling_url&quot;) or &quot;/v1/videos/&quot;+quote(i,safe=&quot;&quot;))\np=urlsplit(u)\nif p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/videos/&quot;):raise SystemExit(&quot;Use actual Ailoot lookup path.&quot;)\nPath(&quot;poll-url.txt&quot;).write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error &quot;$(cat poll-url.txt)&quot; -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -D status-headers.txt -o status.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2776-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2776-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nif r.get(&quot;status&quot;)!=&quot;succeeded&quot;:raise SystemExit(&quot;Poll same original job until an owned result is returned.&quot;)\nu=r.get(&quot;content&quot;,{}).get(&quot;video_url&quot;)\nurls=[u] if isinstance(u,str) else u\nif not isinstance(urls,list) or not urls:raise SystemExit(&quot;No completed video URL.&quot;)\nfor u in urls:\n    if not isinstance(u,str):raise SystemExit(&quot;Invalid returned URL.&quot;)\n    p=urlsplit(u)\n    if p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/media/assets/&quot;) or not p.path.endswith(&quot;/content&quot;) or not p.query:raise SystemExit(&quot;Wait for actual Ailoot-owned signed result.&quot;)\nPath(&quot;asset-urls.txt&quot;).write_text(&quot;\\n&quot;.join(urls)+&quot;\\n&quot;)\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error &quot;$asset_url&quot; -o &quot;video-${index}.bin&quot;\n  index=$((index + 1))\ndone &lt; asset-urls.txt\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\">JSON natif avec id/polling_url publics. Après publication, content.video_url contient une ou plusieurs URL signées appartenant à Ailoot ; avant publication, les URL de sortie sélectionnées sont vidées.</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><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\">Conservez chaque URL réelle dans content.video_url ; index doit identifier une sortie réelle renvoyée.</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\">Conservez la réponse, les en-têtes et l’id d’origine, puis interrogez cette opération ; ne soumettez jamais à nouveau une création dont l’issue est inconnue.</p></div><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></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></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">provider_task_id</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">polling_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</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 when supplied</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">content.video_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string|string[]</td></tr><tr><th data-cell-label=\"Champ\" scope=\"row\"><span class=\"card-cell-label\">Champ</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object when supplied</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>JSON/model, types des champs obligatoires ou index de contenu non valides.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span></td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>401 · <code>authentication_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Clé API Ailoot non valide.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span></td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>404 · <code>not_found_error</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Tâche ou sortie absente, ou n’appartenant pas au même utilisateur, à la même clé API ou au même groupe.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span></td></tr><tr><th data-cell-label=\"Réponse\" scope=\"row\"><span class=\"card-cell-label\">Réponse</span>502 · <code>result_pending_check</code></th><td data-cell-label=\"Condition\"><span class=\"card-cell-label\">Condition</span>Soumission ou statut d’origine incomplet ; conservez l’identifiant d’origine, sans soumettre à nouveau.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span></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>Le média, la route ou le règlement d’origine est en cours de vérification ; poursuivez l’opération d’origine.</td><td data-cell-label=\"Étape suivante\"><span class=\"card-cell-label\">Étape suivante</span></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=doubao-seedance-1-0-pro-250528&amp;route=Ultra&amp;caller=doubao-seedance-1-0-pro-250528&amp;fmt=videos\"><code>doubao-seedance-1-0-pro-250528</code></a></span></p><h4>Alias des chemins de méthode</h4><p class=\"note-s\"><code>/v1/videos/generations</code></p><h4>ID d’appel associés</h4><p class=\"note-s\"><a href=\"#m=doubao-seedance-1-0-pro-250528&amp;route=Ultra&amp;caller=doubao-seedance-1-0-pro-250528&amp;fmt=videos\"><code>doubao-seedance-1-0-pro-250528</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "doubao-seedance-1-0-pro-250528",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "doubao-seedance-1-0-pro-250528",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|doubao-seedance-1-0-pro-250528",
      "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": {
            "errors": [
              {
                "condition": "JSON/model, types des champs obligatoires ou index de contenu non valides.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "Clé API Ailoot non valide.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "Tâche ou sortie absente, ou n’appartenant pas au même utilisateur, à la même clé API ou au même groupe.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "Soumission ou statut d’origine incomplet ; conservez l’identifiant d’origine, sans soumettre à nouveau.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "Le média, la route ou le règlement d’origine est en cours de vérification ; poursuivez l’opération d’origine.",
                "http_status": 503,
                "type": "result_pending_check"
              }
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "succeeded"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [
                "failed",
                "expired"
              ],
              "id_source": "Actual returned id or X-Ailoot-Task-Id; provider_task_id is separate. Use returned polling_url.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "queued",
                "running"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "Conservez la réponse, les en-têtes et l’id d’origine, puis interrogez cette opération ; ne soumettez jamais à nouveau une création dont l’issue est inconnue.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ],
              [
                "text",
                "image"
              ]
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only content.video_url is selected for ownership. No owned last-frame/callback result flow is established.",
              "all_results": "Conservez chaque URL réelle dans content.video_url ; index doit identifier une sortie réelle renvoyée.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "status",
                  "type": "string when supplied"
                },
                {
                  "description": null,
                  "name": "content.video_url",
                  "type": "string|string[]"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Configured video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON natif avec id/polling_url publics. Après publication, content.video_url contient une ou plusieurs URL signées appartenant à Ailoot ; avant publication, les URL de sortie sélectionnées sont vidées."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "doubao-seedance-1-0-pro-250528"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Objets natifs de texte ou de média ; le tableau externe doit être non vide. Les types des nœuds imbriqués ne sont pas validés par ce constructeur générique Ailoot.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minItems": 1,
                "name": "content",
                "required": true,
                "type": "array"
              },
              {
                "availability": "source_interface",
                "conditions": "Schéma principal 1.x : 2–12 ; une description commune ultérieure indique 4–12 ou -1 pour 1.5. L’exemple utilise 5, valeur documentée dans les deux cas.",
                "default": 5,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 12,
                "minimum": 2,
                "name": "duration",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "conditions": "Les valeurs confirmées pour la génération de vidéo à partir de texte sont 480p et 1080p. L’entrée par image de référence exclut 1080p. L’énumération commune 720p contredit la description propre au modèle ; la prise en charge de 720p reste donc indéterminée dans les deux modes.",
                "default": "1080p",
                "default_conditions": "1080p is the documented model default for text-to-video. Reference-image input excludes 1080p; its default is not established here.",
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "resolution",
                "required": false,
                "supported_values_by_mode": {
                  "image_to_video": {
                    "confirmed": [
                      "480p"
                    ],
                    "excluded": [
                      "1080p"
                    ],
                    "unresolved": [
                      "720p"
                    ]
                  },
                  "text_to_video": {
                    "confirmed": [
                      "480p",
                      "1080p"
                    ],
                    "unresolved": [
                      "720p"
                    ]
                  }
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Valeurs par défaut dépendant de la scène ou du modèle ; la documentation de l’entrée image recommande adaptive.",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "4:3",
                  "1:1",
                  "3:4",
                  "9:16",
                  "21:9",
                  "adaptive"
                ],
                "enum_known": true,
                "name": "ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "default=online, flex=offline ; choisissez avant la création.",
                "default": "default",
                "default_known": true,
                "enum": [
                  "default",
                  "flex"
                ],
                "enum_known": true,
                "name": "service_tier",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": -1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 4294967295,
                "minimum": -1,
                "name": "seed",
                "required": true,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "conditions": "Obligatoire pour Ailoot ; le contrôle de la caméra avec une image de référence est documenté comme non pris en charge et son effet n’est pas garanti.",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "camerafixed",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "watermark",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "default": 172800,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 259200,
                "minimum": 3600,
                "name": "execution_expires_after",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              }
            ],
            "profile_binding": "Exact model ID and documented Ailoot video interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "camerafixed": {
                  "type": "boolean"
                },
                "content": {
                  "items": {
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "duration": {
                  "maximum": 12,
                  "minimum": 2,
                  "type": "integer"
                },
                "execution_expires_after": {
                  "maximum": 259200,
                  "minimum": 3600,
                  "type": "integer"
                },
                "model": {
                  "const": "doubao-seedance-1-0-pro-250528",
                  "type": "string"
                },
                "ratio": {
                  "enum": [
                    "16:9",
                    "4:3",
                    "1:1",
                    "3:4",
                    "9:16",
                    "21:9",
                    "adaptive"
                  ],
                  "type": "string"
                },
                "resolution": {
                  "description": "Use the explicit resolution supported_values_by_mode conditions: reference-image input excludes 1080p; 720p support is unresolved. No unconditional per-model enum is asserted.",
                  "type": "string"
                },
                "seed": {
                  "maximum": 4294967295,
                  "minimum": -1,
                  "type": "integer"
                },
                "service_tier": {
                  "enum": [
                    "default",
                    "flex"
                  ],
                  "type": "string"
                },
                "watermark": {
                  "type": "boolean"
                }
              },
              "required": [
                "camerafixed",
                "content",
                "execution_expires_after",
                "model",
                "seed",
                "watermark"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "Primary content.items.required says type+text even for its image example without text; preserve intended example branches and outer-array validation boundary.",
              "Pro/pro-fast inline-resolution and top-level enum differ; copyable example uses documented 480p."
            ],
            "unsupported": [
              "Separate cancel/delete for this generic method",
              "Separate edit/extension endpoint for this method"
            ]
          },
          "hints": [
            "Créez une seule fois et conservez les valeurs publiques id/polling_url renvoyées.",
            "Interrogez la tâche d’origine ; téléchargez le contenu réel content.video_url vous appartenant après succeeded."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "image_constraints": {
              "aspect_ratio_exclusive": [
                0.4,
                2.5
              ],
              "dimensions_px_exclusive": [
                300,
                6000
              ],
              "file_size_mb_exclusive": 30,
              "formats": [
                "jpeg",
                "png",
                "webp",
                "bmp",
                "tiff",
                "gif"
              ],
              "mb_bytes_definition": null
            },
            "material_types": [
              "text",
              "image"
            ],
            "optional": [
              "duration",
              "resolution",
              "ratio",
              "service_tier"
            ],
            "required": [
              "camerafixed",
              "content",
              "execution_expires_after",
              "model",
              "seed",
              "watermark"
            ],
            "validation_scope": "Ailoot vérifie les types des champs obligatoires ainsi qu’un champ model et un tableau content non vides. Les autres champs de requête sont conservés pour le modèle sélectionné."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "succeeded"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [
              "failed",
              "expired"
            ],
            "id_source": "Actual returned id or X-Ailoot-Task-Id; provider_task_id is separate. Use returned polling_url.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "queued",
              "running"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "Preserve original response/headers/id and poll that operation; never resubmit unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text",
              "image"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video",
            "image_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only content.video_url is selected for ownership. No owned last-frame/callback result flow is established.",
            "all_results": "Retain every actual URL in content.video_url; index must identify a real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": null,
                "name": "id",
                "type": "string"
              },
              {
                "description": null,
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": null,
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": null,
                "name": "status",
                "type": "string when supplied"
              },
              {
                "description": null,
                "name": "content.video_url",
                "type": "string|string[]"
              },
              {
                "description": null,
                "name": "usage",
                "type": "object when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Configured video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "Native JSON with public id/polling_url. After publication content.video_url contains Ailoot-owned signed URL(s); before publication selected output URLs are blanked."
          }
        },
        "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": {
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.0044000",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_output_token",
                "label": "per 1,000 video tokens",
                "native_amount_usd_per_unit": "0.0000044",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_output_token"
              }
            ]
          },
          {
            "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 de génération estimé",
            "units": [
              {
                "amount": "0.2112",
                "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.2112",
                "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}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"doubao-seedance-1-0-pro-250528\",\"content\":[{\"type\":\"text\",\"text\":\"女孩抱着狐狸，女孩睁开眼，温柔地看向镜头，狐狸友善地抱着，镜头缓缓拉出，女孩的头发被风吹动\"}],\"resolution\":\"480p\",\"ratio\":\"1:1\",\"duration\":5,\"service_tier\":\"default\",\"seed\":-1,\"camerafixed\":false,\"watermark\":false,\"execution_expires_after\":172800}\nJSON_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 · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i.startswith(\"native302_\"):raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"status\")!=\"succeeded\":raise SystemExit(\"Poll same original job until an owned result is returned.\")\nu=r.get(\"content\",{}).get(\"video_url\")\nurls=[u] if isinstance(u,str) else u\nif not isinstance(urls,list) or not urls:raise SystemExit(\"No completed video URL.\")\nfor u in urls:\n    if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n    p=urlsplit(u)\n    if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for actual Ailoot-owned signed result.\")\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain returned public id/polling_url.",
          "Poll the original job; download actual owned content.video_url after succeeded."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Vidéo",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/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": {
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.0044000",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_output_token",
                "label": "per 1,000 video tokens",
                "native_amount_usd_per_unit": "0.0000044",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_output_token"
              }
            ]
          },
          {
            "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.2112",
                "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.2112",
                "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": "doubao-seedance-1-0-pro-250528",
        "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.0044000",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_output_token",
            "label": "per 1,000 video tokens",
            "native_amount_usd_per_unit": "0.0000044",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_output_token"
          },
          {
            "amount": "0.2112",
            "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.2112",
            "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": "doubao-seedance-1-0-pro-250528",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "5ab20e952fa1abbf609b4593684be4200d7e58b57ada0e1955805942b4b9ad63",
    "input_html_sha256": "2dae77252783cf4d91560d6d3d69b7439a850727ddaa4f2587c6649e6a1eb5d0",
    "private_audit_sha256": "4f1e387792bed3609757e38171aa2017a2d3af558047238f9a8db47c4e52a19a",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fr/doubao-seedance-1-0-pro-250528/",
    "description": "Seedance 1.0 Pro génère une vidéo sans son à partir de texte ou d’une image initiale. Décrivez l’action et la caméra, ou animez une composition existante, avec une durée de 2 à 12 secondes, 24 fps et des réglages explicites de cadrage et de résolution de sortie.",
    "locale": "fr",
    "md_url": "https://ailoot.ai/models/fr/doubao-seedance-1-0-pro-250528/index.md",
    "title": "ByteDance: Seedance 1.0 Pro — Ailoot",
    "url": "https://ailoot.ai/models/fr/doubao-seedance-1-0-pro-250528/"
  },
  "rawModel": {
    "about": "Seedance 1.0 Pro génère une vidéo à partir de texte ou d’une scène guidée par une image. Le sélecteur doubao-seedance-1-0-pro-250528 accepte les deux modes d’entrée : le point de départ peut donc être un concept écrit ou une composition visuelle existante. Utilisez un brief textuel pour créer une nouvelle scène, ou fournissez une image lorsque le sujet, sa disposition et la vue initiale doivent être établis visuellement. Ce profil 1.0 produit une vidéo sans son ; le son synchronisé relève du profil 1.5 Pro décrit séparément.\n\nPour la génération texte-vers-vidéo, précisez le sujet, l’environnement, le mouvement, le cadrage et la caméra dans une scène cohérente. L’exemple documenté passe progressivement d’un champ de marguerites à une vue rapprochée d’une fleur dont les pétales portent de la rosée. Cette structure convient à d’autres mises en valeur : présentez le décor, rapprochez-vous du sujet et terminez sur le détail important. Pour un concept de produit, décrivez la matière et l’éclairage ainsi que l’action, et donnez à la caméra un trajet réalisable pendant ce plan court.\n\nPour la génération image-vers-vidéo, placez la référence dans un élément de contenu image_url et expliquez ce qui doit changer par rapport à cette vue initiale. Un portrait préparé peut définir la personne et le cadrage, tandis que le brief décrit une légère rotation, des cheveux en mouvement ou un doux recul de caméra. Une photographie de produit peut établir l’objet et l’arrière-plan, tandis que le prompt demande une mise en valeur contrôlée. Gardez le mouvement demandé compatible avec la composition source ; l’image d’une face d’un objet ne fournit pas une vue exacte de toutes les autres faces non visibles.\n\nLe champ image accepte une URL accessible ou une URL de données contenant des données d’image Base64. Les formats documentés sont JPEG, PNG, WEBP, BMP, TIFF et GIF. Les images doivent peser moins de 30 MB, avec un rapport largeur/hauteur strictement compris entre 0,4 et 2,5 et chaque dimension strictement comprise entre 300 et 6 000 pixels. Préparez une source nette avec le cadrage voulu plutôt que de vous appuyer sur une miniature dont les détails distinctifs manquent déjà. Pour la génération image-vers-vidéo, le guide recommande un cadrage adaptatif qui suit les proportions de la référence.\n\nLa durée documentée pour la version 1.0 va de deux à douze secondes, avec une cadence de 24 fps. Les réglages de sortie comprennent les niveaux 480p, 720p et 1080p, avec 1080p comme valeur par défaut de Pro ; le guide exclut 1080p dans le cas d’une image de référence. Les cadrages fixes comprennent 16:9, 4:3, 1:1, 3:4, 9:16 et 21:9. Choisissez une combinaison compatible avec les images pour un plan guidé par une image, au lieu de reprendre tous les réglages texte-vers-vidéo tels quels. Vérifiez le cadrage réellement renvoyé avant d’intégrer le clip dans une mise en page.\n\nLes réglages de graine aléatoire et de filigrane sont documentés avec camerafixed. La consigne de caméra fixe n’est pas prise en charge dans le cas d’une image de référence et, lorsqu’elle s’applique, le guide ne garantit pas une caméra parfaitement immobile. Les instructions de paramètres intégrées au prompt prennent le pas sur les champs facultatifs distincts. Gardez un seul réglage faisant autorité pour la durée, la résolution et le rapport d’aspect, et faites concorder la description de caméra avec celui-ci. Cela évite que le brief de scène remplace silencieusement les réglages sélectionnés pour la requête.\n\nL’utilisation est mesurée en tokens vidéo : largeur de sortie × hauteur de sortie × cadence d’images × durée de sortie / 1024. La tâche achevée rapporte cette quantité dans usage.completion_tokens. Conservez l’utilisation rapportée avec le clip achevé et les réglages demandés.\n\nLe processus renvoie d’abord un identifiant de tâche, puis l’emplacement de la vidéo achevée après traitement. Conservez l’identifiant pendant la consultation des états en attente ou en cours ; une tâche réussie fournit content.video_url et les informations d’utilisation. La durée documentée de conservation des fichiers générés est de sept jours. Enregistrez le clip achevé, l’image source et le prompt exact comme historique de révision, puis vérifiez l’apparence du sujet, le mouvement, la continuité de l’image et la composition finale sur l’ensemble du résultat.",
    "alias_of": null,
    "aliases": [],
    "author": "ByteDance",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.2112",
            "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.2112",
            "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,
    "display_name": "ByteDance: Seedance 1.0 Pro",
    "formats": [
      "videos"
    ],
    "id": "doubao-seedance-1-0-pro-250528",
    "input": [
      "text",
      "image"
    ],
    "kind": "video",
    "locale": "en",
    "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": {
            "errors": [
              {
                "condition": "JSON/model, types des champs obligatoires ou index de contenu non valides.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "Clé API Ailoot non valide.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "Tâche ou sortie absente, ou n’appartenant pas au même utilisateur, à la même clé API ou au même groupe.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "Soumission ou statut d’origine incomplet ; conservez l’identifiant d’origine, sans soumettre à nouveau.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "Le média, la route ou le règlement d’origine est en cours de vérification ; poursuivez l’opération d’origine.",
                "http_status": 503,
                "type": "result_pending_check"
              }
            ],
            "ignored_fields": [],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "succeeded"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [
                "failed",
                "expired"
              ],
              "id_source": "Actual returned id or X-Ailoot-Task-Id; provider_task_id is separate. Use returned polling_url.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "queued",
                "running"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "Conservez la réponse, les en-têtes et l’id d’origine, puis interrogez cette opération ; ne soumettez jamais à nouveau une création dont l’issue est inconnue.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ],
              [
                "text",
                "image"
              ]
            ],
            "operation_modes": [
              "text_to_video",
              "image_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only content.video_url is selected for ownership. No owned last-frame/callback result flow is established.",
              "all_results": "Conservez chaque URL réelle dans content.video_url ; index doit identifier une sortie réelle renvoyée.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": null,
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "status",
                  "type": "string when supplied"
                },
                {
                  "description": null,
                  "name": "content.video_url",
                  "type": "string|string[]"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Configured video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON natif avec id/polling_url publics. Après publication, content.video_url contient une ou plusieurs URL signées appartenant à Ailoot ; avant publication, les URL de sortie sélectionnées sont vidées."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "doubao-seedance-1-0-pro-250528"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Objets natifs de texte ou de média ; le tableau externe doit être non vide. Les types des nœuds imbriqués ne sont pas validés par ce constructeur générique Ailoot.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "minItems": 1,
                "name": "content",
                "required": true,
                "type": "array"
              },
              {
                "availability": "source_interface",
                "conditions": "Schéma principal 1.x : 2–12 ; une description commune ultérieure indique 4–12 ou -1 pour 1.5. L’exemple utilise 5, valeur documentée dans les deux cas.",
                "default": 5,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 12,
                "minimum": 2,
                "name": "duration",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "conditions": "Les valeurs confirmées pour la génération de vidéo à partir de texte sont 480p et 1080p. L’entrée par image de référence exclut 1080p. L’énumération commune 720p contredit la description propre au modèle ; la prise en charge de 720p reste donc indéterminée dans les deux modes.",
                "default": "1080p",
                "default_conditions": "1080p is the documented model default for text-to-video. Reference-image input excludes 1080p; its default is not established here.",
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "resolution",
                "required": false,
                "supported_values_by_mode": {
                  "image_to_video": {
                    "confirmed": [
                      "480p"
                    ],
                    "excluded": [
                      "1080p"
                    ],
                    "unresolved": [
                      "720p"
                    ]
                  },
                  "text_to_video": {
                    "confirmed": [
                      "480p",
                      "1080p"
                    ],
                    "unresolved": [
                      "720p"
                    ]
                  }
                },
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "Valeurs par défaut dépendant de la scène ou du modèle ; la documentation de l’entrée image recommande adaptive.",
                "default": null,
                "default_known": false,
                "enum": [
                  "16:9",
                  "4:3",
                  "1:1",
                  "3:4",
                  "9:16",
                  "21:9",
                  "adaptive"
                ],
                "enum_known": true,
                "name": "ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "default=online, flex=offline ; choisissez avant la création.",
                "default": "default",
                "default_known": true,
                "enum": [
                  "default",
                  "flex"
                ],
                "enum_known": true,
                "name": "service_tier",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": -1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 4294967295,
                "minimum": -1,
                "name": "seed",
                "required": true,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "conditions": "Obligatoire pour Ailoot ; le contrôle de la caméra avec une image de référence est documenté comme non pris en charge et son effet n’est pas garanti.",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "camerafixed",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "watermark",
                "required": true,
                "type": "boolean"
              },
              {
                "availability": "source_interface",
                "default": 172800,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "maximum": 259200,
                "minimum": 3600,
                "name": "execution_expires_after",
                "required": true,
                "type": "integer",
                "unit": "secondes"
              }
            ],
            "profile_binding": "Exact model ID and documented Ailoot video interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "camerafixed": {
                  "type": "boolean"
                },
                "content": {
                  "items": {
                    "type": "object"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "duration": {
                  "maximum": 12,
                  "minimum": 2,
                  "type": "integer"
                },
                "execution_expires_after": {
                  "maximum": 259200,
                  "minimum": 3600,
                  "type": "integer"
                },
                "model": {
                  "const": "doubao-seedance-1-0-pro-250528",
                  "type": "string"
                },
                "ratio": {
                  "enum": [
                    "16:9",
                    "4:3",
                    "1:1",
                    "3:4",
                    "9:16",
                    "21:9",
                    "adaptive"
                  ],
                  "type": "string"
                },
                "resolution": {
                  "description": "Use the explicit resolution supported_values_by_mode conditions: reference-image input excludes 1080p; 720p support is unresolved. No unconditional per-model enum is asserted.",
                  "type": "string"
                },
                "seed": {
                  "maximum": 4294967295,
                  "minimum": -1,
                  "type": "integer"
                },
                "service_tier": {
                  "enum": [
                    "default",
                    "flex"
                  ],
                  "type": "string"
                },
                "watermark": {
                  "type": "boolean"
                }
              },
              "required": [
                "camerafixed",
                "content",
                "execution_expires_after",
                "model",
                "seed",
                "watermark"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "Primary content.items.required says type+text even for its image example without text; preserve intended example branches and outer-array validation boundary.",
              "Pro/pro-fast inline-resolution and top-level enum differ; copyable example uses documented 480p."
            ],
            "unsupported": [
              "Separate cancel/delete for this generic method",
              "Separate edit/extension endpoint for this method"
            ]
          },
          "hints": [
            "Créez une seule fois et conservez les valeurs publiques id/polling_url renvoyées.",
            "Interrogez la tâche d’origine ; téléchargez le contenu réel content.video_url vous appartenant après succeeded."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "image_constraints": {
              "aspect_ratio_exclusive": [
                0.4,
                2.5
              ],
              "dimensions_px_exclusive": [
                300,
                6000
              ],
              "file_size_mb_exclusive": 30,
              "formats": [
                "jpeg",
                "png",
                "webp",
                "bmp",
                "tiff",
                "gif"
              ],
              "mb_bytes_definition": null
            },
            "material_types": [
              "text",
              "image"
            ],
            "optional": [
              "duration",
              "resolution",
              "ratio",
              "service_tier"
            ],
            "required": [
              "camerafixed",
              "content",
              "execution_expires_after",
              "model",
              "seed",
              "watermark"
            ],
            "validation_scope": "Ailoot vérifie les types des champs obligatoires ainsi qu’un champ model et un tableau content non vides. Les autres champs de requête sont conservés pour le modèle sélectionné."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "succeeded"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [
              "failed",
              "expired"
            ],
            "id_source": "Actual returned id or X-Ailoot-Task-Id; provider_task_id is separate. Use returned polling_url.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "queued",
              "running"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "Preserve original response/headers/id and poll that operation; never resubmit unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text",
              "image"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video",
            "image_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only content.video_url is selected for ownership. No owned last-frame/callback result flow is established.",
            "all_results": "Retain every actual URL in content.video_url; index must identify a real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": null,
                "name": "id",
                "type": "string"
              },
              {
                "description": null,
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": null,
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": null,
                "name": "status",
                "type": "string when supplied"
              },
              {
                "description": null,
                "name": "content.video_url",
                "type": "string|string[]"
              },
              {
                "description": null,
                "name": "usage",
                "type": "object when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Configured video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "Native JSON with public id/polling_url. After publication content.video_url contains Ailoot-owned signed URL(s); before publication selected output URLs are blanked."
          }
        },
        "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": {
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.0044000",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_output_token",
                "label": "per 1,000 video tokens",
                "native_amount_usd_per_unit": "0.0000044",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_output_token"
              }
            ]
          },
          {
            "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 de génération estimé",
            "units": [
              {
                "amount": "0.2112",
                "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.2112",
                "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}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"doubao-seedance-1-0-pro-250528\",\"content\":[{\"type\":\"text\",\"text\":\"女孩抱着狐狸，女孩睁开眼，温柔地看向镜头，狐狸友善地抱着，镜头缓缓拉出，女孩的头发被风吹动\"}],\"resolution\":\"480p\",\"ratio\":\"1:1\",\"duration\":5,\"service_tier\":\"default\",\"seed\":-1,\"camerafixed\":false,\"watermark\":false,\"execution_expires_after\":172800}\nJSON_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 · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i.startswith(\"native302_\"):raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"status\")!=\"succeeded\":raise SystemExit(\"Poll same original job until an owned result is returned.\")\nu=r.get(\"content\",{}).get(\"video_url\")\nurls=[u] if isinstance(u,str) else u\nif not isinstance(urls,list) or not urls:raise SystemExit(\"No completed video URL.\")\nfor u in urls:\n    if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n    p=urlsplit(u)\n    if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for actual Ailoot-owned signed result.\")\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain returned public id/polling_url.",
          "Poll the original job; download actual owned content.video_url after succeeded."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Vidéo",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/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": {
              "quoted_unit": "per 1,000 video tokens"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.0044000",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "video_output_token",
                "label": "per 1,000 video tokens",
                "native_amount_usd_per_unit": "0.0000044",
                "native_quantity": 1,
                "public_unit_label": "per 1,000 video tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "video_output_token"
              }
            ]
          },
          {
            "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.2112",
                "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.2112",
                "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": "doubao-seedance-1-0-pro-250528",
        "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.0044000",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "video_output_token",
            "label": "per 1,000 video tokens",
            "native_amount_usd_per_unit": "0.0000044",
            "native_quantity": 1,
            "public_unit_label": "per 1,000 video tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "video_output_token"
          },
          {
            "amount": "0.2112",
            "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.2112",
            "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": "doubao-seedance-1-0-pro-250528",
        "request_model_id": "doubao-seedance-1-0-pro-250528",
        "route_label": "Ultra"
      }
    ],
    "name": "ByteDance: Seedance 1.0 Pro",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.2112,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.2112,
      "varies": false
    },
    "short": "Seedance 1.0 Pro génère une vidéo sans son à partir de texte ou d’une image initiale. Décrivez l’action et la caméra, ou animez une composition existante, avec une durée de 2 à 12 secondes, 24 fps et des réglages explicites de cadrage et de résolution de sortie."
  },
  "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": "Seedance 1.0 Pro génère une vidéo sans son à partir de texte ou d’une image initiale. Décrivez l’action et la caméra, ou animez une composition existante, avec une durée de 2 à 12 secondes, 24 fps et des réglages explicites de cadrage et de résolution de sortie.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "9fa3daae470a2b8bfa1d445c629b3d1286d9e694ac59786447e082e5127dc212",
    "renderer_sha256": "44d2db1deadc475e1793597083716540bae7bbc53606f05f58780fec5f115dd4"
  },
  "sourceRevision": "b876cdfef9d5ddba86a4addcb5226dedf6c095119e0864949eb44d0222abba5f"
}
