Workflow (Task Management) API Task lists, tasks, worklogs, interjections, approvals, and todos.

Base URL: https://api.fast.io/current/ Auth: Bearer {jwt_token} Format: JSON

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

MethodEndpointDescription
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

MethodEndpointDescription
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

MethodEndpointDescription
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

MethodEndpointDescription
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

MethodEndpointDescription
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

ParameterTypeFormatDescription
{workspace_id}string19-digit numericWorkspace profile ID
{share_id}string19-digit numericShare profile ID
{list_id}string30-char alphanumericTask list ID
{task_id}string30-char alphanumericTask ID
{entry_id}string30-char alphanumericWorklog entry ID
{approval_id}string30-char alphanumericApproval ID
{todo_id}string30-char alphanumericTodo ID
{entity_type}stringSee per-section enumsEntity type discriminator
{entity_id}stringVaries by entity typeEntity identifier
{filter}stringpending, created, resolvedUser approvals filter

Common Error Responses

These errors apply to all workflow endpoints (except toggle):

Error CodeHTTP StatusMessageCause
1650 (Authentication Invalid)401Authentication requiredMissing or invalid JWT token
1680 (Access Denied)403Workflow is not enabledWorkflow feature not enabled on entity
1680 (Access Denied)403Insufficient permissionsUser lacks required access level
1651 (Invalid Request Type)400Invalid requestWrong HTTP method
1671 (Rate Limited)429Rate limit exceededToo 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.

RoleApprovalsTasks / Todos / WorklogsToggle (Enable/Disable)
Owner / AdminFull access (list, create, update, delete, resolve, bulk)Full accessAllowed
MemberFull access (list, create, update, delete, resolve, bulk)Full accessDenied
GuestView & resolve assigned only (no update/delete)DeniedDenied
Public GuestDeniedDeniedDenied

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

POST /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

FieldTypeDescription
response.messagestringConfirmation message
response.workflowbooltrue = enabled, false = disabled

Access Levels

RoleAccess
Owner / AdminCan enable/disable
Member / GuestDenied

Error Responses

Error CodeHTTP StatusMessageCause
1650 (Authentication Invalid)401Authentication requiredMissing or invalid token
1609 (Not Found)404Workspace not foundWorkspace does not exist
1680 (Access Denied)403Insufficient permissionsUser is not owner or admin
1605 (Invalid Input)400Workflow is already enabledAlready enabled
1654 (Internal Error)500Failed to enable workflowInternal error

Disable Workflow on Workspace

POST /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 CodeHTTP StatusMessageCause
1650 (Authentication Invalid)401Authentication requiredMissing or invalid token
1609 (Not Found)404Workspace not foundWorkspace does not exist
1680 (Access Denied)403Insufficient permissionsUser is not owner or admin
1605 (Invalid Input)400Workflow is already disabledAlready disabled
1654 (Internal Error)500Failed to disable workflowInternal error

Share Toggle Endpoints

POST /current/share/{share_id}/workflow/enable/
POST /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

ValueDescription
pendingNot started
in_progressActively being worked on
completeFinished
blockedBlocked by a dependency or issue

Valid Status Transitions

FromAllowed Transitions
pendingin_progress, blocked
in_progresscomplete, blocked, pending
completepending, in_progress
blockedpending, in_progress

Task Priority (integer)

ValueMeaning
0None (default)
1Low
2Medium
3High
4Critical

Task List Object

FieldTypeDescription
idstring30-character alphanumeric ID
profile_idstringWorkspace or share profile ID (19-digit numeric)
namestringTask list name
descriptionstring|nullTask list description
created_bystringUser profile ID of the creator
propertiesobjectMetadata properties (JSON)
sort_orderintDisplay sort order
createdstringTimestamp (YYYY-MM-DD HH:MM:SS)
updatedstringTimestamp (YYYY-MM-DD HH:MM:SS)
deletedstring|nullDeletion timestamp (YYYY-MM-DD HH:MM:SS), or null

Task Object

