Quickstart
Assign roles to identities: one at a time or many at once.
Using the Console
There are two flows on the Identities page: open a single identity's drawer to manage their assignments one at a time, or tick checkboxes across multiple rows to assign the same role to all of them at once.
Assign a role to a single identity
Bulk-assign a role to multiple identities
First time setting up?
When you land on a fresh Environment (Canopy seeds every Account with a Development and Production env at signup, both empty), the Overview page shows a banner that reads "You haven't invited any users or assigned them roles yet." Click Complete Invite & Assign Users Setup to open the Setup Guide on its Invite & Assign Users tab, an interactive slide-out panel that walks you through inviting identities and assigning them roles. Each step links directly to the right page and surfaces contextual help alongside, so you don't have to bounce between docs and the Console to figure out where to click next.
What the guide walks you through:
Using the API
Two endpoints cover the same two flows. Use the single-create endpoint when adding access for one identity at a time; use the bulk-create endpoint when provisioning a cohort, syncing from an HR system, or backfilling roles after a migration. Each API key is scoped to one Environment: assignments are created in that Environment and nowhere else.
Single: Endpoint
POST /api/v1/assignmentsAuthenticate with your API key in the X-API-Key header.
Example
Send the identity, node, and role IDs in the request body. effective_from and effective_to are optional ISO-8601 timestamps:
{ "identity_id": "9d7e3a6f-2c4b-4e1a-9f5d-1a3c4b5d6e7f", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b", "effective_from": "2026-05-01T00:00:00Z", "effective_to": "2026-12-31T23:59:59Z" }
The response returns the created assignment with its id and its effective dates. The role's permissions take effect immediately at that node and every descendant, with no separate evaluation step or cache flush required.
Bulk: Endpoint
POST /api/v1/assignments/bulk-createSame auth as the single-create endpoint. The body is an array of assignments processed independently.
Example
Send an array of { identity_id, node_id, role_id } entries. Per-item effective_from / effective_to are optional:
{ "assignments": [ { "identity_id": "9d7e3a6f-2c4b-4e1a-9f5d-1a3c4b5d6e7f", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b" }, { "identity_id": "ab1cd2ef-3456-4789-abcd-ef1234567890", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b" } ] }
The endpoint returns 200 OK with { summary, results } when every item succeeded, or 207 Multi-Status with the same shape when at least one item failed (e.g., the identity already had the role). Iterate results to know which entries landed and which were skipped: partial success is the norm here, not an error.
Using the Console
Hierarchy RBAC adds one decision to every assignment: which node. You assign the same two ways as flat (one identity from the Identities page, or many at once), but the dialog's Node field is a real picker: the role applies at the node you choose and cascades to every node beneath it. You can also assign directly at a node from the Hierarchy page.
Assign a role to a single identity
Bulk-assign a role to multiple identities
Or assign directly at a node
First time setting up?
When you land on a fresh Environment (Canopy seeds every Account with a Development and Production env at signup, both empty), the Overview page shows a banner that reads "You haven't invited any users or assigned them roles yet." Click Complete Invite & Assign Users Setup to open the Setup Guide on its Invite & Assign Users tab, an interactive slide-out panel that walks you through inviting identities and assigning them roles. Each step links directly to the right page and surfaces contextual help alongside, so you don't have to bounce between docs and the Console to figure out where to click next.
What the guide walks you through:
Using the API
Same endpoints as flat RBAC: the only difference is node_id: in hierarchy mode it points at the tree node where the role should apply (not the Environment root), and the grant cascades to that node's descendants. Each API key is scoped to one Environment: assignments are created in that Environment and nowhere else.
Single: Endpoint
POST /api/v1/assignmentsAuthenticate with your API key in the X-API-Key header.
Example
Send the identity, the target node, and role IDs in the request body. effective_from and effective_to are optional ISO-8601 timestamps:
{ "identity_id": "9d7e3a6f-2c4b-4e1a-9f5d-1a3c4b5d6e7f", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b", "effective_from": "2026-05-01T00:00:00Z", "effective_to": "2026-12-31T23:59:59Z" }
The response returns the created assignment with its id and its effective dates. The role's permissions take effect immediately at that node and every descendant, with no separate evaluation step or cache flush required.
Bulk: Endpoint
POST /api/v1/assignments/bulk-createSame auth as the single-create endpoint. The body is an array of assignments processed independently.
Example
Each entry names its own node_id, so one call can grant roles at different nodes across the tree. Per-item effective_from / effective_to are optional:
{ "assignments": [ { "identity_id": "9d7e3a6f-2c4b-4e1a-9f5d-1a3c4b5d6e7f", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b" }, { "identity_id": "ab1cd2ef-3456-4789-abcd-ef1234567890", "node_id": "0aa1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c", "role_id": "5e1f2a3b-4c5d-4e6f-7a8b-9c0d1e2f3a4b" } ] }
The endpoint returns 200 OK with { summary, results } when every item succeeded, or 207 Multi-Status with the same shape when at least one item failed (e.g., the identity already had the role at that node). Iterate results to know which entries landed and which were skipped: partial success is the norm here, not an error.
Tell us how we can improve this guide.