Pro API: video's met geluid genereren

Een clip vanuit een prompt, of een animatie van een stilstaand beeld dat je aanlevert. Het bestand is een MP4, met geluid als je daarom vraagt.

Een video indienen

POST /videos

json
{ "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 }
VeldTypeStandaardWat het doet
promptstringverplichtDe actie, de sfeer, het licht. Beschrijf de beweging.
width, heightint720 x 1280Standaard verticaal. Zie de prijstabel hieronder.
qualitystringmax: Ultra-modus (de fijnste render), zie Ultra-modus.
consistencystringstandardenhanced: versterkte consistentie, stabielere beweging, gezichten en achtergrond over tijd, tot 721 frames per shot (30 s bij 24 fps, 24 s bij 30), extensies inbegrepen. Alleen in Kwaliteit-modus. Zie Versterkte consistentie.
modestringltx25ltx25: engine 2.5 (geluid, automatische duur, 1080p, eindframe). turbo: buiten gebruik op 11 oktober 2026; een turbo-verzoek wordt gerenderd in Kwaliteit 480p (zelfde oriëntatie, zelfde lengte, maximaal 241 frames, vaste lengte), tegen de prijs van Kwaliteit 480p.
duration_autobooltrueDe engine kiest de lengte op basis van de prompt, tot 20 s bij 24 fps (16 s bij 30, 8 s bij 60: het maximum telt frames, zie fps), en length wordt dan genegeerd. Zet op false voor een vaste lengte, opgegeven via length. Met consistency enhanced boven 30 fps is de lengte altijd vast (fps_requires_fixed_duration anders).
lengthint121Lengte in frames, op de fps-snelheid, altijd van de vorm 8n+1; de duur is (length - 1) / fps. Maximaal 481 (721 met consistency enhanced). Bij 24 fps: 73 (3 s), 121 (5 s), 241 (10 s), 361 (15 s), 481 (20 s; 721, dus 30 s, in enhanced). Bij 30: 241 (8 s), 481 (16 s; 721, 24 s). Bij 60: 241 (4 s), 481 (8 s; 721, 12 s). Gebruikt voor een vaste lengte (duration_auto op false); genegeerd bij automatische duur.
fpsint30Framerate, in frames per seconde: 24, 30 of 60. Standaard 30, de aanbevolen instelling (vloeiende beweging); 60, het vloeiendst; 24, de bioscoopsnelheid. 50, alleen met consistency enhanced, geeft een lichte slowmotion (ongeveer 0,83x: de engine stelt de beweging in voor 60 en speelt af op 50). length telt frames op deze snelheid. De prijs verandert niet (vast tarief per clip); de maximale lengte wel, omdat die in frames telt. Een extensie behoudt de framerate van de vorige clip, een reeks die van zijn eerste shot. Een snelheid die de modus niet heeft: invalid_fps, dat de beschikbare snelheden opsomt.
audioboolfalseGeluid gegenereerd samen met het beeld (sfeer, stem). Verdubbelt de prijs van de clip (zie Formaten en prijs).
imagestringBeginframe in base64: de video animeert dit beeld.
end_imagestringEindframe in base64, samen met image: de clip gaat van het ene naar het andere over (alleen engine 2.5). Een overgang wordt gerenderd in het gevraagde formaat, van 480p tot 1080p, en wordt gefactureerd als een clip van dat formaat.
keyframesarrayKeyframes (Kwaliteit-modus): 1 tot 4 objecten { "image": base64, "at": seconds, "strength": 0.1 to 1 (1 by default) }. De clip toont elk beeld op het opgegeven moment, bijvoorbeeld een personage in het midden van een shot dat begint en eindigt op een lege locatie. De lengte wordt vast (length, duration_auto geforceerd op false); 0 < at < lengte, minimaal 0,5 s tussen twee keyframes; nauwkeurig tot ongeveer een derde van een seconde. Werkt samen met image en end_image. Niet in Ultra of Multi-Ref; in een extensie alleen met consistency enhanced (zie Versterkte consistentie). Zelfde prijs als een clip van hetzelfde formaat.
lora, lora_strengthstring, numberEen getraind personage op het account (name uit GET /loras) en diens sterkte (0 tot 1).
lora2, lora2_strengthstring, numberEen tweede personage.
multirefobjectCast 1 tot 4 personages (12 in Ultra) uit GET /characters, plus opgeslagen objecten, dieren en een locatie uit GET /subjects, opgeroepen via @Naam in de prompt, zie Multi-Ref Video.
seedintwillekeurigSeed van de render, van 0 tot 4294967295. Zelfde seed, zelfde prompt, zelfde beeld en zelfde instellingen (formaat, lengte, geluid, modus): dezelfde clip, met kleine verschillen als de videokaart verandert. Bij automatische duur kan een anders gekozen lengte de clip veranderen: voor een strikte reproductie zet je duration_auto op false en geef je length op.
stepsintengineLeeg laten.

Standaard framerate: 30 fps. Clips werden vroeger gerenderd op 24 fps. Zonder fps is een clip van dezelfde length dus korter dan voorheen (241 frames: 8 s in plaats van 10 s). Stuur "fps": 24 om het vroegere gedrag te behouden.

Het antwoord:

json
{ "jobId": "...", "seed": 908172, "cost": 30 }

De kosten worden berekend en bekendgemaakt bij het indienen, voordat er iets wordt afgeschreven. De seed wordt ook teruggegeven, of je hem nu zelf hebt opgegeven of hij willekeurig is gekozen.

Formaten en prijs

Een video wordt per formaat geprijsd, als een vast tarief onafhankelijk van de lengte. Basis: 5 credits.

Het vaste tarief wordt vermenigvuldigd met 2 bij 720p en met 3 bij 1080p, waarna geluid de prijs verdubbelt. De factoren worden toegepast op het basistarief, niet op elkaar: 1080p met geluid kost 5 x 3 x 2 = 30 credits. Tot 481 frames, dus 20 s bij 24 fps, verandert de lengte niets (5 s of 20 s, zelfde tarief). Boven 481 frames (tot 721, alleen met consistency enhanced, vaste lengte) wordt de prijs van het formaat verdubbeld. De framerate (fps) verandert de prijs niet, maar de drempels tellen frames: bij 30 fps geldt de normale prijs tot 16 s; bij 60 tot 8 s (12 s bij dubbele prijs in enhanced).

Eén uitzondering: in Kwaliteit kost 480p zonder geluid 2 credits, ongeacht de lengte (vanaf 11 oktober 2026). Multi-Ref en versterkte consistentie houden het vaste tarief van het formaat, 5 credits.

FormaatKorte zijdeVoorbeeldformatenZonder geluidMet geluid
480p480480 x 832, 832 x 4802 (5 in Multi-Ref en versterkte consistentie)10
720p720720 x 1280, 1280 x 7201020
1080p10801080 x 1920, 1920 x 10801530

Het formaat dat je terugkrijgt. De engine werkt in veelvouden van 32 en in twee stappen, waardoor het bestand uitkomt op 768 x 1280 (of 1280 x 768) voor 720p en 1088 x 1920 (of 1920 x 1088) voor 1080p. 480p blijft op 480 x 832 (of 832 x 480), behalve bij versterkte consistentie. Handig om te weten als je onze renders samenvoegt of er iets overheen legt.

De turbo-modus is buiten gebruik gesteld op 11 oktober 2026: een turbo-verzoek wordt gerenderd in Kwaliteit 480p en dienovereenkomstig geprijsd (2 credits zonder geluid, 10 met geluid).

De prijs kennen vóór het indienen

POST /videos/quote accepteert dezelfde body als POST /videos en voert dezelfde berekening uit, maar er wordt niets aangemaakt: geen render, geen credits gereserveerd, geen quota verbruikt. Roep dit aan voordat je je vastlegt, met name vanuit een agent die met een budget werkt.

json
{ "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 legt de berekening uit; fps is de gebruikte framerate en seconds_max de maximale duur in seconden op die snelheid. Met "consistency": "enhanced" accepteert de quote een vaste lengte tot 721 frames en past het tarief toe boven 481 frames (x 2 (over 20 s) in detail bij 24 fps, x 2 (over 481 frames) bij een andere snelheid). Dezelfde route bestaat voor afbeeldingen, POST /images/quote, die altijd antwoordt met { "cost": 1, ... }: een afbeelding kost altijd 1 credit.

Voor een Ultra-clip die per seconde wordt gefactureerd, geeft de offerte de gefactureerde lengte in seconds, en detail splitst de prijs per seconde uit.

Pollen, downloaden, annuleren

Dezelfde routes als voor afbeeldingen, onder /videos.

  • GET /videos/{jobId}: pending / completed / failed, zelfde velden. Een versterkte extensie kan eindigen als failed met "error": "extension_not_applied" (de engine heeft het einde van de vorige clip niet opgepakt): er worden geen credits afgeschreven, dien opnieuw in.
  • GET /videos/{jobId}/file: de MP4 (Content-Type: video/mp4).
  • POST /videos/{jobId}/cancel: annuleert, en er worden geen credits afgeschreven.

Bij Ultra per seconde stopt een render die al wordt berekend niet meer: de annulering antwoordt 409 render_in_progress, en de clip wordt geleverd en gefactureerd. Een clip die de engine bij de uitvoer weigert, eindigt als failed, met een zin in detail en de code van de engine in reason: er wordt niets afgeschreven.

Een video duurt 1 tot 5 minuten, langer wanneer de engine koud opstart. Poll elke 3 seconden en download zodra de status completed is: het bestand wordt niet gearchiveerd.

Meerdere shots in één clip

Eén prompt kan meerdere shots bevatten met harde overgangen, tot 20 seconden in totaal bij 24 fps (16 s bij 30, de standaard). Beschrijf ze op volgorde: Shot 1: <kadrering>, <actie>. Cut to Shot 2: .... Herhaal in elk shot wat gelijk moet blijven (personage, outfit, locatie, licht), en sluit af met één regel gedeelde sfeer.

Laat timecodes weg: houd duration_auto aan, en de engine kiest de lengte (tot 20 s bij 24 fps, 16 s bij 30) en waar te knippen. Twee tot vier shots per clip werken het best.

text
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.

Meerdere shots in één clip, of een reeks? Ze dienen een ander doel:

Meerdere shots in één clipReeks (extensies)
Tussen shotsHarde overgangenGeen overgang: elk shot zet de beweging voort
LengteMaximaal 20 s bij 24 fps (16 s bij 30)Langer
RendersEénEén per shot
PrijsEén clipEén clip per shot

Een clip verlengen

Een clip kan worden verlengd: het volgende shot zet de beweging van het vorige voort, zonder onderbreking op de overgang. Het wordt gestuurd door ongeveer de laatste seconde van de vorige clip, niet door één stilstaand frame. Voeg toe aan POST /videos:

VeldTypeStandaardWat het doet
extend_job_idstringDe te verlengen clip: een render van je licentie, kort na voltooiing opgehaald.
extend_framesint25Hoeveel van het einde van de clip het volgende shot stuurt, in frames: 9, 17, 25, 33, 41 of 49 (25 is ongeveer 1 s bij 24 fps).
extend_videostringIn plaats van extend_job_id: het einde van een clip die je zelf hebt, als een base64 MP4 van exact extend_frames frames, maximaal 8 MB.

Het verlengde shot behoudt de resolutie van de vorige clip: width en height worden genegeerd met extend_job_id, en met extend_video wordt het formaat gelezen uit het bestand dat je stuurt. Het bevat alleen de nieuwe frames, zodat de shots aan elkaar gelegd één doorlopende video vormen. Het behoudt de framerate van de vorige clip: laat fps weg (het overneemt die van de vorige) of geef dezelfde op; een andere wordt geweigerd (extend_fps_mismatch). length is de nieuwe duur van het shot (121 = 5 s meer bij 24 fps), en die is exact: automatische duur geldt niet voor een extensie. Een extensie kost de prijs van een clip.

Beperkingen: geen eindframe of keyframes tegelijk, behalve met versterkte consistentie.

Het geluid loopt door op de overgang. Met audio: true, wanneer het einde van de vorige clip een geluidsspoor heeft, pakt het nieuwe shot dat geluid op in plaats van een nieuw te maken. Met extend_job_id behoudt het afgesneden einde het geluid van de clip; met extend_video stuur je het einde met zijn geluid mee. Zonder geluidsspoor in dat einde, bij versterkte consistentie en in Ultra, begint het geluid opnieuw bij het shot: houd dezelfde sfeer in elke prompt aan, zodat de overgang zo weinig mogelijk hoorbaar is.

Verleng een clip kort nadat hij klaar is. Later is hij bij ons niet meer beschikbaar (clip_unavailable), en stuur je zelf het einde op via extend_video.

Een Ultra-shot verlengen, vooruit of achteruit

Een shot dat in Ultra per seconde is gerenderd, wordt ook in Ultra verlengd, vooruit of achteruit; elke andere clip wordt verlengd zoals hierboven. Stuur POST /videos met "quality": "max" en:

VeldTypeStandaardWat het doet
extend_job_idstringHet te verlengen Ultra-shot, minder dan 24 uur geleden gerenderd met je licentie.
extend_upload_idstringIn plaats daarvan, voor een ouder shot: de id die POST /extensions (hieronder) teruggeeft, zodra het originele bestand is geüpload.
extend_directionstringforwardforward rendert wat volgt; backward rendert de momenten vlak ervoor, om vóór het shot te monteren.
  • De render bevat alleen het nieuwe deel, zo lang als een Ultra-clip (length / fps, 5 s bij automatische duur). Hij neemt de resolutie van het shot over (width en height worden genegeerd) en sluit aan op het laatste frame (forward) of het eerste (backward).
  • Geen startafbeelding, referenties (multiref), beweging of versterkte consistentie. backward gaat niet in een reeks, die haar shots achter elkaar plaatst.
  • Prijs: het nieuwe deel tegen de Ultra-prijs per seconde, plus per seconde van het verlengde shot 2 credits in 480p, 5 in 720p en 13 in 1080p (ultra.extend_per_second in GET /pricing). Die seconden worden naar boven afgerond op de seconde (tot op 0,1 s) en tellen bij 24 frames per seconde: een shot met een hogere framerate telt naar verhouding (2 s bij 60 fps tellen als 5 s). POST /videos/quote met dezelfde velden geeft extend_seconds en de exacte prijs.
  • Een shot ouder dan 24 uur: upload het originele bestand, zoals geleverd door GET /videos/{jobId}/file. POST /extensions met { "size": <bytes> } geeft upload_id, upload_url, headers en expires_in (900 s); stuur het bestand met PUT upload_url en precies die headers, en geef daarna binnen 2 uur extend_upload_id door. Een upload dient voor één render: een MP4 van 4 tot 30 s, maximaal 60 MB en 1080p. Vóór de render wordt elke video die naar de Ultra-modus gaat (een beweging of een te verlengen video) gecontroleerd, en er wordt niets afgeschreven als hij wordt geweigerd (400 input_video_out_of_limits): 24 tot 60 beelden per seconde, een verhouding breedte/hoogte van 0,4 tot 2,5 en per render maximaal 30 s en 10 bestanden voor de video's en referentiegeluiden samen. Bij een realistisch gezicht wordt een opnieuw gecodeerd of bewerkt bestand geweigerd (400 engine_refused): alleen het origineel komt erdoor. Een video die niet in de Ultra-modus is gerenderd (de render van een andere modus, bijvoorbeeld) wordt niet in Ultra verlengd als er een realistisch gezicht in staat (400 extension_real_face, er wordt niets afgeschreven): verleng hem in Kwaliteit-modus, of maak de shot opnieuw in Ultra.

Versterkte consistentie

Met "consistency": "enhanced" wordt de clip gerenderd door een modus die beweging, gezichten en achtergrond stabieler houdt over tijd. Hij gaat tot 721 frames per shot, dus 30 s bij 24 fps en 24 s bij 30 (length, vaste lengte) en is vooral bedoeld voor lange video's:

  • Eerste shot: een normale clip (prompt, beginframe, keyframes, end_image), tot 721 frames.
  • Extensie: extend_job_id (of extend_video) zoals bij Een clip verlengen, met dezelfde consistency. length is nog steeds de nieuwe duur (tot 721, dus 30 s meer bij 24 fps). Een versterkte extensie accepteert ook keyframes, waarvan at telt vanaf het eerste nieuwe frame, en een eindframe end_image, geplaatst op het laatste frame van het shot: bijvoorbeeld het beginframe van het eerste shot, zodat een lange video als loop werkt.

Alleen in Kwaliteit-modus (mode ltx25, zonder quality: "max"), tot 1080p, niet in Multi-Ref (400 consistency_mode). Prijs: het vaste tarief van het formaat (480p zonder geluid: 5 credits) tot 481 nieuwe frames (20 s bij 24 fps), verdubbeld daarboven (zie de prijstabel hierboven). Framerates: 24, 30, 50 of 60. Boven 30 is de lengte vast (fps_requires_fixed_duration anders); 50 geeft een lichte slowmotion (zie fps). De render duurt langer dan een standaard clip, en het begin kan wachten op een grotere videokaart (lange shots). Een reeks behoudt dezelfde consistency voor alle shots. Geleverd formaat: hetzelfde als in Kwaliteit bij 720p en 1080p; bij 480p komt de korte zijde uit op 448 (448 x 832, 832 x 448, 448 x 448), omdat deze modus werkt in veelvouden van 64.

Sommige prompts worden nog niet ondersteund. Daarvoor wordt een enkel shot van 20 s of korter (15 s met een end_image, bij een vaste lengte) gerenderd in standaard consistentie, tegen dezelfde prijs. Daarboven (length boven 481 met duration_auto: false, of boven 361 met een end_image), in een extensie of in een reeks, wordt het verzoek geweigerd met 400 consistency_explicit: verkort het shot of vraag consistency: "standard".

Lange video (reeksen)

Een clip duurt maximaal 481 frames, dus 20 s bij 24 fps (721 met versterkte consistentie, 30 s bij 24 fps). Voor langer brengt een reeks elk shot in zodra de render klaar is, en voegt ze daarna samen tot één MP4 zonder opnieuw te encoderen. Een minuut is bijvoorbeeld 3 shots van 20 s, of 2 shots van 30 s in versterkte consistentie, bij 24 fps.

  1. POST /sequences opent een reeks en antwoordt met { "sequence_id": "seq_...", ... }.
  2. POST /videos met "sequence_id": "seq_..." voor elk shot: het eerste zoals gewoonlijk, de volgende met extend_job_id ingesteld op het vorige shot. Elk shot wordt ingediend in de reeks, op volgorde van indiening, zodra GET /videos/{jobId} aangeeft dat het klaar is.
  3. POST /sequences/{id}/export zodra het laatste shot klaar is. Het antwoord bevat seconds, resolution en file_url.
  4. GET /sequences/{id}/file: de samengevoegde video (MP4).

Daarnaast: GET /sequences/{id} geeft de status (ingediende of nog verwachte shots), POST /sequences/{id}/clips met { "job_id": "..." } dient een render handmatig in, en DELETE /sequences/{id} verwijdert de reeks onmiddellijk.

Regels. Elk shot heeft dezelfde resolutie (extensies behouden die) en dezelfde geluidsinstelling, allemaal met of allemaal zonder geluid, dezelfde consistency en dezelfde framerate (fps): het eerste shot bepaalt ze, en een shot dat afwijkt wordt geweigerd (409 consistency_mismatch, 409 sequence_fps_mismatch; 422 encoding_mismatch voor een handmatig ingediend shot). Een shot zonder fps neemt die van de reeks over. Maximaal 30 shots per reeks en 5 reeksen tegelijk per licentie.

Wat we bewaren en hoe lang. De shots van een reeks in uitvoering worden gewist 30 minuten nadat het laatste is toegevoegd, en de samengevoegde video 24 uur na de export. Daarna is alles verdwenen.

De projectmap exporteren

Een projectmap bundelt in een ZIP alles wat je nodig hebt om een video elders verder te bewerken of te automatiseren: de shots, hun referenties, de montage en een manifest waarmee elke shot opnieuw te renderen is. Hij is gratis: er wordt niets gerenderd.

  • POST /videos/{jobId}/export: een render van POST /videos (losse shot, Multi-Ref, verlenging).
  • POST /sequences/{id}/project: alle shots van een reeks, achter elkaar.
  • Optionele body, dezelfde keuzes als het exportvenster van de app:
    • include_media (standaard true): de video's van de shots en hun ondertekende originelen. false: geen enkele video (geen clip, geen origineel, geen film); de shots houden hun tekst, instellingen en referenties ("state": "expired") en het manifest bevat videos_included: false.
    • include_references (standaard true): de weergaven van de personages en de afbeeldingen van de elementen, in references/. false: er wordt er geen gekopieerd; hun namen, @vermeldingen, id en vingerafdrukken blijven in het manifest (references_included: false).
    • exclude_references: de referenties die niet gekopieerd worden, een voor een, via id (character_id, subject_id), naam of @vermelding, bijvoorbeeld ["@Parc", "chr_..."] (maximaal 200). Het manifest bevat references_included: "partial" en "included": false bij elke uitgesloten referentie (false als ze allemaal uitgesloten zijn). Een item dat geen enkele referentie van de export aanwijst: 400 unknown_reference.
    • include_film (alleen reeks, standaard false): de film van een reeks die al is samengevoegd; vereist include_media (anders 400 invalid_export_options, net als een optie die geen boolean is of een exclude_references dat geen lijst van teksten is).
    • manifest_only: true: alleen het manifest, zonder ZIP.

Het antwoord is { "manifest": { ... }, "file_url": "...", "export_id": "exp_...", "expires_at": "...", "bytes": n }, en GET /exports/{id}/file downloadt de ZIP. Eén export tegelijk per licentie (409 export_in_progress), hoogstens 2 GB (413 export_too_large: exporteer de shots een voor een).

BestandInhoud
tendre-project.jsonHet manifest (schema tendre.project/1, Engelse sleutels). Voor elke shot: de status, de getypte prompt (prompt) en de naar de engine verstuurde (prompt_sent), de instellingen, de seed, de kosten, de verlenging (extends, direction), de referenties gekoppeld aan hun bestanden, en api_request, de body van POST /videos die de shot opnieuw rendert (null als een afbeelding alleen in base64 werd verstuurd); bovenaan references_included: true in de ZIP (de bestanden van de referenties staan in references/), false met manifest_only (referenties zonder bestand: files leeg, alleen sha256-vingerafdrukken); een manifest zonder dit veld (eerdere exports) geldt als true. Een map die de app exporteerde, waarin de klant de referenties één voor één kiest, draagt true, false of "partial", en elke referentie kan included dragen (ontbreekt het: zoals bovenaan, false als daar false staat, anders true); een niet opgenomen referentie houdt haar naam, @vermelding, id en beschrijving, met files leeg. project.settings bevat de instellingen van de eerste shot (quality, width, height, fps, audio, output_format "mp4") en settings_from_shot, de id van die shot. Een map die de app exporteerde kan een app-blok bevatten dat voor de app bestemd is: negeer het
shots/NN/clip.mp4De render van elke shot, zolang de server hem heeft; shots/NN/original.mp4 of .mov: het ondertekende bestand van de engine, byte voor byte, als het nog bestaat
references/De weergaven van de personages en de afbeeldingen van de gebruikte locaties, objecten, dieren, stijlen en outfits
timeline.otio, timeline.fcpxmlDe montage (OpenTimelineIO; FCPXML voor Final Cut Pro en DaVinci Resolve), media via een pad relatief aan de map
film.mp4De samengevoegde video van een reeks, alleen met include_film: true en als die al is samengevoegd (POST /sequences/{id}/export); anders is assembled null in het manifest

Wat we bewaren en hoe lang. Voor elke geaccepteerde POST /videos bewaart de server een fiche van de render zonder enige afbeelding of video: de tekst, de instellingen, de identificaties (een in base64 verstuurde afbeelding laat alleen haar vingerafdruk achter). Die wordt 24 uur na het indienen gewist; daarna antwoordt de export 404 unknown_export. De ZIP wordt 45 minuten na de eerste download gewist, uiterlijk 2 uur na het aanmaken. Een shot die de server niet meer heeft, komt terug met "state": "expired", zonder bestand maar met tekst, instellingen en referenties: een agent kan hem opnieuw renderen met api_request.

Reeks. Het samenvoegen wist de shots een voor een. Wil je de shots en de film, exporteer het project dan voor het samenvoegen, voeg daarna samen en exporteer opnieuw met { "include_film": true }: de film komt erbij, en de shots komen dan terug als expired.

Ultra-modus

De Ultra-modus is de fijnste videorender. Voeg "quality": "max" toe aan POST /videos (met mode ltx25, de standaard). Hij wordt per seconde gefactureerd, of tegen een vaste prijs met een LoRA of bij een extensie van een clip die niet per seconde is gerenderd; het verlengen van een Ultra-shot, vooruit of achteruit, wordt per seconde gefactureerd. POST /videos/quote geeft de exacte prijs van je aanvraag.

Per seconde

De clip wordt per seconde gefactureerd volgens zijn resolutie, geluid inbegrepen:

ResolutiePrijs
480p4 credits per seconde
720p8 credits per seconde
1080p20 credits per seconde
  • Lengte: 4 tot 30 s bij 24 beelden per seconde, bekend vóór de render: 5 s bij automatische lengte (duration_auto, de standaard), anders length / fps (24 als fps ontbreekt), afgerond op de seconde.
  • Formaat: het gevraagde, in de dichtstbijzijnde verhouding; 480p wordt in 480p gerenderd. Boven 1080p: resolution_outside_ultra.
  • Beginbeeld (image): mogelijk. De engine kan een tekst of een beeld bij het indienen weigeren: 400 engine_refused, met de reden in detail en de code in code; er wordt niets afgeschreven.
  • Geen seed: seed wordt genegeerd en het antwoord geeft er geen.
  • Annuleren: vrij zolang de render op zijn beurt wacht; zodra hij wordt berekend, 409 render_in_progress, en de clip wordt geleverd en gefactureerd.
  • Geen eindbeeld, geen keyframes en geen versterkte consistentie in Ultra.

Tegen een vaste prijs

Met een LoRA of bij een extensie van een clip die niet per seconde is gerenderd, wordt Ultra gerenderd met het volledige videomodel, tegen een vaste prijs:

Gevraagd formaatGeleverd formaatVaste prijs per clip
480p of 720pZoals in de tabel hierboven bij 720p (1280 x 768), een 480p-verzoek wordt gerenderd in 720p40 credits
1080pZoals in de tabel hierboven (1920 x 1088)60 credits

De prijs is vast per formaat: geluid en lengte veranderen niets. Ultra begint bij 720p: een 480p-verzoek wordt gerenderd en gefactureerd in 720p. POST /videos/quote geeft de exacte prijs. 1080p (1920 x 1088) is het maximum, in elke modus: 4K wordt niet meer aangeboden. Een groter formaat wordt geweigerd (ultra_4k_unavailable met quality: "max", resolution_above_quality zonder).

  • Lengte: maximaal 481 frames, zoals elke clip (20 s bij 24 fps, 16 s bij 30, 8 s bij 60). Extensies en lange video's werken ook in Ultra. Een extensie behoudt het formaat van de clip die hij voortzet, en onder 720p wordt hij gefactureerd tegen de 720p-prijs.
  • Tijd: enkele minuten voor een clip van 5 s, langer voor een clip van 20 s. Het begin kan wachten tot een grote videokaart beschikbaar is.
  • Geen overgang (end_image) in Ultra (ultra_incompatible).
  • Geen keyframes (keyframes) in Ultra (keyframes_mode).
  • Een LoRA van het personage van je account werkt in Ultra net als in de normale modus.

Multi-Ref Video

Een clip waarin 1 tot 4 personages (tot 12 in Ultra) spelen, elk herkenbaar, op een optionele locatie, met opgeslagen objecten, dieren en een opgeslagen locatie wanneer je die nodig hebt. De personages komen uit GET /characters: gemaakt van één foto via de API, of in de app. De objecten, dieren en locaties komen uit GET /subjects. Voeg het multiref-object toe aan POST /videos (toestemming videos) en roep elk personage op via @Naam in de prompt:

json
{
  "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": "<optional: an image of the location>",
    "background_description": "a sunny kitchen"
  },
  "width": 1088, "height": 1920,
  "audio": true
}
Veld van multirefWat het doet
characters[].character_idEen personage uit GET /characters
characters[].nameEén woord (letters, cijfers, _), het woord dat na @ in de prompt wordt geschreven
characters[].descriptionEen korte beschrijving in het Engels; standaard diens kind
characters[].strengthGewicht van de gelijkenis, 0 tot 2 (standaard 1)
characters[].sheet_idOptioneel: welke sheet te gebruiken voor een personage met meerdere sheets (standaard de meest recente)
characters[].voiceMet "audio": true, characters[0] en characters[1]: character (de standaard) is de stem uit zijn profiel als die online is (has_voice bij het personage), anders een stem die het model maakt; generated vraagt om een stem die het model maakt. Het antwoord zegt welke is gebruikt (voices).
characters[].voice_b64Optioneel, alleen characters[0] en characters[1], met "audio": true: een andere stem voor het personage, een audiobestand (WAV, MP3, OGG, FLAC) in base64, maximaal 4 MB (een kort fragment is genoeg), die voorrang heeft op die van het profiel
background_b64, background_descriptionOptionele locatie: een afbeelding en enkele Engelse woorden
  • Prompt in het Engels, één alinea in de tegenwoordige tijd; Sound: voor het geluid, dialoogregels tussen aanhalingstekens, exactly 2 people en waar iedereen staat als dat helpt, geen negaties. Een wezen wordt beschreven door wat het is. Een @Naam die niet overeenkomt met een personage wordt geweigerd (unknown_mention).
  • Formaten (width x height): staand 480 x 832, 720 x 1280, 1088 x 1920; liggend 832 x 480, 1280 x 720, 1920 x 1088; vierkant 480 x 480, 720 x 720, 1088 x 1088. Geen 4K; 480p alleen in Kwaliteit.
  • Modi: Kwaliteit (de standaard), of Ultra (quality: "max"). Geen extensie en geen overgang.
  • Lengte: automatisch (duration_auto, de standaard), of vast met duration_auto: false en length 121 (5 s), 241 (10 s) of 481 (20 s) bij 24 fps; bij een andere snelheid dezelfde duur geteld in frames, maximaal 481 (bij 30: 145, 297, 481; bij 60: 297, 481).
  • Framerate: fps 24, 30 (de standaard) of 60, zoals voor elke clip; length telt frames op deze snelheid, maximaal 481 (16 s bij 30, 8 s bij 60).
  • Prijs: de prijs van een clip. In Kwaliteit het vaste tarief van het formaat in de tabel hierboven, verdubbeld met geluid; 480p zonder geluid blijft op 5 credits (het lage tarief van Kwaliteit geldt niet voor Multi-Ref). POST /videos/quote met "multiref": true geeft de exacte prijs.
  • De server past de beeldhoeken aan op het exacte formaat van de video: stuur de personages zoals ze zijn. Een personage met slechts één weergave wordt gerenderd, met warnings limited_likeness in het antwoord: de gelijkenis is beperkt.
  • Profielstemmen: met geluid spreken characters[0] en characters[1] standaard met de stem uit hun profiel als die online is (has_voice); voice generated laat het model er een maken. Het antwoord geeft de stem van elk personage in voices (character_id, voice: character, custom of generated).
  • Stemmen van personages (voice_b64): het model laat het personage spreken met die stem, inclusief lipsynchronisatie; de server gebruikt de eerste 5 seconden. Maximaal twee stemmen, op characters[0] en characters[1] (de engine ondersteunt 2 stemmen). Zet characters in de volgorde van de dialoog: characters[0] spreekt eerst, characters[1] antwoordt. Geluid is vereist ("audio": true), anders voice_requires_audio; een stem op een ander personage: voice_slot; een onleesbaar bestand: unsupported_audio_format; groter dan 4 MB: audio_too_large. Alleen de eerste 5 seconden worden gebruikt: stuur een kort fragment. De volledige aanvraagtekst blijft onder 30 MB (daarboven een 413 zonder JSON-body). Geen extra kosten.
  • Pollen, downloaden en annuleren verlopen zoals voor elke video (zie Pollen, downloaden, annuleren, hierboven).

Opgeslagen objecten, dieren en locaties. Twee extra velden van multiref casten de onderwerpen die je hebt opgeslagen vanuit je eigen afbeeldingen:

Veld van multirefWat het doet
subjects[]Objecten en dieren (subject_id, dan optioneel name, description, strength). Ze delen de slots met de personages: maximaal 4 referenties in totaal; in Ultra tot 30 afbeeldingen in totaal (zie hieronder).
locationEén opgeslagen locatie als decor (subject_id, dan optioneel name, description, strength): de afbeeldingen ervan, met een eigen sterkte. Vervangt background_b64 (beide tegelijk: multiref_incompatible). Er is minstens één personage, object of dier bij nodig.

name is standaard het eerste woord van de naam van het onderwerp, en elke @Naam in de prompt wordt gekoppeld zoals bij een personage. Een locatie doorgegeven in subjects, of een object doorgegeven als location, wordt geweigerd (invalid_subject_type). De prijs verandert niet: het is de prijs van een clip. Een onderwerp speelt met zijn eerste 5 afbeeldingen (in Ultra met alle, hoogstens 6).

json
"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."

In Ultra volgt een Multi-Ref clip de regels van Ultra per seconde: dezelfde prijs per seconde, geluid inbegrepen, 4 tot 30 s bij 24 beelden per seconde (5 s bij automatische lengte), 480p tot 1080p, geen seed.

  • Elk personage gaat mee met zijn character sheet (of, zonder sheet, met al zijn beelden), en de server voegt alles samen tot één beeld; elk object, dier of elke locatie met al zijn beelden (hoogstens 6).
  • De eerste render van een personage bereidt dat beeld voor, enkele tientallen seconden langer: zijn jobId begint dan met sdp- en wordt gevolgd zoals de andere.
  • Geen stem: voice_b64 en de stem van het profiel worden genegeerd (warnings voice_ignored), en strength heeft geen effect.
  • De engine kan een referentiebeeld weigeren (een echt gezicht, bijvoorbeeld): de render eindigt als failed met de reden, en er wordt niets afgeschreven.

Stijlen, outfits en beweging. Alleen in Ultra (quality: "max"), drie extra velden van multiref; elders wordt het verzoek geweigerd (multiref_ultra_only), nooit zonder gerenderd.

Veld van multirefWat het doet
styles[]Opgeslagen stijlen (subject_id, dan optioneel name, description): de hele clip neemt hun look over (techniek, licht, kleuren, texturen), nooit hun inhoud.
outfits[]Opgeslagen outfits (dezelfde velden, plus worn_by), gedragen zoals op hun afbeeldingen. worn_by (optioneel) is de name van een van de personages: het voegt "<Naam> wears <Outfit>." toe aan het begin van de scène. Zonder dit veld schrijf je het in de prompt: @Lea wears @RedGown.
motionEén bewegingsvideo van 4 tot 30 s: { "motion_id": ... } (geüpload met POST /motions) of { "video_b64": ... } (MP4, MOV, WebM of MKV, maximaal 20 MB), en een optionele description van de beweging in het Engels. mode bepaalt wat de clip ervan overneemt: camera (standaard) de camerabeweging, de kadrering en het ritme; choreography de lichaamsbewegingen, de gebaren en hun ritme. Nooit de persoon of de plek uit de video; dezelfde prijs in beide modi. De server brengt de video terug naar ongeveer 410.000 pixels (856 × 482 in 16:9), op 24 beelden per seconde, zonder geluid; de verhouding breedte/hoogte ligt tussen 0,4 en 2,5.
  • Maximaal 30 afbeeldingen in Ultra, personages, onderwerpen, stijlen, outfits en locatie samen (multiref_too_many_images), waarvan maximaal 12 personages (daarboven multiref_characters_required). 8 worden aanbevolen: van 9 tot 12 wordt de render verwerkt met warnings many_characters, omdat sommige kunnen ontbreken of door elkaar lopen. Een stijl buiten styles, of een outfit buiten outfits, wordt geweigerd (invalid_subject_type).
  • Prijs van de beweging: 3 credits per seconde van de bewegingsvideo (naar boven afgerond op de seconde), bovenop de render, te lezen in GET /pricing (ultra.motion_per_second); POST /videos/quote met dezelfde multiref.motion geeft motion_seconds en de exacte prijs.
  • Directe upload, voor een zware bewegingsvideo: POST /motions met { "size": <bytes> } (maximaal 20 MB) geeft motion_id, upload_url, headers en expires_in (900 s); stuur het bestand met PUT upload_url en precies die headers, en geef daarna binnen 2 uur multiref.motion.motion_id door aan POST /videos. Een motion_id dient voor één render.
json
"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."

De foutcodes van stijlen, outfits en beweging staan in Limieten en fouten.

Met de MCP-server doet de agent dit alles met tendre_multiref_video: beschrijf de scène en noem de personages, objecten, dieren en de locatie (subjects, location_id).

Face swap

De persoon die gefilmd is in je eigen video wordt een van je personages: gezicht, haar, lichaam en outfit (of alleen het hoofd, zie part), met behoud van hun gebaren, lippen en de omgeving, en hun stem tenzij het personage een eigen stem heeft (zie voice). Het is de Face swap van de app, op één passage van maximaal 20 s: één personage, zonder ketening en zonder overgang. Het verzoek is POST /faceswap (toestemming videos):

json
{
  "video_b64": "<the video in base64: MP4, MOV, WebM or MKV, 20 MB at most>",
  "character_id": "chr_8f3a...",
  "start": 2,
  "duration": 6,
  "scene": "@Lea wears a long red coat.",
  "zone": "normal",
  "likeness": 1
}
VeldWat het doet
video_b64De video, maximaal 20 MB, met één duidelijk zichtbare persoon. Daarboven: snij of comprimeer eerst, of gebruik de MCP-tool tendre_face_swap, die tot 95 MB accepteert.
character_id, sheet_idEen personage uit GET /characters, en diens sheet als het er meerdere heeft (standaard de meest recente).
nameOptioneel, maximaal 60 tekens: de naam van het personage, standaard de naam die het heeft in GET /characters. Een personage aangemaakt in de app heeft pas een naam online zodra de app die heeft verstuurd (app 0.9.1 en later; anders is name null in GET /characters): geef er één op om het @Naam in scene te noemen, roep het anders op als Image 1.
start, durationDe passage, in seconden: vanaf start (standaard 0), gedurende duration (standaard tot het einde van de video, maximaal 20 s).
sceneOptioneel, in het Engels, maximaal 400 tekens: wat er moet veranderen of worden verduidelijkt. Het personage wordt opgeroepen als @Naam (het eerste woord van de naam, zie name) of Image 1. Zonder scène beweegt het personage precies zoals de gefilmde persoon. Laat het personage er nooit in spreken en beschrijf nooit zijn mond, blik of hoofd ("says", "looks at the camera", "smiles"): het neemt die over uit de video, en een instructie laat het ze verzinnen, met lippen die niet synchroon lopen en een gedraaid hoofd. Beschrijf wat er rondom verandert: outfit, accessoire, licht.
descriptionOptioneel, in het Engels, maximaal 360 tekens: wie het personage is ("a 28 year old woman with long red hair, wearing a black leather jacket"). Standaard diens kind en outfit.
partfull (de standaard): het hele personage. head: alleen het hoofd (gezicht en haar); het gefilmde lichaam, de kleding en de omgeving blijven. Het personage wordt dan gerenderd vanuit de drie portretten van zijn character sheet, bijgesneden tot het hoofd (heads_only in het antwoord); een personage met een of twee weergaven houdt ze heel. De standaardbeschrijving geeft alleen zijn kind, zonder outfit, en zone is standaard tight.
zoneDe ruimte rond het gefilmde silhouet waarbinnen het personage kan worden getekend: tight, normal (de standaard) of wide (ruimte voor grote oren, vleugels, een brede bouw). Met part head is het de ruimte rond het hoofd, standaard tight.
likenessHoe nauw het personage zijn weergaven volgt, van 0,5 tot 2 (standaard 1).
audioStandaard true: het geluid van de video wordt behouden en de lippen volgen het. false: een stille video.
voicecharacter (de standaard): het geluid van de video wordt omgezet naar de stem uit het profiel van het personage als het er online een heeft (has_voice in GET /characters), in dezelfde render en zonder het tempo te veranderen, zodat de lippen synchroon blijven. Zonder profielstem blijft de gefilmde stem. original: de gefilmde stem behouden. Het antwoord zegt welke is gebruikt (voice: character, custom, original, of none zonder geluid).
voice_b64Optioneel, met geluid: een andere stem voor het personage (WAV, MP3, OGG, FLAC, maximaal 2 MB; de eerste 20 seconden worden gebruikt), die voorrang heeft op die van het profiel. Het geluid van de video wordt omgezet naar deze stem, zonder het tempo te veranderen.
seedSeed van de render, van 0 tot 4294967295, om opnieuw te renderen of te variëren.

Video en stem samen: maximaal 22 MB, zodat de aanvraagtekst onder 30 MB blijft (daarboven een 413 zonder JSON-body).

  • De server bereidt alles voor. Hij knipt de passage, stelt hem in op de werkframerate (30 fps voor een bron bij 29 fps of meer, 50 en 60 inbegrepen, 24 daaronder) en op het werkformaat (veelvouden van 128, een korte zijde van 768, de verhouding die het dichtst bij je video ligt), en past de weergaven van het personage aan op dat formaat.
  • Wat je terugkrijgt is de video van de passage in het werkformaat, ongeveer één megapixel (768 x 1408 voor een verticale video, bijvoorbeeld), met de verhoudingen van je video binnen 5%. Volledige resolutie en meerdere personages achter elkaar zijn specifiek voor de tendre.AI-desktopapp: die plakt het personage terug op de oorspronkelijke video in volledige resolutie en ketent meerdere personages aan elkaar.
  • Prijs: 6 credits per seconde van de voorbereide passage (seconds in het antwoord), afgerond naar het volgende credit. Het antwoord geeft jobId, seed, cost en de voorbereide passage (width, height, length, fps, seconds, audio, voice, views, part). Een personage met slechts één weergave wordt gerenderd, met warnings limited_likeness.
  • Geen quote: noch POST /videos/quote noch de MCP's tendre_quote kent Face swap. Om de prijs vóór het indienen te berekenen, lees je grid.body_swap in GET /pricing: seconden van de passage x per_block_720p (de prijs van een blok) / block_seconds (de duur van een blok), afgerond naar het volgende credit.
  • Sommige scènes worden gerenderd vanuit de drie portretten van het personage bijgesneden tot het hoofd (heads_only in het antwoord), en de outfit van de weergaven wordt niet langer opgelegd: de scène beslist.
  • Een Face swap telt als een gebruik van het personage en stelt de verwijdering ervan uit, net als Multi-Ref.
  • Pollen, downloaden en annuleren verlopen zoals voor elke video (zie Pollen, downloaden, annuleren, hierboven): GET /videos/{jobId}, GET /videos/{jobId}/file, POST /videos/{jobId}/cancel.
  • Eigen fouten: 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 (een stem groter dan 2 MB), face_swap_too_large (de passage is na voorbereiding nog te zwaar: verkort duration), server_busy (er worden al twee video's voorbereid: probeer opnieuw na Retry-After, 20 s), face_swap_unavailable en face_swap_price_missing (Face swap gesloten, of zonder prijs: probeer later opnieuw). Wat elk betekent: Limieten en fouten.
  • Je video passeert onze servers tijdens de voorbereiding en gaat vervolgens naar de videokaart die hem rendert, zoals elk bronafbeelding.

Gebruik alleen video's van personen die hun toestemming hebben gegeven: dat is een regel van de gebruiksvoorwaarden.

Met de MCP-server doet de agent dit alles met tendre_face_swap.

Windows · Mac · Cloud of lokaal

Genereer privé. Vanavond.

Download tendre.AI gratis en genereer zonder limieten, privé, op je eigen GPU.

OS Windows 10/11GPU NVIDIA 8GB+VRAM 12GB aanbevolenSchijf 20GB

Mac: Apple silicon (M1 of later), macOS 13 of later. Intel Macs worden niet ondersteund.

Voor lokale beeldgeneratie op Mac heb je een M4 met 24 GB geheugen nodig, of een M2 of M3 Pro, Max of Ultra met 24 GB. Daaronder draait alles online met credits. Retoucheren en video draaien voorlopig online op Mac.

Alles over tendre.AI voor Mac

Geen NVIDIA GPU? Begin 100% in de cloud: elke dag 5 gratis afbeeldingen en 1 gratis video. Een NVIDIA-kaart (8GB+) ontgrendelt onbeperkt lokaal genereren.