Vídeo

API de vídeo e narração

Gere vídeos de anúncios a partir de fotos, edite-os sem voltar a renderizar, adicione narrações com IA e legendas sincronizadas, e escolha música de fundo — tudo a partir de chamadas JSON síncronas.

POST/api/create_video

Constrói um vídeo MP4 a partir de uma lista de imagens com efeitos de movimento, legendas opcionais, música de fundo, sobreposições com características do imóvel e cartões finais. O endpoint é síncrono: bloqueia até o vídeo ser renderizado e depois devolve HTTP 200 com o videoUrl final.

Exemplos de vídeos walkthrough
Vê vídeos reais de anúncios gerados a partir de algumas fotos — verticais e horizontais.
Ver exemplos →

Síncrono — define um timeout de cliente generoso

O endpoint bloqueia enquanto o vídeo é renderizado, depois devolve o URL reproduzível. A renderização pode demorar vários minutos, por isso define o timeout do teu cliente HTTP de forma generosa — os 30–60 segundos padrão da maioria das bibliotecas HTTP terminarão antes da Pedra responder.

Parâmetros de topo

apiKeystringobrigatório
A tua chave API.
imagesarrayobrigatório
Lista ordenada de objetos image. Cada um torna-se um frame/clip no vídeo. Ver "Objeto image" abaixo.
isVerticalboolean
Formato vertical 9:16 para Instagram Reels / TikTok. Por defeito 16:9 horizontal.
Default: false
propertyCharacteristicsarray
Array de pares {label, value} (Bedrooms, Bathrooms, Surface, Price, etc). Mostrado por defeito em todos os frames quando fornecido; define characteristics.enabled = false numa imagem para o ocultar nesse frame.
musicobject
Música de fundo. Objeto: { enabled: boolean, track: string }.
voiceobject
Narração. Objeto: { enabled: boolean, audioId: string, showSubtitles: boolean }. Gera o audioId com /api/generate_voice. Ver a secção Voz abaixo.
brandingobject
Logo personalizado, foto do agente e sobreposição de cor de marca. Ver secção "Branding".
endingTitlestring
Título mostrado no cartão final.
endingSubtitlestring
Subtítulo do cartão final (normalmente uma CTA ou informação de contacto).
propertyIdstring
Id opcional da propriedade (de list_properties ou create_property) a que estas fotos pertencem. Quando definido, o vídeo final é guardado nessa propriedade — visível no separador Vídeos e editável a partir da app — em vez de ser apenas devolvido como URL.

Objeto image

Cada entrada de images descreve um frame:

imageUrlstringobrigatório
URL da foto (ou data URI base64).
effectstringobrigatório
Efeito de movimento aplicado a este frame.
Values: zoom-in zoom-out static transition
secondImageUrlstring
Obrigatório quando effect = "transition". Imagem para a qual transicionar.
subtitlestring
Legenda mostrada sobre este frame.
titlestring
Sobreposição de título grande (ex.: "Living Room", "Kitchen").
watermarkobject
Configuração da marca de água: { enabled, position, opacity }. Desativada por defeito. Define { enabled: true } para aplicar a tua marca de água (bottom-right, opacity 1.0 por defeito).
characteristicsobject
Mostra/oculta a sobreposição propertyCharacteristics neste frame. Ativada por defeito quando propertyCharacteristics é fornecido; define { enabled: false } para a ocultar.

Opções de marca de água

enabledboolean
Mostra a marca de água da Pedra.
Default: true
positionstring
Onde aparece a marca de água.
Values: top-left top top-right left center right bottom-left bottom bottom-right
Default: bottom-right
opacitynumber
De 0.0 (invisível) a 1.0 (totalmente opaco).
Default: 1

Faixas de música

enabledbooleanobrigatório
Ativa a música de fundo.
trackstringobrigatório
Género musical. Uma das chaves de /api/music_library. Os valores antigos (calm, uplifting, corporate, piano) continuam a ser aceites.
Values: acoustic chill cinematic electronic upbeat

