GET /workflows returns the workflow definitions currently registered in the project - the shape a
runner declared when it connected. It is the read model behind the console’s
Workflows view. Definitions are registered by your runners; there is no write endpoint for them.
POST /workflows/{app}/{name}/trigger starts one off-schedule run of a registered workflow by identity -
see trigger a run manually below.
GET /workflows takes no query parameters - it returns the whole set. Filter client-side by app when
you only want one app’s workflows.
Response
An array of workflow definitions:Flow control
flowControl re-emits whatever flow-control policies the workflow registered, each
as an optional sub-field. A field is present only when that policy is active; all durations are
milliseconds:
Step manifest
steps is the workflow’s advisory manifest of declared steps, in declaration order. Each entry is:
The manifest is rendering metadata only: it never gates execution, never fails a run for drift, and
never matches emitted opcodes. When a run’s executed steps disagree with the manifest, discovery
wins - the run view shows what actually ran. A workflow that declares no manifest behaves exactly the
same; the field is simply absent.
- TypeScript
- REST API
The wire contract (
GET /workflows) is stable, so any language can read it over REST today.Trigger a run manually
POST /workflows/{app}/{name}/trigger starts one run of one workflow by identity, independent of its
declared triggers. It works even for a workflow with only a cron trigger, which POST /events cannot
reach - there is no event to send it. See the manual trigger guide
for the cron-only case, how this differs from POST /events, and why flow control still applies.
Every field is optional, and a request with no body at all is valid - that’s the cron-only case:
- TypeScript
- REST API
Request body
eventName, dedupeId, and runner are each bounded at 256 characters; a longer value or unparseable
input returns 400.
Response
202 Accepted. The run is created and enqueued, not executed - a caller that wants the finished result
polls GET /runs/{id} or uses runs.wait.
A workflow not registered in the project (or registered in another project) returns
404. No live
runner capable of serving the workflow returns 502 - the run was never queued, so there’s nothing to
poll.