API de geração de vídeo UGC com IA: crie anúncios UGC automaticamente

Um blueprint funcional para uma API de geração de vídeo UGC com IA: como transformar um briefing de produto em dezenas de anúncios verticais no estilo criador, com roteiros, imagens de persona, clipes de vídeo com áudio nativo, limites de fila, checagens de qualidade e divulgação clara de IA, com código de requisição em Python e Node.

API de geração de vídeo UGC com IA: crie anúncios UGC automaticamente
Cristian Da Conceicao
Fundador do Picasso IA

As marcas deixaram de confiar em comerciais de estúdio polidos há algum tempo, e os espectadores deixaram de assisti-los ainda antes. O que faz o polegar parar é uma mulher na cozinha explicando, com as próprias palavras, por que um sérum finalmente funcionou para ela. Esse é o anúncio de estilo UGC (conteúdo gerado pelo usuário), e é por isso que as equipes de performance agora querem uma API de geração de vídeo UGC com IA em vez de uma planilha cheia de criadores esperando amostras de produto.

Este artigo apresenta um pipeline que você pode construir esta semana. Um briefing de produto entra, e uma leva de anúncios verticais, no estilo criador, sai. Você recebe código de requisição funcional em Python e Node, os limites reais da API para desenvolvedores da PicassoIA, uma tabela com o que cada modelo faz e as checagens que mantêm os anúncios automatizados honestos e alinhados à marca.

Por que anúncios UGC precisam de uma API

O problema do volume criativo

Todo profissional de marketing de performance conhece o ciclo. Um criativo entra no ar, o gasto aumenta e, em poucas semanas, o público já viu demais e os resultados caem. A solução é mais criativo, e não um pouco mais. Um teste sério cruza ganchos, personas, cenários e durações, então cinco ganchos, quatro personas e três cenários já somam 60 variantes antes de você mexer na chamada para ação.

Contratar criadores humanos para essa matriz significa briefings, envios de produto, rodadas de feedback e uma longa espera. Pedir a um editor que corte sessenta versões à mão faz o trabalho acontecer uma vez por trimestre, em vez de toda semana.

Um desenvolvedor em uma mesa perto de uma janela com chuva, construindo um pipeline automatizado de anúncios

💡 Dica: Trate o criativo como estoque. Se um novo lote leva três semanas para chegar, você está sempre rodando os vencedores de ontem.

Veja como as duas abordagens se comparam na prática:

Fluxo manual com criadoresPipeline orientado por API
Variantes por rodada de testeAlgumas, limitadas pelas contrataçõesDezenas, limitadas pela sua matriz
Tempo de entregaDe dias a semanasMinutos por clipe
Consistência entre variantesDepende de cada criadorDefinida pelo seu template
Mudar uma alegação do produtoRegravar ou recortarEditar uma linha e rodar de novo
Esforço de revisãoPor vídeo, longoPor lote, checagens pontuais

O que uma API substitui

Ela substitui o clique. Um painel serve para um clipe, mas ninguém quer colar sessenta prompts em um formulário. Com uma API, o briefing fica em uma planilha, em um feed de produtos ou em uma linha de banco de dados, e um script transforma cada linha em uma requisição.

O trabalho é assíncrono: você cria uma previsão, consulta o status e depois baixa o arquivo final. A documentação para desenvolvedores não descreve webhooks, então o polling é todo o mecanismo, o que mantém a integração pequena.

Gatilhos típicos para uma execução em lote são estes:

  • Um novo produto entra no seu catálogo e precisa de um conjunto de lançamento.
  • Um anúncio vencedor mostra desgaste e precisa de dez irmãos.
  • Uma oferta sazonal muda o gancho de cada clipe ativo.
  • Um novo mercado precisa de versões localizadas do mesmo roteiro.

Uma API substitui a produção, não o julgamento. Alguém ainda precisa decidir quais alegações são verdadeiras e quais clipes são bons o bastante para rodar.

O pipeline do briefing ao anúncio

Pense em quatro etapas, cada uma com uma entrada e uma saída. Quando uma etapa falha, você tenta de novo apenas essa etapa, nunca a cadeia inteira.

EtapaEntradaSaída
RoteiroBriefing do produto e tipo de gancho10 a 15 segundos de texto falado
Quadro da personaPrompt de persona e cenárioUma imagem fixa
VídeoImagem fixa mais prompt de movimentoUm clipe com áudio
RevisãoClipe mais metadadosAprovado ou rejeitado

Etapa 1: variantes de roteiro

Use qualquer modelo de linguagem para escrever as falas, porque a API de vídeo não se importa de onde vêm as palavras. Dê a ele uma estrutura rígida: um gancho nos primeiros dois segundos, um problema, uma prova e uma chamada para ação.

