Pro API: generar vídeos con sonido
Un clip a partir de un prompt, o una animación de una imagen fija que tú aportas. El archivo es un MP4, con sonido cuando lo pides.
Enviar un vídeo
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 }| Campo | Tipo | Por defecto | Qué hace |
|---|---|---|---|
prompt | string | required | La acción, el ambiente, la luz. Describe el movimiento. |
width, height | int | 720 x 1280 | Vertical por defecto. Consulta la tabla de precios más abajo. |
quality | string | max: modo Ultra (el render más fino); consulta Modo Ultra. | |
consistency | string | standard | enhanced: Coherencia reforzada, movimiento, caras y fondo más estables a lo largo del tiempo, hasta 721 fotogramas por plano (30 s a 24 fps, 24 s a 30); extensiones incluidas. Solo en modo Calidad. Consulta Coherencia reforzada. |
mode | string | ltx25 | ltx25: motor 2.5 (sonido, duración automática, 1080p, fotograma final). turbo: retirado el 11 de octubre de 2026; una solicitud turbo se renderiza en Calidad 480p (misma orientación, misma duración, 241 fotogramas como máximo, duración fija), al precio de Calidad 480p. |
duration_auto | bool | true | El motor elige la duración a partir del prompt, hasta 20 s a 24 fps (16 s a 30, 8 s a 60: el límite cuenta fotogramas, consulta fps), y length se ignora. Ponlo en false para una duración fija indicada por length. Con consistency enhanced por encima de 30 fps, la duración es siempre fija (fps_requires_fixed_duration en caso contrario). |
length | int | 121 | Duración en fotogramas, a la cadencia fps, siempre de la forma 8n+1; la duración es (length - 1) / fps. 481 como máximo (721 con consistency enhanced). A 24 fps: 73 (3 s), 121 (5 s), 241 (10 s), 361 (15 s), 481 (20 s; 721, es decir 30 s, en enhanced). A 30: 241 (8 s), 481 (16 s; 721, 24 s). A 60: 241 (4 s), 481 (8 s; 721, 12 s). Se usa para duración fija (duration_auto en false); se ignora con duración automática. |
fps | int | 30 | Cadencia, en fotogramas por segundo: 24, 30 o 60. 30 por defecto, el ajuste recomendado (movimiento nítido); 60, el más fluido; 24, la cadencia de cine. 50, solo con consistency enhanced, da una ligera cámara lenta (aproximadamente 0,83x: el motor ajusta el movimiento como a 60 y lo reproduce a 50). length cuenta fotogramas a esta cadencia. El precio no cambia (tarifa plana por clip); la duración máxima sí, ya que cuenta fotogramas. Una extensión mantiene la cadencia del clip anterior; una secuencia mantiene la de su primer plano. Una cadencia no disponible en el modo devuelve invalid_fps, que lista las admitidas. |
audio | bool | false | Sonido generado junto con la imagen (ambiente, voz). Duplica el precio del clip (consulta Formatos y precio). |
image | string | Fotograma inicial en base64: el vídeo anima esta imagen. | |
end_image | string | Fotograma final en base64, junto con image: el clip hace la transición de uno al otro (solo motor 2.5). Una transición se obtiene al tamaño solicitado, de 480p a 1080p, y se factura como un clip de ese formato. | |
keyframes | array | Imágenes clave (modo Calidad): de 1 a 4 objetos { "image": base64, "at": segundos, "strength": 0.1 a 1 (1 por defecto) }. El clip muestra cada imagen en su momento, por ejemplo un personaje en mitad de un plano que empieza y termina en un decorado vacío. La duración pasa a ser fija (length, duration_auto forzado a false); 0 < at < length, al menos 0,5 s entre dos imágenes clave; precisión de aproximadamente un tercio de segundo. Compatible con image y end_image. No disponible en Ultra ni en Multi-Ref; en una extensión, solo con consistency enhanced (consulta Coherencia reforzada). Mismo precio que un clip del mismo formato. | |
lora, lora_strength | string, number | Un personaje entrenado en la cuenta (name de GET /loras) y su fuerza (0 a 1). | |
lora2, lora2_strength | string, number | Un segundo personaje. | |
multiref | object | Reparte de 1 a 4 personajes (12 en Ultra) de GET /characters, además de objetos guardados, animales y un decorado de GET /subjects, llamados por @Nombre en el prompt; consulta Multi-Ref Vídeo. | |
seed | int | aleatorio | Semilla del render, de 0 a 4294967295. Misma seed, mismo prompt, misma imagen y mismos ajustes (formato, duración, sonido, modo): el mismo clip, con pequeñas diferencias si cambia la tarjeta gráfica. Con duración automática, una duración elegida de forma distinta cambia el clip: para una reproducción exacta, pon duration_auto en false e indica length. |
steps | int | motor | Déjalo vacío. |
Cadencia por defecto: 30 fps. Los clips se renderizaban antes a 24 fps. Sin fps, un clip con el mismo length es por tanto más corto que antes (241 fotogramas: 8 s en lugar de 10 s). Envía "fps": 24 para mantener el comportamiento anterior.
La respuesta:
{ "jobId": "...", "seed": 908172, "cost": 30 }El coste se calcula y se anuncia al enviar la solicitud, antes de cargar nada. La seed también se devuelve, tanto si la has indicado tú como si se ha generado aleatoriamente.
Formatos y precio
Un vídeo tiene un precio por formato, como tarifa plana independiente de su duración. Base: 5 créditos.
La tarifa plana se multiplica por 2 a 720p y por 3 a 1080p, y el sonido duplica el precio. Los factores se aplican sobre la tarifa base, no entre sí: 1080p con sonido cuesta 5 x 3 x 2 = 30 créditos. Hasta 481 fotogramas, es decir 20 s a 24 fps, la duración no cambia nada (5 s o 20 s, misma tarifa). Más allá de 481 fotogramas (hasta 721, solo con consistency enhanced, duración fija), el precio del formato se duplica. La cadencia (fps) no cambia el precio, pero los tramos cuentan fotogramas: a 30 fps, el precio normal llega hasta 16 s; a 60, hasta 8 s (12 s al doble del precio en enhanced).
Una excepción: en Calidad, 480p sin sonido cuesta 2 créditos, sea cual sea su duración (desde el 11 de octubre de 2026). Multi-Ref y la coherencia reforzada mantienen la tarifa plana del formato, 5 créditos.
| Formato | Lado corto | Tamaños de ejemplo | Sin sonido | Con sonido |
|---|---|---|---|---|
| 480p | 480 | 480 x 832, 832 x 480 | 2 (5 en Multi-Ref y coherencia reforzada) | 10 |
| 720p | 720 | 720 x 1280, 1280 x 720 | 10 | 20 |
| 1080p | 1080 | 1080 x 1920, 1920 x 1080 | 15 | 30 |
El tamaño que recibes. El motor trabaja en múltiplos de 32 y en dos etapas, por lo que el archivo sale a 768 x 1280 (o 1280 x 768) para 720p y 1088 x 1920 (o 1920 x 1088) para 1080p. El 480p se mantiene en 480 x 832 (o 832 x 480), excepto en coherencia reforzada. Útil saberlo si vas a unir o superponer nuestros renders.
El modo turbo fue retirado el 11 de octubre de 2026: una solicitud turbo se renderiza en Calidad 480p y se factura como tal (2 créditos sin sonido, 10 con sonido).
Conocer el precio antes de enviar
POST /videos/quote acepta el mismo cuerpo que POST /videos y realiza el mismo cálculo, pero no se crea nada: ni render, ni créditos retenidos, ni cuota consumida. Úsalo antes de comprometerte, especialmente desde un agente que trabaja con un presupuesto.
{ "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 desglosa la cifra; fps es la cadencia utilizada y seconds_max la duración máxima en segundos a esa cadencia. Con "consistency": "enhanced", el presupuesto acepta una duración fija de hasta 721 fotogramas y aplica la tarifa por encima de 481 fotogramas (x 2 (over 20 s) en detail a 24 fps, x 2 (over 481 frames) a otra cadencia). La misma ruta existe para imágenes, POST /images/quote, que siempre responde { "cost": 1, ... }: una imagen siempre cuesta 1 crédito.
Para un clip Ultra facturado por segundo, el presupuesto da la duración facturada en seconds, y detail desglosa el precio por segundo.
Consultar, descargar, cancelar
Las mismas rutas que para las imágenes, bajo /videos.
GET /videos/{jobId}:pending/completed/failed, mismos campos. Una extensión reforzada puede terminar comofailedcon"error": "extension_not_applied"(el motor no tomó el final del clip anterior): no se cobra nada, vuelve a enviarla.GET /videos/{jobId}/file: el MP4 (Content-Type: video/mp4).POST /videos/{jobId}/cancel: cancela y no se cobra nada.
En Ultra facturado por segundo, un render que ya se está calculando ya no se detiene: la cancelación responde 409 render_in_progress, y el clip se entrega y se factura. Un clip que el motor rechaza a la salida termina en failed, con una frase en detail y el código del motor en reason: no se cobra nada.
Un vídeo tarda entre 1 y 5 minutos, más cuando el motor arranca en frío. Consulta el estado cada 3 segundos y descarga en cuanto el estado sea completed: el archivo no se archiva.
Varios planos en un mismo clip
Un único prompt puede contener varios planos con cortes directos, hasta 20 segundos en total a 24 fps (16 s a 30, la cadencia por defecto). Descríbelos en orden: Shot 1: <encuadre>, <acción>. Cut to Shot 2: .... Repite en cada plano lo que debe mantenerse igual (personaje, ropa, lugar, luz) y termina con una línea de ambiente compartido.
Omite los códigos de tiempo: deja duration_auto activado y el motor elige la duración (hasta 20 s a 24 fps, 16 s a 30) y dónde cortar. De dos a cuatro planos por clip es lo que mejor funciona.
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.¿Varios planos en un clip o una secuencia? Cada opción hace cosas distintas:
| Varios planos en un clip | Secuencia (extensiones) | |
|---|---|---|
| Entre planos | Cortes directos | Sin corte: cada plano continúa el movimiento |
| Duración | 20 s como máximo a 24 fps (16 s a 30) | Más larga |
| Renders | Uno | Uno por plano |
| Precio | Un clip | Un clip por plano |
Extender un clip
Un clip puede extenderse: el siguiente plano continúa el movimiento del anterior sin pausa en la unión. Está guiado aproximadamente por el último segundo del clip anterior, no por un fotograma fijo. Añade a POST /videos:
| Campo | Tipo | Por defecto | Qué hace |
|---|---|---|---|
extend_job_id | string | El clip que extender: un render de tu licencia, tomado poco después de que termine. | |
extend_frames | int | 25 | Cuánto del final del clip guía el siguiente plano, en fotogramas: 9, 17, 25, 33, 41 o 49 (25 es aproximadamente 1 s a 24 fps). |
extend_video | string | En lugar de extend_job_id: el final de un clip que tienes tú, como un MP4 en base64 de exactamente extend_frames fotogramas, 8 MB como máximo. |
El plano extendido mantiene la resolución del clip anterior: width y height se ignoran con extend_job_id, y con extend_video el tamaño se lee del archivo que envías. Contiene solo los fotogramas nuevos, de modo que los planos unidos forman un vídeo continuo. Mantiene la cadencia del clip anterior: omite fps (la toma del clip anterior) o indica la misma; una distinta se rechaza (extend_fps_mismatch). length es la nueva duración del plano (121 = 5 s más a 24 fps) y es exacta: la duración automática no se aplica a una extensión. Una extensión cuesta el precio de un clip.
Limitaciones: no se puede usar fotograma final ni imágenes clave al mismo tiempo, excepto con coherencia reforzada.
El sonido continúa en la unión. Con audio: true, cuando el final del clip anterior tiene pista de sonido, el nuevo plano retoma ese sonido en lugar de generar uno nuevo. Con extend_job_id, el final cortado conserva el sonido del clip; con extend_video, envía el final con su sonido. Sin pista de sonido en ese final, en coherencia reforzada y en Ultra, el sonido empieza de nuevo con el plano: mantén el mismo ambiente en cada prompt para que la unión se note lo menos posible.
Extiende un clip poco después de que termine. Más tarde ya no estará disponible para nosotros (clip_unavailable) y deberás enviar su final tú mismo en extend_video.
Extender un plano Ultra, hacia delante o hacia atrás
Un plano renderizado en Ultra por segundo también se extiende en Ultra, hacia delante o hacia atrás; cualquier otro clip se extiende como se indica arriba. Envía POST /videos con "quality": "max" y:
| Campo | Tipo | Por defecto | Qué hace |
|---|---|---|---|
extend_job_id | string | El plano Ultra que extender, renderizado por tu licencia hace menos de 24 horas. | |
extend_upload_id | string | En su lugar, para un plano más antiguo: el identificador que devuelve POST /extensions (abajo), una vez subido su archivo original. | |
extend_direction | string | forward | forward renderiza lo que sigue; backward renderiza los instantes justo anteriores al plano, para montarlos delante. |
- El render contiene solo la parte nueva, con la duración de un clip Ultra (
length/fps, 5 s con la duración automática). Toma la resolución del plano (widthyheightse ignoran) y enlaza con su último fotograma (forward) o con el primero (backward). - Sin imagen de inicio, referencias (
multiref), movimiento ni coherencia reforzada.backwardno entra en una secuencia, que coloca sus planos uno tras otro. - Precio: la parte nueva al precio de Ultra por segundo, más, por cada segundo del plano extendido, 2 créditos en 480p, 5 en 720p y 13 en 1080p (
ultra.extend_per_secondenGET /pricing). Esos segundos se redondean al segundo superior (con una precisión de 0,1 s) y se cuentan a 24 fotogramas por segundo: un plano con más fotogramas por segundo cuenta a prorrata (2 s a 60 fps cuentan como 5 s).POST /videos/quotecon los mismos campos daextend_secondsy el precio exacto. - Un plano de más de 24 horas: sube su archivo original, tal como lo entregó
GET /videos/{jobId}/file.POST /extensionscon{ "size": <bytes> }devuelveupload_id,upload_url,headersyexpires_in(900 s); envía el archivo conPUT upload_urly exactamente esosheaders, y luego pasaextend_upload_iden un plazo de 2 horas. Una subida sirve para un render: un MP4 de 4 a 30 s, 60 MB y 1080p como máximo. Antes del render, cada vídeo enviado al modo Ultra (un movimiento o un vídeo que prolongar) se comprueba, y no se cobra nada si se rechaza (400 input_video_out_of_limits): de 24 a 60 imágenes por segundo, una relación ancho/alto de 0,4 a 2,5 y, por render, 30 s y 10 archivos como máximo para los vídeos y los sonidos de referencia en conjunto. Con un rostro realista, un archivo recodificado o editado se rechaza (400 engine_refused): solo pasa el original. Un vídeo que no se renderizó en modo Ultra (el render de otro modo, por ejemplo) no se prolonga en Ultra si muestra un rostro realista (400 extension_real_face, no se cobra nada): prolóngalo en modo Calidad, o vuelve a hacer el plano en Ultra.
Coherencia reforzada
Con "consistency": "enhanced", el clip se renderiza por un canal que mantiene el movimiento, las caras y el fondo más estables a lo largo del tiempo. Llega hasta 721 fotogramas por plano, es decir 30 s a 24 fps y 24 s a 30 (length, duración fija), y está pensado principalmente para vídeos largos:
- Primer plano: un clip normal (prompt, fotograma inicial,
keyframes,end_image), hasta 721 fotogramas. - Extensión:
extend_job_id(oextend_video) como en Extender un clip, con la mismaconsistency.lengthsigue siendo la nueva duración (hasta 721, es decir 30 s más a 24 fps). Una extensión reforzada también admitekeyframes, cuyoatcuenta desde el primer fotograma nuevo, y un fotograma finalend_imagecolocado en el último fotograma del plano: por ejemplo el fotograma inicial del primer plano, para que un vídeo largo forme un bucle.
Solo en modo Calidad (mode ltx25, sin quality: "max"), hasta 1080p, no disponible en Multi-Ref (400 consistency_mode). Precio: la tarifa plana del formato (480p sin sonido: 5 créditos) hasta 481 fotogramas nuevos (20 s a 24 fps), duplicada a partir de ahí (consulta la tabla de precios anterior). Cadencias: 24, 30, 50 o 60. Por encima de 30, la duración es fija (fps_requires_fixed_duration en caso contrario); 50 da una ligera cámara lenta (consulta fps). El render tarda más que un clip estándar y su inicio puede esperar a una tarjeta gráfica más potente (planos largos). Una secuencia mantiene la misma consistency en todos sus planos. Tamaño entregado: igual que en Calidad a 720p y 1080p; a 480p, el lado corto sale en 448 (448 x 832, 832 x 448, 448 x 448), ya que este canal trabaja en múltiplos de 64.
Algunos prompts aún no son compatibles. Para ellos, un plano único de 20 s o menos (15 s con end_image, a duración fija) se renderiza con coherencia estándar, al mismo precio. Más allá de eso (length superior a 481 con duration_auto: false, o superior a 361 con end_image), en una extensión o en una secuencia, la solicitud se rechaza con 400 consistency_explicit: acorta el plano o pide consistency: "standard".
Vídeo largo (secuencias)
Un clip dura como máximo 481 fotogramas, es decir 20 s a 24 fps (721 con coherencia reforzada, 30 s a 24 fps). Para duraciones mayores, una secuencia registra cada plano a medida que termina su render y los une en un único MP4 sin recodificar. Un minuto, por ejemplo, son 3 planos de 20 s, o 2 planos de 30 s en coherencia reforzada, a 24 fps.
POST /sequencesabre una secuencia y responde{ "sequence_id": "seq_...", ... }.POST /videoscon"sequence_id": "seq_..."para cada plano: el primero como de costumbre, los siguientes conextend_job_idapuntando al plano anterior. Cada plano se registra en la secuencia, en orden de envío, en cuantoGET /videos/{jobId}lo ve terminado.POST /sequences/{id}/exportuna vez terminado el último plano. Responde conseconds,resolutionyfile_url.GET /sequences/{id}/file: el vídeo ensamblado (MP4).
Además: GET /sequences/{id} indica el estado (planos registrados o pendientes), POST /sequences/{id}/clips con { "job_id": "..." } registra un render a mano, y DELETE /sequences/{id} elimina la secuencia de inmediato.
Reglas. Todos los planos tienen la misma resolución (las extensiones la conservan) y la misma elección de sonido, todos con sonido o todos sin él, la misma consistency y la misma cadencia (fps): el primer plano las establece, y un plano que difiere se rechaza (409 consistency_mismatch, 409 sequence_fps_mismatch; 422 encoding_mismatch para un plano registrado a mano). Un plano sin fps toma la cadencia de la secuencia. Como máximo 30 planos por secuencia y 5 secuencias en curso por licencia.
Qué conservamos y durante cuánto tiempo. Los planos de una secuencia en curso se borran 30 minutos después de que se añadiera el último, y el vídeo ensamblado 24 horas después de la exportación. Después, todo desaparece.
Exportar la carpeta del proyecto
Una carpeta de proyecto reúne en un ZIP todo lo necesario para retomar un vídeo en otro lugar o automatizarlo: los planos, sus referencias, el montaje y un manifiesto que permite volver a renderizar cada plano. Es gratuita: no se renderiza nada.
POST /videos/{jobId}/export: un render dePOST /videos(plano suelto, Multi-Ref, extensión).POST /sequences/{id}/project: todos los planos de una secuencia, uno tras otro.- Cuerpo opcional, las mismas opciones que la ventana de exportación de la app:
include_media(truepor defecto): los vídeos de los planos y sus originales firmados.false: ningún vídeo (ni clip, ni original, ni película); los planos conservan su texto, sus ajustes y sus referencias ("state": "expired") y el manifiesto llevavideos_included: false.include_references(truepor defecto): las vistas de los personajes y las imágenes de los elementos, enreferences/.false: no se copia ninguna; sus nombres, @menciones,idy huellas quedan en el manifiesto (references_included: false).exclude_references: las referencias que no se copian, una a una, porid(character_id,subject_id), nombre o @mención, por ejemplo["@Parc", "chr_..."](200 como máximo). El manifiesto llevareferences_included: "partial"y"included": falseen cada excluida (falsesi lo están todas). Una entrada que no designa ninguna referencia de la exportación:400 unknown_reference.include_film(solo secuencia,falsepor defecto): la película de una secuencia ya ensamblada; requiereinclude_media(si no,400 invalid_export_options, como una opción que no es booleana o unexclude_referencesque no es una lista de textos).manifest_only: true: solo el manifiesto, sin ZIP.
La respuesta es { "manifest": { ... }, "file_url": "...", "export_id": "exp_...", "expires_at": "...", "bytes": n }, y GET /exports/{id}/file descarga el ZIP. Una exportación a la vez por licencia (409 export_in_progress), 2 GB como máximo (413 export_too_large: exporta los planos uno a uno).
| Archivo | Contenido |
|---|---|
tendre-project.json | El manifiesto (esquema tendre.project/1, claves en inglés). Para cada plano: su estado, el prompt escrito (prompt) y el enviado al motor (prompt_sent), los ajustes, la semilla, el coste, la extensión (extends, direction), las referencias vinculadas a sus archivos y api_request, el cuerpo de POST /videos que vuelve a renderizar el plano (null si una imagen solo se envió en base64); al principio, references_included: true en el ZIP (los archivos de las referencias están en references/), false con manifest_only (referencias sin archivo: files vacío, solo huellas sha256); un manifiesto sin este campo (exportaciones anteriores) se lee como true. Una carpeta exportada por la app, donde el cliente elige sus referencias una a una, lleva true, false o "partial", y cada referencia puede llevar included (si falta: como al principio, false si allí es false, si no true); una referencia no incluida conserva su nombre, su @mención, su id y su descripción, con files vacío. project.settings lleva los ajustes del primer plano (quality, width, height, fps, audio, output_format "mp4") y settings_from_shot, el id de ese plano. Una carpeta exportada por la app puede contener un bloque app reservado a la app: ignóralo |
shots/NN/clip.mp4 | El render de cada plano, mientras el servidor lo tenga; shots/NN/original.mp4 o .mov: el archivo firmado del motor, byte a byte, si aún existe |
references/ | Las vistas de los personajes y las imágenes de los lugares, objetos, animales, estilos y atuendos usados |
timeline.otio, timeline.fcpxml | El montaje (OpenTimelineIO; FCPXML para Final Cut Pro y DaVinci Resolve), con los medios por ruta relativa a la carpeta |
film.mp4 | El vídeo ensamblado de una secuencia, solo con include_film: true y si ya se ensambló (POST /sequences/{id}/export); si no, assembled vale null en el manifiesto |
Qué conservamos y durante cuánto tiempo. Por cada POST /videos aceptado, el servidor guarda una ficha del render sin ninguna imagen ni vídeo: el texto, los ajustes, los identificadores (una imagen enviada en base64 solo deja su huella). Se borra 24 horas después del envío; pasado ese plazo, la exportación responde 404 unknown_export. El ZIP se borra 45 minutos después de su primera descarga, 2 horas después de su creación como máximo. Un plano que el servidor ya no tiene sale con "state": "expired", sin su archivo pero con su texto, sus ajustes y sus referencias: un agente puede volver a renderizarlo con api_request.
Secuencia. El ensamblaje borra los planos uno a uno. Para tener los planos y la película, exporta el proyecto antes de ensamblar, luego ensambla y vuelve a exportar con { "include_film": true }: la película se añade, y los planos salen entonces como expired.
Modo Ultra
El modo Ultra es el render de vídeo más fino. Añade "quality": "max" a POST /videos (con mode ltx25, el valor por defecto). Se factura por segundo, o a precio fijo con un LoRA o en una extensión de un clip que no se renderizó por segundo; extender un plano Ultra, hacia delante o hacia atrás, se factura por segundo. POST /videos/quote da el precio exacto de tu solicitud.
Por segundo
El clip se factura por segundo según su resolución, sonido incluido:
| Resolución | Precio |
|---|---|
| 480p | 4 créditos por segundo |
| 720p | 8 créditos por segundo |
| 1080p | 20 créditos por segundo |
- Duración: de 4 a 30 s a 24 fotogramas por segundo, conocida antes del render: 5 s con la duración automática (
duration_auto, por defecto), si nolength/fps(24 si faltafps), redondeada al segundo. - Formato: el solicitado, en la proporción más cercana; el 480p se renderiza en 480p. Por encima de 1080p:
resolution_outside_ultra. - Imagen inicial (
image): posible. El motor puede rechazar un texto o una imagen al enviarlos:400 engine_refused, con su motivo endetaily su código encode; no se cobra nada. - Sin semilla:
seedse ignora y la respuesta no la incluye. - Cancelación: libre mientras el render espera su turno; una vez en cálculo,
409 render_in_progress, y el clip se entrega y se factura. - Sin imagen final, sin imágenes clave y sin coherencia reforzada en Ultra.
A precio fijo
Con un LoRA o en una extensión de un clip que no se renderizó por segundo, Ultra se renderiza con el modelo de vídeo completo, a precio fijo:
| Formato solicitado | Tamaño entregado | Precio fijo por clip |
|---|---|---|
| 480p o 720p | Como en la tabla anterior a 720p (1280 x 768); una solicitud 480p se renderiza en 720p | 40 créditos |
| 1080p | Como en la tabla anterior (1920 x 1088) | 60 créditos |
El precio es fijo por formato: el sonido y la duración no cambian nada. Ultra empieza en 720p: una solicitud 480p se renderiza y se factura en 720p. POST /videos/quote da el precio exacto. 1080p (1920 x 1088) es el máximo, en todos los modos: el 4K ya no se ofrece. Un tamaño mayor se rechaza (ultra_4k_unavailable con quality: "max", resolution_above_quality sin él).
- Duración: 481 fotogramas como máximo, como cualquier clip (20 s a 24 fps, 16 s a 30, 8 s a 60). Las extensiones y los vídeos largos también funcionan en Ultra. Una extensión conserva el tamaño del clip que continúa y, por debajo de 720p, se factura al precio de 720p.
- Tiempo: varios minutos para un clip de 5 s, más para un clip de 20 s. El inicio puede esperar a que una tarjeta gráfica potente quede libre.
- Sin transición (
end_image) en Ultra (ultra_incompatible). - Sin imágenes clave (
keyframes) en Ultra (keyframes_mode). - Un LoRA de personaje de tu cuenta se aplica en Ultra igual que en el modo normal.
Multi-Ref Vídeo
Un clip en el que juegan de 1 a 4 personajes (hasta 12 en Ultra), cada uno reconocible, en un decorado opcional, con objetos guardados, animales y un decorado guardado cuando los necesitas. Los personajes provienen de GET /characters: creados a partir de una foto mediante la API o en la app. Los objetos, animales y decorados provienen de GET /subjects. Añade el objeto multiref a POST /videos (permiso videos) y llama a cada personaje por @Nombre en el 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": "<optional: an image of the location>",
"background_description": "a sunny kitchen"
},
"width": 1088, "height": 1920,
"audio": true
}Campo de multiref | Qué hace |
|---|---|
characters[].character_id | Un personaje de GET /characters |
characters[].name | Una sola palabra (letras, dígitos, _), la que se escribe tras @ en el prompt |
characters[].description | Una descripción breve en inglés; por defecto, su kind |
characters[].strength | Peso del parecido, de 0 a 2 (1 por defecto) |
characters[].sheet_id | Opcional: qué sheet usar para un personaje que tiene varias (la más reciente por defecto) |
characters[].voice | Con "audio": true, characters[0] y characters[1]: character (el predeterminado) es la voz de su perfil cuando está en línea (has_voice en el personaje), si no, una voz hecha por el modelo; generated pide una voz hecha por el modelo. La respuesta indica cuál se usó (voices). |
characters[].voice_b64 | Opcional, solo characters[0] y characters[1], con "audio": true: otra voz para el personaje, un archivo de audio (WAV, MP3, OGG, FLAC) en base64, 4 MB como máximo (un fragmento corto es suficiente), que tiene prioridad sobre la del perfil |
background_b64, background_description | Decorado opcional: una imagen y unas pocas palabras en inglés |
- Prompt en inglés, un párrafo en presente;
Sound:para el sonido, líneas de diálogo entre comillas,exactly 2 peopley la posición de cada uno cuando ayude, sin negaciones. Una criatura se describe por lo que es. Un@Nombreque no coincide con ningún personaje se rechaza (unknown_mention). - Formatos (
widthxheight): vertical 480 x 832, 720 x 1280, 1088 x 1920; horizontal 832 x 480, 1280 x 720, 1920 x 1088; cuadrado 480 x 480, 720 x 720, 1088 x 1088. Sin 4K; 480p solo en Calidad. - Modos: Calidad (el predeterminado) o Ultra (
quality: "max"). Sin extensión ni transición. - Duración: automática (
duration_auto, el valor predeterminado) o fija conduration_auto: falseylength121 (5 s), 241 (10 s) o 481 (20 s) a 24 fps; a otra cadencia, las mismas duraciones contadas en fotogramas, 481 como máximo (a 30: 145, 297, 481; a 60: 297, 481). - Cadencia:
fps24, 30 (el predeterminado) o 60, como para cualquier clip;lengthcuenta fotogramas a esta cadencia, 481 como máximo (16 s a 30, 8 s a 60). - Precio: el precio de un clip. En Calidad, la tarifa plana del formato en la tabla anterior, duplicada con sonido; 480p sin sonido se mantiene en 5 créditos (el precio reducido de Calidad no se aplica a Multi-Ref).
POST /videos/quotecon"multiref": trueda el precio exacto. - El servidor adapta los ángulos al formato exacto del vídeo: envía los personajes tal como están. Un personaje que tiene una sola vista se renderiza, con
warningslimited_likenessen la respuesta: el parecido es limitado. - Voces de perfil: con sonido,
characters[0]ycharacters[1]hablan por defecto con la voz de su perfil cuando está en línea (has_voice);voicegenerateddeja que el modelo haga una. La respuesta da la voz de cada uno envoices(character_id,voice:character,customogenerated). - Voces de personajes (
voice_b64): el modelo hace hablar al personaje con esa voz, labios incluidos; el servidor usa sus primeros 5 segundos. Dos voces como máximo, encharacters[0]ycharacters[1](el motor admite 2 voces). Ordenacharacterssegún el diálogo:characters[0]habla primero,characters[1]responde. Requiere sonido ("audio": true), de lo contrariovoice_requires_audio; una voz en otro personaje:voice_slot; un archivo ilegible:unsupported_audio_format; más de 4 MB:audio_too_large. Solo se usan los primeros 5 segundos: envía un fragmento corto. El cuerpo total de la solicitud debe estar por debajo de 30 MB (si no, un413sin cuerpo JSON). Sin cargo adicional. - La consulta, la descarga y la cancelación son las de cualquier vídeo (consulta Consultar, descargar, cancelar, más arriba).
Objetos, animales y decorados guardados. Dos campos más de multiref incorporan los sujetos guardados a partir de tus propias imágenes:
Campo de multiref | Qué hace |
|---|---|
subjects[] | Objetos y animales (subject_id, luego name, description, strength opcionales). Comparten los slots con los personajes: 4 referencias como máximo en total; en Ultra, hasta 30 imágenes en total (ver más abajo). |
location | Un decorado guardado como escenario (subject_id, luego name, description, strength opcionales): sus imágenes, con su propia fuerza. Sustituye a background_b64 (ambos juntos: multiref_incompatible). Necesita al menos un personaje, objeto o animal junto a él. |
name toma por defecto la primera palabra del nombre del sujeto, y cada @Nombre en el prompt se empareja igual que el de un personaje. Un decorado pasado en subjects, o un objeto pasado como location, se rechaza (invalid_subject_type). El precio no cambia: es el precio de un clip. Un sujeto se usa con sus 5 primeras imágenes (todas en Ultra, 6 como máximo).
"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 sigue las reglas de Ultra facturado por segundo: mismo precio por segundo, sonido incluido, de 4 a 30 s a 24 fotogramas por segundo (5 s con la duración automática), de 480p a 1080p, sin semilla.
- Cada personaje va con su character sheet (o, si no tiene, con todas sus imágenes), y el servidor lo reúne todo en una sola imagen; cada objeto, animal o decorado con todas sus imágenes (6 como máximo).
- El primer render de un personaje prepara esa imagen, unas decenas de segundos más: su
jobIdempieza entonces porsdp-y se sigue como los demás. - Sin voz:
voice_b64y la voz de la ficha se ignoran (warningsvoice_ignored), ystrengthno tiene efecto. - El motor puede rechazar una imagen de referencia (un rostro real, por ejemplo): el render termina en
failedcon el motivo, y no se cobra nada.
Estilos, outfits y movimiento. Solo en Ultra (quality: "max"), tres campos más de multiref; en otro modo, la solicitud se rechaza (multiref_ultra_only), nunca se renderiza sin ellos.
Campo de multiref | Qué hace |
|---|---|
styles[] | Estilos guardados (subject_id, luego name, description opcionales): todo el clip toma su aspecto (técnica, luz, colores, texturas), nunca su contenido. |
outfits[] | Outfits guardados (mismos campos, más worn_by), llevados tal como en sus imágenes. worn_by (opcional) es el name de uno de los personajes: añade "<Nombre> wears <Outfit>." al principio de la escena. Sin él, escríbelo en el prompt: @Lea wears @RedGown. |
motion | Un vídeo de movimiento de 4 a 30 s: { "motion_id": ... } (subido con POST /motions) o { "video_b64": ... } (MP4, MOV, WebM o MKV, 20 MB como máximo), y una description opcional del movimiento en inglés. mode indica lo que el clip toma de él: camera (por defecto), su movimiento de cámara, su encuadre y su ritmo; choreography, los movimientos del cuerpo, los gestos y su ritmo. Nunca la persona ni el lugar del vídeo; mismo precio en ambos modos. El servidor lo reduce a unos 410 000 píxeles (856 × 482 en 16:9), a 24 imágenes por segundo, sin sonido; su relación ancho/alto va de 0,4 a 2,5. |
- 30 imágenes como máximo en Ultra, entre personajes, sujetos, estilos, outfits y decorado (
multiref_too_many_images), con 12 personajes como máximo (multiref_characters_requiredpor encima). Se recomiendan 8: de 9 a 12, el render sale conwarningsmany_characters, porque algunos pueden faltar o mezclarse. Un estilo fuera destyles, o un outfit fuera deoutfits, se rechaza (invalid_subject_type). -
Precio del movimiento: 3 créditos por segundo del vídeo de movimiento (redondeado al segundo superior), además del render, en
GET /pricing(ultra.motion_per_second);POST /videos/quotecon el mismomultiref.motiondamotion_secondsy el precio exacto. - Subida directa, para un vídeo de movimiento pesado:
POST /motionscon{ "size": <bytes> }(20 MB como máximo) devuelvemotion_id,upload_url,headersyexpires_in(900 s); envía el archivo conPUT upload_urly exactamente esosheaders, y luego pasamultiref.motion.motion_idaPOST /videosen un plazo de 2 horas. Unmotion_idsirve para un render.
"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."Los códigos de error de los estilos, los outfits y el movimiento están en Límites y errores.
Con el servidor MCP, el agente hace todo esto con tendre_multiref_video: describe la escena y nombra los personajes, objetos, animales y el decorado (subjects, location_id).
Face swap
La persona filmada en tu propio vídeo se convierte en uno de tus personajes: cara, cabello, cuerpo y ropa (o solo la cabeza, ver part), conservando sus gestos, sus labios y el entorno, y su voz salvo que el personaje tenga la suya (ver voice). Es el Face swap de la app, en un pasaje de 20 s como máximo: un personaje, sin encadenamiento ni transición. La solicitud es POST /faceswap (permiso videos):
{
"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
}| Campo | Qué hace |
|---|---|
video_b64 | El vídeo, 20 MB como máximo, con una persona claramente visible. Si supera ese límite, recórtalo o comprímelo primero, o usa la herramienta MCP tendre_face_swap, que admite hasta 95 MB. |
character_id, sheet_id | Un personaje de GET /characters y su sheet si tiene varias (la más reciente por defecto). |
name | Opcional, 60 caracteres como máximo: el nombre del personaje; por defecto, el que tiene en GET /characters. Un personaje creado en la app solo tiene su nombre en línea una vez que la app lo ha enviado (app 0.9.1 y posteriores; si no, name es null en GET /characters): indícalo para llamarlo @Nombre en scene; de lo contrario, llámalo Image 1. |
start, duration | El pasaje, en segundos: desde start (0 por defecto), durante duration (por defecto hasta el final del vídeo, 20 s como máximo). |
scene | Opcional, en inglés, 400 caracteres como máximo: qué debe cambiar o precisarse. El personaje se llama @Nombre (la primera palabra de su nombre, consulta name) o Image 1. Sin scene, se mueve exactamente como la persona filmada. Nunca hagas hablar al personaje en ella ni describas su boca, su mirada o su cabeza («says», «looks at the camera», «smiles»): los copia del vídeo, y una indicación hace que los invente, con los labios desincronizados y la cabeza girada. Describe lo que cambia alrededor: ropa, accesorio, luz. |
description | Opcional, en inglés, 360 caracteres como máximo: quién es el personaje ("a 28 year old woman with long red hair, wearing a black leather jacket"). Por defecto, su kind y su ropa. |
part | full (el predeterminado): el personaje entero. head: solo la cabeza (cara y cabello); el cuerpo filmado, la ropa y el entorno se mantienen. El personaje se renderiza entonces a partir de los tres retratos de su character sheet, recortados a la cabeza (heads_only en la respuesta); un personaje de una o dos vistas las conserva enteras. Su descripción por defecto da solo su kind, sin la ropa, y zone es tight por defecto. |
zone | El espacio alrededor de la silueta filmada donde se puede dibujar el personaje: tight (Ajustada), normal (el predeterminado) o wide (Amplia; espacio para orejas grandes, alas, una complexión ancha). Con part head, es el espacio alrededor de la cabeza, tight por defecto. |
likeness | Con qué precisión el personaje se ajusta a sus vistas, de 0,5 a 2 (1 por defecto). |
audio | true por defecto: el sonido del vídeo se conserva y los labios lo siguen. false: un vídeo silencioso. |
voice | character (el predeterminado): el sonido del vídeo se convierte a la voz del perfil del personaje cuando tiene una en línea (has_voice en GET /characters), en el mismo render y sin cambiar su ritmo, así que los labios siguen sincronizados. Sin voz de perfil, se queda la voz filmada. original: conservar la voz filmada. La respuesta indica cuál se usó (voice: character, custom, original, o none sin sonido). |
voice_b64 | Opcional, con sonido: otra voz para el personaje (WAV, MP3, OGG, FLAC, 2 MB como máximo; se usan sus primeros 20 segundos), que tiene prioridad sobre la del perfil. El sonido del vídeo se convierte a esta voz sin cambiar su ritmo. |
seed | Semilla del render, de 0 a 4294967295, para repetirlo o variarlo. |
Vídeo y voz juntos: 22 MB como máximo, para que el cuerpo de la solicitud se mantenga por debajo de 30 MB (si no, un 413 sin cuerpo JSON).
- El servidor lo prepara todo. Recorta el pasaje, lo ajusta a la cadencia de trabajo (30 fps para una fuente a 29 fps o más, 50 y 60 incluidos, 24 por debajo) y al formato de trabajo (múltiplos de 128, lado corto de 768, la proporción más cercana a tu vídeo), y adapta las vistas del personaje a ese formato.
- Lo que recibes es el vídeo del pasaje en el formato de trabajo, de aproximadamente un megapíxel (768 x 1408 para un vídeo vertical, por ejemplo), con las proporciones de tu vídeo dentro de un 5%. La resolución completa y varios personajes seguidos son funciones exclusivas de la app de escritorio tendre.AI: pega el personaje de vuelta sobre el vídeo original a su resolución completa y encadena varios personajes.
- Precio: 6 créditos por segundo del pasaje preparado (
secondsen la respuesta), redondeado al crédito siguiente. La respuesta devuelvejobId,seed,costy el pasaje preparado (width,height,length,fps,seconds,audio,voice,views,part). Un personaje que tiene solo una vista se renderiza, conwarningslimited_likeness. - Sin presupuesto previo: ni
POST /videos/quotenitendre_quotedel MCP conoce Face swap. Para calcular el precio antes de enviar, leegrid.body_swapenGET /pricing: segundos del pasaje xper_block_720p(el precio de un bloque) /block_seconds(la duración de un bloque), redondeado al crédito siguiente. - Algunas escenas se renderizan a partir de los tres retratos del personaje recortados a la cabeza (
heads_onlyen la respuesta) y la ropa de sus vistas ya no se impone: la escena lo decide. - Un Face swap cuenta como un uso del personaje y retrasa su borrado, igual que Multi-Ref.
- La consulta, la descarga y la cancelación son las de cualquier vídeo (consulta Consultar, descargar, cancelar, más arriba):
GET /videos/{jobId},GET /videos/{jobId}/file,POST /videos/{jobId}/cancel. - Errores propios:
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(voz de más de 2 MB),face_swap_too_large(el pasaje sigue siendo demasiado pesado una vez preparado: acortaduration),server_busy(ya se están preparando dos vídeos: reintenta después deRetry-After, 20 s),face_swap_unavailableyface_swap_price_missing(Face swap cerrado o sin precio: reintenta más tarde). Lo que significa cada uno: Límites y errores. - Tu vídeo pasa por nuestros servidores mientras se prepara y luego va a la tarjeta gráfica que lo renderiza, como cualquier imagen fuente.
Usa solo vídeos de personas que hayan dado su consentimiento: es una regla de los términos de uso.
Con el servidor MCP, el agente hace todo esto con tendre_face_swap.