Skip to main content

Roles

GET /orgs/{orgId}/api/v1/admin/roles
POST /orgs/{orgId}/api/v1/admin/roles
GET /orgs/{orgId}/api/v1/admin/roles/{roleId}
PUT /orgs/{orgId}/api/v1/admin/roles/{roleId}
DELETE /orgs/{orgId}/api/v1/admin/roles/{roleId}
GET /orgs/{orgId}/api/v1/admin/roles/{roleId}/permissions
POST /orgs/{orgId}/api/v1/admin/roles/{roleId}/permissions
DELETE /orgs/{orgId}/api/v1/admin/roles/{roleId}/permissions/{permissionId}
GET /orgs/{orgId}/api/v1/admin/roles/{roleId}/users
POST /orgs/{orgId}/api/v1/admin/roles/{roleId}/users
DELETE /orgs/{orgId}/api/v1/admin/roles/{roleId}/users/{userId}

Roles group permissions together and can be assigned to users or groups. When a user authenticates, their active roles are embedded in the access token.

Authentication​

All role management endpoints require an admin API key or a Bearer token with admin:roles:read / admin:roles:write.

Each endpoint needs the credential's scope and a permission. A session or Bearer caller must hold the permission; for an API key its creator must still hold it. A missing permission returns 403 forbidden with details.required_permissions. See Required permissions.

MethodEndpointPermissionAPI-key / token scope
GET/admin/rolesroles.viewadmin:roles:read
GET/admin/roles/{roleId}roles.viewadmin:roles:read
POST/admin/rolesroles.createadmin:roles:write
PUT PATCH/admin/roles/{roleId}roles.editadmin:roles:write
DELETE/admin/roles/{roleId}roles.deleteadmin:roles:write
GET/admin/roles/{roleId}/permissionsroles.viewadmin:roles:read
PUT/admin/roles/{roleId}/permissionsroles.assign-permissionsadmin:roles:write
POST/admin/roles/{roleId}/permissionsroles.assign-permissionsadmin:roles:write
DELETE/admin/roles/{roleId}/permissions/{permissionId}roles.assign-permissionsadmin:roles:write
GET/admin/roles/{roleId}/usersroles.viewadmin:roles:read
POST/admin/roles/{roleId}/usersroles.editadmin:roles:write
DELETE/admin/roles/{roleId}/users/{userId}roles.editadmin:roles:write
Platform-wide roles are read-only

The list includes platform-wide (system) roles as well as the roles your organization created. Only roles your organization owns can be changed: updating, deleting or editing the permissions of a platform-wide role returns 404, the same as a missing role. For a platform-wide role, userCount and GET /admin/roles/{roleId}/users count and list only your organization's users.

The Role Object​

Single-role responses are wrapped in a data envelope. permissions is an array of objects (not slug strings); it and updatedAt are returned only on the single-role GET /roles/{roleId} (detailed) response — list rows omit them. updatedAt is null until the role is first updated.

Role Object
{
"data": {
"id": "17",
"name": "developer",
"slug": "developer",
"description": "Can read and write code repositories",
"isSystem": false,
"userCount": 12,
"createdAt": "2026-01-15T10:30:00Z",
"permissions": [
{
"id": "16",
"name": "View Users",
"slug": "users.view",
"resource": "users",
"action": "view"
}
],
"updatedAt": null
}
}

List Roles​

List Roles
curl "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles" \
-H "Authorization: ApiKey lmk_abc123"

Query Parameters​

ParameterDescription
pagePage number (default: 1)
limitResults per page (default: 25, max: 100)
searchFilter by name or slug
isSystemtrue to list only platform-wide roles, false for your organization's own
sortBy, sortDirSort field and direction (asc/desc)

Create Role​

Create a Role
curl -X POST https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles \
-H "Authorization: ApiKey lmk_abc123" \
-H "Content-Type: application/json" \
-d '{
"name": "developer",
"slug": "developer",
"description": "Can read and write code repositories"
}'

Returns 201 Created with the new role object.

Update Role​

Update a Role
curl -X PUT https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE... \
-H "Authorization: ApiKey lmk_abc123" \
-H "Content-Type: application/json" \
-d '{
"name": "developer",
"description": "Read and write code repositories and trigger pipelines"
}'

Manage Role Permissions​

Get Role Permissions​

Get Role Permissions
curl "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../permissions" \
-H "Authorization: ApiKey lmk_abc123"

Add a Permission to a Role​

Accepts a single permissionId or an array permissionIds for bulk assignment.

Add a Permission to a Role
curl -X POST https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../permissions \
-H "Authorization: ApiKey lmk_abc123" \
-H "Content-Type: application/json" \
-d '{"permissionId": 42}'
Bulk Assign Permissions
curl -X POST https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../permissions \
-H "Authorization: ApiKey lmk_abc123" \
-H "Content-Type: application/json" \
-d '{"permissionIds": [42, 43, 44]}'

Remove a Permission from a Role​

Remove a Permission from a Role
curl -X DELETE "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../permissions/42" \
-H "Authorization: ApiKey lmk_abc123"

Manage Role Members​

List Users in Role​

List Users with a Role
curl "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../users" \
-H "Authorization: ApiKey lmk_abc123"

Add a User to a Role​

Add a User to a Role
curl -X POST https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../users \
-H "Authorization: ApiKey lmk_abc123" \
-H "Content-Type: application/json" \
-d '{"userId": "01JF3KUSER..."}'

Remove a User from a Role​

Remove a User from a Role
curl -X DELETE "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE.../users/01JF3KUSER..." \
-H "Authorization: ApiKey lmk_abc123"

Delete Role​

Delete a Role
curl -X DELETE "https://app.lumoauth.dev/orgs/acme-corp/api/v1/admin/roles/01JF3KABCDE..." \
-H "Authorization: ApiKey lmk_abc123"

Returns 200 on success. The role is removed from all users and groups that held it.

warning

System roles (isSystem: true) cannot be deleted.