O UGC parece real porque é curto e específico. "Parei de comprar três produtos e fiquei com este" vence "o melhor sérum de todos" sempre. Peça uma dúzia de ganchos por produto e fique com os cinco que soam como uma pessoa falando em voz alta.

Vista de cima de um roteiro impresso de anúncio, frascos de produto e um celular sobre uma mesa de madeira

💡 Dica: Uma alegação por roteiro. Cada alegação extra é mais uma frase que você precisa verificar antes de qualquer coisa ir ao ar.

Etapa 2: imagens de persona e cena

O primeiro quadro decide como o clipe inteiro vai parecer, porque o modelo de vídeo anima a partir dele. Use o PicassoIA Image para gerar o quadro da persona: uma pessoa em um cômodo com jeito de morada, luz de janela, enquadramento de câmera na mão, com um produto sem marca na mão.

Quando o produto real precisar aparecer, use o PicassoIA Image Editor Pro. Ele aceita de uma a quatro imagens de entrada, então você pode colocar sua foto de embalagem real na cena e manter o rótulo correto.

Escreva prompts como um fotógrafo: lente, direção da luz, textura da pele e do tecido. Rejeite o visual brilhante. O UGC pede cômodos imperfeitos e luz natural.

Vista em contra-plongée de um celular em tripé filmando um homem em uma sala de estar loft

Etapa 3: vídeo com áudio nativo

Envie o quadro para o Seedance 2.5 Lite com um prompt de movimento que diga o que a pessoa faz e diz ao longo do clipe. A opção save_audio vem ativada por padrão, então a fala e o som do ambiente chegam dentro do arquivo, em vez de virar uma etapa separada do pipeline.

Descreva a ação em ordem: ela levanta o frasco, olha para a lente, diz a fala, sorri. Ajuste o roteiro ao clipe também. Um vídeo de dez segundos comporta cerca de 25 a 30 palavras faladas em ritmo natural, então uma fala mais longa será apressada ou cortada.

Mantenha o movimento de câmera mínimo. Uma leve deriva da câmera na mão é a assinatura do UGC, e movimentos cinematográficos pesados quebram a ilusão.

Close de mãos abrindo uma caixa de envio de papel kraft sobre um sofá de linho

Etapa 4: revisão e envio

Baixe o clipe, verifique e envie para sua plataforma de anúncios com um nome que identifique a variante, como question_kitchen_10s. Esse padrão de nomes é o que torna os resultados legíveis depois, quando você finalmente puder dizer que a persona da cozinha com o gancho de pergunta superou todo o resto. Registre o nome da variante, o prompt, o seed, o modelo e o id da previsão em uma linha por clipe, e sua planilha se torna a memória de toda a campanha.

Modelos que você pode chamar hoje

Modelos da API em resumo

No momento em que escrevo, a API da PicassoIA expõe quatro modelos. As entradas abaixo vêm da documentação pública para desenvolvedores.

ModeloFunção em um pipeline UGCEntradas relevantes
PicassoIA ImageImagem fixa de persona e cenaprompt
PicassoIA Image Editor ProColocar seu produto real em uma cenaprompt, images (1 a 4)
PicassoIA VideoTexto ou imagem para vídeoresolution (480p, 720p, 1080p), duration, seed
Seedance 2.5 LiteImagem para vídeo com áudioimage, last_frame_image, duration (5, 10, 15), resolution (480p, 720p)

Dois detalhes importam para anúncios. No PicassoIA Video, a duração máxima depende da resolução: até 20 segundos em 480p, até 10 em 720p e até 5 em 1080p. No Seedance 2.5 Lite, o last_frame_image opcional permite fixar onde o clipe termina, o que é útil quando o último quadro precisa mostrar o produto.

💡 Dica: aspect_ratio vem por padrão como match_input_image quando você envia uma imagem. Sua imagem fixa decide se o anúncio é vertical ou quadrado, então confira a forma do quadro da persona antes de gastar um job de vídeo com ele.

Vozes e sincronização labial no app

O catálogo mais amplo fica no app web, e não na API. É ali que você encontra vozes dedicadas e ferramentas para fazer apresentadores falarem nos casos em que o áudio nativo não basta.

Uma divisão prática: deixe a API produzir a maior parte dos seus clipes com áudio nativo, e leve os cinco ou dez anúncios de melhor resultado para o app, para um acabamento de voz e sincronização labial.

Uma mulher com fones de ouvido de estúdio gravando uma narração em um microfone condensador

Sua primeira requisição em Python

Autenticação e URL base