Narração

enabledbooleanobrigatório
Ativa a narração.
audioIdstringobrigatório
Id de uma narração gerada com /api/generate_voice. É o identificador que anexa a narração e gera as legendas sincronizadas.
showSubtitlesboolean
Incorpora legendas sincronizadas palavra a palavra a partir da narração.
Default: true

Branding

showWatermarkboolean
Mostra o teu logo personalizado como marca de água em vez do da Pedra.
watermarkUrlstring
URL do teu logo (recomendado PNG com transparência).
showProfessionalPictureboolean
Mostra a foto do agente no cartão final.
professionalPictureUrlstring
URL do retrato do agente.
primaryColorstring
Cor da marca usada para sobreposições, como string hex (ex.: "#007BFF"). Por defeito, branco (#ffffff).
Default: #ffffff

Exemplo: vídeo mínimo

curl -X POST https://app.pedra.ai/api/create_video \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "images": [
      { "imageUrl": "https://example.com/img1.jpg", "effect": "zoom-in" },
      { "imageUrl": "https://example.com/img2.jpg", "effect": "zoom-out" }
    ],
    "isVertical": false,
    "endingTitle": "Contact us!",
    "endingSubtitle": "Visit our website"
  }'

Exemplo: vídeo de anúncio de produção completo

Walkthrough de 3 frames com efeitos mistos (zoom-in / zoom-out / transition / static), marca de água personalizada + foto do agente + cor da marca, música, narração, legendas por frame, sobreposição com características do imóvel e cartão final. Corresponde ao padrão de payload real que a própria app Pedra utiliza.

curl -X POST https://app.pedra.ai/api/create_video \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "images": [
      {
        "imageUrl": "https://example.com/exterior.jpg",
        "effect": "zoom-in",
        "subtitle": "Renovated 2-bedroom in Barcelona",
        "watermark": {"enabled": true, "position": "bottom-right", "opacity": 0.75},
        "characteristics": {"enabled": true}
      },
      {
        "imageUrl": "https://example.com/living-room.jpg",
        "effect": "zoom-out",
        "subtitle": "Bright, open-plan living space",
        "watermark": {"enabled": true, "position": "bottom-right", "opacity": 0.75}
      },
      {
        "imageUrl": "https://example.com/before.jpg",
        "secondImageUrl": "https://example.com/after.jpg",
        "effect": "transition",
        "title": "Before & After"
      }
    ],
    "isVertical": false,
    "propertyCharacteristics": [
      {"label": "Price", "value": "€450,000"},
      {"label": "Bedrooms", "value": "2"},
      {"label": "Bathrooms", "value": "1"},
      {"label": "Surface", "value": "85 m²"}
    ],
    "music": {"enabled": true, "track": "cinematic"},
    "voice": {"enabled": true, "audioId": "AUDIO_ID_FROM_GENERATE_VOICE", "showSubtitles": true},
    "branding": {
      "showWatermark": true,
      "watermarkUrl": "https://example.com/agency-logo.png",
      "showProfessionalPicture": true,
      "professionalPictureUrl": "https://example.com/agent-photo.jpg",
      "primaryColor": "#000000"
    },
    "endingTitle": "Felix Ingla",
    "endingSubtitle": "felix@pedra.ai"
  }'

Resposta

JSON
{
  "message": "Video created successfully",
  "videoId": "<uuid>",
  "videoUrl": "https://img.pedra.ai/<uuid>"
}

Créditos

Cada frame custa 5 créditos — exceto frames com effect: "static", que são gratuitos. Um vídeo de 5 imagens com todos os efeitos zoom-in/zoom-out consome 25 créditos. Ver Preços.

Erros de validação

HTTP 400 é devolvido para:

  • Array images em falta ou vazio.
  • Qualquer imagem sem imageUrl (o erro indica o índice em falta).
  • effect fora de [zoom-in, zoom-out, transition, static].
  • effect: "transition" sem secondImageUrl.

