API Reference / Overview
Verified against Flow 5.0.0-beta.39
Flow exposes a REST API under /api/v2. This page covers what every route has in common: where the API is, how to authenticate, and how errors, paging, labels and YAML work. The route pages list each operation with its parameters, permission and response.
Every route is under /api/v2 on service-core. A resource that a workspace owns is under /api/v2/workspace/{workspace}/…, where {workspace} is the workspace's name. Everything else is global.
curl -H "Authorization: Bearer $FLOW_TOKEN" \
"$FLOW_URL/api/v2/workspace/my-workspace/workflowrun/query?statuses=failed&limit=20"/api/v2 only gains routes and fields within 5.x, so a client written against an earlier 5.x release keeps working against a later one. The API changelog lists what changed from the v4 API. The health probe, GET /health, is outside /api/v2 and needs no token.
Each operation on the route pages ends with an example curl request. The request reads service-core's origin and your token from the shell, and each value in the path from a variable named after it:
export FLOW_URL=http://localhost:7700 # service-core's origin, without /api/v2
export FLOW_TOKEN=bfk_... # a Flow token
export WORKSPACE=example-workspace # a workspace name
export RUN_ID=6aed1feb739ea20d87d5b99e # a workflow run IDWhere a route takes a JSON body, the request either sends body.json, shown under it as the example request body, or a body built from the request schema's required fields, with placeholder values to replace. Some operations also show an example response, captured from a running Flow and shortened.
Every route needs a Flow token, except the five that Slack and GitHub call: the GitHub App callback and four Slack routes. Those verify the request themselves, and their Authorization section reads "No authorization required". Send the token in one of the ways below.
Authorization: Bearer <token>, an HTTP bearer token. Send a Flow token, such as a bfk_ key token. Behind an authenticating proxy, Flow also accepts the proxy's JSON Web Token (JWT) here, which is the format the contract names: JWT.
?access_token=<token>, a URL query parameter. A token in the URL, for webhook senders that cannot set a header. Only the routes whose Authorization section lists access_token accept it: POST /api/v2/webhook, POST /api/v2/event, and GET or POST /api/v2/callback.
Warning
A token in a URL is recorded by every proxy and access log it passes through. Prefer a header. If a sender can only use the URL, give it a key token with only the webhook/action permission on its workspace.
x-access-token: <token>, an HTTP header. Send a Flow token here instead of in Authorization.
Each route's description names the permission it needs and the token kinds it accepts, for example "Requires the workflowrun/read permission, from a global, key, user, session token." Machine tokens covers the token kinds and how to create them, and Tokens covers what each kind grants.
A request without a valid token is 401, with a WWW-Authenticate: Bearer header. A 403 means the credential lacks the permission the route needs. With flow.security.enabled=false, Flow checks no token at all: see What happens with security off?.
An error Flow raises is a RestErrorResponse:
{
"timestamp": "2026-09-01T10:00:00.000+00:00",
"code": 1001,
"reason": "QUERY_INVALID_FILTERS",
"message": "Invalid query filters(labels) have been provided.",
"status": "400 BAD_REQUEST"
}| Field | Holds |
|---|---|
timestamp |
When Flow raised the error |
code |
A number. Below 1000 it mirrors the HTTP status, except 101, which two user errors carry. Then 10xx is generic, 11xx workspace, 12xx workflow, 13xx workflow run, 14xx task, 15xx task run, 16xx action, 17xx schedule, 18xx parameter, 19xx integration and 20xx artifact. |
reason |
The error's name, such as WORKFLOWRUN_INVALID_REFERENCE. Key on reason, not code: four codes each carry two reasons. 101 is USER_NOT_FOUND or USER_UNABLE_TO_DELETE, 429 is TOO_MANY_REQUESTS or WORKFLOW_TRIGGER_DISABLED, 1405 is TASK_INVALID_WORKFLOWREF or TASK_DELETE_IN_USE, and 1802 is PARAMS_NON_UNIQUE_REFERENCE or PARAMS_NON_UNIQUE_KEY. |
message |
A readable explanation |
status |
The HTTP status, as its code and name |
The response also carries cause, which is null unless the operator sets flow.error.include-cause=true. The default is false.
404, with a reason such as WORKSPACE_INVALID_REF or WORKFLOWRUN_INVALID_REFERENCE.400, with a reason such as WORKFLOW_INVALID_REQ.PERMISSION_DENIED carries code 403 but answers HTTP 401.403: the credential lacks the permission the route needs.RestErrorResponse.List routes, usually ending /query, take these query parameters:
page, counted from 0;limit;order, ASC or DESC;sort, a field name, where the list is sortable.They return a page: the matches in content, with totalElements, totalPages, number and size. On the run, task run, workflow, task, workspace, user and token lists, leaving out limit returns every match. The action and schedule lists default to 10.
The run, task run, action and token lists also take fromDate and toDate, in epoch milliseconds: fromDate is included and toDate is not. statuses and phase ignore case. A value that names no status or phase is 400 QUERY_INVALID_FILTERS.
labels keeps the items that carry every key=value pair you list. URL-encode each pair and separate the pairs with commas: labels=Organization%3DBoomerang,customKey%3Dtest. Each pair splits on its first =, so a%3Db%3Dc matches the value b=c. A pair without a key or a value is 400 QUERY_INVALID_FILTERS.
Labels under boomerang.io/ are Flow's own. Flow sets some, such as boomerang.io/model on an AI task run, and drops any that a client sends. PATCH on a workspace replaces its labels, and PUT on a workflow merges them unless you add replace=true.
The task routes, under /api/v2/task and /api/v2/workspace/{workspace}/task, also serve and accept a task as YAML. Send Accept: application/x-yaml to read YAML and Content-Type: application/x-yaml to write it. With no Accept header, Flow answers JSON.
The YAML is a Tekton Task. Its boomerang.io/params annotation carries each parameter's other fields, so a task you read and apply back unchanged stays as it was.
flow-sdk is the public API as a Java library: Flow.connect(url, token), then typed calls to submit, read, cancel and retry workflow runs, query runs and task runs by label, and read Insights. Each Flow release publishes it to GitHub Packages as io.boomerang:flow-sdk, at the release's version. Use the version of the Flow you run against. Reading GitHub Packages needs a GitHub token with read:packages. Call Flow with flow-sdk has the dependency, an example and what the library covers.
Flow publishes no client for other languages. Generate one from the contract with a tool such as OpenAPI Generator.
These pages are generated from contracts/api-v2.yaml at 5.0.0-beta.39, an OpenAPI 3.1.0 document. The rules every route follows are in specifications/api-contract.md. A running service-core serves the same document at /api/docs/spec/api-v2, and Swagger UI at /api/docs/swagger-ui.
| Route | Endpoint |
|---|---|
| Provide an update for an Action | PUT /api/v2/workspace/{workspace}/action |
| Retrieve a specific Action by Id | GET /api/v2/workspace/{workspace}/action/{actionId} |
| Search for Actions | GET /api/v2/workspace/{workspace}/action/query |
| Get Actions Summary | GET /api/v2/workspace/{workspace}/action/summary |
| Route | Endpoint |
|---|---|
| Delete a workspace artifact, by id, and its file | DELETE /api/v2/workspace/{workspace}/artifacts/{artifactId} |
| Delete a run's artifact, by name, and its file | DELETE /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/artifacts/{name} |
| Download an artifact's file | GET /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/artifacts/{name} |
| List a WorkflowRun's artifacts, expired ones included | GET /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/artifacts |
| List the workspace's artifacts, largest first | GET /api/v2/workspace/{workspace}/artifacts |
| Route | Endpoint |
|---|---|
| Query the audit trail | GET /api/v2/audit |
| Count the audit trail by outcome | GET /api/v2/audit/stats |
| Route | Endpoint |
|---|---|
| Summarise a workspace's runs over a period | GET /api/v2/workspace/{workspace}/insights |
| Summarise runs across workspaces over a period | GET /api/v2/insights |
| List task runs across workspaces | GET /api/v2/insights/taskruns |
| Group a workspace's task runs over a period | GET /api/v2/workspace/{workspace}/insights/tasks |
| Group task runs across workspaces over a period | GET /api/v2/insights/tasks |
| Detail one workflow's runs over a period | GET /api/v2/workspace/{workspace}/insights/workflow/{workflow} |
| Route | Endpoint |
|---|---|
| Create a global Param | POST /api/v2/parameters |
| Delete a global Param | DELETE /api/v2/parameters/{name} |
| Get all global Params | GET /api/v2/parameters |
| Update a global Param | PATCH /api/v2/parameters/{name} |
| Route | Endpoint |
|---|---|
| Get your Profile | GET /api/v2/profile |
| Patch your Profile | PATCH /api/v2/profile |
| Route | Endpoint |
|---|---|
| Create a Schedule. | POST /api/v2/workspace/{workspace}/schedule |
| Delete a Schedule. | DELETE /api/v2/workspace/{workspace}/schedule/{scheduleId} |
| Retrieve a Schedule. | GET /api/v2/workspace/{workspace}/schedule/{scheduleId} |
| Retrieve Calendars for Schedules by Dates. | GET /api/v2/workspace/{workspace}/schedule/calendars |
| Search for Schedules | GET /api/v2/workspace/{workspace}/schedule/query |
| Apply a Schedule. | PUT /api/v2/workspace/{workspace}/schedule |
| Validate a Schedules CRON. | GET /api/v2/workspace/{workspace}/schedule/validate-cron |
| Route | Endpoint |
|---|---|
| Retrieve Boomerang Flow Settings | GET /api/v2/settings |
| Retrieve feature flags. | GET /api/v2/features |
| Retrieve this instances context, features, and navigation. | GET /api/v2/context |
| Retrieve navigation. | GET /api/v2/navigation |
| Update Boomerang Flow Settings | PATCH /api/v2/settings |
| List outbox rows, dead ones by default. | GET /api/v2/system/outbox |
| Register and activate an installation of Flow | PUT /api/v2/activate |
| Replay outbox rows | PUT /api/v2/system/outbox/replay |
| Route | Endpoint |
|---|---|
| Search for TaskRuns across WorkflowRuns | GET /api/v2/workspace/{workspace}/taskrun/query |
| Retrieve a TaskRuns log from a specific WorkflowRun. | GET /api/v2/taskrun/{taskRunId}/log |
| Route | Endpoint |
|---|---|
| Update, replace, or create a global task using Tekton Task YAML | PUT /api/v2/task/{name} |
| Create a new Task using Tekton Task YAML | POST /api/v2/task |
| Delete a Task | DELETE /api/v2/task/{name} |
| Retrieve a global task as Tekton Task YAML. If no version specified, the latest version is returned. | GET /api/v2/task/{name} |
| Retrieve a global task's changelog | GET /api/v2/task/{name}/changelog |
| Search for Task. If workspaces are provided it will query the workspaces. If no workspaces are provided it will query Global Task Templates | GET /api/v2/task/query |
| Validate a global task's Tekton Task YAML | POST /api/v2/task/validate |
| Route | Endpoint |
|---|---|
| Create Token | POST /api/v2/token |
| Delete Token | DELETE /api/v2/token/{id} |
| Retrieve the permission catalog for building a Token | GET /api/v2/token/catalog |
| Search for Tokens | GET /api/v2/token/query |
| Route | Endpoint |
|---|---|
| Update a Boomerang Flow Users details | PATCH /api/v2/user/{userId} |
| Delete a Boomerang Flow user | DELETE /api/v2/user/{userId} |
| Get a Users details | GET /api/v2/user/{userId} |
| Get a Users Workspace memberships | GET /api/v2/user/{userId}/workspaces |
| Search for Users | GET /api/v2/user/query |
| Route | Endpoint |
|---|---|
| Accept CloudEvent | POST /api/v2/event |
| Accept Wait for Event Callbcak | GET /api/v2/callback |
| Accept Wait for Event Callback with JSON Payload | POST /api/v2/callback |
| Accept Webhook payloads from various sources. | POST /api/v2/webhook |
| Route | Endpoint |
|---|---|
| Cancel a WorkflowRun | DELETE /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/cancel |
| Retrieve a summary of WorkflowRuns by Status. | GET /api/v2/workspace/{workspace}/workflowrun/count |
| Retrieve a specific WorkflowRun. | GET /api/v2/workspace/{workspace}/workflowrun/{workflowRunId} |
| Pause a running WorkflowRun | PUT /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/pause |
| Purge a WorkflowRun with everything it owns and its lineage: its retries, its child runs, their task runs, actions, artifacts and logs. A run in flight is cancelled first. Audit records stay. | DELETE /api/v2/workspace/{workspace}/workflowrun/{workflowRunId} |
| Purge the WorkflowRuns matching every label, oldest first, each with its lineage. One call takes a page of matches and reports how many remain; repeat until none. | DELETE /api/v2/workspace/{workspace}/workflowrun |
| Search for WorkflowRuns | GET /api/v2/workspace/{workspace}/workflowrun/query |
| Resume a paused WorkflowRun | PUT /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/resume |
| Retry WorkflowRun execution. | PUT /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/retry |
| Start WorkflowRun execution. The WorkflowRun has to already have been queued. | PUT /api/v2/workspace/{workspace}/workflowrun/{workflowRunId}/start |
| Route | Endpoint |
|---|---|
| Update, replace, or create new, Workflow for Canvas | PUT /api/v2/workspace/{workspace}/workflow/{name}/compose |
| Update, replace, or create new, Workflow | PUT /api/v2/workspace/{workspace}/workflow |
| Convert workflow to compose model for UI Designer and detailed Activity screens. | GET /api/v2/workspace/{workspace}/workflow/{name}/compose |
| Create a new workflow | POST /api/v2/workspace/{workspace}/workflow |
| Delete a workflow | DELETE /api/v2/workspace/{workspace}/workflow/{name} |
| Duplicates the workflow. | POST /api/v2/workspace/{workspace}/workflow/{name}/duplicate |
| Export the Workflow as JSON. | GET /api/v2/workspace/{workspace}/workflow/{name}/export |
| Retrieve the parameters. | GET /api/v2/workspace/{workspace}/workflow/{name}/available-parameters |
| Retrieve a workflow's changelog | GET /api/v2/workspace/{workspace}/workflow/{name}/changelog |
| Retrieve a Workflow | GET /api/v2/workspace/{workspace}/workflow/{name} |
| Change what a workflow is | PATCH /api/v2/workspace/{workspace}/workflow/{name} |
| Search for Workflows | GET /api/v2/workspace/{workspace}/workflow/query |
| Submit a Workflow to be run. Will queue the WorkflowRun ready for execution. | POST /api/v2/workspace/{workspace}/workflow/{name}/submit |
| Route | Endpoint |
|---|---|
| Create new workspace | POST /api/v2/workspace |
| Delete Approver Groups | DELETE /api/v2/workspace/{workspace}/approvers |
| Delete Workspace Parameter | DELETE /api/v2/workspace/{workspace}/parameters/{name} |
| Delete Workspace | DELETE /api/v2/workspace/{workspace} |
| Retrieve Default Workspace Quota | GET /api/v2/workspace/quotas/default |
| Retrieve Workspace Roles | GET /api/v2/workspace/roles |
| Get workspace | GET /api/v2/workspace/{workspace} |
| Search for Workspaces | GET /api/v2/workspace/query |
| Leave Workspace | DELETE /api/v2/workspace/{workspace}/leave |
| Remove Workspace Members | DELETE /api/v2/workspace/{workspace}/members |
| Reset Workspace Quota | DELETE /api/v2/workspace/{workspace}/quotas |
| Patch or update a workspace | PATCH /api/v2/workspace/{workspace} |
| Validate workspace name and check uniqueness. | POST /api/v2/workspace/validate-name |
| Route | Endpoint |
|---|---|
| Update, replace, or create a workspace task using Tekton Task YAML | PUT /api/v2/workspace/{workspace}/task/{name} |
| Create a new Task Template using Tekton Task YAML | POST /api/v2/workspace/{workspace}/task |
| Delete a Workspace Task | DELETE /api/v2/workspace/{workspace}/task/{name} |
| Retrieve a workspace task as Tekton Task YAML. If no version specified, the latest version is returned. | GET /api/v2/workspace/{workspace}/task/{name} |
| Retrieve a workspace task's changelog | GET /api/v2/workspace/{workspace}/task/{name}/changelog |
| Search for Tasks. If workspaces are provided it will query the workspaces. If no workspaces are provided it will query Global Task Templates | GET /api/v2/workspace/{workspace}/task/query |
| Validate a workspace task's Tekton Task YAML | POST /api/v2/workspace/{workspace}/task/validate |