API Pro: gerar vídeos com som
Um clip a partir de um prompt, ou uma animação de uma imagem que forneces. O ficheiro é um MP4, com som quando o pedires.
Submeter um 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 | Predefinição | O que faz |
|---|---|---|---|
prompt | string | obrigatório | A ação, o ambiente, a luz. Descreve o movimento. |
width, height | int | 720 x 1280 | Vertical por predefinição. Consulta a tabela de preços abaixo. |
quality | string | max: modo Ultra (a renderização mais fina), vê Modo Ultra. | |
consistency | string | standard | enhanced: coerência reforçada, movimento, rostos e fundo mais estáveis ao longo do tempo, até 721 fotogramas por cena (30 s a 24 fps, 24 s a 30), extensões incluídas. Apenas no modo Qualidade. Vê Coerência reforçada. |
mode | string | ltx25 | ltx25: motor 2.5 (som, duração automática, 1080p, imagem final). turbo: retirado a 11 de outubro de 2026; um pedido turbo é renderizado em Qualidade 480p (mesma orientação, mesmo comprimento, no máximo 241 fotogramas, comprimento fixo), ao preço de Qualidade 480p. |
duration_auto | bool | true | O motor escolhe a duração a partir do prompt, até 20 s a 24 fps (16 s a 30, 8 s a 60: o limite conta fotogramas, vê fps), e length é então ignorado. Define como false para um comprimento fixo, dado por length. Com consistency enhanced acima de 30 fps, o comprimento é sempre fixo (fps_requires_fixed_duration caso contrário). |
length | int | 121 | Comprimento em fotogramas, à taxa fps, sempre da forma 8n+1; a duração é (length - 1) / fps. No máximo 481 (721 com consistency enhanced). A 24 fps: 73 (3 s), 121 (5 s), 241 (10 s), 361 (15 s), 481 (20 s; 721, ou seja 30 s, em enhanced). A 30: 241 (8 s), 481 (16 s; 721, 24 s). A 60: 241 (4 s), 481 (8 s; 721, 12 s). Usado para comprimento fixo (duration_auto definido como false); ignorado com duração automática. |
fps | int | 30 | Taxa de quadros, em fotogramas por segundo: 24, 30 ou 60. 30 por predefinição, a definição recomendada (movimento nítido); 60, o mais suave; 24, a taxa cinematográfica. 50, apenas com consistency enhanced, dá um ligeiro câmara lenta (cerca de 0,83x: o motor define o movimento como a 60 e reproduz-o a 50). length conta fotogramas a esta taxa. O preço não muda (taxa fixa por clip); o comprimento máximo muda, pois conta fotogramas. Uma extensão mantém a taxa de fotogramas do clip anterior, uma sequência a do seu primeiro plano. Uma taxa que o modo não tem: invalid_fps, que lista as disponíveis. |
audio | bool | false | Som gerado juntamente com a imagem (ambiente, voz). Duplica o preço do clip (vê Formatos e preço). |
image | string | Imagem inicial em base64: o vídeo anima esta imagem. | |
end_image | string | Imagem final em base64, a par de image: o clip faz a transição entre uma e outra (apenas motor 2.5). Uma transição sai no tamanho pedido, de 480p a 1080p, e é faturada como um clip desse formato. | |
keyframes | array | Imagens-chave (modo Qualidade): 1 a 4 objetos { "image": base64, "at": seconds, "strength": 0.1 to 1 (1 by default) }. O clip mostra cada imagem no seu momento, por exemplo uma personagem no meio de uma cena que começa e termina numa localização vazia. O comprimento torna-se fixo (length, duration_auto forçado a false); 0 < at < length, pelo menos 0,5 s entre duas imagens-chave; preciso a cerca de um terço de segundo. Funciona com image e end_image. Não disponível em Ultra ou Multi-Ref; numa extensão, apenas com consistency enhanced (vê Coerência reforçada). Mesmo preço que um clip do mesmo formato. | |
lora, lora_strength | string, number | Uma personagem treinada na conta (name de GET /loras) e a sua intensidade (0 a 1). | |
lora2, lora2_strength | string, number | Uma segunda personagem. | |
multiref | object | Coloca 1 a 4 personagens (12 em Ultra) de GET /characters, mais objetos, animais e um cenário guardados de GET /subjects, chamados por @Name no prompt, vê Multi-Ref Vídeo. | |
seed | int | aleatório | Semente da renderização, de 0 a 4294967295. Mesma seed, mesmo prompt, mesma imagem e mesmas definições (formato, comprimento, som, modo): o mesmo clip, com ligeiras diferenças se a placa gráfica mudar. Com duração automática, um comprimento escolhido de forma diferente altera o clip: para uma reprodução exata, define duration_auto como false e indica length. |
steps | int | motor | Deixa vazio. |
Taxa de fotogramas predefinida: 30 fps. Os clips costumavam ser renderizados a 24 fps. Sem fps, um clip com o mesmo length é portanto mais curto do que antes (241 fotogramas: 8 s em vez de 10 s). Envia "fps": 24 para manter o comportamento anterior.
A resposta:
{ "jobId": "...", "seed": 908172, "cost": 30 }O custo é calculado e anunciado no momento da submissão, antes de qualquer débito. A seed também é devolvida, independentemente de a teres fornecido ou de ter sido gerada aleatoriamente.
Formatos e preço
Um vídeo tem preço por formato, como taxa fixa independente da sua duração. Base: 5 créditos.
A taxa fixa é multiplicada por 2 a 720p e por 3 a 1080p, e depois o som duplica o preço.
Os fatores aplicam-se à taxa base, não uns aos outros: 1080p com som custa 5 x 3 x 2 = 30
créditos. Até 481 fotogramas, ou seja 20 s a 24 fps, a duração não altera nada (5 s ou 20 s, a mesma taxa).
Além de 481 fotogramas (até 721, apenas com consistency enhanced, comprimento fixo), o preço do
formato é duplicado. A taxa de fotogramas (fps) não altera o preço, mas os patamares contam fotogramas:
a 30 fps, o preço normal vai até 16 s; a 60, até 8 s (12 s ao dobro do preço em enhanced).
Uma exceção: em Qualidade, 480p sem som custa 2 créditos, independentemente da duração (desde 11 de outubro de 2026). Multi-Ref e coerência reforçada mantêm a taxa fixa do formato, 5 créditos.
| Formato | Lado curto | Exemplos de tamanhos | Sem som | Com som |
|---|---|---|---|---|
| 480p | 480 | 480 x 832, 832 x 480 | 2 (5 em Multi-Ref e coerência reforçada) | 10 |
| 720p | 720 | 720 x 1280, 1280 x 720 | 10 | 20 |
| 1080p | 1080 | 1080 x 1920, 1920 x 1080 | 15 | 30 |
O tamanho que recebes de volta. O motor trabalha em múltiplos de 32 e em duas fases, por isso o ficheiro sai a 768 x 1280 (ou 1280 x 768) para 720p e 1088 x 1920 (ou 1920 x 1088) para 1080p. O 480p mantém-se a 480 x 832 (ou 832 x 480), exceto em coerência reforçada. Útil de saber se juntas ou sobrepões as nossas renderizações.
O modo turbo foi retirado a 11 de outubro de 2026: um pedido turbo é renderizado em Qualidade 480p
e tem o preço correspondente (2 créditos sem som, 10 com som).
Saber o preço antes de submeter
POST /videos/quote aceita o mesmo corpo que POST /videos e executa o mesmo cálculo, mas
nada é criado: sem renderização, sem créditos retidos, sem consumo de quota. Chama-o antes de confirmar,
especialmente a partir de um agente a trabalhar com um orçamento.
{ "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 explica o valor; fps é a taxa de fotogramas usada, e seconds_max a duração em segundos
a essa taxa. Com "consistency": "enhanced", a cotação aceita um comprimento fixo até 721 fotogramas e
aplica a taxa acima de 481 fotogramas (x 2 (over 20 s) em detail a 24 fps, x 2 (over 481 frames) a
outra taxa). A mesma rota existe para imagens, POST /images/quote, que
responde sempre { "cost": 1, ... }: uma imagem custa sempre 1 crédito.
Para um clip Ultra faturado ao segundo, o orçamento dá a duração faturada em seconds, e detail detalha o preço por segundo.
Consultar, descarregar, cancelar
As mesmas rotas que as imagens, em /videos.
GET /videos/{jobId}:pending/completed/failed, mesmos campos. Uma extensão reforçada pode terminar comofailedcom"error": "extension_not_applied"(o motor não aproveitou o final do clip anterior): nada é debitado, submete novamente.GET /videos/{jobId}/file: o MP4 (Content-Type: video/mp4).POST /videos/{jobId}/cancel: cancela, sem qualquer débito.
Em Ultra faturado ao segundo, uma renderização já em cálculo já não para: o cancelamento responde 409 render_in_progress, e o clip é entregue e faturado. Um clip que o motor recusa à saída termina em failed, com uma frase em detail e o código do motor em reason: nada é debitado.
Um vídeo demora 1 a 5 minutos, mais quando o motor arranca a frio. Consulta de 3 em 3 segundos e
descarrega assim que o estado for completed: o ficheiro não é arquivado.
Vários planos num único clip
Um único prompt pode conter vários planos com cortes diretos, até 20 segundos no total a 24 fps (16 s a 30, o valor predefinido). Descreve-os por
ordem: Shot 1: <enquadramento>, <ação>. Cut to Shot 2: .... Repete em cada plano o que tem de se manter
igual (personagem, roupa, lugar, luz), e termina com uma linha de ambiente comum.
Não incluas códigos de tempo: mantém duration_auto ativo, e o motor escolhe a duração (até 20 s a 24 fps, 16 s a 30) e
onde cortar. Dois a quatro planos por clip funcionam melhor.
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.Vários planos num clip, ou uma sequência? Servem propósitos diferentes:
| Vários planos num clip | Sequência (extensões) | |
|---|---|---|
| Entre planos | Cortes diretos | Sem corte: cada plano prolonga o movimento |
| Duração | No máximo 20 s a 24 fps (16 s a 30) | Mais longa |
| Renderizações | Uma | Uma por plano |
| Preço | Um clip | Um clip por plano |
Prolongar um clip
Um clip pode ser prolongado: o plano seguinte continua o movimento do anterior, sem
paragem na junção. É guiado por aproximadamente o último segundo do clip anterior, não por um único
fotograma estático. Adiciona ao POST /videos:
| Campo | Tipo | Predefinição | O que faz |
|---|---|---|---|
extend_job_id | string | O clip a prolongar: uma renderização da tua licença, usada pouco depois de terminar. | |
extend_frames | int | 25 | Quanto do final do clip guia o plano seguinte, em fotogramas: 9, 17, 25, 33, 41 ou 49 (25 é cerca de 1 s a 24 fps). |
extend_video | string | Em vez de extend_job_id: o final de um clip que tens tu próprio, como MP4 em base64 de exatamente extend_frames fotogramas, no máximo 8 MB. |
O plano prolongado mantém a resolução do clip anterior: width e height são ignorados
com extend_job_id, e com extend_video o tamanho é lido do ficheiro que envias. Contém
apenas os novos fotogramas, por isso os planos encadeados formam um vídeo contínuo. Mantém a taxa de fotogramas
do clip anterior: omite fps (herda-a) ou indica a mesma; uma diferente é recusada (extend_fps_mismatch). length é a nova duração do plano (121 = mais 5 s a
24 fps), e é exata: a duração automática não se aplica
a uma extensão. Uma extensão custa o preço de um clip.
Limites: sem imagem final nem imagens-chave ao mesmo tempo, exceto com coerência reforçada.
O som continua na junção. Com audio: true, quando o final do clip anterior tem uma
faixa sonora, o novo plano retoma esse som em vez de criar um novo. Com extend_job_id, o final cortado mantém o som do clip; com extend_video, envia o final com o seu som. Sem faixa sonora nesse final, em coerência reforçada e em Ultra, o som começa do zero com o plano: mantém o mesmo ambiente em cada prompt, para que a junção seja o menos percetível possível.
Prolonga um clip pouco depois de terminar. Mais tarde já não nos está disponível
(clip_unavailable), e envias o seu final tu próprio em extend_video.
Prolongar um plano Ultra, para a frente ou para trás
Um plano renderizado em Ultra ao segundo também se prolonga em Ultra, para a frente ou para trás; qualquer outro clip prolonga-se como acima. Envia POST /videos com "quality": "max" e:
| Campo | Tipo | Predefinição | O que faz |
|---|---|---|---|
extend_job_id | string | O plano Ultra a prolongar, renderizado pela tua licença há menos de 24 horas. | |
extend_upload_id | string | Em alternativa, para um plano mais antigo: o identificador devolvido por POST /extensions (abaixo), depois de enviado o seu ficheiro original. | |
extend_direction | string | forward | forward renderiza o que vem a seguir; backward renderiza os instantes imediatamente antes do plano, para montar à frente dele. |
- A renderização contém apenas a parte nova, com a duração de um clip Ultra (
length/fps, 5 s com a duração automática). Adota a resolução do plano (widtheheightsão ignorados) e liga-se ao seu último fotograma (forward) ou ao primeiro (backward). - Sem imagem inicial, referências (
multiref), movimento nem coerência reforçada.backwardnão entra numa sequência, que arruma os seus planos uns a seguir aos outros. - Preço: a parte nova ao preço do Ultra ao segundo, mais, por segundo do plano prolongado, 2 créditos em 480p, 5 em 720p e 13 em 1080p (
ultra.extend_per_secondemGET /pricing). Esses segundos são arredondados ao segundo superior (com uma precisão de 0,1 s) e contam a 24 fotogramas por segundo: um plano com cadência mais alta conta proporcionalmente (2 s a 60 fps contam como 5 s).POST /videos/quotecom os mesmos campos dáextend_secondse o preço exato. - Um plano com mais de 24 horas: envia o seu ficheiro original, tal como entregue por
GET /videos/{jobId}/file.POST /extensionscom{ "size": <bytes> }devolveupload_id,upload_url,headerseexpires_in(900 s); envia o ficheiro comPUT upload_urle exatamente essesheaders, depois passaextend_upload_idno prazo de 2 horas. Um envio serve para uma renderização: um MP4 de 4 a 30 s, no máximo 60 MB e 1080p. Antes da renderização, cada vídeo enviado ao modo Ultra (um movimento ou um vídeo a prolongar) é verificado, e nada é debitado se for recusado (400 input_video_out_of_limits): 24 a 60 imagens por segundo, uma proporção largura/altura de 0,4 a 2,5 e, por renderização, no máximo 30 s e 10 ficheiros para os vídeos e os sons de referência em conjunto. Com um rosto realista, um ficheiro recodificado ou editado é recusado (400 engine_refused): só o original passa. Um vídeo que não foi renderizado no modo Ultra (o render de outro modo, por exemplo) não é prolongado em Ultra quando mostra um rosto realista (400 extension_real_face, nada é debitado): prolonga-o no modo Qualidade, ou refaz o plano em Ultra.
Coerência reforçada
Com "consistency": "enhanced", o clip é renderizado por um modo que mantém movimento, rostos e
fundo mais estáveis ao longo do tempo. Vai até 721 fotogramas por plano, ou seja 30 s a 24 fps e 24 s a 30 (length, comprimento fixo)
e destina-se sobretudo a vídeos longos:
- Primeiro plano: um clip normal (prompt, imagem inicial,
keyframes,end_image), até 721 fotogramas. - Extensão:
extend_job_id(ouextend_video) como em Prolongar um clip, com o mesmoconsistency.lengthcontinua a ser a nova duração (até 721, ou seja mais 30 s a 24 fps). Uma extensão reforçada também aceitakeyframes, cujoatconta a partir do primeiro novo fotograma, e uma imagem finalend_image, definida no último fotograma do plano: por exemplo a imagem inicial do primeiro plano, para que um vídeo longo faça um loop.
Apenas no modo Qualidade (mode ltx25, sem quality: "max"), até 1080p, não disponível em Multi-Ref
(400 consistency_mode). Preço: a taxa fixa do formato (480p sem som:
5 créditos) até 481 novos fotogramas (20 s a 24 fps), duplicado além disso (vê a
tabela de preços acima). Taxas de fotogramas: 24, 30, 50 ou 60. Acima de 30, o comprimento é fixo
(fps_requires_fixed_duration caso contrário); 50 dá um ligeiro câmara lenta (vê fps). A renderização demora mais do que um clip normal, e o início pode aguardar uma placa gráfica maior (planos longos). Uma sequência mantém o mesmo consistency para todos os seus planos. Tamanho entregue: o mesmo que em Qualidade a 720p e 1080p; a 480p,
o lado curto sai a 448 (448 x 832, 832 x 448, 448 x 448), pois este modo trabalha em múltiplos de 64.
Alguns prompts ainda não são suportados. Para eles, um único plano de 20 s ou menos (15 s com um
end_image, a comprimento fixo) é renderizado em consistência normal, ao mesmo preço. Além disso
(length acima de 481 com duration_auto: false, ou acima de 361 com um end_image), numa extensão ou numa
sequência, o pedido é recusado com 400 consistency_explicit: encurta o plano ou pede
consistency: "standard".
Vídeo longo (sequências)
Um clip dura no máximo 481 fotogramas, ou seja 20 s a 24 fps (721 com coerência reforçada, 30 s a 24 fps). Para durações maiores, uma sequência regista cada plano assim que a sua renderização termina, e depois junta-os num único MP4 sem recodificação. Um minuto, por exemplo, são 3 planos de 20 s, ou 2 planos de 30 s em coerência reforçada, a 24 fps.
POST /sequencesabre uma sequência e responde com{ "sequence_id": "seq_...", ... }.POST /videoscom"sequence_id": "seq_..."para cada plano: o primeiro como habitualmente, os seguintes comextend_job_iddefinido para o plano anterior. Cada plano é registado na sequência, por ordem de submissão, assim queGET /videos/{jobId}o vê como terminado.POST /sequences/{id}/exportquando o último plano terminar. Responde comseconds,resolutionefile_url.GET /sequences/{id}/file: o vídeo montado (MP4).
Em paralelo: GET /sequences/{id} dá o estado (planos registados ou ainda esperados),
POST /sequences/{id}/clips com { "job_id": "..." } regista uma renderização manualmente, e
DELETE /sequences/{id} elimina a sequência de imediato.
Regras. Todos os planos têm a mesma resolução (as extensões mantêm-na) e a mesma escolha de som, todos
com som ou todos silenciosos, o mesmo consistency e a mesma taxa de fotogramas (fps): o primeiro plano define-as, e um plano diferente é recusado (409 consistency_mismatch, 409 sequence_fps_mismatch; 422 encoding_mismatch
para um plano registado manualmente). Um plano sem fps herda a taxa da sequência. No máximo
30 planos por sequência e 5 sequências em curso por licença.
O que guardamos e por quanto tempo. Os planos de uma sequência em curso são apagados 30 minutos após o último ter sido adicionado, e o vídeo montado 24 horas após a exportação. Depois tudo desaparece.
Exportar a pasta do projeto
Uma pasta de projeto reúne num ZIP tudo o que é preciso para retomar um vídeo noutro sítio ou automatizá-lo: os planos, as suas referências, a montagem e um manifesto que permite renderizar cada plano de novo. É gratuita: nada é renderizado.
POST /videos/{jobId}/export: um render dePOST /videos(plano isolado, Multi-Ref, extensão).POST /sequences/{id}/project: todos os planos de uma sequência, seguidos.- Corpo opcional, as mesmas escolhas da janela de exportação da app:
include_media(truepor omissão): os vídeos dos planos e os respetivos originais assinados.false: nenhum vídeo (nem clip, nem original, nem filme); os planos guardam o texto, as definições e as referências ("state": "expired") e o manifesto trazvideos_included: false.include_references(truepor omissão): as vistas das personagens e as imagens dos elementos, emreferences/.false: nenhuma é copiada; os nomes, @menções,ide impressões digitais ficam no manifesto (references_included: false).exclude_references: as referências a não copiar, uma a uma, porid(character_id,subject_id), nome ou @menção, por exemplo["@Parc", "chr_..."](200 no máximo). O manifesto trazreferences_included: "partial"e"included": falseem cada excluída (falsese forem todas). Uma entrada que não designa nenhuma referência da exportação:400 unknown_reference.include_film(só sequência,falsepor omissão): o filme de uma sequência já montada; exigeinclude_media(senão400 invalid_export_options, tal como uma opção que não é booleana ou umexclude_referencesque não é uma lista de textos).manifest_only: true: só o manifesto, sem ZIP.
A resposta é { "manifest": { ... }, "file_url": "...", "export_id": "exp_...", "expires_at": "...", "bytes": n }, e GET /exports/{id}/file descarrega o ZIP. Uma exportação de cada vez por licença (409 export_in_progress), 2 GB no máximo (413 export_too_large: exporta os planos um a um).
| Ficheiro | Conteúdo |
|---|---|
tendre-project.json | O manifesto (esquema tendre.project/1, chaves em inglês). Para cada plano: o seu estado, o prompt escrito (prompt) e o enviado ao motor (prompt_sent), as definições, a seed, o custo, a extensão (extends, direction), as referências ligadas aos seus ficheiros e api_request, o corpo de POST /videos que renderiza o plano de novo (null se uma imagem só foi enviada em base64); no início, references_included: true no ZIP (os ficheiros das referências estão em references/), false com manifest_only (referências sem ficheiro: files vazio, apenas impressões sha256); um manifesto sem este campo (exportações anteriores) lê-se como true. Uma pasta exportada pela app, onde o cliente escolhe as referências uma a uma, leva true, false ou "partial", e cada referência pode levar included (se faltar: como no início, false se aí for false, senão true); uma referência não incluída mantém o nome, a @menção, o id e a descrição, com files vazio. project.settings leva as definições do primeiro plano (quality, width, height, fps, audio, output_format "mp4") e settings_from_shot, o id desse plano. Uma pasta exportada pela app pode conter um bloco app reservado à app: ignora-o |
shots/NN/clip.mp4 | O render de cada plano, enquanto o servidor o tiver; shots/NN/original.mp4 ou .mov: o ficheiro assinado do motor, byte a byte, se ainda existir |
references/ | As vistas das personagens e as imagens dos locais, objetos, animais, estilos e roupas usados |
timeline.otio, timeline.fcpxml | A montagem (OpenTimelineIO; FCPXML para Final Cut Pro e DaVinci Resolve), com os ficheiros por caminho relativo à pasta |
film.mp4 | O vídeo montado de uma sequência, só com include_film: true e se já tiver sido montada (POST /sequences/{id}/export); caso contrário, assembled vale null no manifesto |
O que guardamos e por quanto tempo. Para cada POST /videos aceite, o servidor guarda uma ficha do render sem nenhuma imagem nem vídeo: o texto, as definições, os identificadores (uma imagem enviada em base64 só deixa a sua impressão digital). É apagada 24 horas após o envio; depois disso, a exportação responde 404 unknown_export. O ZIP é apagado 45 minutos após o seu primeiro download, 2 horas após a sua criação no máximo. Um plano que o servidor já não tem sai com "state": "expired", sem o ficheiro mas com o texto, as definições e as referências: um agente pode renderizá-lo de novo com api_request.
Sequência. A montagem apaga os planos um a um. Para teres os planos e o filme, exporta o projeto antes de montar, depois monta e exporta de novo com { "include_film": true }: o filme junta-se, e os planos saem então como expired.
Modo Ultra
O modo Ultra é a renderização de vídeo mais fina. Adiciona "quality": "max" a POST /videos (com mode ltx25, o valor predefinido). É faturado ao segundo, ou a preço fixo com um LoRA ou numa extensão de um clip que não foi renderizado ao segundo; prolongar um plano Ultra, para a frente ou para trás, é faturado ao segundo. POST /videos/quote dá o preço exato do teu pedido.
Ao segundo
O clip é faturado ao segundo conforme a sua resolução, som incluído:
| Resolução | Preço |
|---|---|
| 480p | 4 créditos por segundo |
| 720p | 8 créditos por segundo |
| 1080p | 20 créditos por segundo |
- Duração: de 4 a 30 s a 24 imagens por segundo, conhecida antes da renderização: 5 s em duração automática (
duration_auto, por predefinição), caso contráriolength/fps(24 sefpsfaltar), arredondada ao segundo. - Formato: o pedido, na proporção mais próxima; o 480p é renderizado em 480p. Acima de 1080p:
resolution_outside_ultra. - Imagem inicial (
image): possível. O motor pode recusar um texto ou uma imagem no envio:400 engine_refused, com o motivo emdetaile o código emcode; nada é debitado. - Sem semente:
seedé ignorada e a resposta não a indica. - Cancelamento: livre enquanto a renderização espera a sua vez; depois de entrar em cálculo,
409 render_in_progress, e o clip é entregue e faturado. - Sem imagem final, sem imagens-chave e sem coerência reforçada em Ultra.
A preço fixo
Com um LoRA ou numa extensão de um clip que não foi renderizado ao segundo, o Ultra é renderizado com o modelo de vídeo completo, a preço fixo:
| Formato pedido | Tamanho entregue | Preço fixo por clip |
|---|---|---|
| 480p ou 720p | Como na tabela acima a 720p (1280 x 768), um pedido 480p é renderizado em 720p | 40 créditos |
| 1080p | Como na tabela acima (1920 x 1088) | 60 créditos |
O preço é fixo por formato: o som e a duração não mudam nada. O Ultra começa a 720p: um pedido 480p
é renderizado, e faturado, em 720p. POST /videos/quote dá o preço exato. 1080p (1920 x 1088) é o máximo, em todos os modos: o 4K deixou de ser oferecido. Um tamanho maior é recusado (ultra_4k_unavailable com quality: "max", resolution_above_quality sem ele).
- Duração: no máximo 481 fotogramas, como qualquer clip (20 s a 24 fps, 16 s a 30, 8 s a 60). As extensões e os vídeos longos também funcionam em Ultra. Uma extensão mantém o tamanho do clip que continua, e abaixo de 720p é faturada ao preço de 720p.
- Tempo: vários minutos para um clip de 5 s, mais para um clip de 20 s. O início pode aguardar que uma placa gráfica grande fique disponível.
- Sem transição (
end_image) em Ultra (ultra_incompatible). - Sem imagens-chave (
keyframes) em Ultra (keyframes_mode). - Um LoRA da personagem da tua conta aplica-se em Ultra como no modo normal.
Multi-Ref Vídeo
Um clip onde 1 a 4 personagens (até 12 em Ultra) atuam, cada uma reconhecível, num cenário opcional, com objetos,
animais e um cenário guardados quando precisares. As personagens vêm de
GET /characters: criadas a partir de uma foto através da API, ou na app. Os
objetos, animais e cenários vêm de GET /subjects. Adiciona o
objeto multiref ao POST /videos (permissão videos) e chama cada personagem por @Name no
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 | O que faz |
|---|---|
characters[].character_id | Uma personagem de GET /characters |
characters[].name | Uma palavra (letras, dígitos, _), a que se escreve após @ no prompt |
characters[].description | Uma descrição curta em inglês; por predefinição, o seu kind |
characters[].strength | Peso da semelhança, de 0 a 2 (1 por predefinição) |
characters[].sheet_id | Opcional: qual a character sheet a usar para uma personagem que tem várias (a mais recente por predefinição) |
characters[].voice | Com "audio": true, characters[0] e characters[1]: character (o predefinido) é a voz do seu perfil quando está online (has_voice na personagem), senão uma voz feita pelo modelo; generated pede uma voz feita pelo modelo. A resposta indica qual foi usada (voices). |
characters[].voice_b64 | Opcional, apenas characters[0] e characters[1], com "audio": true: outra voz para a personagem, um ficheiro de áudio (WAV, MP3, OGG, FLAC) em base64, no máximo 4 MB (um excerto curto é suficiente), que tem prioridade sobre a do perfil |
background_b64, background_description | Cenário opcional: uma imagem e algumas palavras em inglês |
- Prompt em inglês, um parágrafo no presente;
Sound:para o som, diálogos entre aspas,exactly 2 peoplee onde cada um está quando ajuda, sem negações. Uma criatura é descrita pelo que é. Um@Nameque não corresponde a nenhuma personagem é recusado (unknown_mention). - Formatos (
widthxheight): retrato 480 x 832, 720 x 1280, 1088 x 1920; paisagem 832 x 480, 1280 x 720, 1920 x 1088; quadrado 480 x 480, 720 x 720, 1088 x 1088. Sem 4K; 480p apenas em Qualidade. - Modos: Qualidade (o predefinido), ou Ultra (
quality: "max"). Sem extensão nem transição. - Duração: automática (
duration_auto, o predefinido), ou fixa comduration_auto: falseelength121 (5 s), 241 (10 s) ou 481 (20 s) a 24 fps; a outra taxa, as mesmas durações contadas em fotogramas, no máximo 481 (a 30: 145, 297, 481; a 60: 297, 481). - Taxa de fotogramas:
fps24, 30 (o predefinido) ou 60, como em qualquer clip;lengthconta fotogramas a esta taxa, no máximo 481 (16 s a 30, 8 s a 60). - Preço: o preço de um clip. Em Qualidade, o preço fixo do formato na tabela acima,
duplicado com som; 480p sem som mantém-se a 5 créditos (o preço reduzido de
Qualidade não se aplica ao Multi-Ref).
POST /videos/quotecom"multiref": truedá o preço exato. - O servidor adapta as vistas ao formato exato do vídeo: envia as personagens tal como estão. Uma
personagem que tem apenas uma vista é renderizada, com
warningslimited_likenessna resposta: a semelhança é limitada. - Vozes de perfil: com som,
characters[0]echaracters[1]falam por predefinição com a voz do seu perfil quando está online (has_voice);voicegenerateddeixa o modelo fazer uma. A resposta dá a voz de cada uma emvoices(character_id,voice:character,customougenerated). - Vozes das personagens (
voice_b64): o modelo faz a personagem falar com essa voz, incluindo os lábios; o servidor usa os primeiros 5 segundos. No máximo duas vozes, emcharacters[0]echaracters[1](o motor suporta 2 vozes). Ordenacharacterscomo o diálogo:characters[0]fala primeiro,characters[1]responde. Requer som ("audio": true), caso contráriovoice_requires_audio; uma voz noutra personagem:voice_slot; um ficheiro ilegível:unsupported_audio_format; acima de 4 MB:audio_too_large. Apenas os primeiros 5 segundos são usados: envia um excerto curto. O corpo do pedido completo não deve ultrapassar 30 MB (acima disso, um413sem corpo JSON). Sem custo adicional. - A consulta, o download e o cancelamento são os de qualquer vídeo (vê Consultar, descarregar, cancelar, acima).
Objetos, animais e cenários guardados. Mais dois campos de multiref colocam os
sujeitos que guardaste a partir das tuas próprias imagens:
Campo de multiref | O que faz |
|---|---|
subjects[] | Objetos e animais (subject_id, depois opcional name, description, strength). Partilham os slots com as personagens: no máximo 4 referências no total; em Ultra, até 30 imagens no total (ver abaixo). |
location | Um cenário guardado como ambiente (subject_id, depois opcional name, description, strength): as suas imagens, com uma intensidade própria. Substitui background_b64 (os dois juntos: multiref_incompatible). Requer pelo menos uma personagem, objeto ou animal. |
name tem como predefinição a primeira palavra do nome do sujeito, e cada @Name no prompt é correspondido
como o de uma personagem. Um cenário passado em subjects, ou um objeto passado como location, é recusado
(invalid_subject_type). O preço não muda: é o preço de um clip. Um sujeito é usado com as suas 5 primeiras imagens (todas em Ultra, 6 no 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."Em Ultra, um clip Multi-Ref segue as regras do Ultra faturado ao segundo: mesmo preço por segundo, som incluído, de 4 a 30 s a 24 imagens por segundo (5 s em duração automática), de 480p a 1080p, sem semente.
- Cada personagem parte com a sua character sheet (ou, sem ela, com todas as suas imagens), e o servidor junta tudo numa única imagem; cada objeto, animal ou cenário com todas as suas imagens (6 no máximo).
- A primeira renderização de uma personagem prepara essa imagem, umas dezenas de segundos a mais: o seu
jobIdcomeça então porsdp-e acompanha-se como os outros. - Sem voz:
voice_b64e a voz da ficha são ignoradas (warningsvoice_ignored), estrengthnão tem efeito. - O motor pode recusar uma imagem de referência (um rosto real, por exemplo): a renderização termina em
failedcom o motivo, e nada é debitado.
Estilos, roupas e movimento. Só em Ultra (quality: "max"), mais três campos de multiref; noutro modo, o pedido é recusado (multiref_ultra_only), nunca renderizado sem eles.
Campo de multiref | O que faz |
|---|---|
styles[] | Estilos guardados (subject_id, depois name, description opcionais): todo o clip adota o seu aspeto (técnica, luz, cores, texturas), nunca o seu conteúdo. |
outfits[] | Roupas guardadas (os mesmos campos, mais worn_by), usadas tal como nas suas imagens. worn_by (opcional) é o name de uma das personagens: acrescenta "<Nome> wears <Roupa>." no início da cena. Sem ele, escreve-o no prompt: @Lea wears @RedGown. |
motion | Um vídeo de movimento de 4 a 30 s: { "motion_id": ... } (enviado com POST /motions) ou { "video_b64": ... } (MP4, MOV, WebM ou MKV, no máximo 20 MB), e uma description opcional do movimento em inglês. mode indica o que o clip retoma dele: camera (por defeito), o seu movimento de câmara, o seu enquadramento e o seu ritmo; choreography, os movimentos do corpo, os gestos e o seu ritmo. Nunca a pessoa nem o lugar do vídeo; o mesmo preço nos dois modos. O servidor reduz o vídeo a cerca de 410 000 píxeis (856 × 482 em 16:9), a 24 imagens por segundo, sem som; a proporção largura/altura vai de 0,4 a 2,5. |
- No máximo 30 imagens em Ultra, entre personagens, sujeitos, estilos, roupas e cenário (
multiref_too_many_images), com 12 personagens no máximo (multiref_characters_requiredacima disso). Recomendam-se 8: de 9 a 12, o render é processado comwarningsmany_characters, porque algumas podem faltar ou misturar-se. Um estilo fora destyles, ou uma roupa fora deoutfits, é recusado (invalid_subject_type). -
Preço do movimento: 3 créditos por segundo do vídeo de movimento (arredondado ao segundo superior), além do render, lido em
GET /pricing(ultra.motion_per_second);POST /videos/quotecom o mesmomultiref.motiondámotion_secondse o preço exato. - Envio direto, para um vídeo de movimento pesado:
POST /motionscom{ "size": <bytes> }(no máximo 20 MB) devolvemotion_id,upload_url,headerseexpires_in(900 s); envia o ficheiro comPUT upload_urle exatamente essesheaders, depois passamultiref.motion.motion_idaPOST /videosno prazo de 2 horas. Ummotion_idserve para um 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."Os códigos de erro dos estilos, das roupas e do movimento estão em Limites e erros.
Com o servidor MCP, o agente faz tudo isto com tendre_multiref_video: pede a
cena e nomeia as personagens, objetos, animais e o cenário (subjects, location_id).
Face swap
A pessoa filmada no teu próprio vídeo torna-se uma das tuas personagens: rosto,
cabelo, corpo e roupa (ou só a cabeça, ver part), mantendo os seus gestos, os lábios e o cenário, e a voz, salvo se a personagem tiver a sua (ver voice). É o
Face swap da app, numa passagem de no máximo 20 s: uma personagem, sem encadeamento e
sem transição. O pedido é POST /faceswap (permissão 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 | O que faz |
|---|---|
video_b64 | O vídeo, no máximo 20 MB, com uma pessoa claramente visível. Acima disso, corta ou comprime-o primeiro, ou usa a ferramenta MCP tendre_face_swap, que aceita até 95 MB. |
character_id, sheet_id | Uma personagem de GET /characters, e a sua character sheet se tiver várias (a mais recente por predefinição). |
name | Opcional, no máximo 60 caracteres: o nome da personagem, por predefinição o que tem em GET /characters. Uma personagem criada na app só tem o nome online depois de a app o enviar (app 0.9.1 e seguintes; caso contrário, name é null em GET /characters): indica um para a chamar @Name em scene, caso contrário chama-a Image 1. |
start, duration | A passagem, em segundos: a partir de start (0 por predefinição), durante duration (por predefinição até ao final do vídeo, no máximo 20 s). |
scene | Opcional, em inglês, no máximo 400 caracteres: o que deve mudar ou ser precisado. A personagem é chamada @Name (a primeira palavra do seu nome, vê name) ou Image 1. Sem cena, move-se exatamente como a pessoa filmada. Nunca faças a personagem falar nela nem descrevas a boca, o olhar ou a cabeça («says», «looks at the camera», «smiles»): ela copia-os do vídeo, e uma instrução fá-la inventá-los, com os lábios dessincronizados e a cabeça virada. Descreve o que muda à volta: roupa, acessório, luz. |
description | Opcional, em inglês, no máximo 360 caracteres: quem é a personagem ("a 28 year old woman with long red hair, wearing a black leather jacket"). Por predefinição, o seu kind e o seu traje. |
part | full (o predefinido): a personagem inteira. head: só a cabeça (rosto e cabelo); o corpo filmado, a roupa e o cenário mantêm-se. A personagem é então renderizada a partir dos três retratos da sua character sheet, recortados à cabeça (heads_only na resposta); uma personagem de uma ou duas vistas mantém-nas inteiras. A sua descrição predefinida dá apenas o seu kind, sem o traje, e zone é tight por predefinição. |
zone | O espaço em redor da silhueta filmada onde a personagem pode ser desenhada: tight (Justa), normal (o predefinido) ou wide (Larga, espaço para orelhas grandes, asas, uma constituição larga). Com part head, é o espaço em redor da cabeça, tight por predefinição. |
likeness | O grau de proximidade da personagem às suas vistas, de 0,5 a 2 (1 por predefinição). |
audio | true por predefinição: o som do vídeo é mantido, e os lábios acompanham-no. false: um vídeo silencioso. |
voice | character (o predefinido): o som do vídeo é convertido para a voz do perfil da personagem quando ela tem uma online (has_voice em GET /characters), no mesmo render e sem alterar o ritmo, por isso os lábios ficam sincronizados. Sem voz de perfil, fica a voz filmada. original: manter a voz filmada. A resposta indica qual foi usada (voice: character, custom, original, ou none sem som). |
voice_b64 | Opcional, com som: outra voz para a personagem (WAV, MP3, OGG, FLAC, no máximo 2 MB; os primeiros 20 segundos são usados), que tem prioridade sobre a do perfil. O som do vídeo é convertido para esta voz, sem alterar o seu ritmo. |
seed | Semente da renderização, de 0 a 4294967295, para voltar a renderizar ou variar. |
Vídeo e voz juntos: no máximo 22 MB, para que o corpo do pedido não ultrapasse 30 MB (acima disso, um
413 sem corpo JSON).
- O servidor prepara tudo. Corta a passagem, ajusta-a para a taxa de fotogramas de trabalho (30 fps para uma fonte a 29 fps ou mais, incluindo 50 e 60, e 24 abaixo) e para o formato de trabalho (múltiplos de 128, lado curto de 768, a proporção mais próxima do teu vídeo), e adapta as vistas da personagem a esse formato.
- O que recebes de volta é o vídeo da passagem no formato de trabalho, cerca de um megapixel (768 x 1408 para um vídeo vertical, por exemplo), com as proporções do teu vídeo dentro de 5%. Resolução total e várias personagens em sequência são específicos da app de ambiente de trabalho tendre.AI: ela cola a personagem de volta no vídeo original com a sua resolução total, e encadeia várias personagens.
- Preço: 6 créditos por segundo da passagem preparada (
secondsna resposta), arredondado para cima ao crédito seguinte. A resposta dájobId,seed,coste a passagem preparada (width,height,length,fps,seconds,audio,voice,views,part). Uma personagem que tem apenas uma vista é renderizada, comwarningslimited_likeness. - Sem cotação: nem
POST /videos/quotenem otendre_quotedo MCP conhecem o Face swap. Para calcular o preço antes de submeter, lêgrid.body_swapemGET /pricing: segundos da passagem xper_block_720p(o preço de um bloco) /block_seconds(a duração de um bloco), arredondado para cima ao crédito seguinte. - Algumas cenas são renderizadas a partir dos três retratos da personagem recortados à cabeça (
heads_onlyna resposta), e o traje das suas vistas já não é imposto: a cena decide. - Um Face swap conta como uma utilização da personagem e adia a sua eliminação, tal como o Multi-Ref.
- A consulta, o download e o cancelamento são os de qualquer vídeo (vê Consultar, descarregar, cancelar, acima):
GET /videos/{jobId},GET /videos/{jobId}/file,POST /videos/{jobId}/cancel. - Erros próprios:
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(uma voz acima de 2 MB),face_swap_too_large(a passagem ainda está demasiado pesada depois de preparada: encurtaduration),server_busy(dois vídeos já estão a ser preparados: tenta de novo apósRetry-After, 20 s),face_swap_unavailableeface_swap_price_missing(Face swap encerrado, ou sem preço: tenta mais tarde). O que cada um significa: Limites e erros. - O teu vídeo passa pelos nossos servidores enquanto é preparado, depois vai para a placa gráfica que o renderiza, como qualquer imagem de origem.
Usa apenas vídeos de pessoas que deram o seu consentimento: é uma regra dos termos de utilização.
Com o servidor MCP, o agente faz tudo isto com tendre_face_swap.