API Documentation

Integrate your tools with FlowBoard using our REST API.

Quick Start

  1. Sign in to FlowBoard and go to Settings → Integrations
  2. Generate an API key with the permissions you need
  3. Include the key in every request as a Bearer token

Authentication

All API requests require a valid API key passed via the Authorization header:

Authorization: Bearer YOUR_API_KEY

Rate limit: 100 requests per minute per API key. Exceeding this returns HTTP 429.

Optional Headers

HeaderRequiredDescription
X-User-EmailNoYour email in the workspace. Enables mine=true filter and proper comment attribution.

Base URL

https://europe-west3-flowwboard.cloudfunctions.net

Endpoints

POST/submitTask

Permission: Submit Ideas or Submit Bugs

Request Body

{
  "title": "Task title (3-200 characters)",
  "description": "Task description (0-5000 characters)",
  "type": "idea" | "bug" | "feature" | "improvement" | "fix" | "chore",
  "projectId": "optional, required for feature/improvement/fix/chore",
  "tags": ["optional", "array", "of", "tags"],
  "metadata": { "custom": "data" }
}

Response (201 Created)

{
  "id": "task-id",
  "taskNumber": 123,
  "message": "Idea submitted successfully"
}

Example

curl -X POST https://europe-west3-flowwboard.cloudfunctions.net/submitTask \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Add dark mode support",
    "description": "Users want a dark mode option.",
    "type": "idea",
    "tags": ["ui", "feature-request"]
  }'
GET/getTasks

Permission: Search Tasks

Query Parameters

ParameterTypeDescription
boardstring"bugs", "ideas", or "flows"
projectIdstringFilter by project ID
projectNamestringFilter by project name (case-sensitive)
tagsstringComma-separated tags (AND logic)
statusstringopen, in_progress, blocked, ready, done, paused
statusesstringComma-separated statuses (OR logic)
assigneestringFilter by assignee user ID
minebooleanIf true, filter tasks assigned to the user identified by X-User-Email header
typestringfeature, improvement, fix, chore, bug
typesstringComma-separated types
limitnumberMax results (default: 100, max: 500)
excludeReleasedbooleanExclude released tasks (default: true)
excludeArchivedbooleanExclude archived tasks (default: true)
includeDeletedbooleanInclude deleted tasks (default: false)

Response (200 OK)

{
  "tasks": [
    {
      "id": "task-id",
      "taskNumber": "123",
      "title": "Task title",
      "status": "open",
      "type": "feature",
      "tags": ["client-acme"],
      "projectId": "proj123",
      "assignee": "user123",
      "createdAt": "2024-01-01T00:00:00.000Z"
    }
  ],
  "count": 1,
  "filters": { ... }
}
GET/getTask?taskId={taskId}

Permission: Search Tasks

Also accepts taskNumber as an alternative to taskId (e.g. /getTask?taskNumber=42)

Response (200 OK)

{
  "task": {
    "id": "task-id",
    "title": "Task title",
    "description": "Task description",
    "status": "open",
    "type": "feature",
    "tags": ["ui"],
    "taskNumber": "123"
  },
  "comments": [
    {
      "id": "comment-id",
      "text": "Comment text",
      "createdBy": "user123",
      "createdAt": "2024-01-01T00:00:00.000Z"
    }
  ]
}
PATCH/updateTask?taskId={taskId}

Permission: Update Tasks

Also accepts taskNumber as an alternative to taskId. Include X-User-Email header for proper comment attribution.

Request Body (all optional, at least one required)

{
  "status": "open" | "in_progress" | "blocked" | "ready" | "done" | "paused",
  "comment": "Add a comment (1-5000 characters)",
  "assignee": "userId or empty string to clear",
  "branchName": "feature/my-branch (0-200 characters)",
  "externalReference": {
    "type": "github_pr",
    "url": "https://github.com/...",
    "id": "optional",
    "title": "optional"
  }
}

Response (200 OK)

{
  "success": true,
  "taskId": "task-id",
  "message": "Task updated successfully"
}
DELETE/deleteTask?taskId={taskId}

Permission: Update Tasks

Also accepts taskNumber as an alternative to taskId

