Video

API video e voiceover

Genera video di annunci a partire da foto, modificali senza nuovo rendering, aggiungi voiceover con IA e sottotitoli sincronizzati e scegli la musica di sottofondo — tutto da chiamate JSON sincrone.

POST/api/create_video

Crea un video MP4 da un elenco di immagini con effetti di movimento, sottotitoli opzionali, musica di sottofondo, sovrapposizioni delle caratteristiche dell'immobile e schede finali. L'endpoint è sincrono: si blocca fino al rendering del video, poi restituisce HTTP 200 con la videoUrl finale.

Esempi di video walkthrough
Guarda video reali di annunci generati da poche foto — verticali e orizzontali.
Vedi esempi →

Sincrono — imposta un timeout client generoso

L'endpoint si blocca mentre il video viene renderizzato, poi restituisce l'URL riproducibile. Il rendering può richiedere alcuni minuti, quindi imposta il timeout del client HTTP in modo generoso — i 30–60 secondi predefiniti della maggior parte delle librerie HTTP termineranno prima che Pedra risponda.

Parametri principali

apiKeystringobbligatorio
La tua chiave API.
imagesarrayobbligatorio
Elenco ordinato di oggetti image. Ognuno diventa un frame/clip nel video. Vedi "Oggetto image" sotto.
isVerticalboolean
Formato verticale 9:16 per Instagram Reels / TikTok. Predefinito 16:9 orizzontale.
Default: false
propertyCharacteristicsarray
Array di coppie {label, value} (Bedrooms, Bathrooms, Surface, Price, ecc). Mostrato per impostazione predefinita su ogni frame quando fornito; imposta characteristics.enabled = false su un'immagine per nasconderlo in quel frame.
musicobject
Musica di sottofondo. Oggetto: { enabled: boolean, track: string }.
voiceobject
Voiceover. Oggetto: { enabled: boolean, audioId: string, showSubtitles: boolean }. Genera l'audioId con /api/generate_voice. Vedi la sezione Voce sotto.
brandingobject
Logo personalizzato, foto dell'agente e overlay del colore del brand. Vedi la sezione "Branding".
endingTitlestring
Titolo mostrato sulla scheda finale.
endingSubtitlestring
Sottotitolo sulla scheda finale (di solito una CTA o informazioni di contatto).
propertyIdstring
Id opzionale della proprietà (da list_properties o create_property) a cui appartengono queste foto. Se impostato, il video finale viene salvato in quella proprietà — visibile nella scheda Video e modificabile dall'app — invece di essere restituito solo come URL.

Oggetto image

Ogni voce in images descrive un frame:

imageUrlstringobbligatorio
URL della foto (o data URI base64).
effectstringobbligatorio
Effetto di movimento applicato a questo frame.
Values: zoom-in zoom-out static transition
secondImageUrlstring
Obbligatorio quando effect = "transition". Immagine verso cui passare.
subtitlestring
Didascalia mostrata su questo frame.
titlestring
Sovrapposizione di titolo grande (es. "Living Room", "Kitchen").
watermarkobject
Configurazione filigrana: { enabled, position, opacity }. Disattivata per impostazione predefinita. Imposta { enabled: true } per applicare la tua filigrana (bottom-right, opacity 1.0 di default).
characteristicsobject
Mostra/nasconde l'overlay propertyCharacteristics su questo frame. Attivo per impostazione predefinita quando propertyCharacteristics è fornito; imposta { enabled: false } per nasconderlo.

Opzioni filigrana

enabledboolean
Mostra la filigrana di Pedra.
Default: true
positionstring
Dove appare la filigrana.
Values: top-left top top-right left center right bottom-left bottom bottom-right
Default: bottom-right
opacitynumber
Da 0.0 (invisibile) a 1.0 (completamente opaco).
Default: 1

Tracce musicali

enabledbooleanobbligatorio
Attiva la musica di sottofondo.
trackstringobbligatorio
Genere musicale. Una delle chiavi di /api/music_library. I valori legacy (calm, uplifting, corporate, piano) sono ancora accettati.
Values: acoustic chill cinematic electronic upbeat

Voiceover

enabledbooleanobbligatorio
Attiva il voiceover.
audioIdstringobbligatorio
Id di un voiceover generato con /api/generate_voice. È l'identificatore che allega la narrazione e genera i sottotitoli sincronizzati.
showSubtitlesboolean
Incorpora sottotitoli sincronizzati parola per parola dal voiceover.
Default: true

Branding

showWatermarkboolean
Mostra il tuo logo personalizzato come filigrana invece di quello di Pedra.
watermarkUrlstring
URL del tuo logo (si consiglia PNG con trasparenza).
showProfessionalPictureboolean
Mostra la foto dell'agente sulla scheda finale.
professionalPictureUrlstring
URL del ritratto dell'agente.
primaryColorstring
Colore del brand usato per gli overlay, come stringa hex (es. "#007BFF"). Predefinito bianco (#ffffff).
Default: #ffffff

Esempio: video minimo

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"
  }'

Esempio: video di annuncio di produzione completo

Walkthrough di 3 frame con effetti misti (zoom-in / zoom-out / transition / static), filigrana personalizzata + foto dell'agente + colore del brand, musica, voiceover, sottotitoli per frame, overlay con caratteristiche dell'immobile e scheda finale. Corrisponde al pattern di payload reale usato dall'app stessa di Pedra.

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"
  }'

Risposta

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

Crediti

Ogni frame costa 5 crediti — tranne i frame con effect: "static", che sono gratuiti. Un video da 5 immagini con tutti gli effetti zoom-in/zoom-out consuma 25 crediti. Vedi Prezzi.

Errori di validazione

