Skip to main content
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.
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:

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.