
How custom roles work
A custom role has three parts:- Permissions: the list of actions members assigned to the role can perform (for example, view packages, create connections, run jobs).
- Package group scope: which package groups the role applies to.
- Connection group scope: which connection groups the role applies to.
Package groups were previously called workspaces. The role-creation form, the API field names (
workspace_scope, workspace_ids), and the workspace-domain permission keys (viewWorkspace, createWorkspace, and so on) still use the legacy term. They refer to the same thing.| Scope | Effect |
|---|---|
| All package groups / All connection groups | The role applies to every package group or connection group in the account, including ones created after the role was saved. |
| Specific package groups / Specific connection groups | The role applies only to the package groups or connection groups you select. Resources outside that selection are invisible to the role. |
| No package groups / No connection groups | The role grants no access in that domain. Members assigned to the role see no resources in that domain at all, including resources that have no group assigned (orphans). Permissions tied to that domain are also hidden from the member’s effective permission set. |
How scope affects related resources
The package group scope and connection group scope also control visibility of the resources that belong to those groups:- Packages: a package is visible only when it belongs to a package group the role allows. Packages outside the role’s scope are hidden from the packages list, designer, and search.
- Jobs: a job is visible only when its package belongs to a package group the role allows. Jobs whose package is outside the role’s scope are hidden, even from the jobs list.
- Schedules: a schedule is visible only when every package it triggers is in scope. If a schedule references at least one package the user cannot see, the entire schedule is hidden so the scope does not leak the existence of out-of-scope packages.
- Connections: a connection is visible only when it belongs to a connection group the role allows. Connections without a connection group are not visible to a scoped role.
How custom roles combine with predefined roles
A member can be assigned a predefined role, one or more custom roles, or both. The two interact as follows:| Member’s roles | Effective permissions |
|---|---|
| Predefined role only | The predefined role’s permissions, unchanged. |
| Custom role(s) only | The union of every assigned custom role. |
| Predefined role plus custom role(s) | The union of the predefined role’s permissions and every assigned custom role (additive). The predefined role’s account-wide grants still apply, so adding a custom role can only ever grant more access, never restrict it. |
Access Level presets
When you create a role, the Access Level section offers four presets that pre-fill the permission checkboxes:| Preset | Use when |
|---|---|
| Reader | Read-only access. The role can list and view resources in its scope but cannot make changes. |
| Editor | View and edit. The role can update packages and package groups in scope. Connection access is view-only. |
| Operator | Edit, run, and manage. The role adds connection management and the ability to run jobs on top of Editor. |
| Custom | Pick individual permissions. The checkboxes become editable so you can build any combination. |

Creating a custom role
Prerequisites:- You must be an Owner or Admin on the account.
- Custom roles must be enabled for your account.
Enter a Name and an optional Description. Both appear in the Roles list and in the Assigned Roles picker when inviting members.
In Resource Scope, choose a package group scope and a connection group scope. Pick All, Specific (then add the package groups or connection groups), or No. The role-creation form labels the package group axis as “Workspaces” (legacy term), but the meaning is the same.
In Access Level, pick Reader, Editor, Operator, or Custom. With Custom, tick individual permissions in the resource grid below.
Optionally expand Global Permissions and grant account-wide capabilities (managing members, viewing the account profile, viewing billing).

Assigning a custom role to a member
Under Assigned Roles, tick one or more roles. Each role is labeled PREDEFINED or CUSTOM so you can tell them apart at a glance. You can combine a predefined role with one or more custom roles, or assign multiple custom roles together.

Editing or deleting a role
- Predefined roles cannot be modified or deleted.
- Custom roles can be edited at any time. Changes apply immediately to every member assigned to the role; you do not need to re-invite anyone.
- A custom role can be deleted only after every member has been unassigned from it. If you try to delete a role that still has assignees, the UI returns an error listing how many members still use the role.
API reference
The custom roles API is exposed under/api/v2/custom_roles. All endpoints require an account-scoped API key for an Owner or Admin.
List roles
Create a custom role
This example creates a package-group-scoped editor for a single package group, with no connection access. The API still uses the legacyworkspace_scope / workspace_ids field names and the *Workspace permission keys:
all, specific, or none. When the scope is specific, the matching workspace_ids or connection_group_ids array lists the resource IDs to grant access to.
Update a custom role
Delete a custom role
Assign custom roles to a member
Passcustom_role_ids to the members endpoint when inviting or updating a member:
Permission reference
The permission keys you can include when building a custom role, grouped by domain:| Domain | Permissions |
|---|---|
| Package groups (workspaces) | listWorkspaces, viewWorkspace, createWorkspace, updateWorkspace, deleteWorkspace |
| Packages | listPackages, viewPackage, createPackage, updatePackage, deletePackage, validatePackage, listPackageTemplates |
| Jobs | listJobs, viewJob, createJob, updateJob |
| Schedules | listSchedules, viewSchedule, createSchedule, updateSchedule, deleteSchedule |
| Connections | listConnections, viewConnection, createConnection, testConnection, importConnection, updateConnection, deleteConnection |
| Connection groups | listConnectionGroups, viewConnectionGroup, createConnectionGroup, updateConnectionGroup, deleteConnectionGroup |
| Clusters | listClusters, viewCluster, createCluster, updateCluster, deleteCluster |
| Members | listMembers, viewMember, createMember, updateMember, deleteMember, updateMemberRole |
| Hooks | listHooks, viewHook, createHook, updateHook, deleteHook |
| Global variables | viewGlobalVariables, updateGlobalVariables, viewGlobalSecrets, updateGlobalSecrets |
| Account | viewProfile, updateProfile, viewUsage |
| Billing | viewBilling |
| Developer | viewApiKey, regenerateApiKey, listConnectedApplications, manageConnectedApplications |
createJobis the permission to run an existing package (start a new job run). It does not grant the ability to edit the package.updatePackageis the permission to edit a package’s flow. Grant bothcreateJobandupdatePackagewhen an editor also needs to trigger runs.createPackageis the permission to create a new package. It does not implyupdatePackageon packages someone else created.