Tipos de eventos
Los webhooks de Ignite admiten tres tipos de evento para el ciclo de vida de los videos. Puedes suscribirte a cualquier combinación de ellos al crear una suscripción a webhooks.
Eventos disponibles
video.created
Se dispara cuando se crea un video nuevo en tu espacio de trabajo.
Cuándo ocurre:
- Se crea un objeto de video nuevo vía API
- Se sube un video desde la interfaz de administración
Cuerpo (payload): El objeto de video completo con todos los valores iniciales. Ten en cuenta que el status del video puede ser NO_FILE o PROCESSING en este momento.
video.updated
Se dispara cuando se modifica cualquier propiedad de un video.
Cuándo ocurre:
- Se actualizan metadatos del video (título, descripción, visibilidad, etc.)
- Termina el procesamiento del video (el estado pasa a
COMPLETE) - Se añaden o modifican pistas de texto o capítulos
- Cambian categorías o etiquetas
- Se actualiza la miniatura
Cuerpo (payload): El objeto de video completo con todos los valores actuales tras la actualización.
video.deleted
Se dispara cuando se elimina un video de tu espacio de trabajo.
Cuándo ocurre:
- Se elimina un video vía API
- Se elimina un video desde la interfaz de administración
Cuerpo (payload): El objeto de video completo tal como existía antes de la eliminación.
Estructura del cuerpo del evento
Todos los eventos entregan el objeto de video completo como cuerpo de la solicitud. El tipo de evento va en la cabecera X-Webhook-Event, no en el cuerpo.
Ejemplo: video.created
Cabeceras:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.created
X-Webhook-Signature: t=1705316400000,v1=abc123...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439011Cuerpo:
{
"id": "507f1f77bcf86cd799439011",
"status": "PROCESSING",
"visibility": "private",
"title": "My New Video",
"description": "",
"duration": 0,
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}Ejemplo: video.updated
Cabeceras:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.updated
X-Webhook-Signature: t=1705316500000,v1=def456...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439012Cuerpo:
{
"id": "507f1f77bcf86cd799439011",
"status": "COMPLETE",
"visibility": "public",
"title": "My New Video",
"description": "A great video about something",
"duration": 120,
"fps": 30,
"orientation": "landscape",
"src": {
"thumbnails": [
{
"name": "1080p", "width": 1920, "height": 1080,
"formats": {
"jpeg": { "url": "https://cdn.ignite.video/.../a1b2c3d4-1080p.jpg", "fileSize": 9180 },
"webp": { "url": "https://cdn.ignite.video/.../a1b2c3d4-1080p.webp", "fileSize": 4256 }
}
},
// ... additional resolutions
],
"thumbnailUrl": "https://cdn.ignite.video/.../a1b2c3d4-1080p.jpg",
"abr": {
"resolution": "auto",
"description": "Adaptive Bitrate Streaming (ABR)",
"url": "https://cdn.ignite.video/.../master.m3u8",
"maxWidth": 1920,
"maxHeight": 1080
},
"hls": [...],
"mp4": [...]
},
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:35:00.000Z"
}Ejemplo: video.deleted
Cabeceras:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.deleted
X-Webhook-Signature: t=1705316600000,v1=ghi789...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439013Cuerpo:
{
"id": "507f1f77bcf86cd799439011",
"status": "COMPLETE",
"visibility": "public",
"title": "My New Video",
"description": "A great video about something",
"duration": 120,
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:35:00.000Z"
}Buenas prácticas
Gestionar todos los eventos suscritos
Comprueba siempre la cabecera X-Webhook-Event y trata cada tipo de evento de forma adecuada:
const eventType = request.headers['x-webhook-event'];
switch(eventType) {
case 'video.created':
// Handle new video
break;
case 'video.updated':
// Handle video update
break;
case 'video.deleted':
// Handle video deletion
break;
default:
console.log('Unknown event type:', eventType);
}Usar el ID de entrega para idempotencia
La cabecera X-Webhook-Delivery-Id contiene un identificador único para cada entrega de webhook. Guarda los IDs de entrega ya procesados para evitar procesar de nuevo en caso de reintentos:
const deliveryId = request.headers['x-webhook-delivery-id'];
if (await hasBeenProcessed(deliveryId)) {
return res.status(200).json({ received: true, duplicate: true });
}
// Process the event...
await markAsProcessed(deliveryId);