Tudo vai para https://api.picassoia.com/v1, e toda requisição carrega um cabeçalho Authorization: Bearer pia_sk_…. Crie a chave secreta na página da API da sua conta. Uma conta pode ter duas por vez, então faça a rotação criando a nova antes de apagar a antiga.

Guarde a chave secreta em uma variável de ambiente no seu servidor. Nunca a envie em um bundle de navegador ou em um app móvel.

💡 Verifique o acesso primeiro: a documentação diz que as previsões atualmente não usam créditos, mas criar uma delas responde 403 plan_required quando seu plano não inclui acesso à API. Envie uma única requisição de teste antes de projetar qualquer coisa em torno da API.

Criar, consultar e baixar

O endpoint para um novo job é POST /v1/models/{owner}/{name}/predictions, com seus campos envolvidos em um objeto input. A resposta traz um id, um status (starting, processing, succeeded, failed ou canceled) e um output que é uma URL ou uma lista de URLs.

O polling usa GET /v1/predictions/{id}. O campo eta.next_poll_in_seconds informa quando vale a pena fazer a próxima checagem, então você nunca sobrecarrega o endpoint.

import os, time, requests

API = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_TOKEN']}"}

def run(model, payload):
    r = requests.post(f"{API}/models/{model}/predictions",
                      json={"input": payload}, headers=HEADERS)
    pred = r.json()
    if not r.ok:
        raise RuntimeError(f"{pred['code']}: {pred['detail']}")
    while pred["status"] not in ("succeeded", "failed", "canceled"):
        time.sleep((pred.get("eta") or {}).get("next_poll_in_seconds", 2))
        pred = requests.get(pred["urls"]["get"], headers=HEADERS).json()
    if pred["status"] != "succeeded":
        raise RuntimeError(pred["error"] or pred["status"])
    return pred["output"]

def first(output):
    return output[0] if isinstance(output, list) else output

def make_ad(brief):
    frame = first(run("picassoia/picassoia-image", {"prompt": brief["persona_prompt"]}))
    return first(run("picassoia/seedance-2.5-lite", {
        "prompt": brief["motion_prompt"],
        "image": frame,
        "duration": 10,
        "resolution": "720p",
    }))

Trate failed como dado, não como surpresa. Registre a string error, tente de novo um job que falhou uma vez com a mesma entrada e, depois, mais uma vez com um prompt um pouco mais curto, e encaminhe-o para uma revisão humana depois disso. Nunca tente de novo plan_required nem uma requisição malformada, porque a resposta não vai mudar. Copie os arquivos finais para seu próprio armazenamento assim que ficarem prontos, em vez de presumir que o link de saída viverá para sempre.

O mesmo fluxo em Node

A versão em Node é o mesmo loop com fetch. Envolva seus campos em input, faça o polling de urls.get e respeite eta.next_poll_in_seconds.

const API = 'https://api.picassoia.com/v1'
const headers = {
  Authorization: `Bearer ${process.env.PICASSOIA_TOKEN}`,
  'Content-Type': 'application/json',
}
const sleep = (s) => new Promise((r) => setTimeout(r, s * 1000))

async function run(model, input) {
  const res = await fetch(`${API}/models/${model}/predictions`, {
    method: 'POST', headers, body: JSON.stringify({ input }),
  })
  let pred = await res.json()
  if (!res.ok) throw new Error(`${pred.code}: ${pred.detail}`)
  while (!['succeeded', 'failed', 'canceled'].includes(pred.status)) {
    await sleep(pred.eta?.next_poll_in_seconds ?? 2)
    pred = await (await fetch(pred.urls.get, { headers })).json()
  }
  if (pred.status !== 'succeeded') throw new Error(pred.error ?? pred.status)
  return pred.output
}

Escalando para muitos anúncios por dia

Uma pequena equipe de marketing revisando quadros de vídeo impressos em um mural de cortiça

Trabalhando dentro do limite de cinco jobs

A conta permite 5 previsões na fila ou em execução ao mesmo tempo, e esse orçamento é compartilhado entre todas as chaves secretas e todas as conexões MCP. Se um colega também estiver gerando a partir de um cliente MCP, seu script concorre com ele.

A regra para o seu código é simples: nunca rode mais de cinco workers e, de preferência, deixe uma vaga livre. Um pool de threads faz isso em poucas linhas.

from multiprocessing.pool import ThreadPool

with ThreadPool(4) as pool:
    results = pool.map(make_ad, briefs)

A vazão é fácil de estimar. Divida os segundos de uma hora pelo tempo que um anúncio leva e multiplique pelo número de workers. Se uma imagem mais um vídeo levam cerca de quatro minutos, quatro workers terminam aproximadamente 60 anúncios por hora.

Cinco smartphones enfileirados sobre uma mesa, cada um mostrando uma pessoa diferente com um produto

