Flowral Work API
Ready, blocked and in-progress work across every flow.
Ready, blocked and in-progress work across every flow.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/flowral-app:flowral-app-work-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Flowral Work API
version: 1.0.0
summary: Client projects as dependency graphs — over HTTP.
description: 'The Flowral public API: flows, the tasks in them, and the derived state that
makes a dependency planner useful — what is ready, what is blocked, and when a
project actually lands.
**Authentication.** Every request carries a credential created in the app under
**API & AI**. Either send an API key as a bearer token, or exchange a client id
and secret for a short-lived token at `POST /v1/oauth/token`. A credential
belongs to a workspace and carries its own role: it can never do more than that
role allows, and it cannot move between workspaces.
**Errors** are `{ "error": { "code", "message" } }`. Switch on `code`; the
message is for humans and may change.
**Lists** are `{ "total", "items" }` and take `size` and `from`.
**Rate limit** 120 requests/minute per credential, burst 240. Exceeding it
returns `429` with `Retry-After`.
**Stability.** This is v1. Fields get added; nothing that exists is removed or
repurposed without a new major version. The platform API the web app uses is a
different, unversioned surface — it is not this, and it will change without
notice.'
contact:
name: Flowral
email: hello@flowral.app
url: https://flowral.app/api
license:
name: Proprietary
url: https://flowral.app/terms
servers:
- url: https://api.flowral.app
description: Production
security:
- apiKey: []
- oauth2: []
tags:
- name: work
description: Ready, blocked and in-progress work across every flow.
paths:
/v1/work/available:
get:
operationId: work.available
summary: What is ready to start
description: Every unblocked, unstarted task across the workspace, critical-path work first. The single most useful call in this API.
tags:
- work
parameters:
- name: flowId
in: query
required: false
description: Restrict to one flow.
schema:
type: string
description: Restrict to one flow.
- name: assigneeId
in: query
required: false
description: Restrict to one person. Unassigned work is always included.
schema:
type: string
description: Restrict to one person. Unassigned work is always included.
- name: size
in: query
required: false
schema:
type: integer
default: 25
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total matching, not the length of `items`.
items:
type: array
items:
$ref: '#/components/schemas/WorkItem'
required:
- total
- items
'401':
description: UNAUTHORIZED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHORIZED
message: Human-readable explanation.
'403':
description: PLAN_REQUIRED · INSUFFICIENT_SCOPE
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: PLAN_REQUIRED
message: Human-readable explanation.
'429':
description: RATE_LIMITED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: Human-readable explanation.
security:
- apiKey: []
- oauth2:
- flows:read
x-codeSamples:
- lang: cURL
source: "curl '{{API_URL}}/v1/work/available' \\\n -H 'Authorization: Bearer {{API_KEY}}'"
x-examples:
- request:
curl: "curl '{{API_URL}}/v1/work/available' \\\n -H 'Authorization: Bearer {{API_KEY}}'"
response:
status: 200
body:
total: 2
items:
- taskId: tsk_3
taskName: Client approval
flowId: flw_2b8e10
flowName: 'Acme: Website relaunch'
status: ready
assigneeId: null
criticalPath: true
- taskId: tsk_9
taskName: Write launch copy
flowId: flw_2b8e10
flowName: 'Acme: Website relaunch'
status: ready
assigneeId: usr_41
criticalPath: false
/v1/work/mine:
get:
operationId: work.mine
summary: What is assigned to the caller
description: Ready and in-progress work assigned to this credential's identity. For a service credential, pass `assigneeId` to `/work/available` instead — a credential is not a person and has nothing assigned to it.
tags:
- work
parameters:
- name: size
in: query
required: false
schema:
type: integer
default: 25
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total matching, not the length of `items`.
items:
type: array
items:
$ref: '#/components/schemas/WorkItem'
required:
- total
- items
'401':
description: UNAUTHORIZED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHORIZED
message: Human-readable explanation.
'403':
description: FORBIDDEN · PLAN_REQUIRED · INSUFFICIENT_SCOPE
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: FORBIDDEN
message: Human-readable explanation.
'429':
description: RATE_LIMITED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: Human-readable explanation.
security:
- apiKey: []
- oauth2:
- flows:read
/v1/work/blocked:
get:
operationId: work.blocked
summary: What is stuck, and on what
description: Blocked work with the unfinished tasks holding it up, ranked so the task blocking the most appears first. This is the "where is delivery actually stalling" call.
tags:
- work
parameters:
- name: flowId
in: query
required: false
schema:
type: string
- name: size
in: query
required: false
schema:
type: integer
default: 25
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total matching, not the length of `items`.
items:
type: array
items:
$ref: '#/components/schemas/WorkItem'
required:
- total
- items
'401':
description: UNAUTHORIZED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHORIZED
message: Human-readable explanation.
'403':
description: FORBIDDEN · PLAN_REQUIRED · INSUFFICIENT_SCOPE
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: FORBIDDEN
message: Human-readable explanation.
'429':
description: RATE_LIMITED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: Human-readable explanation.
security:
- apiKey: []
- oauth2:
- flows:read
/v1/work/in-progress:
get:
operationId: work.inProgress
summary: What is under way
tags:
- work
parameters:
- name: flowId
in: query
required: false
schema:
type: string
- name: assigneeId
in: query
required: false
schema:
type: string
- name: size
in: query
required: false
schema:
type: integer
default: 25
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
type: object
properties:
total:
type: integer
description: Total matching, not the length of `items`.
items:
type: array
items:
$ref: '#/components/schemas/WorkItem'
required:
- total
- items
'401':
description: UNAUTHORIZED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHORIZED
message: Human-readable explanation.
'403':
description: FORBIDDEN · PLAN_REQUIRED · INSUFFICIENT_SCOPE
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: FORBIDDEN
message: Human-readable explanation.
'429':
description: RATE_LIMITED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: Human-readable explanation.
security:
- apiKey: []
- oauth2:
- flows:read
/v1/work/overview:
get:
operationId: work.overview
summary: The whole workspace in one call
description: Per-flow counts, workload per member and the flows at risk of their due date — so a dashboard does not have to fetch twelve flows to render.
tags:
- work
responses:
'200':
description: SUCCESS
content:
application/json:
example:
flows:
- flowId: flw_2b8e10
flowName: 'Acme: Website relaunch'
completion: 0.43
ready: 2
blocked: 6
inProgress: 1
dueDate: '2026-09-14T00:00:00.000Z'
onTrack: true
workload:
- memberId: usr_41
name: Alex
openTasks: 5
hoursRemaining: 22
atRisk: []
'401':
description: UNAUTHORIZED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: UNAUTHORIZED
message: Human-readable explanation.
'403':
description: FORBIDDEN · PLAN_REQUIRED · INSUFFICIENT_SCOPE
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: FORBIDDEN
message: Human-readable explanation.
'429':
description: RATE_LIMITED
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error:
code: RATE_LIMITED
message: Human-readable explanation.
security:
- apiKey: []
- oauth2:
- flows:read
components:
schemas:
Error:
type: object
description: Every non-2xx response has this shape.
properties:
error:
type: object
properties:
code:
type: string
description: Stable, machine-readable. Switch on this, not on the message.
examples:
- NOT_FOUND
message:
type: string
description: Human-readable. May change; never parse it.
details:
type: object
additionalProperties: true
description: Present when the code alone is not actionable — which task blocked, which deliverable is missing, which limit was hit.
required:
- code
- message
required:
- error
WorkItem:
type: object
description: A task in the context of "what should be worked on", flattened so a caller does not have to hold the flow to make sense of it.
properties:
taskId:
type: string
taskName:
type: string
flowId:
type: string
flowName:
type: string
status:
type: string
enum:
- blocked
- ready
- in_progress
- done
assigneeId:
type:
- string
- 'null'
estimateHours:
type:
- number
- 'null'
criticalPath:
type: boolean
subtasks:
type: array
description: This objective's sub-tasks, if it has any. An objective with sub-tasks completes through them rather than directly — see the Task schema — so a client offering "start"/"complete" on this item should check here first.
items:
$ref: '#/components/schemas/SubTask'
blockedBy:
type: array
description: On blocked work, the unfinished tasks holding it up, most-blocking first.
items:
type: object
properties:
taskId:
type: string
taskName:
type: string
blocking:
type: integer
description: How many tasks this one is holding up.
required:
- taskId
- taskName
- flowId
- flowName
- status
- subtasks
SubTask:
type: object
properties:
id:
type: string
name:
type: string
done:
type: boolean
assigneeId:
type:
- string
- 'null'
description: Workspace member id.
estimateHours:
type:
- number
- 'null'
required:
- id
- name
- done
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'An API key from the app: `Authorization: Bearer fl_sk_live_…`.'
oauth2:
type: oauth2
description: Client credentials, for anything long-lived.
flows:
clientCredentials:
tokenUrl: https://api.flowral.app/v1/oauth/token
scopes:
flows:read: Read flows, tasks, schedules and reports
flows:write: Create and change flows and tasks
work:write: Start, complete, assign and comment on work
team:read: Read members and invitations
team:write: Invite people and change roles
templates:read: Read templates and start flows from them
notifications:read: Read what people are emailed about
notifications:write: Change what people are emailed about