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. All GET endpoints support format=md query parameter for Markdown output (AI agent-friendly).
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/tasks/workspace/{workspace_id}/ | List task lists in a workspace |
| GET | /current/tasks/share/{share_id}/ | List task lists in a share |
| POST | /current/tasks/workspace/{workspace_id}/create/ | Create a task list in a workspace |
| POST | /current/tasks/share/{share_id}/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/bulk-status/ | Bulk update task statuses |
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 |
Approvals
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/approvals/workspace/{workspace_id}/ | List approvals in a workspace |
| GET | /current/approvals/share/{share_id}/ | List approvals in a share |
| POST | /current/approvals/{entity_type}/{entity_id}/create/ | Create an approval request |
| GET | /current/approvals/{approval_id}/details/ | Get approval details |
| POST | /current/approvals/{approval_id}/resolve/ | Resolve an approval |
Todos
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/todos/workspace/{workspace_id}/ | List todos in a workspace |
| GET | /current/todos/share/{share_id}/ | List todos in a share |
| POST | /current/todos/workspace/{workspace_id}/create/ | Create a todo in a workspace |
| POST | /current/todos/share/{share_id}/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/todos/workspace/{workspace_id}/bulk-toggle/ | Bulk toggle todos in a workspace |
| POST | /current/todos/share/{share_id}/bulk-toggle/ | Bulk toggle todos in a share |
Common Path Parameters
| Parameter | Type | Format | Description |
|---|---|---|---|
| {workspace_id} | string | 20-digit numeric | Workspace profile ID |
| {share_id} | string | 20-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 |
Common Error Responses
These errors apply to all workflow endpoints (except toggle):
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
APP_AUTH_INVALID | 401 | Authentication required | Missing or invalid JWT token |
APP_DENIED | 403 | Workflow is not enabled | Workflow feature not enabled on entity |
APP_DENIED | 403 | Insufficient permissions | User lacks required access level |
APP_REQUEST_TYPE | 400 | Invalid request | Wrong HTTP method |
APP_RATE_LIMITED | 429 | Rate limit exceeded | Too many requests |
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 |
|---|---|---|---|
APP_AUTH_INVALID | 401 | Authentication required | Missing or invalid token |
APP_NOT_FOUND | 404 | Workspace not found | Workspace does not exist |
APP_DENIED | 403 | Insufficient permissions | User is not owner or admin |
APP_ERROR_INPUT_INVALID | 400 | Workflow is already enabled | Already enabled |
APP_ERROR_GENERAL | 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 |
|---|---|---|---|
APP_AUTH_INVALID | 401 | Authentication required | Missing or invalid token |
APP_NOT_FOUND | 404 | Workspace not found | Workspace does not exist |
APP_DENIED | 403 | Insufficient permissions | User is not owner or admin |
APP_ERROR_INPUT_INVALID | 400 | Workflow is already disabled | Already disabled |
APP_ERROR_GENERAL | 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.
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 (20-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 | ISO 8601 timestamp |
| updated | string | ISO 8601 timestamp |
| deleted | string|null | ISO 8601 deletion timestamp, 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 (20-digit numeric) |
| 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 | ISO 8601 timestamp |
| updated | string | ISO 8601 timestamp |
| deleted | string|null | ISO 8601 deletion timestamp, or null |
List Task Lists
/current/tasks/workspace/{workspace_id}/
/current/tasks/share/{share_id}/
List all task lists in a workspace or share.
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/tasks/workspace/1234567890123456789/?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/tasks/workspace/{workspace_id}/create/
/current/tasks/share/{share_id}/create/
Create a new task list.
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/tasks/workspace/1234567890123456789/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 | 20-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 | 20-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 | 20-digit numeric profile ID, or null | User to assign, or null to unassign |
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 |
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 (20-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 | int | 0 = not acknowledged, 1 = acknowledged |
| acknowledged_at | string|null | ISO 8601 timestamp when acknowledged |
| properties | object|null | Metadata properties (JSON) |
| created | string | ISO 8601 timestamp |
Worklog entries are immutable. There is no updated or deleted field. The only mutable operation is acknowledging an interjection.
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": 0,
"acknowledged_at": null,
"properties": null,
"created": "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 | 20-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 | 20-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: 1 and acknowledged_at 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, or worklog entries). 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 |
Approval Object
| Field | Type | Description |
|---|---|---|
| id | string | 30-character alphanumeric ID |
| entity_type | string | task, node, worklog_entry |
| entity_id | string | ID of the entity being approved |
| profile_id | string | Workspace or share profile ID (20-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 | ISO 8601 resolution timestamp, or null |
| comment | string|null | Resolution comment, or null |
| deadline | string|null | ISO 8601 deadline (informational), or null |
| node_id | string|null | Associated artifact node ID, or null |
| properties | object|null | Metadata properties (JSON) |
| created | string | ISO 8601 timestamp |
| updated | string | ISO 8601 timestamp |
List Approvals
/current/approvals/workspace/{workspace_id}/
/current/approvals/share/{share_id}/
List approval requests in a workspace or share.
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/approvals/workspace/1234567890123456789/?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",
"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/approvals/{entity_type}/{entity_id}/create/
Create an approval request on an entity.
Auth: Required (JWT). Rate limited.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {entity_type} | string | Yes | task, node, worklog_entry |
| {entity_id} | string | Yes | Entity ID |
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| description | string | Yes | 1-65535 characters | What is being approved |
| profile_id | string | Yes | 20-digit numeric | Workspace or share profile ID |
| approver_id | string | No | 20-digit numeric profile ID | Designated approver; omit for any admin |
| deadline | string | No | ISO 8601 datetime | 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/approvals/task/x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5/create/" \
-H "Authorization: Bearer {jwt_token}" \
-d "description=Please%20review%20the%20deployment%20plan&profile_id=1234567890123456789&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. There is notitlefield — usedescriptionto describe what is being approved.
Get Approval Details
/current/approvals/{approval_id}/details/
Get full details of an approval request.
Auth: Required (JWT). Rate limited.
Response: Returns the approval under the approval key.
Resolve Approval
/current/approvals/{approval_id}/resolve/
Resolve an approval by approving or rejecting it. 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/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. The resolution comment is stored incomment(notresolution_comment).
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 (20-digit numeric) |
| 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 | ISO 8601 timestamp |
| updated | string | ISO 8601 timestamp |
| deleted | string|null | ISO 8601 deletion timestamp, or null |
Todos do not have a description field. The done field is an integer (0 or 1), not a boolean.
List Todos
/current/todos/workspace/{workspace_id}/
/current/todos/share/{share_id}/
List all todos in a workspace or share.
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/todos/workspace/1234567890123456789/" \
-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/todos/workspace/{workspace_id}/create/
/current/todos/share/{share_id}/create/
Create a new todo.
Auth: Required (JWT). Rate limited.
Request Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
| title | string | Yes | 1-512 characters | Todo title |
| assignee_id | string | No | 20-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/todos/workspace/1234567890123456789/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.
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 | 20-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/todos/workspace/{workspace_id}/bulk-toggle/
/current/todos/share/{share_id}/bulk-toggle/
Bulk toggle the done state of multiple todos.
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/todos/workspace/1234567890123456789/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 |
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_completed
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.