API

Event catalog

Mobius has two event planes. Source events are durable project events that event triggers and wait_for_event steps can match. Run-stream events are per-run timeline records for operators, server-sent events (SSE), and the run detail page.

Do not use run-stream events as triggers directly. When a run reaches a terminal state, Mobius emits a separate source event such as run.completed for loop-to-loop reactions.

Source event envelope

Source events use one normalized envelope:

{
  "event_type": "table.row.inserted",
  "source_kind": "table_row",
  "source_id": "tbl_01...",
  "event": {
    "table_id": "tbl_01...",
    "row_id": "row_01..."
  },
  "meta": {
    "event_type": "table.row.inserted",
    "table_id": "tbl_01...",
    "row_id": "row_01..."
  }
}

Event triggers start runs with the normalized event at inputs.event and routing fields at inputs.meta. wait_for_event conditions and payload mappings evaluate against { event, meta }.

Public source events

EventSource kindTriggerableWaitableSent whenMeta fields
artifact.createdartifactYesYesAn artifact is produced during a run.artifact_id, loop_run_id, kind, content_type
email.receivedemailYesYesEmail arrives at a Mobius agent address.agent_id
http_trigger.receivedhttp_triggerYesYesAn inbound request reaches an HTTP trigger URL.trigger_id, http_handle
interaction.resolvedinteractionNoYesAn interaction resolves from a participant response.interaction_id, kind, status, responder_id, resolving_response_id
run.cancelledloop_runYesYesA loop run reaches cancelled.run_id, loop_id
run.completedloop_runYesYesA loop run reaches completed.run_id, loop_id
run.failedloop_runYesYesA loop run reaches failed.run_id, loop_id
session.message.createdsessionYesYesA new message is posted in an agent session.session_id, agent_id, message_id, role
signal.<name>signalNoYesA signal is sent to a run-scoped wait.run_id, signal_name
table.row.deletedtable_rowYesYesA table row is deleted.table_name, table_id, row_id
table.row.insertedtable_rowYesYesA table row is inserted.table_name, table_id, row_id
table.row.updatedtable_rowYesYesA table row is updated.table_name, table_id, row_id

interaction.resolved and signal.<name> are waitable but not triggerable. Use them to resume an existing run, not to start a new one.

Integration source events

Integration events are provider-scoped and project-aware. The event catalog in the app and API is the source of truth for which provider events are active in your project.

Provider events follow this pattern:

<provider>.<resource>.<verb>

Examples:

github.pull_request.opened
github.pull_request.closed
linear.issue.created
slack.event
gmail.message.received
jira.issue.updated

Use exact names for narrow triggers. Use a trailing wildcard only when every event below a prefix should match:

triggers:
  - kind: event
    config:
      event_type: github.pull_request.*

Internal source events

These event types exist in the source_events table for runtime processing, but they are internal. Do not use them in authored triggers or waits.

EventWhy it exists
interaction.http_subscriber.dispatchDispatches an interaction callback to an HTTP subscriber.
loop.http_trigger.receivedStarts the asynchronous handler for an HTTP trigger.
loop.run_allocation.completedRecords a worker-reported completed run allocation.
loop.run_allocation.failedRecords a worker-reported failed run allocation.
loop.schedule.tickStarts the asynchronous handler for a schedule trigger.
loop_run.continueRe-executes a run after a step lease expires.
loop_run.resumeResumes a run when a timer or signal is due.
run.progress_initialStarts server-side progression for a newly persisted run.
run.resumeResumes a suspended run from the older resume path.
schedule.tickRecords a schedule tick before the public loop handler runs.

If you need to react to a schedule, add a schedule trigger. If you need to react to an HTTP request, add an http trigger.

Run-stream events

Run-stream events are stored on a single run and replayed by the run events API and SSE stream. They are what the Timeline tab renders.

EventSent whenPayload to expect
run.startedThe run is created and execution begins.Run ID, loop/version identifiers, source fields.
run.suspendedThe run is waiting on a timer, event, interaction, or worker-owned work.Step key, wait kind, wait details.
run.resumedA suspended run starts moving again.Step key and resume reason.
run.completedThe run reaches completed.Final result context.
run.failedThe run reaches failed.Error text, step key when known, error type.
run.cancelledThe run is cancelled.Reason and cancellation metadata.
step.startedA step begins.Step key and step kind.
step.suspendedA step opens a wait.Step key, wait kind, subscription or interaction details.
step.resumedA suspended step resumes.Step key and kind.
step.completedA step finishes successfully.Step key and output.
step.failedA step fails.Step key, error, and error type.
step.retriedA step failure has attempts remaining.Step key, attempt, and retry metadata.
step.skippedA conditional loop step does not start its child run.Step key and kind.
wait.openedA sleep, wait_for_event, or interaction wait is registered.Wait kind, subject, deadline, and step key.
wait.resumedA wait receives the payload that resumes it.Resolved event, signal, or interaction payload.
wait.timed_outA wait reaches its timeout.Step key, wait kind, and timeout reason.
interaction.requestedAn interaction step creates an interaction.Interaction ID, protocol, targets, and prompt facts.
interaction.respondedA run-backed interaction resolves and resumes the step.Interaction ID, response value, and responder facts.
action.calledAn action step dispatches a server, worker, or environment action.Action name, step key, and parameters metadata.
action.completedAn action returns successfully.Action name, step key, and result.
action.failedAn action attempt fails.Action name, step key, error, and error type.
action.retriedA worker-executed action is requeued for another attempt.Action name, attempt, max attempts.
action.resultLegacy compatibility record for action result rendering.Same result shape as the action completion path.
artifact.createdA run-linked artifact is available.Artifact ID, name, content type, run and step lineage.
generation.deltaA live generation stream emits partial text.Provider-specific delta payload.
limit.reachedA runtime or billing cap stops the run.Limit kind, configured cap, and observed usage.
usage.recordedUsage attribution is recorded for the run.Category, quantity, and attribution metadata.

Prefer action.completed for new consumers. Keep action.result handling only for compatibility with older run records.

Example run stream

event: run.started
event: step.started
event: action.called
event: action.completed
event: step.completed
event: usage.recorded
event: run.completed

The stream is replayable by sequence number. If a client reconnects, ask for events after the last sequence it saw so the timeline stays complete.

Next