Rótulos de características disponíveis

Ao usar propertyCharacteristics, as seguintes chaves de rótulo são renderizadas com ícones correspondentes na sobreposição: Bedrooms, Bathrooms, Surface, Price, Location, Parking, Heating, Outdoor. Rótulos personalizados são aceites mas renderizados sem ícone.

Atualizar um vídeo existente

POST/api/update_video

Edita um vídeo que já criaste — através do videoIdsem voltar a renderizar os clips inalterados. Reordenar, trocar a música ou a narração, alterar o branding, os cartões finais, as legendas e os títulos são reagrupados gratuitamente. Apenas fotos novas ou alteradas são reanimadas (e consomem créditos). Tal como o create_video, é síncrono e devolve o novo videoUrl. Se o vídeo foi criado com um propertyId, essa ligação é herdada automaticamente — não é preciso voltar a enviá-lo.

Semântica de atualização parcial

Todos os campos exceto videoId são opcionais. Omite images para manter a linha de tempo existente e mudar apenas áudio/texto/branding (um reagrupamento gratuito). Omite music, voice, branding ou o texto final para deixar cada um no valor guardado — editar a música nunca apaga a narração, e vice-versa. Quando envias images, um clip cuja foto + efeito (+ segunda foto nas transições) corresponde a um existente é reutilizado tal como está.

Parâmetros de topo

apiKeystringobrigatório
A tua chave API.
videoIdstringobrigatório
Id do vídeo a editar (o videoId devolvido por create_video).
imagesarray
Lista ordenada completa de imagens para reconstruir a linha de tempo; os clips que correspondem a uma foto + efeito existentes são reutilizados (sem voltar a renderizar, sem créditos). Omite para manter a linha de tempo atual e editar apenas áudio/texto/branding.
musicobject
Música de fundo. Objeto: { enabled: boolean, track: string }.
voiceobject
Narração. Objeto: { enabled: boolean, audioId: string, showSubtitles: boolean }. Gera o audioId com /api/generate_voice. Ver a secção Voz abaixo.
brandingobject
Logo personalizado, foto do agente e sobreposição de cor de marca. Ver secção "Branding".
endingTitlestring
Título mostrado no cartão final.
endingSubtitlestring
Subtítulo do cartão final (normalmente uma CTA ou informação de contacto).
isVerticalboolean
Formato vertical 9:16 para Instagram Reels / TikTok. Por defeito 16:9 horizontal.
propertyCharacteristicsarray
Array de pares {label, value} (Bedrooms, Bathrooms, Surface, Price, etc). Mostrado por defeito em todos os frames quando fornecido; define characteristics.enabled = false numa imagem para o ocultar nesse frame.

Exemplo: mudar apenas a música

curl -X POST https://app.pedra.ai/api/update_video \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "videoId": "VIDEO_ID_FROM_CREATE",
    "music": { "enabled": true, "track": "upbeat" }
  }'

Exemplo: reordenar + trocar uma foto

curl -X POST https://app.pedra.ai/api/update_video \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "videoId": "VIDEO_ID_FROM_CREATE",
    "images": [
      { "imageUrl": "https://example.com/living-room.jpg", "effect": "zoom-out" },
      { "imageUrl": "https://example.com/exterior.jpg", "effect": "zoom-in" },
      { "imageUrl": "https://example.com/new-kitchen.jpg", "effect": "zoom-in" }
    ]
  }'

Resposta

JSON
{
  "message": "Video updated successfully",
  "videoId": "<uuid>",
  "videoUrl": "https://img.pedra.ai/<uuid>"
}

Créditos

Os clips reutilizados não custam nada. Apenas frames novos ou alterados (não estáticos) são reanimados a 5 créditos cada. Uma edição apenas de música/voz/texto é gratuita. Nota: vídeos criados antes da reutilização de clips reanimam todos os clips na sua primeira edição baseada em imagens.

