Define user permissions
Manage users
Organization-managed roles and permissions are available on the Kinde Scale plan.
By default, roles and permissions are defined once for your whole business and shared by every organization. On the Scale plan, you can also let each organization define roles and permissions of its own. This is useful when your customers need role structures you cannot predict, for example a customer who wants a billing-approver role that only exists in their organization.
This topic explains how organization-managed roles work, how to control which permissions organizations can use, and how to manage organization roles in Kinde, in the self-serve portal, and through the Kinde Management API.
permissions claim alongside business-wide permissions, and the roles themselves appear in the roles claim once you add roles to the access token for the application. Your application code does not need to distinguish them.Before an organization can build roles from your business-wide permissions, you need to mark those permissions as available to organization roles. Permissions that are not marked stay reserved for business-wide roles.
In Kinde, go to Settings > User management > Permissions.
Select Add permission, or select the three dots next to an existing permission and choose Edit permission.
Switch on Available to organization roles.
Select Save.
If you switch Available to organization roles off for a permission, it is removed from every organization role that includes it, in every environment. Members who have those roles lose the permission the next time a new access token is issued for them, unless a business-wide role they hold, or a direct grant, still grants it. Tokens already issued keep the permission until they expire, because a refresh returns the existing access token while it is unexpired.
An organization permission can only be used in that organization’s roles.
In Kinde, go to Organizations and select the organization you want to modify.
In the side menu, select Roles.
Select Add permission.
Give the permission a Name, for example ‘Approve invoices’.
Enter a Key, for example approve:invoices. The key must be unique within the organization and cannot be changed later.
Enter a Description.
Select Save. The permission can now be added to the organization’s roles.
In Kinde, go to Organizations and select the organization.
In the side menu, select Roles. The page lists the roles and permissions that belong only to this organization.
Select Add role.
Give the role a Name. Keep it short and descriptive, for example ‘Billing approver’.
Enter a Key. This is how the role appears in tokens, for example billing-approver. The key must be unique within the organization and cannot be changed later.
Enter a Description of what the role is for and who should have it.
Switch on the Permissions to include in the role. The list shows the business-wide permissions you have made available to organization roles, and this organization’s own permissions.
Select Save.
If no permissions are listed, the organization has no permissions of its own yet, and no business-wide permissions have been made available to organization roles. Add an organization permission, or mark a business-wide permission as available, before you create the role.
Like business-wide roles, changes apply to a member the next time a new access token is issued for them, for example when they sign in again or their current token expires. A refresh returns the existing access token while it is unexpired, so tokens already issued keep their claims until they expire. To apply a change to a member sooner, call the Refresh User Claims endpoint for that user. See Force-update of token claims.
In Kinde, go to Organizations and select the organization.
In the side menu, select Roles.
Select the three dots next to the role or permission and choose Edit or Delete.
Make your changes and select Save, or confirm the deletion.
Deleting an organization role removes it from every member who has it, and from the organization’s default roles. Deleting an organization permission removes it from every organization role that includes it. Neither deletion can be reversed.
Organization roles are assigned the same way as business-wide roles. See Apply roles and permissions to users.
You can let an organization’s admins create and manage roles and permissions for that organization without contacting you.
In Kinde, go to Settings > Environment > Self-serve portal. To enable this for a single organization instead, see Customize the self-serve portal for an organization.
In the Organization self-management section, switch on Roles. The switch is off by default.
If it is not already on, also switch on Members, so admins can assign the roles they create. To let them assign roles while inviting members, invitations must also be allowed for the environment. See Invite members from the portal.
Select Save.
Access inside the portal is controlled by two system permissions:
org:read:roles lets a member view the organization’s roles and permissions.org:write:roles lets a member create, edit, and delete them.The Kinde-managed owner role includes both. To give other members access, add these permissions to the roles you assign to them. See Portal access control with system permissions.
In the portal, members with access open Roles to add roles and permissions, and open Members to assign roles. Assigning roles from Members needs the org:write:members permission.
Organization roles and permissions have their own endpoints under the organization. Business-wide endpoints such as List roles and List permissions return business-wide roles and permissions only.
| Action | Endpoint | Scope |
|---|---|---|
| List organization roles | GET /api/v1/organizations/{org_code}/roles | read:organization_roles |
| Add organization role | POST /api/v1/organizations/{org_code}/roles | create:organization_roles |
| Get organization role | GET /api/v1/organizations/{org_code}/roles/{role_id} | read:organization_roles |
| Update organization role | PATCH /api/v1/organizations/{org_code}/roles/{role_id} | update:organization_roles |
| Delete organization role | DELETE /api/v1/organizations/{org_code}/roles/{role_id} | delete:organization_roles |
| List organization permissions | GET /api/v1/organizations/{org_code}/permissions | read:organization_roles |
| Add organization permission | POST /api/v1/organizations/{org_code}/permissions | create:organization_roles |
| Get organization permission | GET /api/v1/organizations/{org_code}/permissions/{permission_id} | read:organization_roles |
| Update organization permission | PATCH /api/v1/organizations/{org_code}/permissions/{permission_id} | update:organization_roles |
| Delete organization permission | DELETE /api/v1/organizations/{org_code}/permissions/{permission_id} | delete:organization_roles |
See the Organizations section of the Management API reference for request and response details.
Things to know when using the API:
is_organization_role_assignable to true when you add or update the permission. The field is also returned when you list permissions.permissions is an array of permission IDs. The request fails with PERMISSION_NOT_ASSIGNABLE if any of them is not available to the organization’s roles. When you update a role, permissions replaces the role’s entire permission set.PATCH that sends a different key fails with KEY_IMMUTABLE.INVALID_ROLES.PLAN_LIMIT_REACHED if your business is not on the Scale plan. Listing and deleting still work, so you can clean up after a downgrade.Organization roles and permissions use the same role.created, role.updated, role.deleted, permission.created, permission.updated, and permission.deleted webhook events as business-wide roles and permissions. When the role or permission belongs to an organization, data.role or data.permission includes an organization_code field. Business-wide permission events include is_organization_role_assignable instead.
Here is a decoded role.created event for an organization role. See About webhooks for the full payload format.
{ "data": { "role": { "id": "018f3d4e-6f2a-7a1b-9c3d-2e4f5a6b7c8d", "name": "Billing approver", "key": "billing-approver", "description": "Can approve invoices for this organization", "organization_code": "org_7d8e9f0a1b2c" } }, "event_id": "event_1234567890", "event_timestamp": "2026-10-27T12:00:00.000Z", "source": "admin", "timestamp": "2026-10-27T12:00:00.000Z", "type": "role.created"}If your business moves to a plan without organization-managed roles: