Webhooks
Event Types

Event Types

Ignite Webhooks support three event types for video lifecycle events. You can subscribe to any combination of these events when creating a webhook subscription.

Available Events

video.created

Triggered when a new video is created in your workspace.

When it fires:

  • A new video object is created via the API
  • A video is uploaded through the Admin UI

Payload: The complete video object with all initial values. Note that the video status may be NO_FILE or PROCESSING at this point.

video.updated

Triggered when any property of a video is modified.

When it fires:

  • Video metadata is updated (title, description, visibility, etc.)
  • Video processing completes (status changes to COMPLETE)
  • Text tracks or chapters are added/modified
  • Categories or tags are changed
  • Thumbnail is updated

Payload: The complete video object with all current values after the update.

video.deleted

Triggered when a video is deleted from your workspace.

When it fires:

  • A video is deleted via the API
  • A video is deleted through the Admin UI

Payload: The complete video object as it existed before deletion.

Event Payload Structure

All events deliver the complete video object as the request body. The event type is specified in the X-Webhook-Event header, not in the body.

Example: video.created

Headers:

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_507f1f77bcf86cd799439011

Body:

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

Example: video.updated

Headers:

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_507f1f77bcf86cd799439012

Body:

{
  "id": "507f1f77bcf86cd799439011",
  "status": "COMPLETE",
  "visibility": "public",
  "title": "My New Video",
  "description": "A great video about something",
  "duration": 120,
  "fps": 30,
  "orientation": "landscape",
  "src": {
    "thumbnailUrl": "https://cdn.ignite.video/...",
    "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"
}

Example: video.deleted

Headers:

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_507f1f77bcf86cd799439013

Body:

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

Best Practices

Handle All Subscribed Events

Always check the X-Webhook-Event header and handle each event type appropriately:

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);
}

Use the Delivery ID for Idempotency

The X-Webhook-Delivery-Id header contains a unique identifier for each webhook delivery. Store processed delivery IDs to prevent duplicate processing in case of retries:

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);