Narração e áudio

Um fluxo em dois passos: escreve um guião a partir das fotos (ou fornece o teu), renderiza-o para áudio e depois anexa o audioId devolvido ao objeto voice de um vídeo. As legendas são geradas automaticamente a partir dos tempos das palavras da narração.

Gerar um guião de narração

POST/api/generate_voice_script

Escreve um guião de narração curto e natural a partir das fotos do anúncio e (opcionalmente) dos dados do imóvel. Usa visão para que o guião reflita o que está realmente nas imagens. Devolve o texto do guião — passa-o a /api/generate_voice, ou edita-o antes.

Parâmetros de topo

apiKeystringobrigatório
A tua chave API.
imagesarray
Fotos para basear o guião — um array de strings URL ou objetos { imageUrl }. As primeiras são analisadas com visão.
propertyCharacteristicsarray
Dados {label, value} opcionais do imóvel para incorporar no guião (Bedrooms, Surface, Price, etc).
languagestring
Idioma do guião. Por defeito inglês. Ver /api/music_library para os valores aceites.
Default: English
curl -X POST https://app.pedra.ai/api/generate_voice_script \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "images": [
      "https://example.com/exterior.jpg",
      "https://example.com/living-room.jpg"
    ],
    "propertyCharacteristics": [
      { "label": "Bedrooms", "value": "2" },
      { "label": "Surface", "value": "85 m²" }
    ],
    "language": "English"
  }'

Resposta

JSON
{
  "message": "Script generated successfully",
  "script": "Welcome to this bright, renovated two-bedroom apartment. Step into a sunlit, open-plan living space with room to breathe across 85 square metres."
}

A geração do guião é gratuita.

Gerar uma narração

POST/api/generate_voice

Renderiza um guião numa faixa de narração por conversão de texto em voz. Devolve um audioId — passa-o ao voice.audioId de um vídeo em create_video ou update_video para anexar a narração (e as suas legendas sincronizadas).

Parâmetros de topo

apiKeystringobrigatório
A tua chave API.
textstringobrigatório
O guião a narrar. Máximo 1000 caracteres.
languagestring
Idioma da voz (seleciona o locutor). Por defeito inglês. Ver /api/music_library para os valores aceites.
Default: English
curl -X POST https://app.pedra.ai/api/generate_voice \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "text": "Welcome to this bright, renovated two-bedroom apartment.",
    "language": "English"
  }'

Resposta

JSON
{
  "message": "Voice generated successfully",
  "audioId": "<uuid>",
  "audioUrl": "https://img.pedra.ai/audio/<uuid>.mp3",
  "alignmentUrl": "https://img.pedra.ai/audio/<uuid>.alignment.json",
  "duration": 7
}

Créditos

Cada narração custa 1 crédito. O limite de texto é de 1000 caracteres.

Listar a biblioteca de música

POST/api/music_library

Devolve os valores válidos de music.track (chaves de género) com rótulos, mais os idiomas aceites pelos endpoints de narração. Apenas leitura — nunca consome créditos e aceita GET ou POST.

curl https://app.pedra.ai/api/music_library

Resposta

JSON
{
  "tracks": [
    { "track": "acoustic", "label": "Acoustic & Warm" },
    { "track": "chill", "label": "Chill Beats" },
    { "track": "cinematic", "label": "Cinematic & Orchestral" },
    { "track": "electronic", "label": "Modern Electronic" },
    { "track": "upbeat", "label": "Upbeat & Energetic" }
  ],
  "variantsPerTrack": 6,
  "defaultTrack": "chill",
  "voiceLanguages": ["English", "Español", "Français", "Deutsch", "Português", "Italiano", "Nederlands", "Polski"]
}

Seguinte

Ver Erros e limites para os modos de falha das tarefas de vídeo e o comportamento de timeouts.