or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

audio

audio-processing.mdrealtime-transcription.mdspeech-to-speech.mdspeech-to-text.mdtext-to-speech.md
index.md
tile.json

workspace.mddocs/management/

Workspace Management

Manage workspace members, group memberships, invitations, and resource sharing permissions. Control access to voices, pronunciation dictionaries, dubbing projects, conversational AI agents, and other workspace resources.

Quick Reference

import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

const client = new ElevenLabsClient({ apiKey: "your-api-key" });
// Access this API via: client.workspace

Capabilities

Member Management

Update workspace member attributes such as workspaces, role, or groups.

/**
 * Updates attributes of a workspace member. Apart from the email identifier,
 * all parameters will remain unchanged unless specified.
 * This endpoint may only be called by workspace administrators.
 */
client.workspace.members.update(
  request: UpdateMemberRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<UpdateWorkspaceMemberResponseModel>;

interface UpdateMemberRequest {
  /** Email of the target user. (REQUIRED) */
  email: string;
  /** Whether to lock or unlock the user account. */
  isLocked?: boolean;
  /** Role dictating permissions in the workspace. */
  workspaceRole?: "owner" | "admin" | "member";
}

interface UpdateWorkspaceMemberResponseModel {
  /** Status message */
  status: string;
}

Invite Management

Send and manage workspace invitations for new members.

/**
 * Sends an email invitation to join your workspace to the provided email.
 * If the user doesn't have an account they will be prompted to create one.
 * If the user accepts this invite they will be added as a user to your workspace
 * and your subscription using one of your seats. This endpoint may only be called
 * by workspace administrators. If the user is already in the workspace a 400 error
 * will be returned.
 */
client.workspace.invites.create(
  request: InviteUserRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<AddWorkspaceInviteResponseModel>;

/**
 * Sends email invitations to join your workspace to the provided emails.
 * Requires all email addresses to be part of a verified domain. If the users
 * don't have an account they will be prompted to create one. If the users accept
 * these invites they will be added as users to your workspace and your subscription
 * using one of your seats. This endpoint may only be called by workspace administrators.
 */
client.workspace.invites.createBatch(
  request: BodyInviteMultipleUsersV1WorkspaceInvitesAddBulkPost,
  requestOptions?: RequestOptions
): HttpResponsePromise<AddWorkspaceInviteResponseModel>;

/**
 * Deletes a pending workspace invitation. This endpoint may only be called
 * by workspace administrators.
 */
client.workspace.invites.delete(
  request: BodyDeleteExistingInvitationV1WorkspaceInvitesDelete,
  requestOptions?: RequestOptions
): HttpResponsePromise<DeleteWorkspaceInviteResponseModel>;

interface BodyDeleteExistingInvitationV1WorkspaceInvitesDelete {
  /** The email of the customer */
  email: string;
}

interface DeleteWorkspaceInviteResponseModel {
  /** Status message */
  status: string;
}

interface InviteUserRequest {
  /** Email address to send the invitation to */
  email: string;
}

interface BodyInviteMultipleUsersV1WorkspaceInvitesAddBulkPost {
  /** List of email addresses to invite (must be from verified domain) */
  emails: string[];
}

interface AddWorkspaceInviteResponseModel {
  /** Status of the invitation */
  status: string;
  /** ID of the created invite (optional) */
  inviteId?: string;
}

Resource Sharing

Manage sharing permissions for workspace resources such as voices, pronunciation dictionaries, dubbing projects, and conversational AI agents.

/**
 * Gets the metadata of a resource by ID, including sharing permissions
 * and role assignments.
 */
client.workspace.resources.get(
  resource_id: string,
  request: ResourcesGetRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<ResourceMetadataResponseModel>;

/**
 * Grants a role on a workspace resource to a user, service account, group,
 * or workspace API key. Overrides any existing role. Requires admin access.
 * To target a user or service account, pass userEmail. To target a group,
 * pass groupId. To target a workspace API key, pass workspaceApiKeyId.
 */
client.workspace.resources.share(
  resource_id: string,
  request: ShareWorkspaceResourceRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<unknown>;

/**
 * Removes any existing role on a workspace resource from a user, service
 * account, group, or workspace API key. Requires admin access. Cannot
 * remove permissions from the resource creator.
 */
client.workspace.resources.unshare(
  resource_id: string,
  request: UnshareWorkspaceResourceRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<unknown>;

/**
 * Copies a workspace resource to another workspace.
 */
client.workspace.resources.copyToWorkspace(
  resource_id: string,
  request: CopyWorkspaceResourceRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<unknown>;

interface ResourcesGetRequest {
  /** Resource type of the target resource */
  resourceType: WorkspaceResourceType;
}

interface ShareWorkspaceResourceRequest {
  /** Role to grant (admin, editor, commenter, viewer) */
  role: "admin" | "editor" | "commenter" | "viewer";
  /** Resource type of the target resource */
  resourceType: WorkspaceResourceType;
  /** Email of the user or service account (optional) */
  userEmail?: string;
  /** ID of the target group, or 'default' for default permissions (optional) */
  groupId?: string;
  /** ID of the workspace API key (optional) */
  workspaceApiKeyId?: string;
}

interface UnshareWorkspaceResourceRequest {
  /** Resource type of the target resource */
  resourceType: WorkspaceResourceType;
  /** Email of the user or service account (optional) */
  userEmail?: string;
  /** ID of the target group, or 'default' for default permissions (optional) */
  groupId?: string;
  /** ID of the workspace API key (optional) */
  workspaceApiKeyId?: string;
}

interface CopyWorkspaceResourceRequest {
  /** Resource type of the target resource */
  resourceType: WorkspaceResourceType;
  /** ID of the target user */
  targetUserId: string;
}

interface ResourceMetadataResponseModel {
  /** The ID of the resource */
  resourceId: string;
  /** The type of the resource */
  resourceType: WorkspaceResourceType;
  /** The ID of the user who created the resource */
  creatorUserId?: string;
  /** Access level for anonymous users (if publicly shared) */
  anonymousAccessLevelOverride?: "admin" | "editor" | "commenter" | "viewer";
  /** Mapping of roles to group IDs */
  roleToGroupIds: Record<string, string[]>;
  /** List of users/groups who can be given access */
  shareOptions: ShareOptionResponseModel[];
}

interface ShareOptionResponseModel {
  /** Email or group name */
  name: string;
  /** User/group ID */
  id: string;
  /** Type: 'user', 'group', 'service_account', or 'workspace_api_key' */
  type: string;
}

type WorkspaceResourceType =
  | "voice"
  | "voice_collection"
  | "pronunciation_dictionary"
  | "dubbing"
  | "project"
  | "convai_agents"
  | "convai_knowledge_base_documents"
  | "convai_tools"
  | "convai_settings"
  | "convai_secrets"
  | "workspace_auth_connections"
  | "convai_phone_numbers"
  | "convai_mcp_servers"
  | "convai_api_integration_connections"
  | "convai_api_integration_trigger_connections"
  | "convai_batch_calls"
  | "convai_agent_response_tests"
  | "convai_test_suite_invocations"
  | "convai_crawl_jobs"
  | "convai_crawl_tasks"
  | "convai_whatsapp_accounts"
  | "convai_agent_versions"
  | "convai_agent_branches"
  | "convai_agent_versions_deployments"
  | "dashboard"
  | "dashboard_configuration"
  | "convai_agent_drafts"
  | "resource_locators"
  | "assets"
  | "content_generations";

Group Management

Search for workspace groups by name.

/**
 * Searches for user groups in the workspace. Multiple or no groups may be returned.
 */
client.workspace.groups.search(
  request: GroupsSearchRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<WorkspaceGroupByNameResponseModel[]>;

interface GroupsSearchRequest {
  /** Name of the group to search for */
  name: string;
}

interface WorkspaceGroupByNameResponseModel {
  /** Workspace group name */
  name: string;
  /** Workspace group ID */
  id: string;
  /** Member emails in the group */
  membersEmails: string[];
}

Group Members

Add or remove members from specific groups.

/**
 * Adds a member of your workspace to the specified group.
 * This endpoint may only be called by workspace administrators.
 */
client.workspace.groups.members.add(
  group_id: string,
  request: AddMemberToGroupRequest,
  requestOptions?: RequestOptions
): HttpResponsePromise<AddWorkspaceGroupMemberResponseModel>;

/**
 * Removes a member from the specified group.
 * This endpoint may only be called by workspace administrators.
 */
client.workspace.groups.members.remove(
  group_id: string,
  request: BodyDeleteMemberFromUserGroupV1WorkspaceGroupsGroupIdMembersRemovePost,
  requestOptions?: RequestOptions
): HttpResponsePromise<DeleteWorkspaceGroupMemberResponseModel>;

interface AddMemberToGroupRequest {
  /** Email address of the member to add to the group */
  email: string;
}

interface BodyDeleteMemberFromUserGroupV1WorkspaceGroupsGroupIdMembersRemovePost {
  /** Email address of the member to remove from the group */
  email: string;
}

interface AddWorkspaceGroupMemberResponseModel {
  /** Request status ('ok' if successful) */
  status: string;
}

interface DeleteWorkspaceGroupMemberResponseModel {
  /** Request status ('ok' if successful) */
  status: string;
}

Usage Examples

Update Member Attributes

import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

const client = new ElevenLabsClient({ apiKey: "your-api-key" });

// Update member's groups
await client.workspace.members.update({
  email: "member@example.com",
  groups: ["group-id-1", "group-id-2"],
});

console.log("Member groups updated");

Send Workspace Invitation

// Send invitation to new member
const invite = await client.workspace.invites.create({
  email: "newmember@example.com",
});

console.log("Invitation sent:", invite.status);
if (invite.inviteId) {
  console.log("Invite ID:", invite.inviteId);
}

Bulk Invite Members

// Invite multiple members at once (requires verified domain)
await client.workspace.invites.createBatch({
  emails: [
    "member1@example.com",
    "member2@example.com",
    "member3@example.com",
  ],
});

console.log("Bulk invitations sent");

Delete Pending Invitation

// Delete a pending invitation
await client.workspace.invites.delete("invite-id");
console.log("Invitation deleted");

Search for Groups

// Search for groups by name
const results = await client.workspace.groups.search({
  name: "Design",
});

console.log(`Found ${results.length} groups matching "Design"`);
for (const group of results) {
  console.log(`- ${group.name} (ID: ${group.id})`);
  console.log(`  Members: ${group.membersEmails.join(", ")}`);
}

Add Member to Group

// Add a member to a specific group
await client.workspace.groups.members.add("group-id", {
  email: "member@example.com",
});

console.log("Member added to group");

Remove Member from Group

// Remove a member from a group
await client.workspace.groups.members.remove("group-id", {
  email: "member@example.com",
});

console.log("Member removed from group");

Complete Invitation Workflow

// Complete workflow for inviting and organizing a new team member
async function inviteAndOrganize(
  email: string,
  groupIds: string[]
): Promise<void> {
  // 1. Send invitation
  const invite = await client.workspace.invites.create({ email });
  console.log(`Invitation sent to ${email}`);

  // Note: Once the user accepts the invitation, you can then:
  // 2. Add them to appropriate groups
  for (const groupId of groupIds) {
    await client.workspace.groups.members.add(groupId, { email });
    console.log(`Added ${email} to group ${groupId}`);
  }

  console.log("Onboarding complete");
}

await inviteAndOrganize("new.member@example.com", ["team-group-id"]);

Update Member Role

// Update member's role in workspace
await client.workspace.members.update({
  email: "member@example.com",
  role: "admin",
});

console.log("Member role updated to admin");

Find and Add to Group

// Search for a group and add a member to it
const groups = await client.workspace.groups.search({
  name: "Engineering",
});

if (groups.length > 0) {
  const engineeringGroup = groups[0];
  await client.workspace.groups.members.add(engineeringGroup.id, {
    email: "developer@example.com",
  });
  console.log(`Added developer to ${engineeringGroup.name} group`);
} else {
  console.log("Engineering group not found");
}

Get Resource Sharing Metadata

// Get sharing permissions for a voice
const metadata = await client.workspace.resources.get("voice-id", {
  resourceType: "voice",
});

console.log("Resource ID:", metadata.resourceId);
console.log("Creator:", metadata.creatorUserId);
console.log("Role assignments:", metadata.roleToGroupIds);

// Check who has admin access
if (metadata.roleToGroupIds.admin) {
  console.log("Admins:", metadata.roleToGroupIds.admin);
}

// Show available share options
console.log("\nAvailable to share with:");
for (const option of metadata.shareOptions) {
  console.log(`- ${option.name} (${option.type})`);
}

Share Resource with User

// Share a voice with a user, granting editor role
await client.workspace.resources.share("voice-id", {
  role: "editor",
  resourceType: "voice",
  userEmail: "colleague@example.com",
});

console.log("Voice shared with colleague");

Share Resource with Group

// Share a pronunciation dictionary with a group
await client.workspace.resources.share("dictionary-id", {
  role: "viewer",
  resourceType: "pronunciation_dictionary",
  groupId: "design-team-group-id",
});

console.log("Dictionary shared with design team");

Share Conversational AI Agent

// Share an agent with admin privileges
await client.workspace.resources.share("agent-id", {
  role: "admin",
  resourceType: "convai_agents",
  userEmail: "team-lead@example.com",
});

console.log("Agent shared with team lead as admin");

Unshare Resource

// Remove access from a user
await client.workspace.resources.unshare("voice-id", {
  resourceType: "voice",
  userEmail: "former-colleague@example.com",
});

console.log("Voice access removed");

Copy Resource to Another Workspace

// Copy a voice to another user's workspace
await client.workspace.resources.copyToWorkspace("voice-id", {
  resourceType: "voice",
  targetUserId: "other-user-id",
});

console.log("Voice copied to target workspace");

Manage Resource Permissions Workflow

// Complete workflow for sharing a resource with multiple users
async function shareWithTeam(
  resourceId: string,
  resourceType: WorkspaceResourceType,
  teamEmails: string[]
): Promise<void> {
  // 1. Get current sharing state
  const metadata = await client.workspace.resources.get(resourceId, {
    resourceType,
  });

  console.log(`Sharing ${resourceType} ${resourceId}`);
  console.log(`Current creator: ${metadata.creatorUserId}`);

  // 2. Share with each team member
  for (const email of teamEmails) {
    await client.workspace.resources.share(resourceId, {
      role: "editor",
      resourceType,
      userEmail: email,
    });
    console.log(`✓ Shared with ${email}`);
  }

  console.log("Resource shared with entire team");
}

await shareWithTeam("voice-123", "voice", [
  "member1@example.com",
  "member2@example.com",
]);

Share with Default Group Permissions

// Set default permissions for a resource
// Any workspace member will have viewer access by default
await client.workspace.resources.share("project-id", {
  role: "viewer",
  resourceType: "project",
  groupId: "default", // Special value for default permissions
});

console.log("Default viewer permissions set for all workspace members");