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. All GET endpoints support format=md query parameter for Markdown output (AI agent-friendly).

Share access: Workflow features on shares (tasks, todos, approvals, worklogs) require Member-level access or higher. Guests and public guests cannot access workflow features on shares. 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

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

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

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

Common Path Parameters

ParameterTypeFormatDescription
{workspace_id}string20-digit numericWorkspace profile ID
{share_id}string20-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

Common Error Responses

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

Error CodeHTTP StatusMessageCause
APP_AUTH_INVALID401Authentication requiredMissing or invalid JWT token
APP_DENIED403Workflow is not enabledWorkflow feature not enabled on entity
APP_DENIED403Insufficient permissionsUser lacks required access level
APP_REQUEST_TYPE400Invalid requestWrong HTTP method
APP_RATE_LIMITED429Rate limit exceededToo many requests

Share Workflow Access Levels

Workflow features on shares have a restricted permission model. Only users with Member-level access or higher can use workflow endpoints on shares.

RoleWorkflow Access (Tasks, Todos, Approvals, Worklogs)Toggle (Enable/Disable)
Owner / AdminAllowedAllowed
MemberAllowedDenied
GuestDeniedDenied
Public GuestDeniedDenied

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
APP_AUTH_INVALID401Authentication requiredMissing or invalid token
APP_NOT_FOUND404Workspace not foundWorkspace does not exist
APP_DENIED403Insufficient permissionsUser is not owner or admin
APP_ERROR_INPUT_INVALID400Workflow is already enabledAlready enabled
APP_ERROR_GENERAL500Failed 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
APP_AUTH_INVALID401Authentication requiredMissing or invalid token
APP_NOT_FOUND404Workspace not foundWorkspace does not exist
APP_DENIED403Insufficient permissionsUser is not owner or admin
APP_ERROR_INPUT_INVALID400Workflow is already disabledAlready disabled
APP_ERROR_GENERAL500Failed 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 (20-digit numeric)
namestringTask list name
descriptionstring|nullTask list description
created_bystringUser profile ID of the creator
propertiesobjectMetadata properties (JSON)
sort_orderintDisplay sort order
createdstringISO 8601 timestamp
updatedstringISO 8601 timestamp
deletedstring|nullISO 8601 deletion timestamp, or null

Task Object

FieldTypeDescription
idstring30-character alphanumeric ID
task_list_idstringParent task list ID
profile_idstringWorkspace or share profile ID (20-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)
createdstringISO 8601 timestamp
updatedstringISO 8601 timestamp
deletedstring|nullISO 8601 deletion timestamp, 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_idstringNo20-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|nullNo20-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|nullYes20-digit numeric profile ID, or nullUser to assign, or null to unassign

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 (20-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|nullISO 8601 timestamp when acknowledged
acknowledgablebooltrue if entry is an unacknowledged interjection
propertiesobject|nullMetadata properties (JSON)
createdstringISO 8601 timestamp
updatedstringISO 8601 timestamp (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_idstringNo20-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_idstringNo20-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, or worklog entries). 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

Approval Object

FieldTypeDescription
idstring30-character alphanumeric ID
entity_typestringtask, node, worklog_entry
entity_idstringID of the entity being approved
profile_idstringWorkspace or share profile ID (20-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|nullISO 8601 resolution timestamp, or null
commentstring|nullResolution comment, or null
deadlinestring|nullISO 8601 deadline (informational), or null
node_idstring|nullAssociated artifact node ID, or null
propertiesobject|nullMetadata properties (JSON)
createdstringISO 8601 timestamp
updatedstringISO 8601 timestamp

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",
        "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/approvals/{entity_type}/{entity_id}/create/

Create an approval request on an entity.

Auth: Required (JWT). Rate limited.

Path Parameters

ParameterTypeRequiredDescription
{entity_type}stringYestask, node, worklog_entry
{entity_id}stringYesEntity ID

Request Body

FieldTypeRequiredConstraintsDescription
descriptionstringYes1-65535 charactersWhat is being approved
profile_idstringYes20-digit numericWorkspace or share profile ID
approver_idstringNo20-digit numeric profile IDDesignated approver; omit for any admin
deadlinestringNoISO 8601 datetimeInformational deadline
node_idstringNoAlphanumeric opaque IDAssociated artifact node ID
propertiesobjectNoMetadata 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_id is a single user (not an array). If omitted, any admin can resolve. There is no title field — use description to describe what is being approved.


Get Approval Details

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

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

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

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

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 (20-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)
createdstringISO 8601 timestamp
updatedstringISO 8601 timestamp
deletedstring|nullISO 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

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_idstringNo20-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.


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|nullNo20-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

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