Soft-deletes a task. The task can be restored from the Trash.

GET/listProjects

Permission: View Projects

Returns all projects in the workspace with their IDs, names, and descriptions.

GET/getComments?taskId={taskId}

Permission: Manage Comments

Also accepts taskNumber as an alternative to taskId

Returns all comments for a given task, ordered by creation date.

POST/addComment?taskId={taskId}

Permission: Manage Comments

Also accepts taskNumber as an alternative to taskId. Include X-User-Email header for proper comment attribution.

Request Body

{
  "taskId": "task-id",
  "text": "Comment text (1-5000 characters)"
}
GET/listReleases

Permission: Search Tasks

Returns all releases in the workspace with version, date, and included tasks.

GET/getRelease?releaseId={releaseId}

Permission: Search Tasks

Returns a single release with full details including all associated tasks.

GET/getReleaseDraft

Permission: Manage Releases

Returns the current release draft state: tasks staged for release and hotfix, version string, and deploy notes.

Response

{
  "draft": {
    "version": "2.1.0",
    "releaseItems": [{ "id": "...", "title": "...", "status": "done", "type": "feature", "taskNumber": 42 }],
    "hotfixItems": [],
    "deployNotes": "",
    "updatedAt": "2026-04-14T10:00:00.000Z"
  }
}
PATCH/updateReleaseDraft

Permission: Manage Releases

Add or remove tasks from the release/hotfix draft, or set version/deploy notes.

Request Body

FieldTypeDescription
actionstringRequired. One of: add, remove, set_version, set_deploy_notes
liststring"release" (default) or "hotfix"
taskIdsstringComma-separated task IDs (for add/remove)
taskNumbersstringComma-separated task numbers (alternative to taskIds)
versionstringVersion string (for set_version)
deployNotesstringDeploy notes HTML (for set_deploy_notes)
POST/confirmRelease

Permission: Manage Releases

Confirm and publish a release from the current draft. Creates the release document, archives all included tasks, and clears the draft.

Request Body

FieldTypeDescription
versionstringRelease version (overrides draft version)
namestringRelease name (defaults to "Release {version}")
liststring"release" (default) or "hotfix"
isPublicbooleanMake release publicly visible
environmentsstring[]Environment tags (e.g. ["Staging", "Production"])

Response

{
  "success": true,
  "releaseId": "abc123",
  "name": "Release 2.1.0",
  "version": "2.1.0",
  "taskCount": 5,
  "isHotfix": false,
  "message": "Release \"Release 2.1.0\" confirmed with 5 task(s)."
}
POST/voteIdea?taskId={taskId}

Permission: Submit Ideas

Also accepts taskNumber as an alternative to taskId

Request Body

{
  "ideaId": "idea-id"
}

MCP Server (AI Tools)

Connect AI tools like Claude Code, Cursor, and Windsurf to FlowBoard via our MCP server. Add this to your tool's MCP configuration:

macOS / Linux:

{
  "mcpServers": {
    "flowboard": {
      "command": "npx",
      "args": ["-y", "@flowboardlabs/mcp-server"],
      "env": {
        "FLOWBOARD_API_KEY": "YOUR_API_KEY",
        "FLOWBOARD_USER_EMAIL": "you@example.com"
      }
    }
  }
}

Windows:

{
  "mcpServers": {
    "flowboard": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@flowboardlabs/mcp-server"],
      "env": {
        "FLOWBOARD_API_KEY": "YOUR_API_KEY",
        "FLOWBOARD_USER_EMAIL": "you@example.com"
      }
    }
  }
}

FLOWBOARD_USER_EMAIL is optional but recommended — it enables "list my tasks" and attributes comments to your account.

Error Codes

CodeDescription
400Bad Request — Missing or invalid parameters
401Unauthorized — Missing or invalid API key
403Forbidden — API key lacks the required permission
404Not Found — Task or resource not found
429Too Many Requests — Rate limit exceeded (100 req/min)
500Internal Server Error

Need Help?

Check out the MCP Server guide for AI tool integration, or the GitHub/GitLab integration guide for webhook setup. For questions, contact support@flowboard.dev.