Vai alla navigazione

Guida rapida a Immagini e Video

Scopri come generare immagini e video da prompt di testo e contenuti multimediali di riferimento.

L’API Immagini e Video è asincrona. Invi una generazione e, una volta completata, scarichi il risultato da un URL firmato. Immagini e video hanno endpoint separati, ma la struttura delle richieste e delle risposte è la stessa per entrambi.

Esistono due modi per ottenere il risultato. La consegna tramite webhook è quella consigliata, nonché quella usata negli esempi seguenti: ElevenLabs chiama il tuo endpoint nel momento in cui una generazione raggiunge uno stato terminale, quindi non vengono consumate risorse nell’attesa. Il polling è l’alternativa quando non hai un endpoint che possa ricevere un callback, e ogni esempio mostra come passare a questa opzione.

L’API Immagini e Video richiede un piano Pro o superiore. Le chiamate da un workspace con un piano inferiore vengono rifiutate con un errore 402 paid_plan_required. La tua chiave API deve inoltre avere l’autorizzazione Immagini e Video o Flows per il workspace.

Genera un’immagine

1

Crea una chiave API

Crea qui una chiave API nella dashboard, che userai per accedere all’API in modo sicuro.

Archivia la chiave come secret gestito e passala agli SDK come variabile d’ambiente tramite un file .env oppure direttamente nella configurazione della tua app, a seconda delle tue preferenze.

.env
ELEVENLABS_API_KEY=<your_api_key_here>
2

Installa l'SDK

Useremo anche la libreria dotenv per caricare la nostra chiave API da una variabile d’ambiente.

pip install elevenlabs
pip install python-dotenv
3

Invia la generazione

Ogni modello ha una propria classe di richiesta e i relativi campi sono i parametri accettati dal modello, quindi cambiando modello possono cambiare i campi disponibili. I campi sconosciuti vengono rifiutati anziché ignorati.

webhook richiede che il risultato completato venga consegnato ai webhook del tuo workspace, quindi la chiamata restituisce un risultato non appena la generazione viene messa in coda. Richiede un webhook iscritto agli eventi di generazione; consulta i webhook per Immagini e Video per configurarne uno, oppure ometti il campo e usa invece il polling.

# example.py
import os
from dotenv import load_dotenv
from elevenlabs import ImageGenerationRequest_Gemini3ProImage, WebhookTarget_All
from elevenlabs.client import ElevenLabs
load_dotenv()
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
generation = elevenlabs.flows.image.create(
request=ImageGenerationRequest_Gemini3ProImage(
prompt="A corgi in a tiny lifeguard chair on a sunlit beach at golden hour, photorealistic",
aspect_ratio="16:9",
resolution="2K",
webhook=WebhookTarget_All(),
)
)
print(generation.id, generation.status)

La risposta contiene l’ID della generazione e nient’altro. Una generazione appena creata è sempre pending:

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "pending"
}
4

Ottieni il risultato

Poiché la richiesta ha abilitato webhook, ElevenLabs invia un evento flows_generation al tuo endpoint quando la generazione raggiunge completed o failed. Il campo data dell’evento è identico a quello restituito dall’endpoint GET e i webhook per Immagini e Video illustrano l’handler che lo riceve.

Se non hai un endpoint per ricevere callback, rimuovi webhook dalla richiesta precedente e usa invece il polling. Recupera la generazione finché il suo stato non è completed o failed, lasciando almeno due secondi tra una richiesta e l’altra per un’immagine — consulta le linee guida sul polling per gli intervalli da usare per ciascuna modalità.

import time
import requests
while True:
result = elevenlabs.flows.image.get(generation.id)
if result.status in ("completed", "failed"):
break
time.sleep(2)
if result.status == "failed":
raise RuntimeError(f"{result.failure_reason}: {result.error_message}")
with open("corgi.png", "wb") as f:
f.write(requests.get(result.content_url).content)

In entrambi i casi, una generazione completata contiene gli stessi campi:

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "completed",
"content_url": "https://storage.googleapis.com/generations/JWr5N6X9ZTqf8jD2LmQb",
"content_mime_type": "image/png"
}
5

Esegui il codice

python example.py

La generazione viene messa in coda e ne viene stampato l’ID. Con la consegna tramite webhook, l’immagine arriva al tuo endpoint; con la variante basata sul polling, viene salvata in corgi.png.

Genera un video

Le generazioni video usano flows.video e seguono lo stesso schema di invio e recupero. Un video può richiedere diversi minuti, quindi questo esempio abilita la consegna tramite webhook con webhook invece di attendere il risultato.

from elevenlabs import VideoGenerationRequest_Veo31FastGenerate001, WebhookTarget_All
generation = elevenlabs.flows.video.create(
request=VideoGenerationRequest_Veo31FastGenerate001(
prompt="A corgi rides a tiny surfboard across a sunlit wave at golden hour, cinematic",
duration_secs=8,
aspect_ratio="16:9",
resolution="1080p",
generate_audio=True,
webhook=WebhookTarget_All(),
)
)
print(generation.id)

