> ## Documentation Index
> Fetch the complete documentation index at: https://docs.framelane.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Events

> All webhook event types and their payload shapes.

## Event catalog

| Event               | Trigger                                                                   |
| ------------------- | ------------------------------------------------------------------------- |
| `render.queued`     | Render job accepted and queued                                            |
| `render.processing` | GPU engine started processing                                             |
| `render.progress`   | Progress update (multiple per job)                                        |
| `render.completed`  | Render finished, artifact ready                                           |
| `render.failed`     | Render failed with an error                                               |
| `render.cancelled`  | Render was cancelled                                                      |
| `task.queued`       | Task accepted and queued                                                  |
| `task.processing`   | Task started processing                                                   |
| `task.completed`    | Task finished, artifact ready                                             |
| `task.failed`       | Task failed with an error                                                 |
| `asset.ready`       | Media metadata extracted after upload or import (duration, width, height) |
| `webhook.test`      | Sent by the test endpoint                                                 |

## Payload envelope

All events share the same outer envelope:

```json theme={null}
{
  "type": "render.completed",
  "created_at": "2026-05-21T07:15:00Z",
  "data": { /* job object */ }
}
```

The `data` field contains the full job object at the time of the event, including `output` (on completion) or `error` (on failure).

## asset.ready example

Fired when a video or audio file finishes metadata extraction — whether uploaded via `POST /v1/uploads` or copied in by `ingest_external` on a render. For an `ingest_external` render, every referenced file emits `asset.ready` before the render leaves the `ingesting` state:

```json theme={null}
{
  "type": "asset.ready",
  "data": {
    "source_url": "https://cdn-user.framelane.io/uploads/ws_01J.../a1b2c3.mp4",
    "duration": 42.5,
    "width": 1920,
    "height": 1080
  }
}
```

## render.completed example

```json theme={null}
{
  "type": "render.completed",
  "created_at": "2026-05-21T07:15:23Z",
  "data": {
    "id": "render_01J...",
    "kind": "render",
    "status": "completed",
    "progress_percent": 100,
    "output": {
      "url": "https://storage.googleapis.com/...",
      "width": 1920,
      "height": 1080,
      "duration": 15.0,
      "size_bytes": 12582912
    },
    "metadata": { "project_id": "proj_123" },
    "created_at": "2026-05-21T07:14:55Z",
    "updated_at": "2026-05-21T07:15:23Z",
    "completed_at": "2026-05-21T07:15:23Z"
  }
}
```

## render.failed example

```json theme={null}
{
  "type": "render.failed",
  "created_at": "2026-05-21T07:14:58Z",
  "data": {
    "id": "render_01J...",
    "status": "failed",
    "error": {
      "code": "source_not_found",
      "message": "Source URL returned 404."
    }
  }
}
```
