Event types

Closed enum. New event types in future versions are additive — existing types never change shape.

Lifecycle events

EventStageNotes
queuedAsset row inserted, work accepted
vision_startedvisionClaude vision call dispatched
vision_completedvisionVision returned a motion prompt
vision_failedvisionVision rejected the source
stage_startedstage1/stage2/merge/singleReplicate prediction submitted
stage_completedstage1/stage2/merge/singlePrediction returned mp4
stage_failedstage1/stage2/merge/singlePrediction errored or timed out
retry_scheduledanyTransient error, retry queued (observational)
r2_write_completedmp4 stored in R2
readyTerminal success
failedTerminal failure (error_code field)
cancelledManual cancel via dashboard

Webhook delivery events

These fire only when webhooks are enabled on the project:

EventNotes
webhook_dispatchedOutbound delivery enqueued
webhook_deliveredCustomer endpoint responded 2xx
webhook_failedEndpoint errored or timed out (will retry)
webhook_dead_letter5 failed attempts, won't retry automatically

Common fields

Every event carries:

ts
type AssetEvent = { ts: number; // unix ms attempt: number; // 1-based, increments on retries request_id: string; asset_id: string; project_id: string; // type-specific extras: stage?: 'stage1' | 'stage2' | 'merge' | 'single' | 'vision' | 'r2_write'; latency_ms?: number; // on *_completed error_code?: string; // on *_failed error_msg?: string; // on *_failed};

error_code enum

error_code is the stable identifier on *_failed events. Branch on this, not on error_msg.

text
vision_blocked — source rejected (NSFW, copyright, oversize)vision_timeout — vision exceeded 30ssource_unfetchable — 4xx/5xx fetching source URLsource_too_large — source > 10 MBsource_unsupported — non-png/jpg/webp content-typei2v_failed — image-to-video model erroredi2v_timeout — i2v exceeded 5 minmerge_failed — loop stitching failedr2_write_failed — R2 write errored (auto-retried; rare)quota_exceeded — monthly limit hit mid-flightpipeline_stalled — cron reconciler gave up after 10 min

SSE format

text
id: 1714801234567event: stage_completeddata: {"stage":"stage1","latency_ms":4820,"asset_id":"a25b…","ts":1714801234567}

Webhook envelope

json
{ "id": "evt_01HXY3K…", "type": "asset.completed", "ts": 1714801234567, "asset_id": "a25b…", "project_id": "proj_abc", "request_id": "req_xyz", "data": { /* event-specific payload */ }}

The type field on webhooks is namespaced as asset.<eventType> (e.g. asset.completed, asset.failed). SSE events use the bare event type.

Subscribing

ChannelAuthEndpoint
SSE (public)Project keyGET /v1/{key}/events/{asset_id}
SSE (auth-gated, per-asset)Session cookieGET /api/assets/{id}/events
SSE (auth-gated, project-wide)Session cookieGET /api/projects/{id}/activity
WebhooksOutbound HMAC-signed POSTConfigure via PUT /api/projects/{id}/webhooks
Ask a question... ⌘I