La chiamata restituisce un risultato non appena la generazione viene messa in coda e il risultato completato viene consegnato a ogni webhook del tuo workspace iscritto agli eventi di generazione. L’output video è in formato MP4, quindi il payload completato riporta content_mime_type come video/mp4. Consulta i webhook per Immagini e Video per configurare un webhook e scrivere l’handler che riceve questo evento.

webhook richiede almeno un webhook del workspace iscritto agli eventi di generazione. Senza uno, la chiamata di creazione viene rifiutata invece di avviare una generazione il cui risultato non ha dove essere consegnato. Rimuovi il campo per usare il polling con flows.video.get e non eseguire il polling più di una volta ogni 10 secondi.

Recupero dei risultati

Webhook e polling restituiscono lo stesso payload, quindi la scelta riguarda il modo in cui attendi il risultato, non ciò che ottieni.

Consegna tramite webhookPolling
Ideale perL’impostazione predefinita per entrambe le modalità e l’uso in produzioneScript e ambienti senza endpoint pubblico
RichiedeUn endpoint HTTPS iscritto agli eventi di generazioneNulla
Costo dell’attesaNessuno; vieni chiamato quando la generazione terminaUna richiesta per ogni polling e per ogni generazione

Usa i webhook quando possibile. Ricorri al polling quando non hai dove ricevere un callback e, quando lo usi, segui gli intervalli indicati di seguito.

Scelta delle destinazioni webhook

webhook accetta due forme. WebhookTarget_All raggiunge ogni webhook iscritto agli eventi di generazione, ed è l’opzione predefinita corretta perché continua a funzionare se i webhook vengono ruotati o sostituiti. WebhookTarget_Ids limita la consegna a webhook specifici, quando un workspace distribuisce eventi a più destinatari e un determinato job deve raggiungerne uno solo:

from elevenlabs import WebhookTarget_Ids
webhook = WebhookTarget_Ids(ids=["Q8mVr2LpXcT4nB6yJdKw"])

Ogni ID deve essere già iscritto agli eventi di generazione; indicare un webhook non iscritto viene rifiutato anziché ignorato in silenzio. Il payload consegnato è identico a quello restituito dall’endpoint GET, quindi un handler scritto per uno funziona anche per l’altro. La guida ai webhook spiega come configurare un webhook, verificare la firma e gestire l’evento.

Linee guida sul polling

Il runtime di una generazione dipende dal modello, dalla risoluzione e, per i video, dalla durata, quindi esegui il polling con un intervallo adeguato a ciò che hai richiesto anziché con un ciclo a intervallo fisso:

  • Immagini: esegui il polling non più di una volta ogni 2 secondi. La maggior parte viene completata entro pochi secondi.
  • Video: esegui il polling non più di una volta ogni 10 secondi. Considera minuti, non secondi, e adatta l’intervallo in base a duration_secs e resolution.

Due regole valgono per entrambi. Riduci la frequenza quando una generazione richiede più tempo del previsto — raddoppiare l’intervallo fino a circa un minuto evita che una generazione lenta si trasformi in centinaia di richieste. E imposta un limite al ciclo, così una generazione bloccata termina con un timeout nel tuo codice anziché con un ciclo senza limiti.

Un polling più rapido non offre alcun vantaggio: lo stato di una generazione non cambia prima solo perché lo hai richiesto due volte. Un polling aggressivo e prolungato può restituire risposte 429, che dovresti gestire con un backoff esponenziale.

Ciclo di vita della generazione

Una generazione passa attraverso quattro stati. I due stati terminali contengono campi diversi, quindi verifica status prima di leggere il resto della risposta.

StatoSignificato
pendingLa generazione è in coda. È lo stato di ogni generazione appena creata.
generatingIl modello è in esecuzione.
completedL’output è pronto. La risposta contiene content_url e content_mime_type.
failedLa generazione non ha prodotto un output. La risposta contiene i dettagli dell’errore.

content_url è un URL firmato che scade circa un’ora dopo la restituzione della risposta. Recupera nuovamente la generazione per ottenere un URL aggiornato, anziché memorizzare l’URL firmato stesso.

Gestione degli errori

Una generazione non riuscita riporta una categoria failure_reason insieme a un messaggio error_message leggibile:

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "failed",
"failure_reason": "moderated",
"error_message": "The prompt was rejected by content moderation. You were not charged for this generation."
}
failure_reasonCausa
timeoutIl modello non ha restituito un risultato in tempo.
model_errorIl provider del modello ha restituito un errore o non ha prodotto output.
moderatedIl prompt o un input è stato rifiutato dalla moderazione dei contenuti.
invalid_parametersI parametri sono stati rifiutati quando la generazione ha raggiunto il modello.
dependency_failedUna generazione di riferimento da cui dipende questa generazione non è riuscita.
charging_failedNon è stato possibile addebitare la generazione al workspace.
internal_errorSi è verificato un errore imprevisto.

Le generazioni non riuscite non vengono addebitate. I problemi relativi ai parametri che possono essere rilevati in anticipo — un campo non supportato, un valore al di fuori dell’intervallo consentito da un modello o una combinazione non valida di input di riferimento — vengono invece rifiutati dalla richiesta di creazione, prima che inizi qualsiasi generazione.

