Workspaces and members
A workspace is the top-level tenancy unit for backups, packs, and snapshots. People access a workspace through memberships: each member has a role (and optionally extra scope tweaks). This guide describes how that model surfaces in the BackupData.io Go SDK, JavaScript/TypeScript SDK, and CLI.
For how roles map to scopes, API-key intersection, and HTTP semantics, see Roles, scopes, and permissions. To create your first workspace from the UI, see Web Portal & Free Workspace.
All snippets assume the imports and an authenticated client:
- Go SDK
- JS SDK
- CLI
import (
sdkclient "github.com/Backup-Data-io/go-sdk/client"
sdktypes "github.com/Backup-Data-io/go-sdk/types"
)
import {
BackupClient,
RoleMember,
RoleAdmin,
ScopeSnapshotsRead,
} from "@backupdata/js-sdk";
npm install -g @backupdata/js-sdk
export BACKUPDATA_API_KEY="lh_..." # Portal β API Keys
export BACKUPDATA_WORKSPACE_ID="<id>" # Portal β Workspaces
baas workspaces # the only workspace command in v0.1.5 (lists)
Member operations are SDK + Portal only β the CLI has no workspace member subcommands.
Conceptsβ
Membersβ
A workspace member ties a BackupData.io user to one workspace. The API returns metadata such as email, display name, role, optional extraScopes / revokedScopes, and when the membership was created.
Rolesβ
Roles are string labels that map to a default set of permissions on the server. The SDK defines these constants:
RoleOwner(owner)RoleAdmin(admin)RoleMember(member)RoleViewer(viewer)
When inviting (WorkspaceMemberInvite) or updating a memberβs role (WorkspaceMemberUpdate), use admin, member, or viewer. Do not send owner in invite requests.
Scopesβ
Beyond role defaults, the API can grant extraScopes or withhold revokedScopes. The SDK exposes constants including:
ScopeBackupWrite,ScopeBackupReadScopeRestoreWrite,ScopeRestoreReadScopeSnapshotsReadScopeUserReadScopeAPIKeysManageScopeWorkspaceManage
Workspaces: create, select, and inspectβ
- Go SDK
- JS SDK
- CLI
wsList, err := client.ListWorkspaces()
if err != nil {
log.Fatal(err)
}
var workspaceID string
if len(wsList.Workspaces) == 0 {
created, err := client.CreateWorkspace(sdktypes.WorkspaceCreateRequest{
Name: "prod-db-backups",
})
if err != nil {
log.Fatal(err)
}
workspaceID = created.WorkspaceID
} else {
workspaceID = wsList.Workspaces[0].WorkspaceID
}
client.SetWorkspaceID(workspaceID)
log.Printf("Using workspace: %s", workspaceID)
const wsList = await client.listWorkspaces();
let workspaceId;
if (wsList.workspaces.length === 0) {
const created = await client.createWorkspace({ name: "prod-db-backups" });
workspaceId = created.workspaceId;
} else {
workspaceId = wsList.workspaces[0].workspaceId;
}
client.setWorkspaceId(workspaceId);
console.log(`Using workspace: ${workspaceId}`);
Workspaces are created in the Portal. The CLI only lists:
baas workspaces # list
baas workspaces --api-key lh_... --workspace <id> # auth is per-command
Create / get / update / use and member management are SDK + Portal only (see JS / Go tabs).
Member operations with BackupClientβ
Note: You must have sufficient permissions (typically admin or owner role, with appropriate scopes) to perform any of the following member operations.
List membersβ
- Go SDK
- JS SDK
- CLI
members, err := client.ListWorkspaceMembers(workspaceID)
if err != nil {
return err
}
for _, m := range members {
_ = m
}
const members = await client.listWorkspaceMembers(workspaceId);
for (const m of members) {
console.log(m.userId, m.email, m.role);
}
Member listing is SDK + Portal only β client.listWorkspaceMembers() (JS) / client.ListWorkspaceMembers() (Go) or Portal β Workspace β Members.
Invite a memberβ
- Go SDK
- JS SDK
- CLI
member, err := client.AddWorkspaceMember(workspaceID, sdktypes.WorkspaceMemberInvite{
Email: "[email protected]",
Role: sdktypes.RoleMember,
})
if err != nil {
return err
}
_ = member
const member = await client.addWorkspaceMember(workspaceId, {
email: "[email protected]",
role: RoleMember,
});
Invites are SDK + Portal only β client.addWorkspaceMember() / client.AddWorkspaceMember() or Portal β Workspace β Members β Invite.
Update role and scopesβ
- Go SDK
- JS SDK
- CLI
updated, err := client.UpdateWorkspaceMember(workspaceID, userID, sdktypes.WorkspaceMemberUpdate{
Role: sdktypes.RoleAdmin,
ExtraScopes: []string{sdktypes.ScopeSnapshotsRead},
RevokedScopes: nil,
})
if err != nil {
return err
}
_ = updated
const updated = await client.updateWorkspaceMember(workspaceId, userId, {
role: RoleAdmin,
extraScopes: [ScopeSnapshotsRead],
});
Role/scope updates are SDK + Portal only β client.updateWorkspaceMember() / client.UpdateWorkspaceMember().
Remove a memberβ
- Go SDK
- JS SDK
- CLI
err := client.RemoveWorkspaceMember(workspaceID, userID)
if err != nil {
return err
}
await client.removeWorkspaceMember(workspaceId, userId);
Removal is SDK + Portal only β client.removeWorkspaceMember() / client.RemoveWorkspaceMember() or Portal β Members β Remove.