Overview

Verified against Flow 5.0.0-beta.39

View as Markdown
On this page

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.

Where is the API?

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.

Try a route with curl

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 ID

Where 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.

Authenticate

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.

BearerAuth

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

?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

x-access-token: <token>, an HTTP header. Send a Flow token here instead of in Authorization.

Which token?

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?.

Read an error

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.

  • A resource in the path that doesn't exist, or that you can't reach, is 404, with a reason such as WORKSPACE_INVALID_REF or WORKFLOWRUN_INVALID_REFERENCE.
  • Blank, missing or unusable input is 400, with a reason such as WORKFLOW_INVALID_REQ.
  • PERMISSION_DENIED carries code 403 but answers HTTP 401.
  • A missing permission is 403: the credential lacks the permission the route needs.
  • A framework error, such as a malformed body or an unsupported method, keeps Spring's problem-detail body instead of a RestErrorResponse.

Page through a list

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.

Filter by label

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.

Send and receive YAML

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.

Use a client library

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.

Get the full contract

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.

Routes

Actions

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

Artifacts

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

Audit

Route Endpoint
Query the audit trail GET /api/v2/audit
Count the audit trail by outcome GET /api/v2/audit/stats

Insights

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}

Integrations

Route Endpoint
Retrieve the integrations and their status within a Workspace GET /api/v2/integration
Receive the GitHub App installation setup callback GET /api/v2/integration/github/callback
Retrieve the installation ID and store against a workspace GET /api/v2/integration/github/installation
Unlinks the GitHub Installation ID from a Workspace POST /api/v2/integration/github/unlink
Install URL Redirect GET /api/v2/integration/slack/install
Receive Slack Oauth2 request GET /api/v2/integration/slack/auth
Receive Slack Slash Commands POST /api/v2/integration/slack/commands
Receive Slack Events POST /api/v2/integration/slack/events
Receive Slack Interactivity POST /api/v2/integration/slack/interactivity
Shares an integration's credentials with the Workspace's tasks as managed Workspace parameters, or stops sharing them: GitHub's installation token, Slack's bot token, or the values entered for a form integration such as Google or Microsoft POST /api/v2/integration/{integration}/share
Disconnects the Slack installation from a Workspace POST /api/v2/integration/slack/unlink

Parameters

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}

Profile

Route Endpoint
Get your Profile GET /api/v2/profile
Patch your Profile PATCH /api/v2/profile

Schedules

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

System

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

Task Runs

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

Tasks

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

Token Management

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

Users

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

Webhooks and Events

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

Workflow Runs

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

Workflows

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

Workspace Management

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

Workspace Tasks

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

Models