FieldTypeDescription
idstring30-character alphanumeric ID
task_list_idstringParent task list ID
profile_idstringWorkspace or share profile ID (19-digit numeric)
created_bystringUser profile ID of the task creator
titlestringTask title
descriptionstring|nullTask description
statusstringpending, in_progress, complete, blocked
assignee_idstring|nullAssigned user's profile ID, or null
priorityint0 (none) through 4 (critical)
sort_orderintDisplay sort order
dependenciesarray<string>|nullTask IDs this task depends on
node_idstring|nullAssociated file/folder node ID
propertiesobjectMetadata properties (JSON)
createdstringTimestamp (YYYY-MM-DD HH:MM:SS)
updatedstringTimestamp (YYYY-MM-DD HH:MM:SS)
deletedstring|nullDeletion timestamp (YYYY-MM-DD HH:MM:SS), or null

List Task Lists

GET /current/workspace/{workspace_id}/tasks/
GET /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

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 200Number of task lists to return
offsetintNo0Min 0Number to skip
formatstringNomdMarkdown 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

POST /current/workspace/{workspace_id}/tasks/create/
POST /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

FieldTypeRequiredConstraintsDescription
namestringYes1-255 charactersTask list name
descriptionstringNoMax 65535 charactersTask list description
propertiesobjectNoMetadata properties
sort_orderintNoDefault 0Display 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

GET /current/tasks/{list_id}/details/

Get task list details including all tasks in the list.

Auth: Required (JWT). Rate limited.

Query Parameters

ParameterTypeRequiredDefaultDescription
formatstringNomd 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

POST /current/tasks/{list_id}/update/

Update a task list. Only provided fields are changed.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
namestringNo1-255 charactersUpdated name
descriptionstring|nullNoMax 65535 chars; null to clearUpdated description
propertiesobjectNoUpdated properties
sort_orderintNoUpdated sort order

Delete Task List

POST /current/tasks/{list_id}/delete/

Soft-delete a task list.

Auth: Required (JWT). Rate limited.


List Tasks

GET /current/tasks/{list_id}/items/

List all tasks in a task list.

Auth: Required (JWT). Rate limited.

Query Parameters

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 200Number of tasks to return
offsetintNo0Min 0Number to skip
formatstringNomdMarkdown output

Create Task

POST /current/tasks/{list_id}/items/create/

Create a new task in a task list.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
titlestringYes1-512 charactersTask title
descriptionstringNoMax 65535 charactersTask description
priorityintNo0-4 (default 0)Priority: 0=none, 1=low, 2=medium, 3=high, 4=critical
assignee_idstringNo19-digit numeric profile IDUser to assign
node_idstringNoAlphanumeric opaque IDFile/folder node to link
dependenciesarray<string>NoArray of task IDsTasks this task depends on
propertiesobjectNoMetadata properties
sort_orderintNoDefault 0Display 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

GET /current/tasks/{list_id}/items/{task_id}/

Get full details of a single task.

Auth: Required (JWT). Rate limited.

Query Parameters

ParameterTypeRequiredDefaultDescription
formatstringNomd for Markdown output

Update Task

POST /current/tasks/{list_id}/items/{task_id}/update/

Update a task. Only provided fields are changed.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
titlestringNo1-512 charactersUpdated title
descriptionstring|nullNoMax 65535 chars; null to clearUpdated description
priorityintNo0-4Updated priority
assignee_idstring|nullNo19-digit numeric; null to unassignUpdated assignee
node_idstring|nullNoOpaque ID; null to clearUpdated node link
dependenciesarray<string>NoArray of task IDsUpdated dependencies
propertiesobjectNoUpdated properties
sort_orderintNoUpdated sort order

Delete Task

POST /current/tasks/{list_id}/items/{task_id}/delete/

Soft-delete a task.

Auth: Required (JWT). Rate limited.


Change Task Status

POST /current/tasks/{list_id}/items/{task_id}/status/

Change a task's status. Enforces valid transitions.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
statusstringYespending, in_progress, complete, blockedNew 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

POST /current/tasks/{list_id}/items/{task_id}/assign/

