Workspace Management Create, configure, and manage workspaces within organizations. Control members, assets, shares, and AI intelligence settings.
Workspaces are shared project spaces within an organization. They support file versioning, search, AI chat, and member management. Most workspace endpoints also accept the workspace's folder_name (e.g., my-project) in place of the numeric ID.
Endpoint Summary
Workspace CRUD
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/org/{org_id}/create/workspace/ | Create a workspace |
| GET | /current/workspace/{workspace_id}/details/ | Get workspace details |
| POST | /current/workspace/{workspace_id}/update/ | Update workspace settings |
| DELETE | /current/workspace/{workspace_id}/delete/ | Delete (close) a workspace |
| POST | /current/workspace/{workspace_id}/archive/ | Archive a workspace |
| POST | /current/workspace/{workspace_id}/unarchive/ | Unarchive a workspace |
Assets
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/assets/ | List available asset types |
| GET | /current/workspace/{workspace_id}/assets/ | List workspace assets |
| POST | /current/workspace/{workspace_id}/assets/{asset_name}/ | Upload/set asset |
| DELETE | /current/workspace/{workspace_id}/assets/{asset_name}/ | Delete asset |
| GET | /current/workspace/{workspace_id}/assets/{asset_name}/read/ | Download asset binary |
| GET | /current/workspace/{workspace_id}/assets/{asset_name}/read/ | Get asset metadata headers (HEAD) |
Members
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/workspace/{workspace_id}/members/{email_or_user_id}/ | Add member or send invitation |
| DELETE | /current/workspace/{workspace_id}/members/{user_id}/ | Remove a member |
| GET | /current/workspace/{workspace_id}/members/list/ | List all members |
| POST | /current/workspace/{workspace_id}/members/join/ | Self-join by org membership |
| POST | /current/workspace/{workspace_id}/members/join/{invitation_key}/{action}/ | Join via invitation |
| DELETE | /current/workspace/{workspace_id}/member/ | Leave workspace (self) |
| GET | /current/workspace/{workspace_id}/member/{member_id}/details/ | Get member details |
| POST | /current/workspace/{workspace_id}/member/{member_id}/update/ | Update member role |
| POST | /current/workspace/{workspace_id}/member/{member_id}/transfer_ownership/ | Transfer ownership |
Invitations
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/members/invitations/list/ | List all invitations |
| GET | /current/workspace/{workspace_id}/members/invitations/list/{state}/ | List invitations by state |
| POST | /current/workspace/{workspace_id}/members/invitation/{invitation_id}/ | Update an invitation |
| DELETE | /current/workspace/{workspace_id}/members/invitation/{invitation_id}/ | Delete an invitation |
Shares (in workspace context)
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/workspace/{workspace_id}/create/share/ | Create a share |
| GET | /current/workspace/{workspace_id}/list/shares/ | List shares |
| POST | /current/workspace/{workspace_id}/import/share/{share_id}/ | Import a user-owned share |
Cloud Import
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/workspace/{workspace_id}/cloud-import/enable/ | Enable cloud import |
| POST | /current/workspace/{workspace_id}/cloud-import/disable/ | Disable cloud import |
Workflow
| Method | Endpoint | Description |
|---|---|---|
| POST | /current/workspace/{workspace_id}/workflow/enable/ | Enable workflow features |
| POST | /current/workspace/{workspace_id}/workflow/disable/ | Disable workflow features |
Task Lists (Workflow)
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/tasks/ | List task lists |
| POST | /current/workspace/{workspace_id}/tasks/create/ | Create a task list |
| POST | /current/workspace/{workspace_id}/tasks/reorder/ | Reorder task lists |
Todos (Workflow)
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/todos/ | List todo items |
| POST | /current/workspace/{workspace_id}/todos/create/ | Create a todo item |
| POST | /current/workspace/{workspace_id}/todos/bulk-toggle/ | Bulk toggle todo done status |
Approvals (Workflow)
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspace/{workspace_id}/approvals/ | List approvals |
Discovery
| Method | Endpoint | Description |
|---|---|---|
| GET | /current/workspaces/all/ | List all accessible workspaces |
| GET | /current/workspaces/available/ | List joinable workspaces |
| GET | /current/workspaces/check/name/{name}/ | Check folder name availability |
| GET | /current/org/{org_id}/list/workspaces/ | List workspaces in an org |
Compact Responses (output=)
Every endpoint that returns one or more workspace objects (details, list, discovery) accepts an optional output query parameter that selects the response shape. A single detail-level token may be combined with modifier tokens; specifying two detail levels (e.g. ?output=terse,standard) returns HTTP 400. When output= is omitted, responses are full and byte-for-byte unchanged.
| Level | Fields returned on each workspace (cumulative) |
|---|---|
terse | id, name, folder_name, org_domain, user_status |
standard | terse + description, workspace_level, closed, archived, locked (admin-only), storage, created, updated, logo, accent_color, org_custom_hostname, intelligence, workflow, capabilities |
full | standard + cloud_import, comments, chat, search, assets, workflow_permissions, remaining branding, perm_* blocks, platform, suspended, owner_defined, parents |
Use terse for workspace switchers, autocomplete, and org-scoped navigation — it carries the identifier, display name, folder slug, parent org domain, and user_status so the two-column "Joined vs. Available" workspace list can render and the join button can enable/disable without a follow-up fetch. Use standard for workspace list views and the summary area of workspace detail pages — it adds lifecycle flags (including the locked admin-only chip), storage usage, timestamps, description, the workspace's visual identity (logo, accent_color), plus the intelligence/workflow feature toggles and the plan-gate capabilities bundle so list rows can differentiate "enabled but plan-locked" from "usable." Use full (or omit the parameter) for the workspace settings screen, branding editors, and any workflow that reads permission matrices or remaining feature blocks (comments, chat, search, assets, workflow_permissions). Unknown tokens are silently ignored. Add the markdown modifier (e.g. ?output=standard,markdown) to receive the response as GitHub-flavored Markdown (Content-Type: text/markdown; charset=UTF-8) instead of JSON — see the cross-cutting ?output= reference for the full contract.
Field Constraints
| Field | Constraint |
|---|---|
folder_name | Regex ^[\p{L}\p{N}-]+$ (letters, numbers, hyphens). Must be globally unique. |
name | 2–100 characters, string |
description | 10–1000 characters, string (optional) |
title (shares) | 2–80 characters |
custom_name (shares) | 10–100 characters, URL-friendly |
Permission Values
perm_join — who can self-join from the parent org
| Value | Description |
|---|---|
'Member or above' | Any org member can join (default) |
'Admin or above' | Only org admins and owners |
'Only Org Owners' | Only org owners |
perm_member_manage — who can manage workspace members
| Value | Description |
|---|---|
'Member or above' | Any workspace member can manage (default) |
'Admin or above' | Only workspace admins and owners |
Permission Levels (numeric hierarchy)
| Level | Numeric | Description |
|---|---|---|
| Owner | 1000 | Full control; one per workspace |
| Admin | 500 | Administrative access |
| Member | 100 | Standard member |
| Guest | 50 | Limited guest access |
| View | 20 | Read-only access |
Intelligence Setting
The intelligence boolean on a workspace controls whether uploaded files are automatically indexed for RAG (retrieval-augmented generation).
- Enable (
intelligence=true) — files are auto-indexed for semantic search, summarization, and citation. Required forchat_with_filesAI chat type. Requires both thecontent_aiandai_agentplan features. Plans that lack either feature cannot setintelligence=true; the API rejects the create/update request with1605 (Invalid Input). - Disable (
intelligence=false) — files are stored/shared without RAG indexing. You can still attach files directly to achattype conversation for one-off analysis on plans that support chat. - Set at creation:
POST /current/org/{org_id}/create/workspace/withintelligence=true|false - Update later:
POST /current/workspace/{id}/update/withintelligence=true|false - Can be enabled and disabled within time restrictions. Disabling intelligence destroys indexed embeddings (the vector index is flushed). Re-enabling intelligence incurs re-indexing costs as AI credits are consumed to re-index all files.
- Agent-account default: On plans that include
ai_agent, new workspaces created by agent accounts defaultintelligence=trueif the parameter is omitted. On plans withoutai_agent(including the free agent plan), the default isfalsebecause the indexing pipeline has no consumer. See the AI reference for the full plan matrix.
Workspace CRUD
Create Workspace
/current/org/{org_id}/create/workspace/
Creates a new workspace within an organization. The authenticated user becomes the workspace owner.
Auth: JWT required. Org membership (Member or above) required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {org_id} | string | Yes | 19-digit numeric organization ID |
Request Parameters
| Name | Type | Required | Constraints | Description |
|---|---|---|---|---|
| folder_name | string | Yes | Regex ^[\p{L}\p{N}-]+$, globally unique | URL-safe identifier used in workspace URLs |
| name | string | Yes | 2–100 chars, non-blank | Display name |
| perm_join | string | Yes | See Permission Values | Who can self-join from the org |
| perm_member_manage | string | Yes | See Permission Values | Who can manage workspace members |
| intelligence | string | Yes (auto-set for agents on plans with ai_agent) | "true" or "false" | Enable AI indexing. Defaults to "true" for agent accounts only on plans that include the ai_agent feature; otherwise the default is "false". Setting "true" requires both content_ai and ai_agent. |
| description | string | 10–1000 chars | Workspace description | |
| accent_color | string (JSON) | Valid JSON | Accent color styling | |
| background_color1 | string (JSON) | Valid JSON | Background color 1 styling | |
| background_color2 | string (JSON) | Valid JSON | Background color 2 styling |
Example
curl -X POST "https://api.fast.io/current/org/10000000000000000001/create/workspace/" \
-H "Authorization: Bearer {jwt_token}" \
-d "folder_name=engineering" \
-d "name=Engineering Team" \
-d "description=Main engineering workspace for the team" \
-d "perm_join=Member or above" \
-d "perm_member_manage=Admin or above" \
-d "intelligence=true"
Response (200 OK)
{
"result": "yes",
"response": {
"workspace": {
"id": "12345678901234567890",
"folder_name": "engineering"
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.workspace.id | string | 19-digit numeric workspace profile ID |
| response.workspace.folder_name | string | The URL-safe folder name that was set |
Access Levels
| Role | Access |
|---|---|
| Org Owner | Can create workspaces |
| Org Admin | Can create workspaces |
| Org Member | Can create workspaces |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1685 (Feature Limit) | 403 | Workspace creation is not available on your current plan. | Feature disabled on billing plan |
1685 (Feature Limit) | 403 | You have reached your workspace creation limit. | Workspace count limit exceeded |
1658 (Not Acceptable) | 406 | The supplied workspace folder name is already in use. | Duplicate folder_name |
1605 (Invalid Input) | 400 | An invalid workspace folder name was supplied. | Invalid folder_name format |
1605 (Invalid Input) | 400 | An invalid configuration was supplied... | Metadata validation failure |
1663 (Update Failed) | 500 | There was an internal error processing your create request. | Internal failure |
Get Workspace Details
/current/workspace/{workspace_id}/details/
Returns full workspace details including settings, permissions, owner, intelligence state, and branding.
Auth: JWT required. Workspace membership required (View or above).
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/details/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"workspace": {
"id": "12345678901234567890",
"name": "Engineering Team",
"folder_name": "engineering",
"description": "Main engineering workspace",
"accent_color": "#0066CC",
"logo": "https://assets.fast.io/12345678901234567890/logo.png",
"closed": false,
"archived": false,
"perm_join": "Member or above",
"perm_member_manage": "Admin or above",
"created": "2023-01-15 10:30:00",
"updated": "2024-01-20 14:45:00",
"user_status": "joined",
"org_domain": "acme-corp"
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.workspace.id | string | 19-digit workspace profile ID |
| response.workspace.name | string | Display name |
| response.workspace.folder_name | string | URL-safe folder identifier |
| response.workspace.description | string or null | Workspace description |
| response.workspace.accent_color | string or null | Brand accent color |
| response.workspace.logo | string or null | Logo asset URL |
| response.workspace.closed | boolean | Whether workspace is closed (soft-deleted) |
| response.workspace.archived | boolean | Whether workspace is archived |
| response.workspace.perm_join | string | Who can join |
| response.workspace.perm_member_manage | string | Who can manage members |
| response.workspace.created | string | Creation timestamp |
| response.workspace.updated | string | Last update timestamp |
| response.workspace.user_status | string | Current user's membership status ("joined", "invited", "available") |
| response.workspace.org_domain | string | Parent organization domain |
Access Levels
| Role | Fields Returned |
|---|---|
| Owner | All fields including intelligence, storage, platform details |
| Admin | All fields including intelligence, storage, platform details |
| Member | Core workspace fields |
| View | Basic workspace information |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1650 (Authentication Invalid) | 401 | Authentication required | Missing or invalid JWT |
1609 (Not Found) | 404 | Workspace not found | Invalid ID or no access |
Update Workspace
/current/workspace/{workspace_id}/update/
Updates workspace configuration. All fields are optional; only provided fields are updated.
Auth: JWT required. Admin or Owner required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID |
Request Parameters (all optional)
| Name | Type | Constraints | Description |
|---|---|---|---|
| folder_name | string | Regex ^[\p{L}\p{N}-]+$, unique | URL-safe identifier |
| name | string | 2–100 chars. Send "null" to clear. | Display name |
| description | string | 10–1000 chars. Send "null" or "" to clear. | Description |
| perm_join | string | See Permission Values | Who can self-join |
| perm_member_manage | string | See Permission Values | Who can manage members |
| intelligence | string | "true" or "false". Can be toggled. Setting to "true" requires both content_ai and ai_agent plan features. Disabling flushes embeddings; re-enabling re-indexes (costs AI credits). | AI indexing toggle |
| accent_color | string (JSON) | Valid JSON. Send "null" to clear. | Accent color |
| background_color1 | string (JSON) | Valid JSON. Send "null" to clear. | Background color 1 |
| background_color2 | string (JSON) | Valid JSON. Send "null" to clear. | Background color 2 |
| owner_defined | string (JSON) | Valid JSON. Send "null" or "" to clear. | Custom owner-defined properties |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/update/" \
-H "Authorization: Bearer {jwt_token}" \
-d "name=Updated Workspace Name" \
-d "description=New description for the workspace" \
-d "perm_join=Admin or above"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | User is not admin or owner |
1605 (Invalid Input) | 400 | An invalid workspace folder name was supplied. | Invalid folder_name |
1658 (Not Acceptable) | 406 | The supplied workspace folder name is already in use. | Duplicate folder_name |
1605 (Invalid Input) | 400 | Intelligence cannot be enabled once it has been disabled... | Attempted to re-enable intelligence |
1605 (Invalid Input) | 400 | Intelligence requires a plan with agentic AI support. | Plan missing content_ai or ai_agent (cannot set intelligence=true) |
1605 (Invalid Input) | 400 | An invalid configuration was supplied... | Metadata validation failure |
1663 (Update Failed) | 500 | There was an internal error processing your update request. | Internal failure |
If no fields have changed, returns
200 OKwithout making changes. JSON fields are decoded server-side; send valid JSON strings.
Delete Workspace
/current/workspace/{workspace_id}/delete/?confirm={folder_name_or_id}
Permanently close (soft-delete) a workspace. Enters a retention period before final purge.
Auth: JWT required. Owner only. 2FA required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| confirm | string | Yes | Must match the workspace's folder_name (case-insensitive) or numeric id. Safety confirmation. |
Example
curl -X DELETE "https://api.fast.io/current/workspace/12345678901234567890/delete/?confirm=engineering" \
-H "Authorization: Bearer {jwt_token}"
Response (202 Accepted)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | User is not the workspace owner |
1605 (Invalid Input) | 400 | The confirm field provided does not match. | Confirmation does not match folder name or ID |
1663 (Update Failed) | 500 | There was an internal error processing your request. | Internal failure |
Archive Workspace
/current/workspace/{workspace_id}/archive/
Archives a workspace. Archived workspaces are hidden from default listings.
Auth: JWT required. Admin or Owner required. 2FA required.
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/archive/" \
-H "Authorization: Bearer {jwt_token}"
Response (202 Accepted)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1663 (Update Failed) | 400 | The workspace is already archived. | Already archived |
Unarchive Workspace
/current/workspace/{workspace_id}/unarchive/
Restores an archived workspace to active status.
Auth: JWT required. Admin or Owner required. 2FA required.
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/unarchive/" \
-H "Authorization: Bearer {jwt_token}"
Response (202 Accepted)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1663 (Update Failed) | 400 | The workspace is not archived. It cannot be unarchived. | Not currently archived |
Workspace Assets
List Available Asset Types
/current/workspace/assets/
Returns available workspace asset metadata types (e.g., logo).
Auth: JWT required.
Example
curl -X GET "https://api.fast.io/current/workspace/assets/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"assets": [
{
"name": "logo",
"type": "image",
"max_size": 5242880,
"accepted_formats": ["image/png", "image/jpeg", "image/svg+xml"]
}
]
},
"current_api_version": "1.0"
}
List Workspace Assets
/current/workspace/{workspace_id}/assets/
Returns assets currently set on the workspace.
Auth: JWT required. Owner only. 2FA required.
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/assets/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"assets": {
"logo": {
"url": "https://assets.fast.io/12345678901234567890/logo.png",
"size": 102400,
"content_type": "image/png"
}
}
},
"current_api_version": "1.0"
}
Upload/Set Workspace Asset
/current/workspace/{workspace_id}/assets/{asset_name}/
Upload or replace an asset. Sent as multipart/form-data.
Auth: JWT required. Admin or Owner required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID |
| {asset_name} | string | Yes | Name of the asset (e.g., logo) |
Request Body (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
| file | file | Yes | The asset file to upload |
| metadata | string (JSON array) | Optional metadata for the asset |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/assets/logo/" \
-H "Authorization: Bearer {jwt_token}" \
-F "file=@/path/to/logo.png" \
-F "metadata={}"
Response (200 OK)
{
"result": "yes",
"response": {
"asset": {
"name": "logo",
"url": "https://assets.fast.io/12345678901234567890/logo.png"
}
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1604 (File Missing) | 400 | Asset upload missing | No file in request |
1605 (Invalid Input) | 400 | metadata invalid | Invalid metadata format |
Delete Workspace Asset
/current/workspace/{workspace_id}/assets/{asset_name}/
Delete a specific asset from a workspace.
Auth: JWT required. Admin or Owner required.
Example
curl -X DELETE "https://api.fast.io/current/workspace/12345678901234567890/assets/logo/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Read Asset Binary
/current/workspace/{workspace_id}/assets/{asset_name}/read/
GET returns raw binary data. HEAD returns metadata headers only (Content-Type, Content-Length).
Auth: JWT required. Any workspace member. 2FA required.
Example
# Download asset
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/assets/logo/read/" \
-H "Authorization: Bearer {jwt_token}" \
--output logo.png
# Get metadata headers only
curl -I "https://api.fast.io/current/workspace/12345678901234567890/assets/logo/read/" \
-H "Authorization: Bearer {jwt_token}"
Response: Raw binary content with appropriate Content-Type header (not JSON).
Workspace Members
Add or Invite a Member
/current/workspace/{workspace_id}/members/{email_or_user_id}/
Add an existing user directly by user ID, or send an invitation by email address.
Auth: JWT required. Permission depends on workspace perm_member_manage setting.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID |
| {email_or_user_id} | string | Yes | 19-digit user ID (direct add) or email address (invitation) |
Request Parameters (adding by user ID)
| Name | Type | Required | Description |
|---|---|---|---|
| permissions | string | "admin", "member", or "guest". Cannot be "owner". | |
| notifications | string | Notification preference | |
| expires | string | Membership expiration (YYYY-MM-DD HH:MM:SS) | |
| force_notification | boolean | Force notification email to existing user |
Request Parameters (inviting by email)
| Name | Type | Required | Description |
|---|---|---|---|
| permissions | string | "admin", "member", or "guest". Cannot be "owner". | |
| message | string | Custom message in invitation email | |
| invitation_expires | string | Invitation expiration (YYYY-MM-DD HH:MM:SS) |
Examples
# Add existing user by ID
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/98765432109876543210/" \
-H "Authorization: Bearer {jwt_token}" \
-d "permissions=member"
# Invite by email
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/newuser@example.com/" \
-H "Authorization: Bearer {jwt_token}" \
-d "permissions=member" \
-d "message=Welcome to the project!"
Response — Direct Add (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Response — Invitation Sent (200 OK)
{
"result": "yes",
"response": {
"invitation": {
"id": "12345678901234567890",
"inviter": "John Doe",
"invitee_email": "newuser@example.com",
"entity_type": "workspace",
"state": "pending",
"created": "2025-01-15 10:30:00",
"expires": "2025-02-15 10:30:00"
}
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Cannot Add As Owner) | 400 | Adding a member as an owner is not allowed | Attempted owner-level permission |
1656 (Limit Exceeded) | 400 | Varies | Workspace or org member limit reached |
1680 (Access Denied) | 403 | Insufficient org permissions to invite to this workspace. | Lacks org-level permission |
1680 (Access Denied) | 403 | Insufficient permissions | Below workspace perm_member_manage level |
Adding a user to a workspace may also auto-add them to the parent organization if the workspace is configured for automatic org membership.
Remove a Member
/current/workspace/{workspace_id}/members/{user_id}/
Removes a member from the workspace. Cannot remove the workspace owner.
Auth: JWT required. Permission depends on perm_member_manage.
Example
curl -X DELETE "https://api.fast.io/current/workspace/12345678901234567890/members/98765432109876543210/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | Cannot remove the owner | Attempted to remove workspace owner |
1680 (Access Denied) | 403 | Insufficient permissions | Below required permission level |
Removing a member cascades removal into all shares within the workspace.
List Workspace Members
/current/workspace/{workspace_id}/members/list/
Lists all members with their permissions, notification preferences, and membership metadata.
Auth: JWT required. Any workspace member.
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/members/list/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"users": [
{
"id": "12345678901234567890",
"account_type": "human",
"email_address": "owner@example.com",
"first_name": "Alice",
"last_name": "Johnson",
"permissions": "owner",
"invite": "accepted",
"notify": "Email me",
"expires": null
},
{
"id": "98765432109876543210",
"account_type": "agent",
"email_address": "bot@example.com",
"first_name": "Sync",
"last_name": "Bot",
"permissions": "member",
"invite": "accepted",
"notify": "Notify me in app",
"expires": "2025-12-31 23:59:59"
}
]
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| users | array | Array of member objects |
| users[].id | string | 19-digit user profile ID |
| users[].account_type | string | "human" or "agent" |
| users[].email_address | string | Member's email address |
| users[].first_name | string | First name |
| users[].last_name | string | Last name |
| users[].permissions | string | Role: "owner", "admin", "member", "guest" |
| users[].invite | string | Invitation status |
| users[].notify | string | Notification preference |
| users[].expires | string or null | Membership expiration or null for permanent |
Leave Workspace (Self)
/current/workspace/{workspace_id}/member/
Removes the authenticated user from the workspace. Owners cannot leave; they must transfer ownership first.
Auth: JWT required.
Example
curl -X DELETE "https://api.fast.io/current/workspace/12345678901234567890/member/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | You cannot leave a workspace you are the owner of, transfer ownership or close workspace. | User is the owner |
1605 (Invalid Input) | 400 | You cannot leave an workspace you are not a member of. | Not a member |
Get Member Details
/current/workspace/{workspace_id}/member/{member_id}/details/
Returns membership details for a specific user.
Auth: JWT required. Any workspace member.
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/member/98765432109876543210/details/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"member": {
"id": "98765432109876543210",
"account_type": "human",
"email_address": "user@example.com",
"first_name": "Jane",
"last_name": "Smith",
"permissions": "member",
"invite": "accepted",
"notify": "Notify me in app",
"expires": null
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| member.id | string | 19-digit user profile ID |
| member.account_type | string | "human" or "agent" |
| member.email_address | string | Email address |
| member.first_name | string | First name |
| member.last_name | string | Last name |
| member.permissions | string | Permission level name |
| member.invite | string | Invitation status |
| member.notify | string | Notification preference |
| member.expires | string or null | Membership expiration or null |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | The membership you specified does not exist. | User is not a member |
Update a Member
/current/workspace/{workspace_id}/member/{member_id}/update/
Updates a member's role, notification preferences, or expiration.
Auth: JWT required. Permission depends on perm_member_manage.
Request Parameters (all optional)
| Name | Type | Description |
|---|---|---|
| permissions | string | New role: "admin", "member", "guest" |
| notifications | string | Notification preference |
| expires | string | Membership expiration (YYYY-MM-DD HH:MM:SS) |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/member/98765432109876543210/update/" \
-H "Authorization: Bearer {jwt_token}" \
-d "permissions=admin"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | The membership you specified does not exist. | Target is not a member |
1680 (Access Denied) | 403 | Insufficient permissions | Below required permission level |
Users cannot escalate permissions beyond their own level.
Transfer Workspace Ownership
/current/workspace/{workspace_id}/member/{member_id}/transfer_ownership/
Transfers ownership to another member. Current owner is demoted to admin.
Auth: JWT required. Owner only.
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/member/98765432109876543210/transfer_ownership/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | You cannot transfer ownership to yourself. | Target is self |
1605 (Invalid Input) | 400 | The membership you specified does not exist. | Target is not a workspace member |
1605 (Invalid Input) | 400 | Member is already an owner. | Target is already owner |
1605 (Invalid Input) | 400 | The new owner must be a member of the parent organization. | Target not in parent org |
1663 (Update Failed) | 500 | Failed to update owner of the workspace. | Internal failure |
1680 (Access Denied) | 403 | Insufficient permissions | Not the workspace owner |
Join Workspace
/current/workspace/{workspace_id}/members/join/
Self-join a workspace based on org membership. Subject to the workspace's perm_join setting.
Auth: JWT required.
Request Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| notifications | string | Notification preference |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/join/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | You do not have the appropriate permissions to join this workspace. | User's org role does not meet perm_join |
1656 (Limit Exceeded) | 400 | Varies | Workspace member limit reached |
Self-joining members are assigned the
memberrole. Only notification preferences are accepted. Self-joined memberships do not expire.
Join Workspace via Invitation
/current/workspace/{workspace_id}/members/join/{invitation_key}/{action}/
Join or decline a workspace invitation.
Auth: JWT required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {invitation_key} | string | Yes | Unique invitation key |
| {action} | string | "accept" (default) or "decline" |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/join/abc123def456/accept/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1654 (Internal Error) | 500 | Failed to get invitation. | Invalid or expired invitation key |
1680 (Access Denied) | 403 | The inviter no longer has appropriate permissions... | Inviter lost management permissions |
1656 (Limit Exceeded) | 400 | Varies | Member limit reached |
The system validates the inviter still has sufficient permissions at acceptance time. Accepting may also auto-add the user to the parent organization.
Pending Members
When a user is invited to a workspace by email but does not yet have a Fast.io account, they appear as a pending member in the member list. Pending members are placeholders that allow teams to pre-assign workflow items before the invitee signs up.
How pending members appear in responses:
- The
statusfield is"pending"(vs"active"for registered users). - An
inviteobject is included with basic invitation details (id,created,expires). email_addressshows the invited email address.first_nameis set to the invited email address;last_nameis empty.
Example Member List Entry (Pending)
{
"id": "55667788990011223344",
"account_type": "human",
"email_address": "newuser@example.com",
"first_name": "newuser@example.com",
"last_name": "",
"permissions": "member",
"status": "pending",
"invite": {
"id": "55667788990011223344",
"created": "2025-01-15 10:30:00",
"expires": "2025-02-15 10:30:00"
},
"notify": "Notify me in app",
"expires": null
}
Workflow assignments: Pending members can be assigned to tasks, approvals, and todos before they create an account. Their user ID is valid and works with all assignment endpoints.
Account claim: When the invited user signs up or accepts the invitation with an existing account, their status transitions from "pending" to "active". All existing workflow assignments (tasks, approvals, todos) are preserved and transfer automatically.
Removal: To remove a pending member, delete their invitation using the invitation endpoints (see Workspace Invitations below). Deleting the invitation removes the pending member and unassigns any workflow items associated with them.
Notifications: Pending members do not receive in-app or email notifications until they claim their account.
Workspace Invitations
List Workspace Invitations
/current/workspace/{workspace_id}/members/invitations/list/
Returns all invitations for the workspace.
Auth: JWT required. Any workspace member.
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/members/invitations/list/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"invitations": [
{
"id": "12345678901234567890",
"inviter": "Alice Johnson",
"invitee_email": "newuser@example.com",
"invitee_uid": null,
"accepted_uid": null,
"entity_type": "workspace",
"workspace": {
"id": "98765432109876543210",
"name": "Project Alpha"
},
"state": "pending",
"created": "2025-01-15 10:30:00",
"updated": "2025-01-15 10:30:00",
"expires": "2025-02-15 10:30:00"
}
]
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| invitations | array | Array of invitation objects |
| invitations[].id | string | Invitation ID |
| invitations[].inviter | string | Display name of inviting user |
| invitations[].invitee_email | string | Email the invitation was sent to |
| invitations[].invitee_uid | string or null | User ID of invitee (if they exist in the system) |
| invitations[].accepted_uid | string or null | User ID of acceptor (if accepted) |
| invitations[].entity_type | string | Always "workspace" |
| invitations[].workspace | object | Workspace details (id, name) |
| invitations[].state | string | "pending", "accepted", "declined", "expired", "revoked" |
| invitations[].created | string | Creation timestamp |
| invitations[].updated | string | Last update timestamp |
| invitations[].expires | string or null | Expiration timestamp |
List Invitations by State
/current/workspace/{workspace_id}/members/invitations/list/{state}/
Filter invitations by state.
Auth: JWT required. Any workspace member.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {state} | string | Yes | "pending", "accepted", "declined", "expired", "revoked" |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/members/invitations/list/pending/" \
-H "Authorization: Bearer {jwt_token}"
Response: Same format as List Workspace Invitations, filtered by state.
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | An invalid invitation state was supplied. | Unrecognized state |
Update an Invitation
/current/workspace/{workspace_id}/members/invitation/{invitation_id}/
Update an existing invitation. The {invitation_id} can be the numeric ID or the invitee's email address.
Auth: JWT required. Permission depends on perm_member_manage.
Request Parameters (all optional)
| Name | Type | Description |
|---|---|---|
| state | string | New state: "pending", "accepted", "declined", "expired", "revoked" |
| permissions | string | Updated permission level for membership |
| expires | string | Updated membership expiration (YYYY-MM-DD HH:MM:SS) |
Examples
# Revoke by ID
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/invitation/11111111111111111111/" \
-H "Authorization: Bearer {jwt_token}" \
-d "state=revoked"
# Update by email
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/members/invitation/user@example.com/" \
-H "Authorization: Bearer {jwt_token}" \
-d "permissions=admin"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | An invalid invitation ID or email was supplied. | Malformed identifier |
1605 (Invalid Input) | 400 | Invitation not found. | No matching invitation |
1605 (Invalid Input) | 400 | An invalid state was supplied. | Unrecognized state |
1679 (Update Failed) | 500 | Failed to update invitation. | Internal failure |
1680 (Access Denied) | 403 | Insufficient permissions | Below required permission level |
Delete an Invitation
/current/workspace/{workspace_id}/members/invitation/{invitation_id}/
Delete (revoke) an invitation. The {invitation_id} can be the numeric ID or the invitee's email.
Auth: JWT required. Permission depends on perm_member_manage.
Example
curl -X DELETE "https://api.fast.io/current/workspace/12345678901234567890/members/invitation/11111111111111111111/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | An invalid invitation ID or email was supplied. | Malformed identifier |
1605 (Invalid Input) | 400 | Invitation not found. | No matching invitation |
1666 (Delete Failed) | 500 | Failed to delete invitation. | Internal failure |
1680 (Access Denied) | 403 | Insufficient permissions | Below required permission level |
Creating Shares from Workspaces
Create Share
/current/workspace/{workspace_id}/create/share/
Create a new share within a workspace. Shares can use independent storage (isolated portal) or a workspace folder as their storage root (live folder share).
Auth: JWT required. Admin or Owner required.
For full share management documentation, see Shares reference.
Required Parameters
| Name | Type | Constraints | Description |
|---|---|---|---|
| intelligence | string | "true" or "false" | Enable AI features for the share |
| share_type | string | "send", "receive", "exchange" | Type of share |
| access_options | string | See access options below | Access control setting |
| invite | string | "owners" or "guests" | Who can manage invitations |
Optional Parameters
| Name | Type | Constraints | Description |
|---|---|---|---|
| storage_mode | string | "independent" (default) or "workspace_folder" | Storage isolation mode |
| folder_node_id | string | Valid OpaqueId | Existing workspace folder (for workspace_folder mode) |
| create_folder | string | "true" or "false" | Create new folder (for workspace_folder mode) |
| folder_name | string | Name for new folder (defaults to "Shared Folder") | |
| title | string | 2–80 chars | Display title |
| description | string | 10–500 chars | Share description |
| custom_name | string | 10–100 chars, URL-friendly | Custom URL name. Auto-generated if omitted. |
| password | string | 4–128 chars | Password protection (Send type only, requires "Anyone with the link" access) |
| expires | string | datetime | Expiration date (portals only, not for workspace folder shares) |
| notify | string | "never", "notify_on_file_received", "notify_on_file_sent_or_received" | Notification preference |
| comments_enabled | string | "true" or "false" | Enable comments |
| download_security | string | high, medium, off | Download security level. high: downloads disabled. medium: restricted. off: unrestricted. |
| guest_chat_enabled | string | "true" or "false" | Enable guest AI chat |
| accent_color | string (JSON) | Valid JSON | Accent color |
| background_color1 | string (JSON) | Valid JSON | Background color 1 |
| background_color2 | string (JSON) | Valid JSON | Background color 2 |
| owner_defined | string (JSON) | Valid JSON | Custom properties |
Access Options (access_options)
| Value | Description |
|---|---|
'Only members of the Share or Workspace' | Most restrictive (default) |
'Members of the Share, Workspace or Org' | Includes org members |
'Anyone with a registered account' | Any authenticated user |
'Anyone with the link' | Least restrictive; allows password. Not available for Receive/Exchange types. |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/create/share/" \
-H "Authorization: Bearer {jwt_token}" \
-d "title=Client Deliverables" \
-d "share_type=send" \
-d "intelligence=true" \
-d "access_options=Anyone with a registered account" \
-d "invite=owners"
Response (200 OK)
{
"result": "yes",
"response": {
"share": {
"id": "98765432109876543210",
"custom_name": "abc123opaque",
"storage_mode": "independent"
}
},
"current_api_version": "1.0"
}
Response — Workspace Folder Share
{
"result": "yes",
"response": {
"share": {
"id": "98765432109876543210",
"custom_name": "def456opaque",
"storage_mode": "workspace_folder",
"folder_node_id": "abc123def456"
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.share.id | string | 19-digit share profile ID |
| response.share.custom_name | string | URL name (custom or auto-generated) |
| response.share.storage_mode | string | "independent" or "workspace_folder" |
| response.share.folder_node_id | string | (Workspace folder shares only) Folder node ID |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1685 (Feature Limit) | 403 | The organization has reached its share creation limit... | Plan share limit exceeded |
1658 (Not Acceptable) | 406 | The supplied share custom name is already in use. | Duplicate custom_name |
1605 (Invalid Input) | 400 | An invalid share custom name was supplied. | Invalid custom_name format |
1605 (Invalid Input) | 400 | Workspace folder shares cannot have an expiration date. | expires set on workspace folder share |
1605 (Invalid Input) | 400 | Receive and Exchange shares cannot have "Anyone" access option. | Invalid access/type combination |
1605 (Invalid Input) | 400 | Password can only be set for shares with "Anyone" access option. | Password on non-public share |
1658 (Not Acceptable) | 406 | This folder has already been shared. | Folder already has a share |
1660 (Conflict) | 409 | Unable to process share creation request due to concurrent operation. | Concurrent folder share creation |
List Shares in Workspace
/current/workspace/{workspace_id}/list/shares/
Lists all shares belonging to a workspace.
Auth: JWT required. View or above.
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| archived | string | "false" | "true" for archived shares, "false" for active |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/list/shares/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"shares": [
{
"id": "98765432109876543210",
"title": "Client Deliverables",
"share_type": "send",
"custom_name": "client-deliverables",
"archived": false,
"closed": false
}
]
},
"current_api_version": "1.0"
}
Import Share into Workspace
/current/workspace/{workspace_id}/import/share/{share_id}/
Transfers a user-owned share into workspace ownership.
Auth: JWT required. Must be workspace member AND share owner.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit workspace ID |
| {share_id} | string | Yes | 19-digit share ID to import |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/import/share/98765432109876543210/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"share": {
"id": "98765432109876543210",
"parent_type": "workspace",
"parent_workspace": "12345678901234567890"
}
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | This share is not owned by you and cannot be imported. | Share parent is not the current user |
1650 (Authentication Invalid) | 401 | You must be the owner of the share to import it to a workspace. | Not the share owner |
1605 (Invalid Input) | 400 | The share has multiple owners... | Remove other owners first |
1685 (Feature Limit) | 403 | The workspace has reached its share limit... | Plan limit exceeded |
Share must be user-owned (not already in another workspace). User must be the sole owner. Multiple owners must be removed first. Archived shares are auto-unarchived during import.
Workspace Discovery
List All Workspaces
/current/workspaces/all/
Lists all workspaces the user has joined or can access across all organizations.
Auth: JWT required.
Example
curl -X GET "https://api.fast.io/current/workspaces/all/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"workspaces": [
{
"id": "12345678901234567890",
"name": "Engineering Team",
"folder_name": "engineering",
"description": "Main engineering workspace",
"accent_color": "#0066CC",
"logo": "https://assets.fast.io/12345678901234567890/logo.png",
"closed": false,
"archived": false,
"perm_join": "Member or above",
"perm_member_manage": "Admin or above",
"created": "2023-01-15 10:30:00",
"updated": "2024-01-20 14:45:00",
"user_status": "joined",
"org_domain": "acme-corp"
}
]
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response.workspaces | array | Array of workspace objects |
| [].id | string | 19-digit workspace profile ID |
| [].name | string | Display name |
| [].folder_name | string | URL-safe folder identifier |
| [].description | string or null | Description |
| [].accent_color | string or null | Brand accent color |
| [].logo | string or null | Logo asset URL |
| [].closed | boolean | Whether closed |
| [].archived | boolean | Whether archived |
| [].perm_join | string | Who can join |
| [].perm_member_manage | string | Who can manage members |
| [].created | string | Creation timestamp |
| [].updated | string | Last update timestamp |
| [].user_status | string | "joined", "invited", or "available" |
| [].org_domain | string | Parent organization domain |
Spans all organizations the user belongs to. Workspaces from orgs without active subscriptions are filtered out.
List Available Workspaces
/current/workspaces/available/
Lists workspaces the user can join but has not yet joined. Useful for discovery UI.
Auth: JWT required.
Example
curl -X GET "https://api.fast.io/current/workspaces/available/" \
-H "Authorization: Bearer {jwt_token}"
Response: Same structure as List All Workspaces, but only includes un-joined workspaces.
Check Workspace Name
/current/workspaces/check/name/{name}/
Checks if a workspace folder name is already in use. Useful for real-time form validation.
Auth: JWT required. Org membership (Member or above) required. 2FA required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {name} | string | Yes | The folder name to check |
Example
curl -X GET "https://api.fast.io/current/workspaces/check/name/engineering/" \
-H "Authorization: Bearer {jwt_token}"
Response — Name Available (202 Accepted)
{
"result": "yes",
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1605 (Invalid Input) | 400 | An invalid workspace folder name was supplied. | Invalid name format |
1658 (Not Acceptable) | 406 | The supplied workspace folder name is already in use. | Name taken |
1680 (Access Denied) | 403 | Permission denied | Not an org member |
Checks globally across all workspaces, not just the current org. Returns
202 Accepted(not200 OK) when the name is available.
List Workspaces in Org
/current/org/{org_id}/list/workspaces/
Lists workspaces within a specific organization. Paginated.
Auth: JWT required.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {org_id} | string | Yes | 19-digit numeric organization ID |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| limit | integer | 100 | 1–500, items per page |
| offset | integer | 0 | Items to skip |
| archived | string | "false" | "true" for archived, "false" for active |
Example
curl -X GET "https://api.fast.io/current/org/10000000000000000001/list/workspaces/?limit=50&offset=0" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"workspaces": [
{
"id": "12345678901234567890",
"folder_name": "engineering",
"name": "Engineering Team",
"description": "Main project workspace"
}
],
"pagination": {
"total": 5,
"limit": 50,
"offset": 0,
"has_more": false
}
},
"current_api_version": "1.0"
}
Access Levels
| Role | Visibility |
|---|---|
| Org Owner | All workspaces |
| Org Admin | All workspaces |
| Org Member | Workspaces matching perm_join permission |
| External User | Only workspaces where they are a direct member |
Cloud Import
Enable Cloud Import
/current/workspace/{workspace_id}/cloud-import/enable/
Enables cloud import features for a workspace. If already enabled, returns success with a message indicating the current state.
Auth: JWT required. Admin or Owner required. Requires the cloud import billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/cloud-import/enable/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"message": "Cloud import features enabled",
"cloud_import": true
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1685 (Feature Limit) | 403 | Feature not available | Cloud import not included in billing plan |
1654 (Internal Error) | 500 | Failed to enable cloud import features | Internal failure |
Disable Cloud Import
/current/workspace/{workspace_id}/cloud-import/disable/
Disables cloud import features for a workspace. If already disabled, returns success with a message indicating the current state.
Auth: JWT required. Admin or Owner required. Requires the cloud import billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/cloud-import/disable/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"message": "Cloud import features disabled",
"cloud_import": false
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1685 (Feature Limit) | 403 | Feature not available | Cloud import not included in billing plan |
1654 (Internal Error) | 500 | Failed to disable cloud import features | Internal failure |
Workflow
Enable Workflow
/current/workspace/{workspace_id}/workflow/enable/
Enables workflow features (tasks, todos, approvals) for a workspace. If already enabled, returns success with a message indicating the current state.
Auth: JWT required. Admin or Owner required. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/workflow/enable/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"message": "Workflow features enabled",
"workflow": true
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1685 (Feature Limit) | 403 | Feature not available | Workflow not included in billing plan |
1654 (Internal Error) | 500 | Failed to enable workflow features | Internal failure |
Disable Workflow
/current/workspace/{workspace_id}/workflow/disable/
Disables workflow features for a workspace. If already disabled, returns success with a message indicating the current state.
Auth: JWT required. Admin or Owner required. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/workflow/disable/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"message": "Workflow features disabled",
"workflow": false
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Permission denied | Not admin or owner |
1685 (Feature Limit) | 403 | Feature not available | Workflow not included in billing plan |
1654 (Internal Error) | 500 | Failed to disable workflow features | Internal failure |
Task Lists
Task lists are a workflow feature. Workflow must be enabled on the workspace before using these endpoints. All task list endpoints support Accept: text/markdown for markdown-formatted output.
List Task Lists
/current/workspace/{workspace_id}/tasks/
Returns all task lists for the workspace. Supports pagination and markdown output.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| limit | integer | 100 | Items per page |
| offset | integer | 0 | Items to skip |
Headers
| Header | Value | Description |
|---|---|---|
| Accept | text/markdown | (Optional) Return markdown-formatted output instead of JSON |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/tasks/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"task_lists": [
{
"id": "abc123opaque",
"profile_id": "12345678901234567890",
"name": "Sprint Backlog",
"description": "Current sprint items",
"created_by": "98765432109876543210",
"properties": {},
"sort_order": 0,
"created": "2026-01-15T10:30:00+00:00",
"updated": "2026-01-20T14:45:00+00:00",
"deleted": null
}
],
"pagination": {
"limit": 100,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| task_lists | array | Array of task list objects |
| task_lists[].id | string | Opaque task list ID |
| task_lists[].profile_id | string | 19-digit workspace profile ID |
| task_lists[].name | string | Task list name |
| task_lists[].description | string or null | Task list description |
| task_lists[].created_by | string | 19-digit user ID of the creator |
| task_lists[].properties | object | Custom properties |
| task_lists[].sort_order | integer | Sort order position |
| task_lists[].created | string | Creation timestamp (YYYY-MM-DD HH:MM:SS) |
| task_lists[].updated | string | Last update timestamp (YYYY-MM-DD HH:MM:SS) |
| task_lists[].deleted | string or null | Deletion timestamp (YYYY-MM-DD HH:MM:SS), or null |
| pagination | object | Pagination metadata |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1654 (Internal Error) | 500 | Failed to retrieve task lists | Internal failure |
Create Task List
/current/workspace/{workspace_id}/tasks/create/
Creates a new task list in the workspace. Request body is JSON.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Request Body (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Task list name |
| description | string | Task list description | |
| properties | object | Custom properties | |
| sort_order | integer | Sort order position (default: 0) |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/tasks/create/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"name": "Sprint Backlog", "description": "Current sprint items"}'
Response (200 OK)
{
"result": "yes",
"response": {
"task_list": {
"id": "abc123opaque",
"profile_id": "12345678901234567890",
"name": "Sprint Backlog",
"description": "Current sprint items",
"created_by": "98765432109876543210",
"properties": {},
"sort_order": 0,
"created": "2026-01-15T10:30:00+00:00",
"updated": "2026-01-15T10:30:00+00:00",
"deleted": null
}
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1605 (Invalid Input) | 400 | Invalid task list name | Name validation failed |
1605 (Invalid Input) | 400 | Invalid description | Description validation failed |
1605 (Invalid Input) | 400 | Invalid JSON in request body | Malformed JSON |
1654 (Internal Error) | 500 | Failed to create task list | Internal failure |
Reorder Task Lists
/current/workspace/{workspace_id}/tasks/reorder/
Bulk reorder task lists within a workspace. All referenced task list IDs must belong to this workspace. Request body is JSON.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Request Body (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| order | array | Yes | Array of {id, sort_order} objects |
| order[].id | string | Yes | Opaque task list ID |
| order[].sort_order | integer | Yes | New sort order position |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/tasks/reorder/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"order": [{"id": "abc123", "sort_order": 0}, {"id": "def456", "sort_order": 1}]}'
Response (200 OK)
{
"result": "yes",
"response": {
"reordered": 2,
"profile_id": "12345678901234567890"
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1605 (Invalid Input) | 400 | order must be a non-empty array... | Missing or empty order array |
1605 (Invalid Input) | 400 | Each order entry must have id and sort_order fields | Malformed order entry |
1605 (Invalid Input) | 400 | Invalid task list ID format | Invalid opaque ID |
1605 (Invalid Input) | 400 | Task list ID does not belong to this workspace | ID not owned by workspace |
1654 (Internal Error) | 500 | Failed to reorder task lists | Internal failure |
Todos
Todos are a workflow feature. Workflow must be enabled on the workspace before using these endpoints. All todo endpoints support Accept: text/markdown for markdown-formatted output.
List Todos
/current/workspace/{workspace_id}/todos/
Returns all todo items for the workspace. Supports pagination and markdown output.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| limit | integer | 100 | Items per page |
| offset | integer | 0 | Items to skip |
Headers
| Header | Value | Description |
|---|---|---|
| Accept | text/markdown | (Optional) Return markdown-formatted output instead of JSON |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/todos/" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"todos": [
{
"id": "abc123opaque",
"profile_id": "12345678901234567890",
"title": "Review pull request",
"done": 0,
"assignee_id": "98765432109876543210",
"sort_order": 0,
"created_by": "98765432109876543210",
"properties": null,
"created": "2026-01-15T10:30:00+00:00",
"updated": "2026-01-20T14:45:00+00:00",
"deleted": null
}
],
"pagination": {
"limit": 100,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| todos | array | Array of todo item objects |
| todos[].id | string | Opaque todo ID |
| todos[].profile_id | string | 19-digit workspace profile ID |
| todos[].title | string | Todo title |
| todos[].done | integer | Completion status: 0 = not done, 1 = done |
| todos[].assignee_id | string or null | 19-digit user ID of the assignee, or null |
| todos[].sort_order | integer | Sort order position |
| todos[].created_by | string or null | 19-digit user ID of the creator, or null |
| todos[].properties | object or null | Custom properties |
| todos[].created | string | Creation timestamp (YYYY-MM-DD HH:MM:SS) |
| todos[].updated | string | Last update timestamp (YYYY-MM-DD HH:MM:SS) |
| todos[].deleted | string or null | Deletion timestamp (YYYY-MM-DD HH:MM:SS), or null |
| pagination | object | Pagination metadata |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1654 (Internal Error) | 500 | Failed to retrieve todo items | Internal failure |
Create Todo
/current/workspace/{workspace_id}/todos/create/
Creates a new todo item in the workspace. Request body is JSON.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Request Body (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| title | string | Yes | Todo title |
| assignee_id | string | 19-digit user ID to assign the todo to | |
| sort_order | integer | Sort order position (default: 0) | |
| properties | object | Custom properties |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/todos/create/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"title": "Review pull request", "assignee_id": "98765432109876543210"}'
Response (200 OK)
{
"result": "yes",
"response": {
"todo": {
"id": "abc123opaque",
"profile_id": "12345678901234567890",
"title": "Review pull request",
"done": 0,
"assignee_id": "98765432109876543210",
"sort_order": 0,
"created_by": "98765432109876543210",
"properties": null,
"created": "2026-01-15T10:30:00+00:00",
"updated": "2026-01-15T10:30:00+00:00",
"deleted": null
}
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1605 (Invalid Input) | 400 | Invalid title | Title validation failed |
1605 (Invalid Input) | 400 | Invalid assignee ID format | Assignee ID is not a valid numeric ID |
1605 (Invalid Input) | 400 | Invalid JSON in request body | Malformed JSON |
1654 (Internal Error) | 500 | Failed to create todo item | Internal failure |
Bulk Toggle Todos
/current/workspace/{workspace_id}/todos/bulk-toggle/
Sets the done status for multiple todo items at once. Request body is JSON.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Request Body (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| todo_ids | array | Yes | Non-empty array of opaque todo ID strings |
| done | boolean | Yes | true to mark as done, false to mark as not done |
Example
curl -X POST "https://api.fast.io/current/workspace/12345678901234567890/todos/bulk-toggle/" \
-H "Authorization: Bearer {jwt_token}" \
-H "Content-Type: application/json" \
-d '{"todo_ids": ["abc123", "def456"], "done": true}'
Response (200 OK)
{
"result": "yes",
"response": {
"toggled": 2,
"done": true
},
"current_api_version": "1.0"
}
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1605 (Invalid Input) | 400 | todo_ids must be a non-empty array | Missing or empty todo_ids |
1605 (Invalid Input) | 400 | done field is required (true or false) | Missing done field |
1605 (Invalid Input) | 400 | Invalid todo ID format | Invalid opaque ID in array |
1654 (Internal Error) | 500 | Failed to bulk toggle todo items | Internal failure |
Approvals
Approvals are a workflow feature. Workflow must be enabled on the workspace before using this endpoint. Supports Accept: text/markdown for markdown-formatted output.
List Approvals
/current/workspace/{workspace_id}/approvals/
Returns approvals for the workspace. Supports optional status filtering, pagination, and markdown output.
Auth: JWT required. View or above. Requires the workflow billing feature.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| {workspace_id} | string | Yes | 19-digit numeric workspace ID or folder_name |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| status | string | (none) | Filter by approval status |
| limit | integer | 100 | Items per page |
| offset | integer | 0 | Items to skip |
Headers
| Header | Value | Description |
|---|---|---|
| Accept | text/markdown | (Optional) Return markdown-formatted output instead of JSON |
Example
curl -X GET "https://api.fast.io/current/workspace/12345678901234567890/approvals/?status=pending" \
-H "Authorization: Bearer {jwt_token}"
Response (200 OK)
{
"result": "yes",
"response": {
"approvals": [
{
"id": "abc123opaque",
"entity_type": "file",
"entity_id": "def456opaque",
"profile_id": "12345678901234567890",
"requested_by": "98765432109876543210",
"description": "Please review this document",
"status": "pending",
"approver_id": "11111111111111111111",
"resolved_by": null,
"resolved_at": null,
"comment": null,
"deadline": "2026-02-01T00:00:00+00:00",
"node_id": "ghi789opaque",
"properties": {},
"created": "2026-01-15T10:30:00+00:00",
"updated": "2026-01-15T10:30:00+00:00"
}
],
"pagination": {
"limit": 100,
"offset": 0,
"total": 1
}
},
"current_api_version": "1.0"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| approvals | array | Array of approval objects |
| approvals[].id | string | Opaque approval ID |
| approvals[].entity_type | string | Type of entity being approved |
| approvals[].entity_id | string | Opaque ID of the entity |
| approvals[].profile_id | string | 19-digit workspace profile ID |
| approvals[].requested_by | string | 19-digit user ID of the requester |
| approvals[].description | string or null | Approval request description |
| approvals[].status | string | Current status |
| approvals[].approver_id | string or null | 19-digit user ID of the designated approver |
| approvals[].resolved_by | string or null | 19-digit user ID of whoever resolved it |
| approvals[].resolved_at | string or null | Resolution timestamp (YYYY-MM-DD HH:MM:SS) |
| approvals[].comment | string or null | Resolution comment |
| approvals[].deadline | string or null | Deadline (YYYY-MM-DD HH:MM:SS) |
| approvals[].node_id | string or null | Opaque ID of the related storage node |
| approvals[].properties | object or null | Custom properties |
| approvals[].created | string | Creation timestamp (YYYY-MM-DD HH:MM:SS) |
| approvals[].updated | string | Last update timestamp (YYYY-MM-DD HH:MM:SS) |
| pagination | object | Pagination metadata |
Error Responses
| Error Code | HTTP Status | Message | Cause |
|---|---|---|---|
1680 (Access Denied) | 403 | Workflow is not enabled | Workflow not enabled on workspace |
1605 (Invalid Input) | 400 | Invalid status filter | Unrecognized status value |
1654 (Internal Error) | 500 | Failed to retrieve approvals | Internal failure |