Webhooks de Imagen y Video
Recibe el resultado de una generación en lugar de consultarlo.
Guía práctica · Da por hecho que has completado la guía de inicio rápido de Imagen y Video .
Resumen
Las generaciones de vídeo pueden tardar varios minutos, por lo que mantener una consulta periódica abierta resulta costoso. Configura una
generación para que se entregue mediante webhook y ElevenLabs enviará un evento flows_generation a tu ruta
cuando la generación alcance el estado completed o failed.
La carga útil del evento es la respuesta final de la ruta GET correspondiente, así que un controlador que ya interpreta la respuesta de consulta periódica no necesita una vía de análisis independiente.
Antes de empezar
La entrega mediante webhook utiliza los webhooks de tu espacio de trabajo suscritos a eventos de generación. Configurarlo requiere dos pasos: crear el webhook y, después, suscribirlo al evento.
Crea un webhook
Ve a Developers > Webhooks y crea un webhook con una URL de callback HTTPS accesible públicamente. Guarda el secreto de firma que devuelve; lo necesitarás para verificar los eventos entrantes.
Suscríbelo a eventos de generación
En Select events to listen to, marca Image & Video API generation completed. Un webhook que existe pero no está suscrito a este evento nunca se llama.
También puedes hacerlo mediante la API pasando el evento flows a
Actualizar webhook del espacio de trabajo:
Crear y suscribir webhooks requiere el permiso de gestión de webhooks o ser administrador del espacio de trabajo. Un
solo evento admite hasta 10 webhooks; a partir de ahí, la solicitud falla con too_many_webhooks.
Se rechaza una generación que solicita entrega mediante webhook cuando no hay ningún webhook suscrito a eventos de generación, así que nunca se genera un resultado sin ningún lugar al que enviarlo.
Solicita la entrega mediante webhook
Añade un objeto webhook a la solicitud de creación. Usa {"type": "all"} para entregar a todos los webhooks
suscritos a eventos de generación, lo que mantiene la solicitud estable aunque se añadan o sustituyan webhooks.
Para dirigirte a webhooks específicos, configura el campo webhook como una lista de ID. Cada ID debe ser uno
de los webhooks del espacio de trabajo suscritos a eventos de generación.
La solicitud de creación valida el destino antes de iniciar la generación y devuelve un error cuando la entrega no sería posible:
La entrega mediante webhook funciona bien con generaciones
encadenadas:
configura webhook en la generación final y toda la cadena se ejecutará en el servidor con un único evento al
final. Esto también se aplica cuando la cadena falla a mitad de camino: el error se propaga hasta la
generación final, que lo entrega como un evento failed con el motivo dependency_failed.
Carga útil del webhook
Una generación completada entrega la URL de salida y el tipo MIME:
Una generación fallida entrega en su lugar la categoría y el mensaje del error:
Usa data.status para decidir qué campos están presentes. Los dos estados finales son los únicos
que puede contener un webhook, ya que la entrega solo se produce cuando finaliza una generación.
content_url es una URL firmada que caduca aproximadamente una hora después de enviar el evento. Descarga el
contenido multimedia cuanto antes o vuelve a obtener la generación para conseguir una URL nueva.
Gestiona el evento
Un controlador verifica la firma, comprueba el tipo de evento y, después, actúa según data.status. Este
ejemplo descarga la salida de una generación completada y registra el motivo de una fallida.
Ambos ejemplos descargan dentro de la solicitud por brevedad. Un vídeo grande tarda lo suficiente como para que esto pueda superar el tiempo de espera de entrega, así que en producción pasa el ID de generación a una cola y devuelve 2xx de inmediato. La URL firmada es válida durante aproximadamente una hora, tiempo de sobra para un proceso en segundo plano.
Para recibir eventos en un servidor local durante el desarrollo, expónlo con un túnel como ngrok y utiliza la URL HTTPS que te proporciona como URL de callback del webhook.
Verifica la firma
El controlador anterior llama a construct_event / constructEvent, que verifica la cabecera
ElevenLabs-Signature, valida la marca de tiempo y analiza la carga útil en un solo paso. Verifica siempre
antes de confiar en un evento.
Es importante que el listener valide todos los webhooks entrantes. Actualmente, los webhooks admiten autenticación mediante firmas HMAC. Configura la autenticación HMAC de esta forma:
- Almacena de forma segura el secreto compartido generado al crear el webhook
- Verifica la cabecera ElevenLabs-Signature en tu ruta de API mediante el SDK
El SDK de JavaScript incluye constructEvent; el SDK de Python incluye construct_event con rawBody, sig_header y secret (en Python no se llaman payload / signature). Ambos verifican la firma, validan la marca de tiempo y analizan la carga útil JSON.
Python
JavaScript
Ejemplo de controlador de webhook con FastAPI:
Comportamiento de entrega
Cada generación entrega exactamente un evento final por cada webhook de destino. La entrega es independiente de la propia generación: un webhook que falla o no es accesible no afecta al resultado, que sigue disponible desde la ruta GET y en la respuesta de lista.
Devuelve un estado 2xx rápidamente desde tu controlador. Los fallos repetidos desactivan automáticamente un webhook y un
webhook desactivado hace que se rechacen al crearlas las generaciones posteriores que lo tengan como destino. Diseña
el controlador para que sea idempotente y usa el id de generación para eliminar duplicados.
En flujos de trabajo en los que no sea aceptable perder un resultado, trata los webhooks como la vía rápida y concilia
periódicamente con flows.image.list o flows.video.list, filtrando por status.