Assign or unassign a task.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
assignee_idstring|nullYes19-digit numeric profile ID, or nullUser to assign, or null to unassign

The assignee_id can 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

POST /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

FieldTypeRequiredConstraintsDescription
target_task_list_idstringYes30-char opaque IDDestination task list ID
sort_orderintNoDefault 0Sort 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

POST /current/tasks/{list_id}/items/bulk-status/

Update the status of multiple tasks at once.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
tasksarrayYesMax 100 itemsArray 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

FieldTypeDescription
response.successbooltrue if all tasks updated successfully
response.updated_countintNumber successfully updated
response.failed_countintNumber that failed
response.total_countintTotal number of tasks in request
response.resultsarrayPer-task results with task_id, success, and error

Reorder Tasks

POST /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)

FieldTypeRequiredConstraintsDescription
orderarrayYesNon-empty arrayArray 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

FieldTypeDescription
response.reorderedintNumber of tasks reordered
response.list_idstringThe task list ID

Reorder Task Lists

POST /current/workspace/{workspace_id}/tasks/reorder/
POST /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)

FieldTypeRequiredConstraintsDescription
orderarrayYesNon-empty arrayArray 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

FieldTypeDescription
response.reorderedintNumber of task lists reordered
response.profile_idstringThe 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

ValueDescription
taskAttached to a task
task_listAttached to a task list
nodeAttached to a file/folder
profileAttached to a workspace or share

Entry Types

ValueDescription
infoGeneral information
decisionA decision record
errorAn error record
status_changeA status change
requestA request for action
interjectionUrgent correction requiring acknowledgement (created via interjection endpoint)

Priority

ValueDescription
normalDefault priority
urgentUrgent (auto-set for interjections)

Worklog Entry Object

