Projects
A project is a piece of work that people, contractors, vacancies and teams are allocated to. Use these endpoints to keep projects in step with another system; allocate capacity to them with Assignments.
All paths are under https://{tenant}.flowstate.inc/api/v1.
| Method | Path | Permission |
|---|---|---|
GET | /org/:orgId/projects | View Projects (roadmap_projects_view) |
GET | /org/:orgId/projects/:id | View Projects (roadmap_projects_view) |
POST | /org/:orgId/projects | Create Projects (roadmap_projects_create) |
PATCH | /org/:orgId/projects/:id | Update Projects (roadmap_projects_update) |
DELETE | /org/:orgId/projects/:id | Delete Projects (roadmap_projects_delete) |
:id accepts a Flowstate id or your externalId. A value that looks like a Flowstate id (24 or 25 lowercase letters and digits, starting with a letter) is looked up as an id; anything else as an externalId.
The project object
| Field | Type | Description |
|---|---|---|
id | string | Flowstate id. Read-only. |
externalId | string | null | Your identifier. Unique per organisation. |
name | string | Project name. |
projectCode | string | null | Short code used in reporting, e.g. "BILL-V2". |
description | string | null | What the project delivers. |
status | string | Delivery status: BACKLOG, TODO, IN_PROGRESS, IN_REVIEW, DONE or CANCELLED. Read-only over REST. Set by the linked project-tool tickets, or in the app when there are none. |
priority | integer | Lower is higher priority. |
startDate | string | ISO 8601 date-time, e.g. "2026-01-15T00:00:00.000Z". |
endDate | string | null | ISO 8601 date-time. null = no fixed end. |
ownerUserId | string | null | The Flowstate user who owns the project. |
valueStreamId | string | null | The value stream the project belongs to. |
costCentreId | string | null | The project’s cost centre. Read-only over REST. |
initiativeId | string | null | The initiative the project belongs to. Read-only over REST. |
estimatedCost | string | null | Estimated total cost as a decimal string, up to 2 decimal places, e.g. "450000". |
icon | string | null | Icon name shown in the app. |
iconColor | string | Icon colour as hex. |
createdAt | string | ISO 8601. Read-only. |
updatedAt | string | ISO 8601. Read-only. |
customAttributes | array | Custom attribute values. GET /projects/:id only. |
Responses can carry further fields that aren’t listed here. Don’t depend on them.
List projects
GET /org/:orgId/projects
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | 1-based. |
limit | integer | 20 | 1–100. |
search | string | — | Case-insensitive match on name, description or projectCode. |
sortBy | string | name | name, startDate, priority or projectCode. Any other value sorts by name. |
sortDir | string | asc | asc or desc. |
curl "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/projects?sortBy=startDate&sortDir=desc&limit=10" \
-H "Authorization: Bearer private_..."
{
"data": [
{
"id": "clx7p8r9q0s1t2u3v4w5x6y7z",
"externalId": "JIRA-BILL",
"name": "Billing V2",
"projectCode": "BILL-V2",
"description": "Usage-based pricing for the billing system.",
"status": "IN_PROGRESS",
"priority": 1,
"startDate": "2026-01-15T00:00:00.000Z",
"endDate": "2026-09-30T00:00:00.000Z",
"ownerUserId": "clx9u1s2e3r4t5y6u7i8o9p0a",
"valueStreamId": null,
"costCentreId": "clx3c4c5e6n7t8r9e0a1b2c3d",
"initiativeId": null,
"estimatedCost": "450000",
"icon": null,
"iconColor": "#6B7280",
"createdAt": "2025-11-01T09:00:00.000Z",
"updatedAt": "2026-02-15T16:30:00.000Z"
}
],
"meta": { "page": 1, "limit": 10, "total": 1, "hasNextPage": false }
}
Retrieve a project
GET /org/:orgId/projects/:id
Returns the project object with customAttributes.
curl "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/projects/JIRA-BILL" \
-H "Authorization: Bearer private_..."
Create a project
POST /org/:orgId/projects
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | At least 1 character. |
startDate | string | Yes | YYYY-MM-DD or ISO 8601. |
endDate | string | null | No | YYYY-MM-DD or ISO 8601. |
externalId | string | null | No | Up to 255 characters. Can’t look like a Flowstate id. |
projectCode | string | null | No | |
description | string | null | No | |
ownerUserId | string | null | No | A Flowstate user id. |
valueStreamId | string | null | No | A value stream id. |
estimatedCost | number | null | No | Zero or more. |
icon | string | null | No | |
iconColor | string | No | Default "#6B7280". |
priority | integer | No | Default 0. |
Unknown fields are ignored.
curl -X POST "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/projects" \
-H "Authorization: Bearer private_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Mobile App Redesign",
"externalId": "JIRA-MOB",
"projectCode": "MOB-RD",
"startDate": "2026-04-01",
"endDate": "2026-12-31",
"estimatedCost": 320000,
"priority": 2
}'
201 Created with the project object. A new project starts in BACKLOG.
Update a project
PATCH /org/:orgId/projects/:id
Takes the same fields as create, all optional. Send only what changes; send null to clear a nullable field.
curl -X PATCH "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/projects/JIRA-MOB" \
-H "Authorization: Bearer private_..." \
-H "Content-Type: application/json" \
-d '{ "endDate": "2027-02-26", "priority": 1 }'
200 OK with the updated project.
Delete a project
DELETE /org/:orgId/projects/:id
Deletes the project, every allocation to it and the effort recorded against it. This can’t be undone.
{ "data": { "id": "clx7p8r9q0s1t2u3v4w5x6y7z", "deleted": true } }
Errors
| Status | code | When |
|---|---|---|
400 | VALIDATION_ERROR | A field is missing or invalid (details[].field names it), or the externalId is already used by another project. |
403 | FORBIDDEN | The key lacks the permission in the table above. |
404 | NOT_FOUND | No project with that id or externalId, e.g. "Project not found: JIRA-MOB". |
501 | NOT_IMPLEMENTED | A create, update or delete sent with scenarioId. See Scenarios. |
scenarioId on a read is validated but returns live data. See Errors for the error body.
Webhooks
Creates, updates and deletes made here send project events. See Webhooks.
Related
- Assignments: allocate people and teams to a project.
- Custom attributes: your own fields on projects.