Workflow (Task Management) API Task lists, tasks, worklogs, interjections, approvals, and todos.
All workflow endpoints (except toggle) require the workflow feature to be enabled on the target workspace or share. Workflow GET endpoints support format=md query parameter for Markdown output (AI agent-friendly).
Share access: On shares, only approvals are accessible to guests. Guests see only approvals assigned to them (where approver_id matches their user ID) and can resolve those approvals. Tasks, todos, and worklogs require member or admin access — guests are blocked. Public guests remain blocked from everything. Toggle endpoints (enable/disable) remain Admin-only.
Endpoint Summary
Feature Toggle
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/workspace/{workspace_id}/workflow/enable/ | Enable workflow on a workspace |
| POST | /current/workspace/{workspace_id}/workflow/disable/ | Disable workflow on a workspace |
| POST | /current/share/{share_id}/workflow/enable/ | Enable workflow on a share |
| POST | /current/share/{share_id}/workflow/disable/ | Disable workflow on a share |
Task Lists & Tasks
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/tasks/ | List task lists in a workspace |
| GET | /current/share/{share_id}/tasks/ | List task lists in a share |
| POST | /current/workspace/{workspace_id}/tasks/create/ | Create a task list in a workspace |
| POST | /current/share/{share_id}/tasks/create/ | Create a task list in a share |
| GET | /current/tasks/{list_id}/details/ | Get task list details (includes tasks) |
| POST | /current/tasks/{list_id}/update/ | Update a task list |
| POST | /current/tasks/{list_id}/delete/ | Soft-delete a task list |
| GET | /current/tasks/{list_id}/items/ | List tasks in a task list |
| POST | /current/tasks/{list_id}/items/create/ | Create a task |
| GET | /current/tasks/{list_id}/items/{task_id}/ | Get task details |
| POST | /current/tasks/{list_id}/items/{task_id}/update/ | Update a task |
| POST | /current/tasks/{list_id}/items/{task_id}/delete/ | Soft-delete a task |
| POST | /current/tasks/{list_id}/items/{task_id}/status/ | Change task status |
| POST | /current/tasks/{list_id}/items/{task_id}/assign/ | Assign/unassign a task |
| POST | /current/tasks/{list_id}/items/{task_id}/move/ | Move task to another list |
| POST | /current/tasks/{list_id}/items/bulk-status/ | Bulk update task statuses |
| POST | /current/tasks/{list_id}/items/reorder/ | Bulk reorder tasks in a task list |
| POST | /current/workspace/{workspace_id}/tasks/reorder/ | Bulk reorder task lists in a workspace |
| POST | /current/share/{share_id}/tasks/reorder/ | Bulk reorder task lists in a share |
| GET | /current/workspace/{workspace_id}/tasks/list/{filter}/ | Filtered task list for workspace (personal view) |
| GET | /current/share/{share_id}/tasks/list/{filter}/ | Filtered task list for share (group view, members/admins only) |
| GET | /current/workspace/{workspace_id}/tasks/summary/ | Task count summary for workspace |
| GET | /current/share/{share_id}/tasks/summary/ | Task count summary for share (members/admins only) |
Worklogs
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/worklogs/{entity_type}/{entity_id}/ | List worklog entries |
| POST | /current/worklogs/{entity_type}/{entity_id}/append/ | Append a worklog entry |
| POST | /current/worklogs/{entity_type}/{entity_id}/interjection/ | Create an interjection |
| GET | /current/worklogs/{entity_type}/{entity_id}/interjections/ | List unacknowledged interjections |
| GET | /current/worklogs/{entry_id}/details/ | Get entry details |
| POST | /current/worklogs/{entry_id}/acknowledge/ | Acknowledge an interjection |
| GET | /current/workspace/{workspace_id}/worklogs/ | List all worklog entries in a workspace |
| GET | /current/share/{share_id}/worklogs/ | List all worklog entries in a share (members/admins only) |
| GET | /current/workspace/{workspace_id}/worklogs/list/{filter}/ | Filtered worklog list for workspace (personal view) |
| GET | /current/share/{share_id}/worklogs/list/{filter}/ | Filtered worklog list for share (group view, members/admins only) |
| GET | /current/workspace/{workspace_id}/worklogs/summary/ | Worklog entry summary for workspace |
| GET | /current/share/{share_id}/worklogs/summary/ | Worklog entry summary for share (members/admins only) |
Approvals
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/approvals/ | List approvals in a workspace |
| GET | /current/share/{share_id}/approvals/ | List approvals in a share |
| POST | /current/workspace/{workspace_id}/approvals/create/ | Create an approval in a workspace |
| POST | /current/share/{share_id}/approvals/create/ | Create an approval in a share |
| GET | /current/workspace/{workspace_id}/approvals/{approval_id}/details/ | Get approval details (workspace) |
| GET | /current/share/{share_id}/approvals/{approval_id}/details/ | Get approval details (share) |
| POST | /current/workspace/{workspace_id}/approvals/{approval_id}/resolve/ | Resolve an approval (workspace) |
| POST | /current/share/{share_id}/approvals/{approval_id}/resolve/ | Resolve an approval (share) |
| POST | /current/workspace/{workspace_id}/approvals/{approval_id}/update/ | Update a pending approval (workspace) |
| POST | /current/share/{share_id}/approvals/{approval_id}/update/ | Update a pending approval (share) |
| POST | /current/workspace/{workspace_id}/approvals/{approval_id}/delete/ | Delete an approval (workspace) |
| POST | /current/share/{share_id}/approvals/{approval_id}/delete/ | Delete an approval (share) |
| POST | /current/share/{share_id}/approvals/bulk/{action}/ | Bulk create, approve, reject, or delete approvals in a share |
| GET | /current/user/approvals/list/{filter}/ | List approvals for the authenticated user by filter |
| GET | /current/workspace/{workspace_id}/approvals/list/{filter}/ | Filtered approval list for workspace (personal view) |
| GET | /current/share/{share_id}/approvals/list/{filter}/ | Filtered approval list for share (group view for owners, scoped to assigned for guests) |
| GET | /current/workspace/{workspace_id}/approvals/list/summary/ | Approval count summary for workspace |
| GET | /current/share/{share_id}/approvals/list/summary/ | Approval count summary for share (owners see all + assigned_to_me, guests see assigned_to_me only) |
Todos
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/todos/ | List todos in a workspace |
| GET | /current/share/{share_id}/todos/ | List todos in a share |
| POST | /current/workspace/{workspace_id}/todos/create/ | Create a todo in a workspace |
| POST | /current/share/{share_id}/todos/create/ | Create a todo in a share |
| GET | /current/todos/{todo_id}/details/ | Get todo details |
| POST | /current/todos/{todo_id}/details/update/ | Update a todo |
| POST | /current/todos/{todo_id}/details/delete/ | Soft-delete a todo |
| POST | /current/todos/{todo_id}/details/toggle/ | Toggle todo done state |
| POST | /current/workspace/{workspace_id}/todos/bulk-toggle/ | Bulk toggle todos in a workspace |
| POST | /current/share/{share_id}/todos/bulk-toggle/ | Bulk toggle todos in a share |
| GET | /current/workspace/{workspace_id}/todos/list/{filter}/ | Filtered todo list for workspace (personal view) |
| GET | /current/share/{share_id}/todos/list/{filter}/ | Filtered todo list for share (group view, members/admins only) |
| GET | /current/workspace/{workspace_id}/todos/summary/ | Todo count summary for workspace |
| GET | /current/share/{share_id}/todos/summary/ | Todo count summary for share (members/admins only) |
Common Path Parameters
| Parameter | Type | Format | Description |
|---|---|---|---|
| {workspace_id} | string | 19-digit numeric | Workspace profile ID |
| {share_id} | string | 19-digit numeric | Share profile ID |
| {list_id} | string | 30-char alphanumeric | Task list ID |
| {task_id} | string | 30-char alphanumeric | Task ID |
| {entry_id} | string | 30-char alphanumeric | Worklog entry ID |
| {approval_id} | string | 30-char alphanumeric | Approval ID |
| {todo_id} | string | 30-char alphanumeric | Todo ID |
| {entity_type} | string | See per-section enums | Entity type discriminator |
| {entity_id} | string | Varies by entity type | Entity identifier |
| {filter} | string | pending, created, resolved | User approvals filter |
Common Error Responses
These errors apply to all workflow endpoints (except toggle):
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1650 (Authentication Invalid) | 401 | Authentication required | Missing or invalid JWT token |
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow feature not enabled on entity |
1680 (Access Denied) | 403 | Insufficient permissions | User lacks required access level |
1651 (Invalid Request Type) | 400 | Invalid request | Wrong HTTP method |
1671 (Rate Limited) | 429 | Rate limit exceeded | Too many requests |
Share Workflow Access Levels
On shares, only approvals are accessible to guests. Guests see only approvals assigned to them (where approver_id matches their user ID). Tasks, todos, and worklogs require member or admin access. Update, delete, and bulk delete require member or admin permissions — guests are blocked.
| Role | Approvals | Tasks / Todos / Worklogs | Toggle (Enable/Disable) |
|---|---|---|---|
| Owner / Admin | Full access (list, create, update, delete, resolve, bulk) | Full access | Allowed |
| Member | Full access (list, create, update, delete, resolve, bulk) | Full access | Denied |
| Guest | View & resolve assigned only (no update/delete) | Denied | Denied |
| Public Guest | Denied | Denied | Denied |
Feature Toggle
Enable or disable workflow on a workspace or share. Requires admin-level access. These endpoints do not require workflow to already be enabled.
Enable Workflow on Workspace
/current/workspace/{workspace_id}/workflow/enable/
Enable workflow features on a workspace.
Auth: Required (JWT). Admin or owner.
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/workflow/enable/" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"message": "Workflow features enabled",
"workflow": true
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.message | string | Confirmation message |
| response.workflow | bool | true = enabled, false = disabled |
Access Levels
| Role | Access |
|---|---|
| Owner / Admin | Can enable/disable |
| Member / Guest | Denied |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1650 (Authentication Invalid) | 401 | Authentication required | Missing or invalid token |
1609 (Not Found) | 404 | Workspace not found | Workspace does not exist |
1680 (Access Denied) | 403 | Insufficient permissions | User is not owner or admin |
1605 (Invalid Input) | 400 | Workflow is already enabled | Already enabled |
1654 (Internal Error) | 500 | Failed to enable workflow | Internal error |
Disable Workflow on Workspace
/current/workspace/{workspace_id}/workflow/disable/
Disable workflow on a workspace. Existing data is preserved but inaccessible until re-enabled.
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/workflow/disable/" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"message": "Workflow features disabled",
"workflow": false
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1650 (Authentication Invalid) | 401 | Authentication required | Missing or invalid token |
1609 (Not Found) | 404 | Workspace not found | Workspace does not exist |
1680 (Access Denied) | 403 | Insufficient permissions | User is not owner or admin |
1605 (Invalid Input) | 400 | Workflow is already disabled | Already disabled |
1654 (Internal Error) | 500 | Failed to disable workflow | Internal error |
Share Toggle Endpoints
/current/share/{share_id}/workflow/enable/
/current/share/{share_id}/workflow/disable/
Behave identically to the workspace variants above, using {share_id} instead. Requires Admin-level access on the share.
Disabling workflow does not delete any data. All entities are preserved and become accessible again when re-enabled.
Task Lists & Tasks
Task lists are containers for tasks, scoped to a workspace or share. Tasks support statuses, priorities, assignees, dependencies, and file/folder node links.
Task Status Values
| Value | Description |
|---|---|
pending | Not started |
in_progress | Actively being worked on |
complete | Finished |
blocked | Blocked by a dependency or issue |
Valid Status Transitions
| From | Allowed Transitions |
|---|---|
pending | in_progress, blocked |
in_progress | complete, blocked, pending |
complete | pending, in_progress |
blocked | pending, in_progress |
Task Priority (integer)
| Value | Meaning |
|---|---|
0 | None (default) |
1 | Low |
2 | Medium |
3 | High |
4 | Critical |
Task List Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| profile_id | string | Workspace or share profile ID (19-digit numeric) |
| name | string | Task list name |
| description | string|null | Task list description |
| created_by | string | User profile ID of the creator |
| properties | object | Metadata properties (JSON) |
| sort_order | int | Display sort order |
| created | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| updated | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| deleted | string|null | Deletion timestamp (YYYY-MM-DD HH:MM:SS), or null |
Task Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| task_list_id | string | Parent task list ID |
| profile_id | string | Workspace or share profile ID (19-digit numeric) |
| created_by | string | User profile ID of the task creator |
| title | string | Task title |
| description | string|null | Task description |
| status | string | pending, in_progress, complete, blocked |
| assignee_id | string|null | Assigned user's profile ID, or null |
| priority | int | 0 (none) through 4 (critical) |
| sort_order | int | Display sort order |
| dependencies | array<string>|null | Task IDs this task depends on |
| node_id | string|null | Associated file/folder node ID |
| properties | object | Metadata properties (JSON) |
| created | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| updated | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| deleted | string|null | Deletion timestamp (YYYY-MM-DD HH:MM:SS), or null |
List Task Lists
/current/workspace/{workspace_id}/tasks/
/current/share/{share_id}/tasks/
List all task lists in a workspace or share.
Backwards compatibility: The previous routes (/current/tasks/workspace/{workspace_id}/ and /current/tasks/share/{share_id}/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 200 | Number of task lists to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| format | string | No | — | md | Markdown output |
Request Example
curl -X GET "https://api.fast.io/current/workspace/1234567890123456789/tasks/?limit=50" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"task_lists": [
{
"id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
"profile_id": "1234567890123456789",
"name": "Sprint 12 Tasks",
"description": "Tasks for the current sprint",
"created_by": "9876543210987654321",
"properties": {},
"sort_order": 0,
"created": "2025-06-01T09:00:00+00:00",
"updated": "2025-06-10T14:30:00+00:00",
"deleted": null
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Create Task List
/current/workspace/{workspace_id}/tasks/create/
/current/share/{share_id}/tasks/create/
Create a new task list.
Backwards compatibility: The previous routes (/current/tasks/workspace/{workspace_id}/create/ and /current/tasks/share/{share_id}/create/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| name | string | Yes | 1-255 characters | Task list name |
| description | string | No | Max 65535 characters | Task list description |
| properties | object | No | — | Metadata properties |
| sort_order | int | No | Default 0 | Display sort order |
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/tasks/create/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "name=Sprint%2012%20Tasks&description=Tasks%20for%20the%20current%20sprint"
Response
{
"result": "yes",
"response": {
"task_list": {
"id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
"profile_id": "1234567890123456789",
"name": "Sprint 12 Tasks",
"description": "Tasks for the current sprint",
"created_by": "9876543210987654321",
"properties": {},
"sort_order": 0,
"created": "2025-06-01T09:00:00+00:00",
"updated": "2025-06-01T09:00:00+00:00",
"deleted": null
}
},
"current_api_version": "1.0"
}
Get Task List Details
/current/tasks/{list_id}/details/
Get task list details including all tasks in the list.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| format | string | No | — | md for Markdown output |
Response
{
"result": "yes",
"response": {
"task_list": {
"id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
"profile_id": "1234567890123456789",
"name": "Sprint 12 Tasks",
"description": "Tasks for the current sprint",
"created_by": "9876543210987654321",
"properties": {},
"sort_order": 0,
"created": "2025-06-01T09:00:00+00:00",
"updated": "2025-06-10T14:30:00+00:00",
"deleted": null
},
"tasks": [
{
"id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"task_list_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
"profile_id": "1234567890123456789",
"title": "Implement login flow",
"description": "Build the OAuth2 login flow",
"status": "in_progress",
"assignee_id": "9876543210987654321",
"priority": 3,
"sort_order": 0,
"dependencies": null,
"node_id": null,
"properties": {},
"created": "2025-06-01T09:30:00+00:00",
"updated": "2025-06-10T14:30:00+00:00",
"deleted": null
}
]
},
"current_api_version": "1.0"
}
Update Task List
/current/tasks/{list_id}/update/
Update a task list. Only provided fields are changed.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| name | string | No | 1-255 characters | Updated name |
| description | string|null | No | Max 65535 chars; null to clear | Updated description |
| properties | object | No | — | Updated properties |
| sort_order | int | No | — | Updated sort order |
Delete Task List
/current/tasks/{list_id}/delete/
Soft-delete a task list.
Auth: Required (JWT). Rate limited.
List Tasks
/current/tasks/{list_id}/items/
List all tasks in a task list.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 200 | Number of tasks to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| format | string | No | — | md | Markdown output |
Create Task
/current/tasks/{list_id}/items/create/
Create a new task in a task list.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| title | string | Yes | 1-512 characters | Task title |
| description | string | No | Max 65535 characters | Task description |
| priority | int | No | 0-4 (default 0) | Priority: 0=none, 1=low, 2=medium, 3=high, 4=critical |
| assignee_id | string | No | 19-digit numeric profile ID | User to assign |
| node_id | string | No | Alphanumeric opaque ID | File/folder node to link |
| dependencies | array<string> | No | Array of task IDs | Tasks this task depends on |
| properties | object | No | — | Metadata properties |
| sort_order | int | No | Default 0 | Display sort order |
Request Example
curl -X POST "https://api.fast.io/current/tasks/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5/items/create/" \
-H "Authorization: Bearer {jwt_token}" \
-d "title=Implement%20login%20flow&priority=3&assignee_id=9876543210987654321"
Response
{
"result": "yes",
"response": {
"task": {
"id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"task_list_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
"profile_id": "1234567890123456789",
"title": "Implement login flow",
"description": null,
"status": "pending",
"assignee_id": "9876543210987654321",
"priority": 3,
"sort_order": 0,
"dependencies": null,
"node_id": null,
"properties": {},
"created": "2025-06-01T09:30:00+00:00",
"updated": "2025-06-01T09:30:00+00:00",
"deleted": null
}
},
"current_api_version": "1.0"
}
Get Task Details
/current/tasks/{list_id}/items/{task_id}/
Get full details of a single task.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| format | string | No | — | md for Markdown output |
Update Task
/current/tasks/{list_id}/items/{task_id}/update/
Update a task. Only provided fields are changed.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| title | string | No | 1-512 characters | Updated title |
| description | string|null | No | Max 65535 chars; null to clear | Updated description |
| priority | int | No | 0-4 | Updated priority |
| assignee_id | string|null | No | 19-digit numeric; null to unassign | Updated assignee |
| node_id | string|null | No | Opaque ID; null to clear | Updated node link |
| dependencies | array<string> | No | Array of task IDs | Updated dependencies |
| properties | object | No | — | Updated properties |
| sort_order | int | No | — | Updated sort order |
Delete Task
/current/tasks/{list_id}/items/{task_id}/delete/
Soft-delete a task.
Auth: Required (JWT). Rate limited.
Change Task Status
/current/tasks/{list_id}/items/{task_id}/status/
Change a task's status. Enforces valid transitions.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| status | string | Yes | pending, in_progress, complete, blocked | New status |
Request Example
curl -X POST "https://api.fast.io/current/tasks/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5/items/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/status/" \
-H "Authorization: Bearer {jwt_token}" \
-d "status=in_progress"
Response
{
"result": "yes",
"response": {
"task": {
"id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"status": "in_progress",
"...": "..."
},
"old_status": "pending",
"new_status": "in_progress"
},
"current_api_version": "1.0"
}
Assign Task
/current/tasks/{list_id}/items/{task_id}/assign/
Assign or unassign a task.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| assignee_id | string|null | Yes | 19-digit numeric profile ID, or null | User to assign, or null to unassign |
The
assignee_idcan refer to a pending member (an invited user who has not yet signed up). Pending members have a valid user ID and can be assigned to tasks before they create their account. When the user claims their account, the assignment is preserved.
Move Task
/current/tasks/{list_id}/items/{task_id}/move/
Move a task from one task list to another within the same profile.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| target_task_list_id | string | Yes | 30-char opaque ID | Destination task list ID |
| sort_order | int | No | Default 0 | Sort order in the target list |
Constraints: Target list must exist, not be deleted, and belong to the same profile. Source and target list cannot be the same.
Example
curl -X POST "https://api.fast.io/current/tasks/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5/items/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/move/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"target_task_list_id": "p1q2r3s4t5u6v7w8x9y0z1a2b3c4d5"}'
Response: Updated task object with old_task_list_id and new_task_list_id.
Bulk Update Task Status
/current/tasks/{list_id}/items/bulk-status/
Update the status of multiple tasks at once.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| tasks | array | Yes | Max 100 items | Array of {"task_id": string, "status": string} objects |
Request Example
curl -X POST "https://api.fast.io/current/tasks/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5/items/bulk-status/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"tasks": [{"task_id": "x1y2z3...", "status": "complete"}, {"task_id": "p1q2r3...", "status": "in_progress"}]}'
Response
{
"result": "yes",
"response": {
"success": true,
"updated_count": 2,
"failed_count": 0,
"total_count": 2,
"results": [
{"task_id": "x1y2z3...", "success": true, "error": null},
{"task_id": "p1q2r3...", "success": true, "error": null}
]
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.success | bool | true if all tasks updated successfully |
| response.updated_count | int | Number successfully updated |
| response.failed_count | int | Number that failed |
| response.total_count | int | Total number of tasks in request |
| response.results | array | Per-task results with task_id, success, and error |
Reorder Tasks
/current/tasks/{list_id}/items/reorder/
Bulk reorder tasks within a task list. Updates sort_order for each specified task atomically.
Auth: Required (JWT). Rate limited.
Request Body (JSON)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| order | array | Yes | Non-empty array | Array of {"id": string, "sort_order": int} objects |
Each entry in the order array specifies a task ID and its new sort order. All task IDs must belong to the specified task list.
Request Example
curl -X POST "https://api.fast.io/current/tasks/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5/items/reorder/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"order": [{"id": "x1y2z3...", "sort_order": 0}, {"id": "p1q2r3...", "sort_order": 1}]}'
Response
{
"result": "yes",
"response": {
"reordered": 2,
"list_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5"
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.reordered | int | Number of tasks reordered |
| response.list_id | string | The task list ID |
Reorder Task Lists
/current/workspace/{workspace_id}/tasks/reorder/
/current/share/{share_id}/tasks/reorder/
Bulk reorder task lists within a workspace or share. Updates sort_order for each specified task list atomically.
Backwards compatibility: The previous routes (/current/tasks/workspace/{workspace_id}/reorder/ and /current/tasks/share/{share_id}/reorder/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Request Body (JSON)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| order | array | Yes | Non-empty array | Array of {"id": string, "sort_order": int} objects |
Each entry in the order array specifies a task list ID and its new sort order. All task list IDs must belong to the specified workspace or share.
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/tasks/reorder/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"order": [{"id": "a1b2c3...", "sort_order": 0}, {"id": "d4e5f6...", "sort_order": 1}]}'
Response
{
"result": "yes",
"response": {
"reordered": 2,
"profile_id": "1234567890123456789"
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.reordered | int | Number of task lists reordered |
| response.profile_id | string | The workspace or share profile ID |
Worklogs
Worklogs provide an append-only activity stream attached to entities. Entries are immutable after creation. Interjections are urgent entries that require acknowledgement.
Worklog Entity Types
| Value | Description |
|---|---|
task | Attached to a task |
task_list | Attached to a task list |
node | Attached to a file/folder |
profile | Attached to a workspace or share |
Entry Types
| Value | Description |
|---|---|
info | General information |
decision | A decision record |
error | An error record |
status_change | A status change |
request | A request for action |
interjection | Urgent correction requiring acknowledgement (created via interjection endpoint) |
Priority
| Value | Description |
|---|---|
normal | Default priority |
urgent | Urgent (auto-set for interjections) |
Worklog Entry Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| entity_type | string | task, task_list, node, profile |
| entity_id | string | ID of the attached entity |
| profile_id | string | Workspace or share profile ID (19-digit numeric) |
| author_id | string | Author's user profile ID |
| entry_type | string | Entry type (see enum above) |
| content | string | Entry text content |
| priority | string | normal or urgent |
| target_id | string|null | Target user profile ID (for interjections/requests) |
| acknowledged | bool | true = acknowledged, false = not acknowledged |
| acknowledged_at | string|null | Timestamp (YYYY-MM-DD HH:MM:SS) when acknowledged |
| acknowledgable | bool | true if entry is an unacknowledged interjection |
| properties | object|null | Metadata properties (JSON) |
| created | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| updated | string | Timestamp (YYYY-MM-DD HH:MM:SS) (falls back to created if not set) |
Worklog entries are immutable after creation. The only mutable operation is acknowledging an interjection, which sets acknowledged, acknowledged_at, and updated.
List Worklog Entries
/current/worklogs/{entity_type}/{entity_id}/
List worklog entries for an entity, ordered chronologically.
Auth: Required (JWT). Rate limited.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {entity_type} | string | Yes | task, task_list, node, profile |
| {entity_id} | string | Yes | Entity ID |
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 200 | Number of entries to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| sort | string | No | asc | asc or desc | Sort direction by creation time |
| format | string | No | — | md | Markdown output |
Request Example
curl -X GET "https://api.fast.io/current/worklogs/task/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/?limit=20&sort=desc" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"entries": [
{
"id": "w1x2y3z4a5b6c7d8e9f0g1h2i3j4k5",
"entity_type": "task",
"entity_id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"profile_id": "1234567890123456789",
"author_id": "9876543210987654321",
"entry_type": "info",
"content": "Completed initial review of uploaded documents.",
"priority": "normal",
"target_id": null,
"acknowledged": false,
"acknowledgable": false,
"acknowledged_at": null,
"properties": null,
"created": "2025-06-10T14:30:00+00:00",
"updated": "2025-06-10T14:30:00+00:00"
}
],
"pagination": {
"limit": 20,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Append Worklog Entry
/current/worklogs/{entity_type}/{entity_id}/append/
Append a standard entry to the worklog.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| content | string | Yes | 1-65535 characters | Entry text content |
| entry_type | string | No | info (default), decision, error, status_change, request | Entry type (cannot use interjection here) |
| priority | string | No | normal (default) or urgent | Entry priority |
| target_id | string | No | 19-digit numeric profile ID | Target user profile ID |
| properties | object | No | — | Metadata properties |
Request Example
curl -X POST "https://api.fast.io/current/worklogs/task/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/append/" \
-H "Authorization: Bearer {jwt_token}" \
-d "content=Completed%20initial%20review&entry_type=info"
Response: Returns the created entry under the entry key.
Create Interjection
/current/worklogs/{entity_type}/{entity_id}/interjection/
Create an interjection — an urgent entry requiring acknowledgement. Automatically sets entry_type: "interjection" and priority: "urgent".
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| content | string | Yes | 1-65535 characters | Interjection text |
| target_id | string | No | 19-digit numeric profile ID | Target user profile ID |
| properties | object | No | — | Metadata properties |
Request Example
curl -X POST "https://api.fast.io/current/worklogs/task/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/interjection/" \
-H "Authorization: Bearer {jwt_token}" \
-d "content=STOP%3A%20The%20uploaded%20contract%20has%20incorrect%20terms&target_id=9876543210987654321"
Response: Returns the created interjection entry under the entry key.
List Unacknowledged Interjections
/current/worklogs/{entity_type}/{entity_id}/interjections/
List unacknowledged interjections for an entity.
Auth: Required (JWT). Rate limited.
Get Entry Details
/current/worklogs/{entry_id}/details/
Get full details of a single worklog entry.
Auth: Required (JWT). Rate limited.
Response: Returns the entry under the entry key.
Acknowledge Interjection
/current/worklogs/{entry_id}/acknowledge/
Acknowledge an interjection. Only interjection-type entries can be acknowledged.
Auth: Required (JWT). Rate limited.
Request Example
curl -X POST "https://api.fast.io/current/worklogs/w1x2y3z4a5b6c7d8e9f0g1h2i3j4k5/acknowledge/" \
-H "Authorization: Bearer {jwt_token}"
Response: Returns the updated entry with acknowledged: true, acknowledgable: false, acknowledged_at, and updated set.
Acknowledging a standard (non-interjection) entry returns an error. Acknowledging an already-acknowledged interjection returns an error. Worklog entries are append-only and immutable. Once created, they cannot be edited or deleted.
Approvals
Formal approval requests attached to entities (tasks, nodes, worklog entries, or shares). A designated approver or any admin can approve or reject.
Approval Status
| Value | Description |
|---|---|
pending | Awaiting resolution |
approved | Approved |
rejected | Rejected |
Approval Entity Types
| Value | Description |
|---|---|
task | Approval on a task |
node | Approval on a file/folder |
worklog_entry | Approval on a worklog entry |
share | Approval on a share profile (shared folders and portals only; workspaces, orgs, and users are rejected) |
Approval Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| entity_type | string | task, node, worklog_entry, share |
| entity_id | string | ID of the entity being approved |
| profile_id | string | Workspace or share profile ID (19-digit numeric) |
| requested_by | string | User profile ID of the requester |
| description | string | What is being approved |
| status | string | pending, approved, rejected |
| approver_id | string|null | Designated approver's profile ID, or null (any admin) |
| resolved_by | string|null | Profile ID of the resolver, or null |
| resolved_at | string|null | Resolution timestamp (YYYY-MM-DD HH:MM:SS), or null |
| comment | string|null | Resolution comment, or null |
| deadline | string|null | Deadline (YYYY-MM-DD HH:MM:SS), or null |
| version_id | string|null | Version ID of the node when the approval was created (node-type only), or null |
| version_match | boolean|null | Whether the approval's version matches the node's current version: true = current, false = stale (file updated since approval created), null = non-node entity or legacy approval. Computed at read time |
| node_id | string|null | Associated artifact node ID, or null |
| properties | object|null | Metadata properties (JSON) |
| created | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| updated | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
List Approvals
/current/workspace/{workspace_id}/approvals/
/current/share/{share_id}/approvals/
List approval requests in a workspace or share.
Backwards compatibility: The previous routes (/current/approvals/workspace/{workspace_id}/ and /current/approvals/share/{share_id}/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 200 | Number of approvals to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| status | string | No | — | pending, approved, rejected | Filter by status |
| format | string | No | — | md | Markdown output |
Request Example
curl -X GET "https://api.fast.io/current/workspace/1234567890123456789/approvals/?status=pending" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"approvals": [
{
"id": "r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5",
"entity_type": "task",
"entity_id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"profile_id": "1234567890123456789",
"requested_by": "9876543210987654321",
"description": "Please review and approve the deployment plan.",
"status": "pending",
"approver_id": "5678901234567890123",
"resolved_by": null,
"resolved_at": null,
"comment": null,
"deadline": "2025-06-15T23:59:59+00:00",
"version_id": null,
"version_match": null,
"node_id": null,
"properties": null,
"created": "2025-06-10T09:00:00+00:00",
"updated": "2025-06-10T09:00:00+00:00"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Create Approval
/current/workspace/{workspace_id}/approvals/create/POST
/current/share/{share_id}/approvals/create/
Create an approval request within a workspace or share.
Auth: Required (JWT). Rate limited. The profile (workspace/share) is determined by the URL path.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} or {share_id} | string | Yes | Profile ID of the workspace or share |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| entity_type | string | Yes | task, node, worklog_entry, share | Type of entity being approved |
| entity_id | string | Yes | — | Entity ID (for share, must be a valid share profile ID) |
| description | string | Yes | 1-65535 characters | What is being approved |
| approver_id | string | No | 19-digit numeric profile ID | Designated approver; must be a member/invited guest. Omit for any admin |
| deadline | string | No | YYYY-MM-DD HH:MM:SS | Informational deadline |
| node_id | string | No | Alphanumeric opaque ID | Associated artifact node ID |
| properties | object | No | — | Metadata properties |
Request Example
curl -X POST "https://api.fast.io/current/share/12345678901234567890/approvals/create/" \
-H "Authorization: Bearer {jwt_token}" \
-d "entity_type=task&entity_id=x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5&description=Please%20review%20the%20deployment%20plan&approver_id=5678901234567890123&deadline=2025-06-15T23:59:59%2B00:00"
Response: Returns the created approval under the approval key.
approver_idis a single user (not an array). If omitted, any admin can resolve. The approver must be a member of or invited guest to the workspace/share. There is notitlefield — usedescriptionto describe what is being approved.
approver_idcan refer to a pending member (an invited user who has not yet signed up). The approval is created with the pending member as the designated approver. When the user claims their account, the approval assignment is preserved.For
entity_type"share", theentity_idmust be a valid share profile ID matching the share in the URL. Only shares are accepted — workspaces, orgs, and users are rejected. Only share members and admins can create (guests are blocked). The share must be active (not archived or disabled).For
entity_type"node", the current file version is automatically captured asversion_id. This allows consumers to detect when a file has been updated since the approval was requested.
Get Approval Details
/current/workspace/{workspace_id}/approvals/{approval_id}/details/GET
/current/share/{share_id}/approvals/{approval_id}/details/
Get full details of an approval request. The approval must belong to the specified workspace or share. On shares, guests only see approvals assigned to them.
Auth: Required (JWT). Rate limited.
Response: Returns the approval under the approval key.
Resolve Approval
/current/workspace/{workspace_id}/approvals/{approval_id}/resolve/POST
/current/share/{share_id}/approvals/{approval_id}/resolve/
Resolve an approval by approving or rejecting it. The approval must belong to the specified workspace or share. Only pending approvals can be resolved.
Auth: Required (JWT). Designated approver or admin. Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| action | string | Yes | approve or reject | Resolution action |
| comment | string | No | Max 65535 characters | Resolution comment |
Request Example
curl -X POST "https://api.fast.io/current/share/12345678901234567890/approvals/r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5/resolve/" \
-H "Authorization: Bearer {jwt_token}" \
-d "action=approve&comment=Looks%20good%2C%20approved."
Response: Returns the resolved approval under the approval key with status, resolved_by, resolved_at, and comment updated.
Access Levels
| Role | Access |
|---|---|
| Designated Approver | Can resolve (if approver_id is set) |
| Admin | Can resolve any approval |
| Other Members | Cannot resolve |
The field is
action(notresolution). Values:"approve"or"reject". Only approvals with"pending"status can be resolved. Stale approvals (version_match = false) cannot be resolved — returns error "This approval is stale". Create a new approval for the updated file version. The resolution comment is stored incomment(notresolution_comment).
Update Approval
/current/workspace/{workspace_id}/approvals/{approval_id}/update/POST
/current/share/{share_id}/approvals/{approval_id}/update/
Update a pending approval within a workspace or share. Only approvals with "pending" status can be updated — resolved approvals are locked.
Auth: Required (JWT). Members and admins only (guests blocked). Rate limited.
Request Body (all fields optional, at least one required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| description | string | No | 1-65535 characters | Updated description |
| approver_id | string | No | 19-digit numeric profile ID | Updated designated approver |
| deadline | string | No | YYYY-MM-DD HH:MM:SS | Updated deadline |
| node_id | string | No | Alphanumeric opaque ID | Updated associated node ID |
| properties | object | No | — | Updated metadata properties |
Request Example
curl -X POST "https://api.fast.io/current/share/12345678901234567890/approvals/r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5/update/" \
-H "Authorization: Bearer {jwt_token}" \
-d "description=Updated%20review%20request&deadline=2025-07-01T23:59:59%2B00:00"
Response: Returns the updated approval under the approval key with version_match computed.
Only pending approvals can be updated. Resolved approvals return an error. The
status,entity_type,entity_id, andprofile_idfields cannot be changed. At least one updatable field must be provided.
Delete Approval
/current/workspace/{workspace_id}/approvals/{approval_id}/delete/POST
/current/share/{share_id}/approvals/{approval_id}/delete/
Delete an approval within a workspace or share. Both pending and resolved approvals can be deleted.
Auth: Required (JWT). Members and admins only (guests blocked). Rate limited.
Request Example
curl -X POST "https://api.fast.io/current/share/12345678901234567890/approvals/r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5/delete/" \
-H "Authorization: Bearer {jwt_token}"
Response:
{
"result": true,
"deleted": true,
"approval_id": "r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5"
}
Deletion is permanent and irreversible. Both pending and resolved approvals can be deleted.
Bulk Approval Operations
/current/share/{share_id}/approvals/bulk/{action}/
Perform bulk operations on approvals within a share. Actions: create, approve, reject, delete.
Auth: Required (JWT). Bulk create and bulk delete require member or admin. Bulk approve/reject is accessible to guests but only processes approvals assigned to them (where approver_id matches their user ID). Rate limited.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {action} | string | Yes | create, approve, reject, or delete |
Bulk Create (action = "create")
Creates node approvals for every file and note in a share. Auto-captures version_id for each node. Limited to shares with 1–50 file/note nodes; rejected if >50 or 0 nodes found. Best-effort: creates as many as possible.
| Field | Type | Required | Description |
|---|---|---|---|
| profile_id | string | Yes | Share profile ID (19-digit numeric) |
| description | string | Yes | Description for all approvals (1-65535 characters) |
| approver_id | string | No | Designated approver's profile ID |
| deadline | string | No | Deadline datetime (YYYY-MM-DD HH:MM:SS) |
Response:
{
"result": "yes",
"response": {
"action": "create",
"profile_id": "12345678901234567890",
"created_count": 5,
"failed_count": 0,
"total_nodes": 5,
"approvals": ["a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5"]
},
"current_api_version": "1.0"
}
Bulk Approve (action = "approve")
Approves all pending approvals in a share. Atomic resolution (race-safe). Skips already-resolved and stale approvals (where the file has been updated since the approval was created). Stale approvals increment skipped_count.
| Field | Type | Required | Description |
|---|---|---|---|
| profile_id | string | Yes | Share profile ID (19-digit numeric) |
| comment | string | No | Resolution comment (max 65535 characters) |
Response:
{
"result": "yes",
"response": {
"action": "approve",
"profile_id": "12345678901234567890",
"approved_count": 4,
"failed_count": 0,
"skipped_count": 1
},
"current_api_version": "1.0"
}
Bulk Reject (action = "reject")
Same as bulk approve but rejects. Response uses rejected_count instead of approved_count.
Response:
{
"result": "yes",
"response": {
"action": "reject",
"profile_id": "12345678901234567890",
"rejected_count": 3,
"failed_count": 0,
"skipped_count": 2
},
"current_api_version": "1.0"
}
Bulk Delete (action = "delete")
Deletes all approvals in a share (both pending and resolved), up to 500. Best effort. Members and admins only — guests blocked.
| Field | Type | Required | Description |
|---|---|---|---|
| profile_id | string | Yes | Share profile ID (19-digit numeric) |
Response:
{
"result": "yes",
"response": {
"action": "delete",
"deleted_count": 12,
"failed_count": 0,
"total": 12
},
"current_api_version": "1.0"
}
User Approvals List
List approvals for the authenticated user across all profiles. No specific workspace or share membership required -- returns approvals across all profiles where the user is involved.
/current/user/approvals/list/{filter}/
List approvals for the authenticated user by filter.
Auth: Required (JWT). Rate limited.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {filter} | string | Yes | pending, created, or resolved |
Filter Behavior
| Filter | Description |
|---|---|
pending | Approvals where the user is the designated approver and status is pending |
created | Approvals the user requested (any status). Supports optional status query param |
resolved | Approvals where the user was the approver that have been approved or rejected |
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 100 | Number of approvals to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| status | string | No | — | pending, approved, rejected | Filter by status (only for created filter) |
Request Example
curl -X GET "https://api.fast.io/current/user/approvals/list/pending/?limit=25" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": true,
"approvals": [
{
"id": "r1s2t3u4v5w6x7y8z9a0b1c2d3e4f5",
"entity_type": "task",
"entity_id": "x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5",
"profile_id": "1234567890123456789",
"requested_by": "9876543210987654321",
"description": "Please review the deployment plan.",
"status": "pending",
"approver_id": "5678901234567890123",
"resolved_by": null,
"resolved_at": null,
"comment": null,
"deadline": "2025-06-15T23:59:59+00:00",
"version_id": null,
"version_match": null,
"node_id": null,
"properties": null,
"created": "2025-06-10T09:00:00+00:00",
"updated": "2025-06-10T09:00:00+00:00"
}
],
"pagination": {
"limit": 25,
"offset": 0,
"total": 15,
"filter": "pending"
}
}
No specific share or workspace membership is needed. The
filtervalue is included in the pagination object. For thecreatedfilter, the optionalstatusquery parameter narrows results to a specific status. Forpendingandresolvedfilters, results are based on theapprover_idmatching the authenticated user.
Todos
Lightweight checklists scoped to workspaces or shares. Each todo has a title, done state, optional assignee, and sort order.
Todo Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| profile_id | string | Workspace or share profile ID (19-digit numeric) |
| created_by | string | User profile ID of the todo creator |
| title | string | Todo title text |
| done | int | 0 = not done, 1 = done |
| assignee_id | string|null | Assigned user's profile ID, or null |
| sort_order | int | Display sort order |
| properties | object|null | Metadata properties (JSON) |
| created | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| updated | string | Timestamp (YYYY-MM-DD HH:MM:SS) |
| deleted | string|null | Deletion timestamp (YYYY-MM-DD HH:MM:SS), or null |
Todos do not have a description field. The done field is an integer (0 or 1), not a boolean.
List Todos
/current/workspace/{workspace_id}/todos/
/current/share/{share_id}/todos/
List all todos in a workspace or share.
Backwards compatibility: The previous routes (/current/todos/workspace/{workspace_id}/ and /current/todos/share/{share_id}/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Query Parameters
| Parameter | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|
| limit | int | No | 50 | Max 200 | Number of todos to return |
| offset | int | No | 0 | Min 0 | Number to skip |
| format | string | No | — | md | Markdown output |
Request Example
curl -X GET "https://api.fast.io/current/workspace/1234567890123456789/todos/" \
-H "Authorization: Bearer {jwt_token}"
Response
{
"result": "yes",
"response": {
"todos": [
{
"id": "t1u2v3w4x5y6z7a8b9c0d1e2f3g4h5",
"profile_id": "1234567890123456789",
"title": "Review uploaded contracts",
"done": 0,
"assignee_id": null,
"sort_order": 0,
"properties": null,
"created": "2025-06-10T09:00:00+00:00",
"updated": "2025-06-10T09:00:00+00:00",
"deleted": null
},
{
"id": "u1v2w3x4y5z6a7b8c9d0e1f2g3h4i5",
"profile_id": "1234567890123456789",
"title": "Send report to stakeholders",
"done": 1,
"assignee_id": "9876543210987654321",
"sort_order": 1,
"properties": null,
"created": "2025-06-09T14:00:00+00:00",
"updated": "2025-06-10T10:30:00+00:00",
"deleted": null
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 2
}
},
"current_api_version": "1.0"
}
Create Todo
/current/workspace/{workspace_id}/todos/create/
/current/share/{share_id}/todos/create/
Create a new todo.
Backwards compatibility: The previous routes (/current/todos/workspace/{workspace_id}/create/ and /current/todos/share/{share_id}/create/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| title | string | Yes | 1-512 characters | Todo title |
| assignee_id | string | No | 19-digit numeric profile ID | User to assign |
| sort_order | int | No | Default 0 | Display sort order |
| properties | object | No | — | Metadata properties |
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/todos/create/" \
-H "Authorization: Bearer {jwt_token}" \
-d "title=Review%20uploaded%20contracts"
Response: Returns the created todo under the todo key. Todos are created with done: 0.
The
assignee_idcan refer to a pending member (an invited user who has not yet signed up). Pending members have a valid user ID and can be assigned to todos before they create their account. When the user claims their account, the assignment is preserved.
Get Todo Details
/current/todos/{todo_id}/details/
Get full details of a single todo.
Auth: Required (JWT). Rate limited.
Response: Returns the todo under the todo key.
Update Todo
/current/todos/{todo_id}/details/update/
Update a todo. Only provided fields are changed.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| title | string | No | 1-512 characters | Updated title |
| done | int | No | 0 or 1 | Updated done state |
| assignee_id | string|null | No | 19-digit numeric; null to unassign | Updated assignee |
| sort_order | int | No | — | Updated sort order |
| properties | object | No | — | Updated properties |
The endpoint path includes
/details/(i.e.,/todos/{todo_id}/details/update/).
Delete Todo
/current/todos/{todo_id}/details/delete/
Soft-delete a todo.
Auth: Required (JWT). Rate limited.
Toggle Todo
/current/todos/{todo_id}/details/toggle/
Toggle a todo's done state. 0 becomes 1, 1 becomes 0.
Auth: Required (JWT). Rate limited.
Request Example
curl -X POST "https://api.fast.io/current/todos/t1u2v3w4x5y6z7a8b9c0d1e2f3g4h5/details/toggle/" \
-H "Authorization: Bearer {jwt_token}"
Response: Returns the updated todo under the todo key with the toggled done value.
Bulk Toggle Todos
/current/workspace/{workspace_id}/todos/bulk-toggle/
/current/share/{share_id}/todos/bulk-toggle/
Bulk toggle the done state of multiple todos.
Backwards compatibility: The previous routes (/current/todos/workspace/{workspace_id}/bulk-toggle/ and /current/todos/share/{share_id}/bulk-toggle/) continue to work via automatic redirect.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| todo_ids | array<string> | Yes | Max 100 items | Todo IDs to toggle |
| done | bool | Yes | true or false | Target state: true = mark all done, false = mark all not done |
Request Example
curl -X POST "https://api.fast.io/current/workspace/1234567890123456789/todos/bulk-toggle/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"todo_ids": ["t1u2v3...", "u1v2w3..."], "done": true}'
Response
{
"result": "yes",
"response": {
"success": true,
"updated_count": 2,
"failed_count": 0,
"total_count": 2,
"results": [
{"todo_id": "t1u2v3...", "success": true, "error": null},
{"todo_id": "u1v2w3...", "success": true, "error": null}
]
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.success | bool | true if all todos updated successfully |
| response.updated_count | int | Number successfully updated |
| response.failed_count | int | Number that failed |
| response.total_count | int | Total number of todo IDs provided |
| response.results | array | Per-todo results with todo_id, success, and error |
Profile-Scoped Filtered Lists & Summaries
All four workflow types support profile-scoped filtered list and summary endpoints. Workspace context provides a personal view (filtered to the current user). Share context provides a group view for owners (all items) and a scoped view for guests (approvals assigned to them only). Tasks, todos, and worklogs on shares are restricted to members and admins. All endpoints support ?limit= (default 50, max 100) and ?offset= (default 0).
Approval Filtered Lists
/current/workspace/{workspace_id}/approvals/list/{filter}/
Personal view. Filters: pending, created, assigned, resolved.
/current/share/{share_id}/approvals/list/{filter}/
For owners/members: group view (all approvals). For guests: scoped to approvals assigned to them. The created filter returns empty for guests.
Approval Summaries
/current/workspace/{workspace_id}/approvals/list/summary/
Returns created_by_me and assigned_to_me counts with pending, approved, rejected, total breakdowns.
/current/share/{share_id}/approvals/list/summary/
Owners/members: returns all + assigned_to_me counts. Guests: returns assigned_to_me counts only. All with status breakdowns.
Task Filtered Lists
/current/workspace/{workspace_id}/tasks/list/{filter}/
/current/share/{share_id}/tasks/list/{filter}/
Filters: assigned (optional ?status=), created (optional ?status=), status (requires ?status=). Share endpoint shows group view. Members and admins only — guests are blocked.
Task Summaries
/current/workspace/{workspace_id}/tasks/summary/
/current/share/{share_id}/tasks/summary/
Returns total count, counts by status, tasks assigned to current user, and tasks created by current user. Members and admins only on share.
Todo Filtered Lists
/current/workspace/{workspace_id}/todos/list/{filter}/
/current/share/{share_id}/todos/list/{filter}/
Filters: assigned, created, done, pending. Share endpoint shows group view. Members and admins only — guests are blocked.
Todo Summaries
/current/workspace/{workspace_id}/todos/summary/
/current/share/{share_id}/todos/summary/
Returns done/pending counts and user-specific breakdowns. Members and admins only on share.
Worklog Base Listing
/current/workspace/{workspace_id}/worklogs/
/current/share/{share_id}/worklogs/
List all worklog entries in a workspace or share. Members and admins only on share — guests are blocked.
Worklog Filtered Lists
/current/workspace/{workspace_id}/worklogs/list/{filter}/
/current/share/{share_id}/worklogs/list/{filter}/
Filters: authored (optional ?entry_type=), interjections (unacknowledged, targeted at current user). Share endpoint shows group view. Members and admins only — guests are blocked.
Worklog Summaries
/current/workspace/{workspace_id}/worklogs/summary/
/current/share/{share_id}/worklogs/summary/
Returns entry type counts and user-specific breakdowns. Members and admins only on share.
Workflow Events
Workflow primitives emit events on all state changes. Filter with:
GET /current/events/search/?workspace_id={id}&category=workflow
Task Events
task_list_createdtask_list_updatedtask_list_deletedtask_createdtask_updatedtask_deletedtask_status_changedtask_assignedtask_movedtask_completedtasks_reorderedtask_lists_reordered
Worklog Events
worklog_entry_createdworklog_interjection_createdworklog_interjection_acknowledged
Approval Events
approval_requestedapproval_approvedapproval_rejected
Todo Events
todo_createdtodo_toggledtodo_deletedtodo_updated
All workflow events use event category workflow and subcategory workflow.