FieldTypeDescription
idstring30-character alphanumeric ID
entity_typestringtask, task_list, node, profile
entity_idstringID of the attached entity
profile_idstringWorkspace or share profile ID (19-digit numeric)
author_idstringAuthor's user profile ID
entry_typestringEntry type (see enum above)
contentstringEntry text content
prioritystringnormal or urgent
target_idstring|nullTarget user profile ID (for interjections/requests)
acknowledgedbooltrue = acknowledged, false = not acknowledged
acknowledged_atstring|nullTimestamp (YYYY-MM-DD HH:MM:SS) when acknowledged
acknowledgablebooltrue if entry is an unacknowledged interjection
propertiesobject|nullMetadata properties (JSON)
createdstringTimestamp (YYYY-MM-DD HH:MM:SS)
updatedstringTimestamp (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

GET /current/worklogs/{entity_type}/{entity_id}/

List worklog entries for an entity, ordered chronologically.

Auth: Required (JWT). Rate limited.

Path Parameters

ParameterTypeRequiredDescription
{entity_type}stringYestask, task_list, node, profile
{entity_id}stringYesEntity ID

Query Parameters

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 200Number of entries to return
offsetintNo0Min 0Number to skip
sortstringNoascasc or descSort direction by creation time
formatstringNomdMarkdown 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

POST /current/worklogs/{entity_type}/{entity_id}/append/

Append a standard entry to the worklog.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
contentstringYes1-65535 charactersEntry text content
entry_typestringNoinfo (default), decision, error, status_change, requestEntry type (cannot use interjection here)
prioritystringNonormal (default) or urgentEntry priority
target_idstringNo19-digit numeric profile IDTarget user profile ID
propertiesobjectNoMetadata 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

POST /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

FieldTypeRequiredConstraintsDescription
contentstringYes1-65535 charactersInterjection text
target_idstringNo19-digit numeric profile IDTarget user profile ID
propertiesobjectNoMetadata 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

GET /current/worklogs/{entity_type}/{entity_id}/interjections/

List unacknowledged interjections for an entity.

Auth: Required (JWT). Rate limited.


Get Entry Details

GET /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

POST /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

ValueDescription
pendingAwaiting resolution
approvedApproved
rejectedRejected

Approval Entity Types

ValueDescription
taskApproval on a task
nodeApproval on a file/folder
worklog_entryApproval on a worklog entry
shareApproval on a share profile (shared folders and portals only; workspaces, orgs, and users are rejected)

Approval Object

FieldTypeDescription
idstring30-character alphanumeric ID
entity_typestringtask, node, worklog_entry, share
entity_idstringID of the entity being approved
profile_idstringWorkspace or share profile ID (19-digit numeric)
requested_bystringUser profile ID of the requester
descriptionstringWhat is being approved
statusstringpending, approved, rejected
approver_idstring|nullDesignated approver's profile ID, or null (any admin)
resolved_bystring|nullProfile ID of the resolver, or null
resolved_atstring|nullResolution timestamp (YYYY-MM-DD HH:MM:SS), or null
commentstring|nullResolution comment, or null
deadlinestring|nullDeadline (YYYY-MM-DD HH:MM:SS), or null
version_idstring|nullVersion ID of the node when the approval was created (node-type only), or null
version_matchboolean|nullWhether 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_idstring|nullAssociated artifact node ID, or null
propertiesobject|nullMetadata properties (JSON)
createdstringTimestamp (YYYY-MM-DD HH:MM:SS)
updatedstringTimestamp (YYYY-MM-DD HH:MM:SS)

List Approvals

GET /current/workspace/{workspace_id}/approvals/
GET /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

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 200Number of approvals to return
offsetintNo0Min 0Number to skip
statusstringNopending, approved, rejectedFilter by status
formatstringNomdMarkdown 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

POST /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

ParameterTypeRequiredDescription
{workspace_id} or {share_id}stringYesProfile ID of the workspace or share

Request Body

FieldTypeRequiredConstraintsDescription
entity_typestringYestask, node, worklog_entry, shareType of entity being approved
entity_idstringYesEntity ID (for share, must be a valid share profile ID)
descriptionstringYes1-65535 charactersWhat is being approved
approver_idstringNo19-digit numeric profile IDDesignated approver; must be a member/invited guest. Omit for any admin
deadlinestringNoYYYY-MM-DD HH:MM:SSInformational deadline
node_idstringNoAlphanumeric opaque IDAssociated artifact node ID
propertiesobjectNoMetadata 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_id is 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 no title field — use description to describe what is being approved.

approver_id can 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", the entity_id must 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 as version_id. This allows consumers to detect when a file has been updated since the approval was requested.


Get Approval Details

GET /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

POST /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

FieldTypeRequiredConstraintsDescription
actionstringYesapprove or rejectResolution action
commentstringNoMax 65535 charactersResolution 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

RoleAccess
Designated ApproverCan resolve (if approver_id is set)
AdminCan resolve any approval
Other MembersCannot resolve

The field is action (not resolution). 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 in comment (not resolution_comment).


Update Approval

POST /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)

FieldTypeRequiredConstraintsDescription
descriptionstringNo1-65535 charactersUpdated description
approver_idstringNo19-digit numeric profile IDUpdated designated approver
deadlinestringNoYYYY-MM-DD HH:MM:SSUpdated deadline
node_idstringNoAlphanumeric opaque IDUpdated associated node ID
propertiesobjectNoUpdated 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, and profile_id fields cannot be changed. At least one updatable field must be provided.


Delete Approval

POST /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

POST /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

ParameterTypeRequiredDescription
{action}stringYescreate, 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.

FieldTypeRequiredDescription
profile_idstringYesShare profile ID (19-digit numeric)
descriptionstringYesDescription for all approvals (1-65535 characters)
approver_idstringNoDesignated approver's profile ID
deadlinestringNoDeadline 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.

FieldTypeRequiredDescription
profile_idstringYesShare profile ID (19-digit numeric)
commentstringNoResolution 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.

FieldTypeRequiredDescription
profile_idstringYesShare 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.

GET /current/user/approvals/list/{filter}/

List approvals for the authenticated user by filter.

Auth: Required (JWT). Rate limited.

Path Parameters

ParameterTypeRequiredDescription
{filter}stringYespending, created, or resolved

