Event catalog
Every realtime event the platform emits, by channel — names, triggers, and payload highlights.
Every event arrives as an event frame (see the
wire protocol); this page catalogs what
goes in event and data. Payloads carry the IDs you need to fetch full
state from the linked product section — they are hints, not complete
documents.
Workspace channel — workspace:WORKSPACE_ID
The firehose: everything happening in a workspace.
| Event | Fired when | Payload highlights |
|---|---|---|
training.job.queued / training.job.started / training.job.completed / training.job.failed | A training run changes status | training_id, model_id, status |
training.job.progress | A running training reports progress | training_id, model_id, status: "running", stage, pct (0–100), epoch, total_epochs |
deployment.updated | A deployment changes status (initializing, deploying, deployed, ready, starting, failed, archived) | deployment_id, promotion_id, model_id, status |
inference.created | A new forecast/inference is recorded | inference_id, model_id, inference_type, success |
inference.completed | A scheduled segment inference finishes (success or failure) | inference_id, deployment_id, segment_id, success, error |
signal.analysis.completed (and .error, .cancelled, .skipped, …) | A signal analysis job changes status — the suffix is the new status | analysis_id, status |
ingestion.execution.queued / .started / .completed / .failed / .cancelled | An ingestion execution changes status | execution_id, source_id, job_id, status; .failed adds error |
ingestion.execution.progress | A running execution reports progress | execution_id, status: "processing", phase, percentage |
ingestion.source.updated | A data source is created, updated, tested, or deleted, or its jobs change | source_id, action |
Every goal event below is also published to the goal's workspace channel, so a workspace subscription sees the full goal stream too.
Goal channel — goal:GOAL_ID
One goal's stream — subscribe here (for example, from a bot) to follow a single goal without the workspace firehose.
| Event | Fired when | Payload highlights |
|---|---|---|
goal.run.queued / goal.run.started / goal.run.completed / goal.run.failed | A discovery run changes status | goal_id, run_id, status; .failed adds error |
goal.run.stage | A funnel stage transitions (running, completed, skipped, failed) | goal_id, run_id, stage, status |
goal.tournament.status | The tournament as a whole transitions (queued, running, completed, failed, cancelled) | goal_id, tournament_id, status |
goal.tournament.entry | One candidate model changes state | goal_id, tournament_id, preset_id, status |
goal.tournament.progress | A running candidate makes mid-fit progress | goal_id, tournament_id, preset_id, folds_done, n_folds, pct, stage |
goal.created / goal.deleted | A goal is created or deleted | goal_id, name, status |
goal.status | The goal's top-level status changes | goal_id, status, shock_state (when it changed) |
goal.anomaly | An anomaly is detected on a live goal | goal_id + detection details |
goal.insight | A new insight is ready on a live goal | goal_id + insight details |
goal.fleet.run.started / goal.fleet.run.failed | A fleet scoring run starts / fails | goal_id, run_id, status, members_total, chunks_total; .failed adds error |
goal.fleet.run.progress | A scoring chunk landed — the leaderboard's progress bar advances | goal_id, run_id, chunks_done, chunks_total |
goal.fleet.run.completed | The run reduced: ranks are final, refetch the leaderboard | goal_id, run_id, stats (median score, top-decile churn, top members) |
goal.fleet.bakeoff | The model bake-off transitions or an entry is scored | goal_id, bakeoff_id, status, entry / winner when relevant |
goal.fleet.scenario.completed | A fleet covariate-shock scenario finished | goal_id, scenario_id, status, error |
alerts.evaluated | A forecast landed and the goal's alerts were evaluated | goal_id, inference_uid, fired (count of alerts that triggered) |
alerts.evaluated is published only on the goal channel — it does not
appear on the workspace channel. Alerts that trigger also notify their
recipients through Notifications, which reaches
the user channel below.
User channel — user:USER_ID
Your own cross-workspace events. This channel follows you everywhere — one subscription covers all your workspaces.
| Event | Fired when | Payload highlights |
|---|---|---|
notification | A notification is delivered to your in-app feed | notification_id, event_code, category, severity, title, body, link, metadata, created_at, read_at |
notification.push | An event you've enabled for realtime push but turned off for the in-app feed — same shape, no feed row | event_code, category, severity, title, body, link, metadata, created_at |
A worked example
A deployment going live, as it arrives on the workspace channel:
{
"type": "event",
"channel": "workspace:WORKSPACE_ID",
"event": "deployment.updated",
"data": {
"deployment_id": "DEPLOYMENT_ID",
"promotion_id": "DEPLOYMENT_ID",
"model_id": "MODEL_ID",
"status": "ready"
},
"ts": "2026-07-15T12:03:41+00:00"
}On receipt, re-fetch the deployment from
GET /v1/deployments/{id} rather than trusting
the payload as complete state — events are invalidation hints.