Prezzi

Le generazioni vengono addebitate in crediti. Il costo dipende dal modello, dai parametri scelti come risoluzione e durata e dagli input forniti. Una generazione costa quanto nell’API quanto nell’app ElevenLabs, dove il costo viene mostrato prima dell’invio. Consulta Immagini e Video nel playground per scoprire come viene presentato il costo di una determinata combinazione di modello e impostazioni.

Elenca le tue generazioni

Ogni endpoint elenca le generazioni create tramite esso, dalla più recente alla meno recente. I risultati sono limitati al tuo workspace e a questa API, quindi le generazioni create nell’app ElevenLabs non vengono visualizzate.

page = elevenlabs.flows.image.list(page_size=20, status="completed")
for item in page.generations:
print(item.id, item.content_url)
while page.has_more:
page = elevenlabs.flows.image.list(page_size=20, status="completed", cursor=page.next_cursor)
for item in page.generations:
print(item.id, item.content_url)

page_size accetta valori da 1 a 100 e il valore predefinito è 30. Passa status per restituire solo le generazioni in un determinato stato del ciclo di vita e model_id per restituire solo le generazioni di un singolo modello. Considera next_cursor come opaco: passa nuovamente il valore esatto e interrompi quando has_more è false.

Modelli disponibili

L’API espone un sottoinsieme dei modelli disponibili nell’app ElevenLabs. Ogni modello accetta solo i parametri elencati per quel modello: l’invio di un campo supportato da un altro modello restituisce un errore di convalida.

I modelli ByteDance sono disabilitati per impostazione predefinita e richiedono un’approvazione esplicita prima dell’uso. Finché l’accesso non viene concesso, una richiesta che ne indica uno viene rifiutata con un errore model_access_denied. I clienti Enterprise possono contattare l’assistenza per richiedere l’accesso.

Modelli di immagini

model_idImmagini di riferimentoControlli dell’output
gpt-image-1Fino a 5, più una maskaspect_ratio (1:1, 3:2, 2:3), quality, background
gpt-image-1.5Fino a 5, più una maskaspect_ratio (1:1, 3:2, 2:3), quality, background
gpt-image-2Fino a 10, più una mask15 rapporti d’aspetto, resolution (1K, 2K, 4K), quality
gpt-image-2.5-sunburstFino a 10, più una mask15 rapporti d’aspetto, resolution (1K, 2K, 4K), quality (fino a max)
gpt-image-2.5-flareFino a 10, più una mask15 rapporti d’aspetto, resolution (1K, 2K, 4K), quality (fino a max)
gemini-2.5-flash-imageFino a 5aspect_ratio
gemini-3-pro-imageFino a 10aspect_ratio, resolution (1K, 2K, 4K)
gemini-3.1-flash-imageFino a 14aspect_ratio (inclusi 1:4, 4:1, 1:8, 8:1), resolution (da 512 a 4K)
gemini-3.1-flash-lite-imageFino a 14aspect_ratio, resolution (1K)
bytedance-seedream-5-liteFino a 10aspect_ratio, resolution (2K, 3K), seed
bytedance-seedream-5-proFino a 10aspect_ratio, resolution (1K, 2K), seed

I modelli GPT Image 2.5 accettano valori quality di low, medium, high, xhigh e max e usano high per impostazione predefinita. GPT Image 2 arriva fino a high e usa medium per impostazione predefinita.

Modelli video

model_idInput multimedialiControlli dell’output
veo-3.1-generate-001start_frame, end_frame, fino a 3 images con un roleduration_secs (4, 6, 8), aspect_ratio (16:9, 9:16), resolution (720p, 1080p, 4K), generate_audio
veo-3.1-fast-generate-001start_frame, end_frame, fino a 3 images con un roleduration_secs (4, 6, 8), aspect_ratio (16:9, 9:16), resolution (720p, 1080p, 4K), generate_audio
bytedance-seedance-v2start_frame, end_frame, fino a 9 images, 3 videos, 3 audiosduration_secs (da 4 a 15), 7 rapporti d’aspetto, resolution (da 480p a 4k), generate_audio
bytedance-seedance-v2-faststart_frame, end_frame, fino a 9 images, 3 videos, 3 audiosduration_secs (da 4 a 15), 7 rapporti d’aspetto, resolution (480p, 720p), generate_audio
bytedance-seedance-v2-ministart_frame, end_frame, fino a 9 images, 3 videos, 3 audiosduration_secs (da 4 a 15), 7 rapporti d’aspetto, resolution (480p, 720p), generate_audio
bytedance-seedance-v2.5start_frame, end_frame, fino a 30 images, 10 videos, 10 audiosduration_secs (da 4 a 30), 7 rapporti d’aspetto, resolution (480p, 720p), generate_audio
creatify-auroraimage e audio, entrambi obbligatoriresolution (480p, 720p), guidance_scale, audio_guidance_scale

Per funzionalità, disponibilità e prezzi dei modelli, consulta la panoramica di Immagini e Video.

Passaggi successivi