Filter Behavior

FilterDescription
pendingApprovals where the user is the designated approver and status is pending
createdApprovals the user requested (any status). Supports optional status query param
resolvedApprovals where the user was the approver that have been approved or rejected

Query Parameters

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 100Number of approvals to return
offsetintNo0Min 0Number to skip
statusstringNopending, approved, rejectedFilter 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 filter value is included in the pagination object. For the created filter, the optional status query parameter narrows results to a specific status. For pending and resolved filters, results are based on the approver_id matching 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

FieldTypeDescription
idstring30-character alphanumeric ID
profile_idstringWorkspace or share profile ID (19-digit numeric)
created_bystringUser profile ID of the todo creator
titlestringTodo title text
doneint0 = not done, 1 = done
assignee_idstring|nullAssigned user's profile ID, or null
sort_orderintDisplay sort order
propertiesobject|nullMetadata properties (JSON)
createdstringTimestamp (YYYY-MM-DD HH:MM:SS)
updatedstringTimestamp (YYYY-MM-DD HH:MM:SS)
deletedstring|nullDeletion 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

GET /current/workspace/{workspace_id}/todos/
GET /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

ParameterTypeRequiredDefaultConstraintsDescription
limitintNo50Max 200Number of todos to return
offsetintNo0Min 0Number to skip
formatstringNomdMarkdown 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

POST /current/workspace/{workspace_id}/todos/create/
POST /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

FieldTypeRequiredConstraintsDescription
titlestringYes1-512 charactersTodo title
assignee_idstringNo19-digit numeric profile IDUser to assign
sort_orderintNoDefault 0Display sort order
propertiesobjectNoMetadata 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_id can 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

GET /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

POST /current/todos/{todo_id}/details/update/

Update a todo. Only provided fields are changed.

Auth: Required (JWT). Rate limited.

Request Body

FieldTypeRequiredConstraintsDescription
titlestringNo1-512 charactersUpdated title
doneintNo0 or 1Updated done state
assignee_idstring|nullNo19-digit numeric; null to unassignUpdated assignee
sort_orderintNoUpdated sort order
propertiesobjectNoUpdated properties

The endpoint path includes /details/ (i.e., /todos/{todo_id}/details/update/).


Delete Todo

POST /current/todos/{todo_id}/details/delete/

Soft-delete a todo.

Auth: Required (JWT). Rate limited.


Toggle Todo

POST /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

POST /current/workspace/{workspace_id}/todos/bulk-toggle/
POST /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

FieldTypeRequiredConstraintsDescription
todo_idsarray<string>YesMax 100 itemsTodo IDs to toggle
doneboolYestrue or falseTarget 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

FieldTypeDescription
response.successbooltrue if all todos updated successfully
response.updated_countintNumber successfully updated
response.failed_countintNumber that failed
response.total_countintTotal number of todo IDs provided
response.resultsarrayPer-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

GET /current/workspace/{workspace_id}/approvals/list/{filter}/

Personal view. Filters: pending, created, assigned, resolved.

GET /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

GET /current/workspace/{workspace_id}/approvals/list/summary/

Returns created_by_me and assigned_to_me counts with pending, approved, rejected, total breakdowns.

GET /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

GET /current/workspace/{workspace_id}/tasks/list/{filter}/
GET /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

GET /current/workspace/{workspace_id}/tasks/summary/
GET /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

GET /current/workspace/{workspace_id}/todos/list/{filter}/
GET /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

GET /current/workspace/{workspace_id}/todos/summary/
GET /current/share/{share_id}/todos/summary/

Returns done/pending counts and user-specific breakdowns. Members and admins only on share.


Worklog Base Listing

GET /current/workspace/{workspace_id}/worklogs/
GET /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

GET /current/workspace/{workspace_id}/worklogs/list/{filter}/
GET /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

GET /current/workspace/{workspace_id}/worklogs/summary/
GET /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

Worklog Events

Approval Events

Todo Events

All workflow events use event category workflow and subcategory workflow.

↑ Back to top