API Pro : générer des vidéos avec du son
Un clip à partir d'un prompt, ou l'animation d'une image fixe que tu fournis. Le fichier est un MP4, avec du son quand tu le demandes.
Soumettre une vidéo
POST /videos
{ "prompt": "a woman in a white linen dress walks along a beach at sunset, wind in her hair, she turns and smiles at the camera",
"width": 1080, "height": 1920, "audio": true }| Champ | Type | Défaut | Ce que ça fait |
|---|---|---|---|
prompt | string | required | L'action, l'ambiance, la lumière. Décris le mouvement. |
width, height | int | 720 x 1280 | Vertical par défaut. Voir la grille tarifaire ci-dessous. |
quality | string | max : mode Ultra (le rendu le plus fin), voir Mode Ultra. | |
consistency | string | standard | enhanced : cohérence renforcée, mouvement, visages et décor plus stables sur la durée, jusqu'à 721 images par plan (30 s à 24 i/s, 24 s à 30), prolongations comprises. Mode Qualité seulement. Voir Cohérence renforcée. |
mode | string | ltx25 | ltx25 : moteur 2.5 (son, durée automatique, 1080p, image de fin). turbo : retiré le 11 octobre 2026 ; une demande turbo est rendue en Qualité 480p (même orientation, même durée, 241 images au plus, durée fixe), au prix de la Qualité 480p. |
duration_auto | bool | true | Le moteur choisit la durée d'après le prompt, jusqu'à 20 s à 24 i/s (16 s à 30, 8 s à 60 : le plafond se compte en images, voir fps) ; length est alors ignoré. Mets false pour une durée fixe, donnée par length. En consistency enhanced au-delà de 30 i/s, la durée est toujours fixe (fps_requires_fixed_duration sinon). |
length | int | 121 | Durée en images, à la cadence fps, toujours de la forme 8n+1 ; la durée vaut (length - 1) / fps. 481 au plus (721 en consistency enhanced). À 24 i/s : 73 (3 s), 121 (5 s), 241 (10 s), 361 (15 s), 481 (20 s ; 721, soit 30 s, en enhanced). À 30 : 241 (8 s), 481 (16 s ; 721, 24 s). À 60 : 241 (4 s), 481 (8 s ; 721, 12 s). Prise en compte en durée fixe (duration_auto à false) ; ignorée en durée automatique. |
fps | int | 30 | Cadence, en images par seconde : 24, 30 ou 60. 30 par défaut, le réglage conseillé (mouvements nets) ; 60, le plus fluide ; 24, la cadence du cinéma. 50, en consistency enhanced seulement, donne un léger ralenti (environ 0,83x : le moteur y règle le mouvement comme pour 60 et le joue à 50). length se compte à cette cadence. Le prix ne change pas (forfait par clip) ; la durée maximale, si : elle se compte en images. Une prolongation garde la cadence du clip précédent, une séquence celle de son premier plan. Une cadence absente du mode : invalid_fps, qui liste celles qu'il a. |
audio | bool | false | Son généré en même temps que l'image (ambiance, voix). Double le prix du clip (voir Formats et tarif). |
image | string | Image de début en base64 : la vidéo anime cette image. | |
end_image | string | Image de fin en base64, associée à image : le clip effectue une transition de l'une à l'autre (moteur 2.5 uniquement). Une transition sort à la taille demandée, du 480p au 1080p, et se paie comme un clip de ce format. | |
keyframes | array | Images clés (mode Qualité) : 1 à 4 objets { "image": base64, "at": secondes, "strength": 0,1 à 1 (1 par défaut) }. Le clip montre chaque image à son instant, par exemple un personnage au milieu d'un plan qui commence et finit sur un décor vide. La durée devient fixe (length, duration_auto forcé à false) ; 0 < at < durée, 0,5 s d'écart au moins entre deux images clés ; précision d'environ un tiers de seconde. Compatible avec image et end_image. Pas en Ultra ni en Multi-Ref ; en prolongation, seulement en consistency enhanced (voir Cohérence renforcée). Même prix qu'un clip du même format. | |
lora, lora_strength | string, number | Un personnage entraîné sur le compte (name issu de GET /loras) et son intensité (0 à 1). | |
lora2, lora2_strength | string, number | Un second personnage. | |
multiref | objet | Fait jouer 1 à 4 personnages (12 en Ultra) de GET /characters, avec des objets, des animaux et un lieu enregistrés de GET /subjects, désignés par @Nom dans le prompt, voir Multi-Ref Vidéo. | |
seed | int | au hasard | Graine du rendu, de 0 à 4294967295. Même seed, même prompt, même image et mêmes réglages (format, durée, son, mode) : le même clip, à de légers écarts près si la carte graphique change. En durée automatique, une durée choisie différemment change le clip : pour une reproduction stricte, duration_auto à false et length. |
steps | int | engine | Laisse vide. |
Cadence par défaut : 30 i/s. Les clips étaient rendus à 24 i/s. Sans fps, un clip de même
length est donc plus court qu'avant (241 images : 8 s au lieu de 10 s). Envoie "fps": 24 pour
garder l'ancien comportement.
La réponse :
{ "jobId": "...", "seed": 908172, "cost": 30 }Le coût est calculé et annoncé à la soumission, avant qu'aucun crédit ne soit débité. La graine
(seed) est renvoyée aussi, qu'elle ait été donnée ou tirée au hasard.
Formats et tarif
Une vidéo est facturée par format, à un tarif fixe indépendant de sa durée. Base : 5 crédits.
Le tarif fixe est multiplié par 2 en 720p et par 3 en 1080p, puis le son double le prix.
Les facteurs s'appliquent au tarif de base, pas l'un à l'autre : 1080p avec son coûte 5 x 3 x 2 = 30
crédits. Jusqu'à 481 images, soit 20 s à 24 i/s, la durée ne change rien (5 s ou 20 s, même tarif).
Au-delà de 481 images (jusqu'à 721, en consistency enhanced seulement, durée fixe), le prix du
format est doublé. La cadence (fps) ne change pas le prix, mais les paliers se comptent en images :
à 30 i/s, le prix normal va jusqu'à 16 s ; à 60, jusqu'à 8 s (12 s au double en enhanced).
Une exception : en Qualité, le 480p sans son coûte 2 crédits, quelle que soit sa durée (depuis le 11 octobre 2026). Le Multi-Ref et la cohérence renforcée gardent le forfait du format, 5 crédits.
| Format | Petit côté | Exemples de tailles | Sans son | Avec son |
|---|---|---|---|---|
| 480p | 480 | 480 x 832, 832 x 480 | 2 (5 en Multi-Ref et en cohérence renforcée) | 10 |
| 720p | 720 | 720 x 1280, 1280 x 720 | 10 | 20 |
| 1080p | 1080 | 1080 x 1920, 1920 x 1080 | 15 | 30 |
La taille que tu récupères. Le moteur travaille en multiples de 32 et en deux étapes, donc le fichier ressort à 768 x 1280 (ou 1280 x 768) en 720p et 1088 x 1920 (ou 1920 x 1088) en 1080p. Le 480p reste à 480 x 832 (ou 832 x 480), sauf en cohérence renforcée. Utile à savoir si tu assembles ou superposes nos rendus.
La voie turbo est retirée depuis le 11 octobre 2026 : une demande turbo est rendue en Qualité
480p et se paie comme elle (2 crédits sans son, 10 avec son).
Connaître le prix avant de soumettre
POST /videos/quote prend le même corps que POST /videos et effectue le même calcul, mais
rien n'est créé : pas de rendu, pas de crédit retenu, pas de quota consommé. Appelle-le avant de valider,
surtout depuis un agent travaillant avec un budget limité.
{ "cost": 30, "mode": "ltx25", "format": "1080p", "audio": true, "fps": 30, "duration_auto": true,
"seconds_max": 16, "detail": "flat 5 x 3 (1080p) x 2 (sound) = 30" }detail détaille le calcul ; fps est la cadence retenue, et seconds_max la durée en secondes à
cette cadence. Avec "consistency": "enhanced", le devis accepte une durée fixe jusqu'à 721 images et
applique le palier au-delà de 481 images (x 2 (over 20 s) dans detail à 24 i/s, x 2 (over 481 frames)
à une autre cadence). La même route existe pour les images, POST /images/quote, qui
répond toujours { "cost": 1, ... } : une image coûte toujours 1 crédit.
Pour un clip Ultra facturé à la seconde, le devis donne la durée facturée dans seconds, et detail détaille le prix à la seconde.
Interroger, télécharger, annuler
Les mêmes routes que pour les images, sous /videos.
GET /videos/{jobId}:pending/completed/failed, mêmes champs. Une prolongation renforcée peut finir enfailedavec"error": "extension_not_applied"(le moteur n'a pas repris la fin du clip précédent) : rien n'est débité, relance-la.GET /videos/{jobId}/file: le MP4 (Content-Type: video/mp4).POST /videos/{jobId}/cancel: annule, et rien n'est débité.
En Ultra facturé à la seconde, un rendu déjà en calcul ne s'arrête plus : l'annulation répond 409 render_in_progress, et le clip est livré et facturé. Un clip que le moteur refuse à la sortie finit en failed, avec une phrase dans detail et le code du moteur dans reason : rien n'est débité.
Une vidéo prend 1 à 5 minutes, plus longtemps quand le moteur démarre à froid. Interroge toutes les 3 secondes et
télécharge dès que le statut est completed : le fichier n'est pas archivé.
Plusieurs plans dans un clip
Un seul prompt peut contenir plusieurs plans séparés par des coupes franches, jusqu'à 20 secondes
au total à 24 i/s (16 s à 30, la cadence par défaut). Décris-les dans l'ordre : Shot 1: <cadrage>, <action>. Cut to Shot 2: .... Répète dans
chaque plan ce qui doit rester identique (personnage, tenue, lieu, lumière), et termine par une
phrase d'ambiance commune.
Pas de timecodes : laisse duration_auto actif, le moteur choisit la durée (jusqu'à 20 s à 24 i/s, 16 s à 30) et
l'endroit des coupes. Deux à quatre plans par clip donnent les meilleurs résultats.
A cinematic sequence of three shots, same woman, same place, same lighting throughout.
Shot 1: Wide shot, night, light rain on a narrow Paris street with glowing café windows. A woman in a long beige trench coat walks toward the camera under a transparent umbrella, wet cobblestones reflecting warm yellow streetlights.
Cut to Shot 2: Close-up on her face under the umbrella, raindrops on the plastic, warm café light on her cheek, she smiles softly.
Cut to Shot 3: Medium shot from inside the café through the rainy window, she pushes the door open and steps in, warm light spilling onto the wet pavement.
Calm, melancholic, romantic mood.Plusieurs plans dans un clip, ou une séquence ? Les deux ne font pas la même chose :
| Plusieurs plans dans un clip | Séquence (prolongations) | |
|---|---|---|
| Entre les plans | Coupes franches | Pas de coupe : chaque plan continue le mouvement |
| Durée | 20 s au plus à 24 i/s (16 s à 30) | Plus long |
| Rendus | Un seul | Un par plan |
| Prix | Un clip | Un clip par plan |
Prolonger un clip
Un clip peut être prolongé : le plan suivant continue le mouvement du précédent, sans arrêt au raccord. Il s'appuie sur environ la dernière seconde du clip précédent, pas sur une seule
image fixe. Ajoute à POST /videos :
| Champ | Type | Défaut | Ce que ça fait |
|---|---|---|---|
extend_job_id | string | Le clip à prolonger : un rendu de ta licence, récupéré peu après sa fin. | |
extend_frames | int | 25 | Quelle portion de la fin du clip guide le plan suivant, en images : 9, 17, 25, 33, 41 ou 49 (25 correspond à environ 1 s à 24 i/s). |
extend_video | string | À la place de extend_job_id : la fin d'un clip que tu possèdes toi-même, sous forme de MP4 en base64 d'exactement extend_frames images, 8 Mo au maximum. |
Le plan prolongé reprend la résolution du clip précédent : width et height sont ignorés
avec extend_job_id, et avec extend_video la taille est lue depuis le fichier que tu envoies. Il contient
uniquement les nouvelles images, de sorte que les plans mis bout à bout forment une seule vidéo continue. Il garde la
cadence du clip précédent : omets fps (il la reprend) ou donne la même ; une autre est refusée
(extend_fps_mismatch). length est la nouvelle durée du plan (121 = 5 s de plus à 24 i/s), et elle est exacte : la durée automatique ne s'applique pas
à une prolongation. Une prolongation coûte le prix d'un clip.
Limites : pas d'image de fin ni d'images clés en même temps, sauf en cohérence renforcée.
Le son continue au raccord. Avec audio: true, quand la fin du clip précédent porte une piste son,
le nouveau plan reprend ce son au lieu d'en inventer un autre. Avec extend_job_id, la fin coupée garde
le son du clip ; avec extend_video, envoie la fin avec son son. Sans piste son dans cette fin, en
cohérence renforcée et en Ultra, le son repart de zéro avec le plan : conserve
la même ambiance dans chaque prompt, pour que le raccord s'entende le moins possible.
Prolonge un clip peu après sa fin. Plus tard il n'est plus disponible de notre côté
(clip_unavailable), et tu envoies sa fin toi-même dans extend_video.
Prolonger un plan Ultra, vers l'avant ou vers l'arrière
Un plan rendu en Ultra à la seconde se prolonge lui aussi en Ultra, vers l'avant ou vers l'arrière ; tout autre clip se prolonge comme ci-dessus. Envoie POST /videos avec "quality": "max" et :
| Champ | Type | Défaut | Ce que ça fait |
|---|---|---|---|
extend_job_id | string | Le plan Ultra à prolonger, rendu par ta licence il y a moins de 24 heures. | |
extend_upload_id | string | À la place, pour un plan plus ancien : l'identifiant rendu par POST /extensions (ci-dessous), une fois son fichier original déposé. | |
extend_direction | string | forward | forward rend la suite du plan ; backward rend les instants juste avant lui, à monter devant. |
- Le rendu ne contient que la partie nouvelle, de la durée d'un clip Ultra (
length/fps, 5 s en durée automatique). Il prend la résolution du plan (widthetheightsont ignorés) et se raccorde à sa dernière image (forward) ou à sa première (backward). - Pas d'image de départ, de références (
multiref), de mouvement ni de cohérence renforcée.backwardne va pas dans une séquence, qui range ses plans à la suite. - Prix : la partie nouvelle au prix de l'Ultra à la seconde, plus, par seconde du plan prolongé, 2 crédits en 480p, 5 en 720p et 13 en 1080p (
ultra.extend_per_seconddansGET /pricing). Ces secondes s'arrondissent à la seconde supérieure (à 0,1 s près) et se comptent à 24 images par seconde : un plan à cadence plus haute compte au prorata (2 s à 60 i/s comptent 5 s).POST /videos/quoteavec les mêmes champs donneextend_secondset le prix exact. - Plan de plus de 24 heures : dépose son fichier original, tel que livré par
GET /videos/{jobId}/file.POST /extensionsavec{ "size": <octets> }rendupload_id,upload_url,headersetexpires_in(900 s) ; envoie le fichier parPUT upload_urlavec exactement cesheaders, puis passeextend_upload_iddans les 2 heures. Un dépôt sert à un rendu : un MP4 de 4 à 30 s, 60 Mo et 1080p au plus. Avant le rendu, chaque vidéo envoyée au mode Ultra (un mouvement ou une vidéo à prolonger) est vérifiée, et rien n'est débité si elle est refusée (400 input_video_out_of_limits) : 24 à 60 images par seconde, un rapport largeur/hauteur de 0,4 à 2,5 et, pour un rendu, 30 s et 10 fichiers au plus pour les vidéos et les sons de référence réunis. Pour un visage réaliste, un fichier réencodé ou remonté est refusé (400 engine_refused) : seul l'original passe. Une vidéo que le mode Ultra n'a pas rendue (le rendu d'un autre mode, par exemple) ne se prolonge pas en Ultra quand elle montre un visage réaliste (400 extension_real_face, rien n'est débité) : prolonge-la en mode Qualité, ou refais le plan en Ultra.
Cohérence renforcée
Avec "consistency": "enhanced", le clip est rendu par une voie qui tient mieux le mouvement, les
visages et le décor sur la durée. Elle va jusqu'à 721 images par plan, soit 30 s à 24 i/s et 24 s
à 30 (length, durée fixe) et sert surtout aux vidéos longues :
- Premier plan : un clip normal (prompt, image de départ,
keyframes,end_image), jusqu'à 721 images. - Prolongation :
extend_job_id(ouextend_video) comme dans Prolonger un clip, avec la mêmeconsistency.lengthreste la durée nouvelle (jusqu'à 721, soit 30 s de plus à 24 i/s). Une prolongation renforcée accepte aussi deskeyframes, dontatcompte depuis la première image nouvelle, et une image de finend_image, posée sur la dernière image du plan : par exemple l'image de départ du premier plan, pour qu'une vidéo longue boucle.
Mode Qualité seulement (mode ltx25, sans quality: "max"), jusqu'au 1080p, pas en Multi-Ref
(400 consistency_mode). Prix : le forfait du format (480p sans son : 5
crédits) jusqu'à 481 images nouvelles (20 s à 24 i/s), doublé au-delà (voir la grille plus haut).
Cadences : 24, 30, 50 ou 60. Au-delà de 30, la durée est fixe (fps_requires_fixed_duration sinon) ;
50 donne un léger ralenti (voir fps). Le rendu prend plus de temps qu'un clip standard, et son
démarrage peut attendre une carte graphique plus grosse (plans longs). Une séquence garde la même
consistency pour tous ses plans. Taille livrée : la même qu'en Qualité au 720p et au 1080p ; au 480p,
le petit côté sort à 448 (448 x 832, 832 x 448, 448 x 448), cette voie travaillant par multiples de 64.
Certains prompts ne sont pas encore pris en charge. Pour eux, un plan seul de 20 s au plus (15 s
avec une end_image, en durée fixe) est rendu en cohérence standard, au même prix. Au-delà (length
au-dessus de 481 avec duration_auto: false, ou de 361 avec une end_image), en prolongation ou dans une
séquence, la demande est refusée avec 400 consistency_explicit : raccourcir le plan ou demander
consistency: "standard".
Longue vidéo (séquences)
Un clip dure 481 images au maximum, soit 20 s à 24 i/s (721 en cohérence renforcée, 30 s à 24 i/s). Pour aller plus loin, une séquence enregistre chaque plan au fur et à mesure de son rendu, puis les assemble en un seul MP4 sans ré-encodage. Une minute, par exemple, c'est 3 plans de 20 s, ou 2 plans de 30 s en cohérence renforcée, à 24 i/s.
POST /sequencesouvre une séquence et répond{ "sequence_id": "seq_...", ... }.POST /videosavec"sequence_id": "seq_..."pour chaque plan : le premier comme d'habitude, les suivants avecextend_job_idpointant vers le plan précédent. Chaque plan est enregistré dans la séquence, dans l'ordre de soumission, dès queGET /videos/{jobId}le voit terminé.POST /sequences/{id}/exportune fois le dernier plan terminé. Il répond avecseconds,resolutionetfile_url.GET /sequences/{id}/file: la vidéo assemblée (MP4).
Autres routes : GET /sequences/{id} donne l'état (plans enregistrés ou encore attendus),
POST /sequences/{id}/clips avec { "job_id": "..." } enregistre un rendu manuellement, et
DELETE /sequences/{id} supprime la séquence immédiatement.
Règles. Chaque plan a la même résolution (les prolongations la reprennent) et le même choix de son, tous
avec son ou tous sans, la même consistency et la même cadence (fps) : le premier plan les fixe, et un plan qui
diffère est refusé (409 consistency_mismatch, 409 sequence_fps_mismatch ; 422 encoding_mismatch
pour un plan rangé à la main). Un plan sans fps prend celle de la séquence. Au maximum
30 plans par séquence et 5 séquences en cours par licence.
Ce que nous conservons, et combien de temps. Les plans d'une séquence en cours sont effacés 30 minutes après l'ajout du dernier, et la vidéo assemblée 24 heures après l'export. Ensuite, tout est supprimé.
Exporter le dossier du projet
Un dossier de projet réunit dans un ZIP tout ce qu'il faut pour reprendre une vidéo ailleurs ou l'automatiser : les plans, leurs références, le montage, et un manifeste qui permet de rendre chaque plan de nouveau. Il est gratuit : aucun rendu.
POST /videos/{jobId}/export: un rendu dePOST /videos(plan seul, Multi-Ref, prolongation).POST /sequences/{id}/project: tous les plans d'une séquence, bout à bout.- Corps facultatif, les mêmes choix que la fenêtre d'export de l'application :
include_media(truepar défaut) : les vidéos des plans et leurs originaux signés.false: aucune vidéo (ni clip, ni original, ni film) ; les plans gardent leur texte, leurs réglages et leurs références ("state": "expired") et le manifeste portevideos_included: false.include_references(truepar défaut) : les vues des personnages et les images des éléments, dansreferences/.false: aucune n'est copiée ; leurs noms, @mentions,idet empreintes restent au manifeste (references_included: false).exclude_references: les références à ne pas copier, une par une, parid(character_id,subject_id), nom ou @mention, par exemple["@Parc", "chr_..."](200 au plus). Le manifeste portereferences_included: "partial"et"included": falsesur chaque exclue (falsesi toutes le sont). Une entrée qui ne désigne aucune référence de l'export :400 unknown_reference.include_film(séquence seulement,falsepar défaut) : le film d'une séquence déjà assemblée ; il demandeinclude_media(sinon400 invalid_export_options, comme une option qui n'est pas un booléen ou unexclude_referencesqui n'est pas une liste de textes).manifest_only: true: le manifeste seul, sans ZIP.
La réponse est { "manifest": { ... }, "file_url": "...", "export_id": "exp_...", "expires_at": "...", "bytes": n }, et GET /exports/{id}/file télécharge le ZIP. Un export à la fois par licence (409 export_in_progress), 2 Go au plus (413 export_too_large : exporte les plans un par un).
| Fichier | Contenu |
|---|---|
tendre-project.json | Le manifeste (schéma tendre.project/1, clés en anglais). Pour chaque plan : son état, le prompt tapé (prompt) et celui parti au moteur (prompt_sent), les réglages, la graine, le coût, la prolongation (extends, direction), les références reliées à leurs fichiers, et api_request, le corps de POST /videos qui rend le plan de nouveau (null si une image n'était envoyée qu'en base64) ; en tête, references_included : true dans le ZIP (les fichiers des références sont dans references/), false avec manifest_only (références sans fichier : files vide, empreintes sha256 seules) ; un manifeste sans ce champ (exports d'avant) se lit comme true. Un dossier exporté par l'application, où le client choisit ses références une par une, porte true, false ou "partial", et chaque référence peut porter included (absent : comme la tête, false si la tête est false, sinon true) ; une référence non incluse garde son nom, sa @mention, son id et sa description, avec files vide. project.settings porte les réglages du premier plan (quality, width, height, fps, audio, output_format "mp4") et settings_from_shot, l'id de ce plan. Un dossier exporté par l'application peut contenir un bloc app réservé à l'application : l'ignorer |
shots/NN/clip.mp4 | Le rendu de chaque plan, tant que le serveur l'a ; shots/NN/original.mp4 ou .mov : le fichier signé du moteur, octet pour octet, s'il existe encore |
references/ | Les vues des personnages et les images des lieux, objets, animaux, styles et tenues utilisés |
timeline.otio, timeline.fcpxml | Le montage (OpenTimelineIO ; FCPXML pour Final Cut Pro et DaVinci Resolve), médias par chemin relatif au dossier |
film.mp4 | La vidéo assemblée d'une séquence, seulement avec include_film: true et si elle a déjà été assemblée (POST /sequences/{id}/export) ; sinon assembled vaut null dans le manifeste |
Ce que nous conservons, et combien de temps. À chaque POST /videos accepté, le serveur garde une fiche du rendu sans aucune image ni vidéo : le texte, les réglages, les identifiants (une image envoyée en base64 n'y laisse que son empreinte). Elle est effacée 24 heures après la soumission ; au-delà, l'export répond 404 unknown_export. Le ZIP est effacé 45 minutes après son premier téléchargement, 2 heures après sa création au plus. Un plan que le serveur n'a plus sort en "state": "expired", sans son fichier mais avec son texte, ses réglages et ses références : un agent peut le rendre de nouveau avec api_request.
Séquence. L'assemblage efface les plans un par un. Pour avoir les plans et le film, exporte le projet avant d'assembler, puis assemble et exporte de nouveau avec { "include_film": true } : le film s'ajoute, et les plans sortent alors en expired.
Mode Ultra
Le mode Ultra est le rendu vidéo le plus fin. Ajoute "quality": "max" à POST /videos (avec mode ltx25, la valeur par défaut). Il se facture à la seconde, ou à prix fixe avec un LoRA ou en prolongation d'un clip qui n'a pas été rendu à la seconde ; prolonger un plan Ultra, vers l'avant ou vers l'arrière, se facture à la seconde. POST /videos/quote donne le prix exact de ta demande.
À la seconde
Le clip est facturé à la seconde selon sa résolution, son compris :
| Résolution | Prix |
|---|---|
| 480p | 4 crédits la seconde |
| 720p | 8 crédits la seconde |
| 1080p | 20 crédits la seconde |
- Durée : de 4 à 30 s, à 24 images par seconde, connue avant le rendu : 5 s en durée automatique (
duration_auto, par défaut), sinonlength/fps(24 sifpsest absent), arrondie à la seconde. - Format : celui demandé, au rapport le plus proche ; le 480p est rendu en 480p. Au-delà du 1080p :
resolution_outside_ultra. - Image de départ (
image) : possible. Le moteur peut refuser un texte ou une image à l'envoi :400 engine_refused, avec sa raison dansdetailet son code danscode; rien n'est débité. - Pas de graine :
seedest ignorée et la réponse n'en donne pas. - Annulation : libre tant que le rendu attend son tour. Une fois en calcul,
409 render_in_progress, et le clip est livré et facturé. - Pas d'image d'arrivée, d'images clés ni de cohérence renforcée en Ultra.
À prix fixe
Avec un LoRA ou en prolongation d'un clip qui n'a pas été rendu à la seconde, l'Ultra est rendu avec le modèle vidéo complet, à prix fixe :
| Format demandé | Taille livrée | Prix fixe par clip |
|---|---|---|
| 480p ou 720p | Celle du tableau plus haut en 720p (1280 x 768), une demande en 480p est rendue en 720p | 40 crédits |
| 1080p | Celle du tableau plus haut (1920 x 1088) | 60 crédits |
Le prix est fixe par format : son et durée n'y changent rien. L'Ultra commence au 720p : une
demande en 480p est rendue, et facturée, en 720p. POST /videos/quote donne le prix exact. Le 1080p (1920 x 1088) est le plafond, dans tous les modes : la 4K n'est plus proposée. Une taille plus grande est refusée (ultra_4k_unavailable avec quality: "max", resolution_above_quality sans).
- Durée : 481 images au plus, comme un clip (20 s à 24 i/s, 16 s à 30, 8 s à 60). La prolongation et la vidéo longue marchent aussi en Ultra. Une prolongation garde la taille du clip qu'elle continue, et sous le 720p elle est facturée au prix du 720p.
- Temps : plusieurs minutes pour un clip de 5 s, davantage pour un clip de 20 s. Le démarrage peut attendre qu'une grosse carte graphique se libère.
- Pas de transition (
end_image) en Ultra (ultra_incompatible). - Pas d'images clés (
keyframes) en Ultra (keyframes_mode). - Un LoRA de personnage de ton compte s'applique en Ultra comme en mode normal.
Multi-Ref Vidéo
Un clip où jouent 1 à 4 personnages (jusqu'à 12 en Ultra), chacun reconnaissable, dans un décor facultatif, avec au
besoin des objets, des animaux et un lieu enregistrés. Les personnages viennent de
GET /characters : fabriqués à partir d'une photo par l'API, ou dans l'appli.
Les objets, animaux et lieux viennent de GET /subjects. Ajoute
l'objet multiref à POST /videos (droit videos) et désigne chaque personnage par @Nom dans le
prompt :
{
"prompt": "@Lea walks toward @Tom in a sunny kitchen and hands him a cup. Sound: footsteps, soft music.",
"multiref": {
"characters": [
{ "character_id": "chr_8f3a...", "name": "Lea", "description": "a 28 year old woman with long red hair" },
{ "character_id": "chr_21bc...", "name": "Tom", "description": "a 30 year old man", "strength": 1.2 }
],
"background_b64": "<facultatif : image du décor>",
"background_description": "a sunny kitchen"
},
"width": 1088, "height": 1920,
"audio": true
}Champ de multiref | Rôle |
|---|---|
characters[].character_id | Un personnage de GET /characters |
characters[].name | Un mot (lettres, chiffres, _), celui écrit après @ dans le prompt |
characters[].description | Une courte description en anglais ; par défaut, son kind |
characters[].strength | Poids de la ressemblance, de 0 à 2 (1 par défaut) |
characters[].sheet_id | Facultatif : la sheet à utiliser pour un personnage qui en a plusieurs (la plus récente par défaut) |
characters[].voice | Avec "audio": true, characters[0] et characters[1] : character (par défaut) est la voix de sa fiche quand elle est en ligne (has_voice sur le personnage), sinon une voix faite par le modèle ; generated demande une voix faite par le modèle. La réponse dit laquelle a servi (voices). |
characters[].voice_b64 | Facultatif, characters[0] et characters[1] seulement, avec "audio": true : une autre voix pour le personnage, un fichier audio (WAV, MP3, OGG, FLAC) en base64, 4 Mo au plus (un extrait court suffit), qui passe devant celle de la fiche |
background_b64, background_description | Décor facultatif : une image et quelques mots en anglais |
- Prompt en anglais, un paragraphe au présent ;
Sound:pour le son, répliques entre guillemets,exactly 2 peopleet la place de chacun si utile, pas de négations. Une créature se décrit par sa nature. Un@Nomqui ne désigne aucun personnage est refusé (unknown_mention). - Formats (
widthxheight) : portrait 480 x 832, 720 x 1280, 1088 x 1920 ; paysage 832 x 480, 1280 x 720, 1920 x 1088 ; carré 480 x 480, 720 x 720, 1088 x 1088. Pas de 4K ; le 480p en Qualité seulement. - Modes : Qualité (par défaut), ou Ultra (
quality: "max"). Pas de prolongation ni de transition. - Durée : automatique (
duration_auto, par défaut), ou fixe avecduration_auto: falseetlength121 (5 s), 241 (10 s) ou 481 (20 s) à 24 i/s ; à une autre cadence, les mêmes durées comptées en images, 481 au plus (à 30 : 145, 297, 481 ; à 60 : 297, 481). - Cadence :
fps24, 30 (par défaut) ou 60, comme un clip ;lengthse compte à cette cadence, 481 images au plus (16 s à 30, 8 s à 60). - Prix : celui d'un clip. En Qualité, le forfait du format dans la grille plus haut, doublé
avec le son ; le 480p sans son reste à 5 crédits (le prix bas de la Qualité
ne s'applique pas au Multi-Ref).
POST /videos/quoteavec"multiref": truedonne le prix exact. - Le serveur met les vues au format exact de la vidéo : envoie les personnages tels quels. Un
personnage qui n'a qu'une vue est rendu, avec
warningslimited_likenessdans la réponse : la ressemblance est limitée. - Voix des fiches : avec du son,
characters[0]etcharacters[1]parlent avec la voix de leur fiche par défaut, quand elle est en ligne (has_voice) ;voicegeneratedlaisse le modèle en faire une. La réponse donne la voix de chacun dansvoices(character_id,voice:character,customougenerated). - Voix des personnages (
voice_b64) : le modèle fait parler le personnage avec cette voix, lèvres comprises ; le serveur en prend les 5 premières secondes. Deux voix au plus, surcharacters[0]etcharacters[1](le moteur supporte 2 voix). Rangecharactersdans l'ordre du dialogue :characters[0]parle en premier,characters[1]lui répond. Il faut du son ("audio": true), sinonvoice_requires_audio; une voix sur un autre personnage :voice_slot; un fichier illisible :unsupported_audio_format; plus de 4 Mo :audio_too_large. Seules les 5 premières secondes servent : envoie un extrait court. Le corps entier de la requête ne dépasse pas 30 Mo (au-delà, un413sans corps JSON). Sans supplément de prix. - Le suivi, le téléchargement et l'annulation sont ceux d'une vidéo (voir plus haut).
Objets, animaux et lieux enregistrés. Deux champs de plus de multiref font jouer les
sujets que tu as enregistrés à partir de tes images :
Champ de multiref | Rôle |
|---|---|
subjects[] | Objets et animaux (subject_id, puis name, description, strength facultatifs). Ils partagent les emplacements avec les personnages : 4 références au plus en tout ; en Ultra, jusqu'à 30 images en tout (voir plus bas). |
location | Un lieu enregistré comme décor (subject_id, puis name, description, strength facultatifs) : ses images, avec une force propre. Il remplace background_b64 (les deux ensemble : multiref_incompatible). Il faut au moins un personnage, objet ou animal avec lui. |
name vaut par défaut le premier mot du nom du sujet, et chaque @Nom du prompt se reconnaît comme
celui d'un personnage. Un lieu passé dans subjects, ou un objet passé en location, est refusé
(invalid_subject_type). Le prix ne change pas : c'est celui d'un clip. Un sujet joue avec ses 5 premières images (toutes en Ultra, 6 au plus).
"multiref": {
"characters": [{ "character_id": "chr_8f3a...", "name": "Lea" }],
"subjects": [{ "subject_id": "sub_1c2d...", "name": "Rex" }],
"location": { "subject_id": "sub_9e8f...", "name": "Loft" }
},
"prompt": "@Lea throws a ball to @Rex across @Loft. Sound: barking, laughter."En Ultra, un clip Multi-Ref suit les règles de l'Ultra facturé à la seconde : même prix à la seconde, son compris, de 4 à 30 s à 24 images par seconde (5 s en durée automatique), du 480p au 1080p, sans graine.
- Chaque personnage part avec sa character sheet (ou, s'il n'en a pas, avec toutes ses images), le tout assemblé par le serveur en une seule image. Chaque objet, animal ou lieu part avec toutes ses images (6 au plus).
- Le premier rendu d'un personnage prépare cette image, ce qui prend quelques dizaines de secondes de plus. Son
jobIdcommence alors parsdp-et se suit comme les autres. - Pas de voix :
voice_b64et la voix de la fiche sont ignorées (warningsvoice_ignored), etstrengthn'a pas d'effet. - Le moteur peut refuser une image de référence, un visage réel par exemple. Le rendu finit alors en
failedavec la raison, et rien n'est débité.
Styles, tenues et mouvement. En Ultra seulement (quality: "max"), trois champs de plus dans multiref ; ailleurs, la requête est refusée (multiref_ultra_only), jamais rendue sans eux.
Champ de multiref | Rôle |
|---|---|
styles[] | Des styles enregistrés (subject_id, puis name, description facultatifs) : tout le clip prend leur rendu (technique, lumière, couleurs, textures), jamais leur contenu. |
outfits[] | Des tenues enregistrées (mêmes champs, plus worn_by), portées telles que sur leurs images. worn_by (facultatif) est le name d'un des personnages : il ajoute « <Nom> wears <Tenue>. » en tête de la scène. Sans lui, écris-le dans le prompt : @Lea wears @RedGown. |
motion | Une vidéo de mouvement de 4 à 30 s : { "motion_id": ... } (déposée par POST /motions) ou { "video_b64": ... } (MP4, MOV, WebM ou MKV, 20 Mo au plus), et une description facultative du mouvement, en anglais. mode dit ce que le clip en reprend : camera (par défaut), son mouvement de caméra, son cadrage et son rythme ; choreography, les mouvements du corps, les gestes et leur rythme. Jamais la personne ni le lieu de la vidéo ; même prix dans les deux modes. Le serveur la ramène à environ 410 000 pixels (856 × 482 en 16:9), à 24 images par seconde, sans son ; son rapport largeur/hauteur va de 0,4 à 2,5. |
- 30 images au plus en Ultra, personnages, sujets, styles, tenues et lieu confondus (
multiref_too_many_images), dont 12 personnages au plus (multiref_characters_requiredau-delà). 8 sont conseillés : de 9 à 12, le rendu part avecwarningsmany_characters, car certains peuvent manquer ou se mélanger. Un style hors destyles, ou une tenue hors deoutfits, est refusé (invalid_subject_type). -
Prix du mouvement : 3 crédits par seconde de la vidéo de mouvement (arrondie à la seconde supérieure), en plus du rendu, lus dans
GET /pricing(ultra.motion_per_second) ;POST /videos/quoteavec le mêmemultiref.motiondonnemotion_secondset le prix exact. - Dépôt direct, pour une vidéo de mouvement lourde :
POST /motionsavec{ "size": <octets> }(20 Mo au plus) rendmotion_id,upload_url,headersetexpires_in(900 s) ; envoie le fichier parPUT upload_urlavec exactement cesheaders, puis passemultiref.motion.motion_idàPOST /videosdans les 2 heures. Unmotion_idsert à un rendu.
"quality": "max",
"multiref": {
"characters": [{ "character_id": "chr_8f3a...", "name": "Lea" }],
"styles": [{ "subject_id": "sub_a1b2..." }],
"outfits": [{ "subject_id": "sub_c3d4...", "name": "RedGown", "worn_by": "Lea" }],
"motion": { "motion_id": "4f0c2a9b1d7e6a35", "description": "a low tracking shot from the side" }
},
"prompt": "@Lea walks along a seaside promenade at sunset."Les codes d'erreur des styles, des tenues et du mouvement sont dans Limites et erreurs.
Avec le serveur MCP, l'agent fait tout cela avec tendre_multiref_video : demande la
scène et nomme les personnages, les objets, les animaux et le lieu (subjects, location_id).
Face swap
La personne filmée dans ta propre vidéo devient un de tes personnages :
visage, cheveux, corps et tenue (ou la tête seule, voir part), en gardant ses gestes, ses lèvres et le décor, et sa voix sauf si le personnage a la sienne (voir voice). C'est le
Face swap de l'appli (le remplacement de personnage), sur un passage de 20 s au
plus : un seul personnage, sans enchaînement ni transition. La requête : POST /faceswap (droit
videos) :
{
"video_b64": "<la vidéo en base64 : MP4, MOV, WebM ou MKV, 20 Mo au plus>",
"character_id": "chr_8f3a...",
"start": 2,
"duration": 6,
"scene": "@Lea wears a long red coat.",
"zone": "normal",
"likeness": 1
}| Champ | Rôle |
|---|---|
video_b64 | La vidéo, 20 Mo au plus, avec une personne bien visible. Au-delà, coupe-la ou compresse-la avant, ou passe par l'outil MCP tendre_face_swap, qui prend jusqu'à 95 Mo. |
character_id, sheet_id | Un personnage de GET /characters, et sa sheet s'il en a plusieurs (la plus récente par défaut). |
name | Facultatif, 60 caractères au plus : son nom, par défaut celui de sa fiche dans GET /characters. Un personnage créé dans l'appli n'a son nom en ligne qu'une fois envoyé par l'appli (appli 0.9.1 et suivantes ; sinon name vaut null dans GET /characters) : donne-le pour l'appeler par @Nom dans scene, sinon appelle-le Image 1. |
start, duration | Le passage, en secondes : à partir de start (0 par défaut), pendant duration (par défaut jusqu'à la fin de la vidéo, 20 s au plus). |
scene | Facultative, en anglais, 400 caractères au plus : ce qui doit changer ou être précisé. Le personnage s'y désigne par @Nom (le premier mot de son nom, voir name) ou Image 1. Sans scène, il bouge exactement comme la personne filmée. Ne jamais y faire parler le personnage ni décrire sa bouche, son regard ou sa tête (« says », « looks at the camera », « smiles ») : il les recopie de la vidéo, et une consigne les lui fait inventer, lèvres décalées et tête tournée. Écris ce qui change autour : tenue, accessoire, lumière. |
description | Facultative, en anglais, 360 caractères au plus : qui il est (« a 28 year old woman with long red hair, wearing a black leather jacket »). Par défaut, sa fiche : sa nature (kind) et sa tenue. |
part | full (par défaut) : le personnage entier. head : la tête seule (visage et cheveux) ; le corps filmé, les vêtements et le décor restent. Le personnage est alors rendu à partir des trois portraits de sa character sheet, recadrés à la tête (heads_only dans la réponse) ; un personnage d'une ou deux vues les garde entières. Sa description par défaut ne donne que sa nature (kind), sans la tenue, et zone vaut tight par défaut. |
zone | L'espace autour de la silhouette filmée où le personnage peut être dessiné : tight (serrée), normal (par défaut) ou wide (large : de la place pour de grandes oreilles, des ailes, une carrure imposante). Avec part head, c'est l'espace autour de la tête, tight par défaut. |
likeness | La ressemblance à sa fiche, de 0,5 à 2 (1 par défaut). |
audio | true par défaut : le son de la vidéo est gardé, les lèvres calées dessus. false : une vidéo muette. |
voice | character (par défaut) : le son de la vidéo est converti dans la voix de la fiche du personnage quand elle en a une en ligne (has_voice dans GET /characters), dans le même rendu et sans changer son rythme : les lèvres restent calées. Sans voix de fiche, la voix filmée reste. original : garder la voix filmée. La réponse dit laquelle a servi (voice : character, custom, original, ou none sans son). |
voice_b64 | Facultative, avec du son : une autre voix pour le personnage (WAV, MP3, OGG, FLAC, 2 Mo au plus ; ses 20 premières secondes servent), qui passe devant celle de la fiche. Le son de la vidéo est converti dans cette voix, sans changer son rythme. |
seed | Graine du rendu, de 0 à 4294967295, pour le refaire ou le décliner. |
Vidéo et voix ensemble : 22 Mo au plus, pour que le corps de la requête reste sous 30 Mo (au-delà,
un 413 sans corps JSON).
- Le serveur prépare tout. Il coupe le passage, le met à la cadence de travail (30 i/s pour une source à 29 i/s ou plus, 50 et 60 compris, 24 en dessous) et au format de travail (multiples de 128, petit côté de 768, le rapport le plus proche de ta vidéo), et met les vues du personnage à ce format.
- Ce que tu récupères : la vidéo du passage au format de travail, environ 1 million de pixels (768 x 1408 pour une vidéo verticale, par exemple), aux proportions de ta vidéo à 5 % près. La pleine résolution et l'enchaînement de plusieurs personnages restent propres à l'appli tendre.AI sur ordinateur : elle recolle le personnage sur la vidéo d'origine, dans sa pleine résolution, et enchaîne plusieurs personnages.
- Prix : 6 crédits par seconde du passage préparé (
secondsdans la réponse), arrondi au crédit supérieur. La réponse donnejobId,seed,costet le passage préparé (width,height,length,fps,seconds,audio,voice,views,part). Un personnage qui n'a qu'une vue est rendu, avecwarningslimited_likeness. - Pas de devis : ni
POST /videos/quoteni letendre_quotedu MCP ne connaissent le Face swap. Pour calculer le prix avant de soumettre, lisgrid.body_swapdansGET /pricing: secondes du passage xper_block_720p(le prix d'un bloc) /block_seconds(la durée d'un bloc), arrondi au crédit supérieur. - Certaines scènes sont rendues à partir des trois portraits du personnage recadrés à la tête
(
heads_onlydans la réponse), et la tenue de ses vues n'est plus imposée : c'est la scène qui décide. - Un Face swap compte comme un usage du personnage et repousse son effacement, comme le Multi-Ref.
- Le suivi, le téléchargement et l'annulation sont ceux d'une vidéo (voir plus haut) :
GET /videos/{jobId},GET /videos/{jobId}/file,POST /videos/{jobId}/cancel. - Erreurs propres :
video_required,video_too_large,unreadable_video,invalid_start,passage_too_short,invalid_duration,invalid_zone,invalid_likeness,invalid_scene,invalid_description,invalid_character_name,invalid_part,invalid_voice_choice,character_required,unknown_character,audio_too_large(une voix de plus de 2 Mo),face_swap_too_large(le passage reste trop lourd une fois préparé : raccourcisduration),server_busy(deux vidéos déjà en préparation : réessaie aprèsRetry-After, 20 s),face_swap_unavailableetface_swap_price_missing(Face swap fermé, ou sans prix : réessaie plus tard). Le sens de chacune : Limites et erreurs. - Ta vidéo transite par nos serveurs le temps d'être préparée, puis part vers la carte graphique qui fait le rendu, comme toute image source.
N'utilise que des vidéos de personnes qui ont donné leur accord : c'est une règle des conditions d'utilisation.
Avec le serveur MCP, l'agent fait tout cela avec tendre_face_swap.