HTTP 400 viene restituito per:

  • Array images mancante o vuoto.
  • Qualsiasi immagine senza imageUrl (l'errore indica l'indice problematico).
  • effect non in [zoom-in, zoom-out, transition, static].
  • effect: "transition" senza secondImageUrl.

Etichette delle caratteristiche disponibili

Quando usi propertyCharacteristics, le seguenti chiavi di etichetta vengono renderizzate con icone corrispondenti nell'overlay: Bedrooms, Bathrooms, Surface, Price, Location, Parking, Heating, Outdoor. Le etichette personalizzate sono accettate ma renderizzate senza icona.

Aggiornare un video esistente

POST/api/update_video

Modifica un video già creato — tramite videoIdsenza ri-renderizzare i clip invariati. Riordinare, cambiare musica o voiceover, modificare branding, schede finali, sottotitoli e titoli vengono riassemblati gratuitamente. Solo le foto nuove o modificate vengono ri-animate (e costano crediti). Come create_video, è sincrono e restituisce la nuova videoUrl. Se il video è stato creato con una propertyId, quel collegamento viene ereditato automaticamente — non serve rinviarlo.

Semantica di aggiornamento parziale

Tutti i campi tranne videoId sono opzionali. Ometti images per mantenere la timeline esistente e cambiare solo audio/testo/branding (un riassemblaggio gratuito). Ometti music, voice, branding o il testo finale per lasciare ciascuno al valore memorizzato — modificare la musica non cancella mai il voiceover, e viceversa. Quando invii images, un clip la cui foto + effetto (+ seconda foto per le transizioni) corrisponde a uno esistente viene riutilizzato così com'è.

Parametri principali

apiKeystringobbligatorio
La tua chiave API.
videoIdstringobbligatorio
Id del video da modificare (il videoId restituito da create_video).
imagesarray
Elenco ordinato completo di immagini per ricostruire la timeline; i clip che corrispondono a una foto + effetto esistenti vengono riutilizzati (nessun re-render, nessun credito). Ometti per mantenere la timeline attuale e modificare solo audio/testo/branding.
musicobject
Musica di sottofondo. Oggetto: { enabled: boolean, track: string }.
voiceobject
Voiceover. Oggetto: { enabled: boolean, audioId: string, showSubtitles: boolean }. Genera l'audioId con /api/generate_voice. Vedi la sezione Voce sotto.
brandingobject
Logo personalizzato, foto dell'agente e overlay del colore del brand. Vedi la sezione "Branding".
endingTitlestring
Titolo mostrato sulla scheda finale.
endingSubtitlestring
Sottotitolo sulla scheda finale (di solito una CTA o informazioni di contatto).
isVerticalboolean
Formato verticale 9:16 per Instagram Reels / TikTok. Predefinito 16:9 orizzontale.
propertyCharacteristicsarray
Array di coppie {label, value} (Bedrooms, Bathrooms, Surface, Price, ecc). Mostrato per impostazione predefinita su ogni frame quando fornito; imposta characteristics.enabled = false su un'immagine per nasconderlo in quel frame.

Esempio: cambiare solo la musica

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" }
  }'

Esempio: riordinare + sostituire una 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" }
    ]
  }'

Risposta

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

Crediti

I clip riutilizzati non costano nulla. Solo i frame nuovi o modificati (non statici) vengono ri-animati a 5 crediti ciascuno. Una modifica solo musica/voce/testo è gratuita. Nota: i video creati prima del riutilizzo dei clip ri-animano tutti i clip alla prima modifica basata sulle immagini.

Voiceover e audio

Un flusso in due passaggi: scrivi un copione dalle foto (o fornisci il tuo), rendilo in audio, poi allega l'audioId restituito all'oggetto voice di un video. I sottotitoli vengono generati automaticamente dai tempi delle parole del voiceover.

Generare un copione per il voiceover

POST/api/generate_voice_script

Scrive un copione breve e naturale a partire dalle foto dell'annuncio e (facoltativamente) dai dati dell'immobile. Usa la visione affinché il copione rifletta ciò che è realmente nelle immagini. Restituisce il testo — passalo a /api/generate_voice, o modificalo prima.

Parametri principali

apiKeystringobbligatorio
La tua chiave API.
imagesarray
Foto su cui basare il copione — un array di stringhe URL o oggetti { imageUrl }. Le prime vengono analizzate con la visione.
propertyCharacteristicsarray
Dati {label, value} opzionali dell'immobile da inserire nel copione (Bedrooms, Surface, Price, ecc).
languagestring
Lingua del copione. Predefinito inglese. Vedi /api/music_library per i valori accettati.
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"
  }'

Risposta

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

La generazione del copione è gratuita.

Generare un voiceover

POST/api/generate_voice

Rende un copione in una traccia di voiceover tramite sintesi vocale. Restituisce un audioId — passalo a voice.audioId di un video in create_video o update_video per allegare la narrazione (e i suoi sottotitoli sincronizzati).

Parametri principali

apiKeystringobbligatorio
La tua chiave API.
textstringobbligatorio
Il copione da narrare. Massimo 1000 caratteri.
languagestring
Lingua della voce (seleziona il narratore). Predefinito inglese. Vedi /api/music_library per i valori accettati.
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"
  }'

Risposta

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
}

Crediti

Ogni voiceover costa 1 credito. Il limite di testo è di 1000 caratteri.

Elencare la libreria musicale

POST/api/music_library

Restituisce i valori validi di music.track (chiavi di genere) con etichette, oltre alle lingue accettate dagli endpoint di voiceover. Di sola lettura — non consuma mai crediti e accetta GET o POST.

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

Risposta

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"]
}

Successivo

Vedi Errori e limiti per le modalità di errore dei job video e il comportamento dei timeout.