Outros limites que vale incorporar à sua validação: corpos de requisição de até 10 MB, imagens em data URL de até 5 MB cada, prompts de até 4.000 caracteres e um timeout de três horas por previsão. Um job que passa do timeout deve ser marcado como morto e tentado de novo, não esperado.

Templates de prompt que variam com segurança

Variar é o objetivo, mas variação aleatória produz clipes fora da marca. Divida seu template em eixos que você muda e eixos que você trava.

EixoVariarTravar
PersonaFaixa etária, cabelo, roupaRealismo da pele e do tecido
CenárioCozinha, carro, academia na garagem, varandaJanela natural ou luz do dia
GanchoPergunta, confissão, demonstraçãoUma alegação por roteiro
Duração5, 10 ou 15 segundosEnquadramento vertical
ProdutoNuncaFoto de embalagem e rótulo exatos

Guarde o prompt final e o seed ao lado de cada saída. Quando um clipe vencer, você pode recriar seus irmãos mudando um único campo, em vez de adivinhar o que fez ele funcionar.

Um homem em uma academia caseira na garagem falando com o celular enquanto segura um shaker

Como usar o Seedance 2.5 Lite

Antes de escrever código, rode alguns clipes à mão para ver o que seus prompts de fato produzem. O Seedance 2.5 Lite é a forma mais rápida de fazer isso.

  1. Abra a página do modelo e entre na sua conta da PicassoIA.
  2. Envie seu quadro de persona. Uma imagem fixa nítida e bem iluminada, com o produto visível, dá o melhor primeiro quadro.
  3. Escreva o prompt de movimento. Nomeie a ação em ordem, inclua a fala entre aspas e mantenha a câmera quase parada.
  4. Escolha resolução e duração. Comece em 480p para testar rápido e depois passe para 720p na versão que pretende publicar.
  5. Mantenha o áudio ligado. save_audio vem como verdadeiro por padrão, o que é o que você quer para um anúncio falado.
  6. Opcionalmente, defina um último quadro. Envie last_frame_image quando o clipe precisar terminar em uma foto limpa do produto.
  7. Fixe um seed quando um resultado parecer certo e depois mude uma coisa de cada vez.
  8. Envie e baixe o clipe, depois assista com som antes de julgá-lo.

💡 Dica: Julgue apenas os primeiros dois segundos. É tudo o que um espectador que rola a tela lhe dá, então um clipe com abertura fraca é reprovado, não importa o quão bom seja o final.

Controle de qualidade e divulgação

Checagens automáticas antes de publicar

Automatize as rejeições chatas para que uma pessoa revise apenas clipes que já passaram:

  • O arquivo carrega. Faça a requisição da URL, espere status 200 e um tipo de conteúdo de vídeo.
  • A duração corresponde ao que você pediu.
  • Existe áudio quando save_audio estava ativado.
  • Prompt e seed são armazenados junto com a saída para reprodutibilidade.
  • Um filtro de alegações roda sobre o texto do roteiro e bloqueia linguagem médica, de renda ou de garantia que você não consegue comprovar.
  • Uma pessoa faz checagens pontuais de rostos, mãos e do rótulo do produto em uma amostra de cada lote.

Rotulagem e consentimento

Trate a divulgação como parte do pipeline, não como um detalhe posterior. As plataformas de anúncios e os reguladores cada vez mais esperam que conteúdo gerado por IA seja rotulado, e as regras mudam com frequência, então leia a política de anúncios atual de cada plataforma antes de lançar um lote.

Nunca apresente uma persona sintética como um cliente real relatando resultados reais. Não recrie o rosto ou a voz de uma pessoa real sem o consentimento por escrito dela. Um depoimento falso é a maneira mais rápida de perder uma conta de anúncios, e merece perder.

Crie seu primeiro lote hoje

Agora você tem o ciclo completo: briefing, roteiro, quadro de persona, clipe com áudio, revisão. A forma mais barata de descobrir se isso serve para o seu produto é rodar três variantes nesta tarde.

Abra o Seedance 2.5 Lite no PicassoIA, envie um quadro de persona do PicassoIA Image e escreva três ganchos diferentes para o mesmo produto. Compare as aberturas lado a lado. Quando um deles se destacar claramente, você terá seu template, e o Python acima o transforma em mais cinquenta.

Uma jovem rolando um feed de vídeos verticais em uma mesa de café ensolarada

Comece pequeno, mantenha os clipes honestos e deixe os dados escolherem os vencedores. Gere sua primeira imagem de persona no PicassoIA hoje, anime-a em um anúncio de estilo UGC e veja até onde um bom template pode chegar. O único experimento que fracassa é aquele que você nunca roda.

Compartilhe este artigo

Escolha seu idioma