Every server has a workspace — a virtual file system for storing files and folders. Apps can be published from workspace contents.
GET /api/servers/:serverId/workspace
const workspace = await client.getWorkspace('server-id')workspace = client.get_workspace("server-id")PATCH /api/servers/:serverId/workspace
await client.updateWorkspace('server-id', { name: 'Updated' })client.update_workspace("server-id", name="Updated")GET /api/servers/:serverId/workspace/tree
Returns the full workspace tree structure.
const tree = await client.getWorkspaceTree('server-id')tree = client.get_workspace_tree("server-id")GET /api/servers/:serverId/workspace/stats
const stats = await client.getWorkspaceStats('server-id')stats = client.get_workspace_stats("server-id")GET /api/servers/:serverId/workspace/children?parentId=folder-id
const children = await client.listWorkspaceChildren('server-id', 'parent-folder-id')children = client.list_workspace_children("server-id", parent_id="parent-folder-id")POST /api/servers/:serverId/workspace/children/batch
const result = await client.batchListChildren('server-id', ['folder-1', 'folder-2'])result = client.batch_list_children("server-id", parent_ids=["folder-1", "folder-2"])GET /api/servers/:serverId/workspace/download
Downloads the entire workspace as a ZIP file.
const blob = await client.downloadWorkspace('server-id')data = client.download_workspace("server-id")POST /api/servers/:serverId/workspace/folders
const folder = await client.createWorkspaceFolder('server-id', {
name: 'docs',
parentId: null,
})folder = client.create_workspace_folder("server-id", name="docs")PATCH /api/servers/:serverId/workspace/folders/:folderId
await client.updateWorkspaceFolder('server-id', 'folder-id', { name: 'renamed' })client.update_workspace_folder("server-id", "folder-id", name="renamed")DELETE /api/servers/:serverId/workspace/folders/:folderId
await client.deleteWorkspaceFolder('server-id', 'folder-id')client.delete_workspace_folder("server-id", "folder-id")GET /api/servers/:serverId/workspace/folders/search
const folders = await client.searchWorkspaceFolders('server-id', { query: 'docs' })folders = client.search_workspace_folders("server-id", query="docs")GET /api/servers/:serverId/workspace/folders/:folderId/download
Downloads a specific folder as a ZIP file.
const blob = await client.downloadWorkspaceFolder('server-id', 'folder-id')data = client.download_workspace_folder("server-id", "folder-id")POST /api/servers/:serverId/workspace/files
const file = await client.createWorkspaceFile('server-id', {
name: 'index.html',
content: '<h1>Hello</h1>',
parentId: 'folder-id',
})file = client.create_workspace_file("server-id",
name="index.html",
content="<h1>Hello</h1>",
parentId="folder-id",
)GET /api/servers/:serverId/workspace/files/:fileId
const file = await client.getWorkspaceFile('server-id', 'file-id')file = client.get_workspace_file("server-id", "file-id")PATCH /api/servers/:serverId/workspace/files/:fileId
await client.updateWorkspaceFile('server-id', 'file-id', {
content: '<h1>Updated</h1>',
})client.update_workspace_file("server-id", "file-id", content="<h1>Updated</h1>")DELETE /api/servers/:serverId/workspace/files/:fileId
await client.deleteWorkspaceFile('server-id', 'file-id')client.delete_workspace_file("server-id", "file-id")GET /api/servers/:serverId/workspace/files/search
const files = await client.searchWorkspaceFiles('server-id', { query: 'index' })files = client.search_workspace_files("server-id", query="index")POST /api/servers/:serverId/workspace/files/:fileId/clone
const clone = await client.cloneWorkspaceFile('server-id', 'file-id')clone = client.clone_workspace_file("server-id", "file-id")POST /api/servers/:serverId/workspace/nodes/paste
await client.pasteWorkspaceNodes('server-id', {
nodeIds: ['file-1', 'folder-1'],
targetParentId: 'destination-folder',
mode: 'copy',
})client.paste_workspace_nodes("server-id",
nodeIds=["file-1", "folder-1"],
targetParentId="destination-folder",
mode="copy",
)POST /api/servers/:serverId/workspace/commands
await client.runWorkspaceCommands('server-id', {
commands: [
{ type: 'rename', nodeId: 'file-id', name: 'new-name.txt' },
],
})client.run_workspace_commands("server-id", commands=[
{"type": "rename", "nodeId": "file-id", "name": "new-name.txt"},
])POST /api/servers/:serverId/workspace/upload
Multipart upload. Fields: file (binary), parentId (optional string).
const formData = new FormData()
formData.append('file', fileBlob, 'photo.png')
await client.uploadWorkspaceFile('server-id', formData)client.upload_workspace_file("server-id", file=open("photo.png", "rb"), parent_id="folder-id")