Boards & Tasks
Read and edit Optiverse task boards, columns, labels, and tasks.
These operations work on the same boards you see under Tasks in the app. Reads count toward the read limit (120 per minute) and writes toward the write limit (60 per minute). Each operation is also an MCP tool with the name shown in brackets.
Boards and tasks cannot be deleted through the API or MCP. Delete them in the app.
Names or IDs
Write operations accept either an ID or a name for columns and labels: sectionId or sectionName, labelId or labelName, and labelNames on tasks. Names are matched case-insensitively. If a name matches more than one column or label, the request fails with 409 conflict and the error message lists the candidates; retry with the ID.
Errors
| Code | Status | When |
|---|---|---|
not_found | 404 | The board, column, label, or task does not exist or you cannot access it. |
forbidden | 403 | You can see the board but not change it, for example renaming a board you don't own. |
conflict | 409 | A name matches more than one item. |
invalid_request | 400 | A field is missing or invalid, or the change is not allowed, for example deleting the Inbox or Done column. |
List Boards
GET /v2/boards (list_boards)
Your boards with their columns and open-task counts. Call it first to find the boardId the other operations need.
{
"data": {
"boards": [
{
"boardId": "b5d0...",
"title": "Launch",
"boardType": "project",
"color": "#3B82F6",
"openTaskCount": 7,
"sections": [{ "sectionId": "s1...", "name": "To Do" }]
}
]
}
}Create a Board
POST /v2/boards (create_board)
Creates a project board with the default Inbox, To Do, In Progress, and Done columns. Returns 201 with the board and its sections.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Board title |
color | string | No | Hex color, for example #3B82F6 |
description | string | No | Board description |
Get a Board
GET /v2/boards/{boardId} (get_board)
One board with its columns (sections), labels, and tasks.
| Parameter | Type | Default | Description |
|---|---|---|---|
includeCompleted | boolean | false | Include completed tasks and tasks in the Done column |
taskLimit | integer | 80 | Maximum tasks, 1 to 200 |
Each task has taskId, title, sectionId, priority, dueDate, labelIds, completedAt, and subtaskCount.
Update a Board
PATCH /v2/boards/{boardId} (update_board)
Renames a board or changes its color or description. Only the board owner can do this.
| Field | Type | Description |
|---|---|---|
title | string | New title |
color | string | New hex color |
description | string | New description |
Search Tasks
GET /v2/tasks/search (search_tasks)
Searches tasks across all your boards, or one board with boardId.
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | Text in the title or description | |
boardId | string | Only this board | |
priority | integer[] | Only these priorities, 1 (urgent) to 4 (low) | |
sectionName | string | Only tasks in a column with this name | |
labelNames | string[] | Only tasks with these labels | |
dueBefore, dueAfter | date or timestamp | Inclusive due date range. A date includes the whole day. | |
includeCompleted | boolean | false | Include completed tasks |
limit | integer | 30 | 1 to 100 |
curl "https://developer.optiverse.ai/api/v2/tasks/search?priority=1,2&dueBefore=2026-10-31" \
-H "Authorization: Bearer optiuser_v1_your_key_here"Date-only bounds use calendar days, including tasks with a due time on that day. Timestamp bounds accept a timezone and compare UTC instants; board due times without a timezone are interpreted as UTC. Tasks with only a due date overlap that full UTC day.
Manage Columns
POST /v2/boards/{boardId}/sections (manage_board_section)
Creates, updates, deletes, or reorders columns. Deleting a column moves its tasks to Inbox. Inbox and Done cannot be deleted.
| Field | Type | Description |
|---|---|---|
action | create, update, delete, or reorder | Required |
sectionId or sectionName | string | The column to update or delete |
name | string | New column name (create, update) |
color | string | Column hex color (create, update) |
order | number | Position index (create, update) |
orders | array | Every column with its new position, as [{ "sectionId": "...", "order": 0 }] (reorder) |
{ "action": "create", "name": "Review", "order": 2 }Manage Labels
POST /v2/boards/{boardId}/labels (manage_board_label)
| Field | Type | Description |
|---|---|---|
action | create, update, or delete | Required |
labelId or labelName | string | The label to update or delete |
name | string | New label name (create, update) |
color | string | Label hex color (create, update) |
Create a Task
POST /v2/boards/{boardId}/tasks (create_task)
Creates one task. Returns 201 with the task. For three or more tasks, use Create tasks in bulk.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Task title |
description | string | No | Plain text or Markdown |
sectionId or sectionName | string | No | Column. Defaults to Inbox. |
priority | integer | No | 1 urgent, 2 high, 3 medium, 4 low |
labelNames | string[] | No | Labels on this board |
dueDate | string | No | YYYY-MM-DD or YYYY-MM-DDThh:mm |
subtasks | array | No | [{ "title": "...", "completed": false }] |
transcriptId | string | No | Meeting record ID when the task comes from a meeting action item |
position | "top", "bottom", or { "after": taskId } | No | Where to place the task in its column |
curl -X POST "https://developer.optiverse.ai/api/v2/boards/b5d0.../tasks" \
-H "Authorization: Bearer optiuser_v1_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "title": "Send renewal contract to Mario", "sectionName": "To Do", "priority": 2, "dueDate": "2026-10-20" }'Update a Task
PATCH /v2/boards/{boardId}/tasks/{taskId} (update_task)
Updates one task and optionally moves it to another column. Send only the fields you want to change.
completed: truemarks the task done and moves it to Done;falsereopens it.labelNamesandsubtasksreplace the existing lists.dueDate: nullclears the due date.sectionIdorsectionNamemoves the task;positionplaces it within the column.
Create Tasks in Bulk
POST /v2/boards/{boardId}/tasks/batch (batch_create_tasks)
Creates up to 40 tasks on one board, for example a meeting's action items. Each item in tasks takes the same fields as Create a task.
All columns, labels, and due dates are checked before the first write. The response includes tasks, status (completed or partial), and remainingTaskIndexes (zero-based indexes of unattempted items). A completed batch has an empty remaining list.
If persistence fails after work starts, the response contains a partial receipt instead of hiding created tasks. Its failure has taskIndex, code, message, and retryable: false. When the outcome of the failed item is uncertain, uncertainTaskId identifies the task to look for before attempting that item again. The failed index is separate from the unattempted indexes. Do not replay the entire batch: keep the returned tasks and inspect the failed item before submitting only the remaining work. Each task is saved atomically, but the entire batch is not one transaction. If the first task is rejected, nothing was saved and the request fails with the usual error, for example 403 forbidden when you can view the board but not edit it.
{
"tasks": [
{ "title": "Send renewal contract", "sectionName": "To Do", "transcriptId": "8f0c..." },
{ "title": "Book follow-up call", "priority": 3 }
]
}Move Tasks
POST /v2/boards/{boardId}/tasks/move (move_tasks)
Moves up to 50 tasks on one board to the same column.
| Field | Type | Required | Description |
|---|---|---|---|
taskIds | string[] | Yes | Tasks to move |
sectionId or sectionName | string | Yes | Target column |
position | "top", "bottom", or { "after": taskId } | No | Where to place the tasks |

