Fine-grained access control API

    The API can be used to create, update, get and list roles, and create or remove built-in role assignments. To use the API, you would need to enable fine-grained access control.

    The API does not currently work with an API Token. So in order to use these API endpoints you will have to use .

    Returns an indicator to check if fine-grained access control is enabled or not.

    Example request

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "enabled": true
    5. }

    Status codes

    CodeDescription
    200Returned a flag indicating if the fine-grained access control is enabled or no.
    403Access denied
    404Not found, an indication that fine-grained access control is not available at all.
    500Unexpected error. Refer to body and/or server logs for more details.

    Get all roles

    GET /api/access-control/roles

    Gets all existing roles. The response contains all global and organization local roles, for the organization which user is signed in. Refer to the for more information.

    Required permissions

    ActionScope
    roles:listroles:*

    Example request

    1. GET /api/access-control/roles
    2. Accept: application/json
    3. Content-Type: application/json

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. [
    4. {
    5. "version": 1,
    6. "uid": "Kz9m_YjGz",
    7. "name": "fixed:reporting:admin:edit",
    8. "description": "Gives access to edit any report or the organization's general reporting settings.",
    9. "global": true,
    10. "updated": "2021-05-13T16:24:26+02:00",
    11. "created": "2021-05-13T16:24:26+02:00"
    12. },
    13. {
    14. "version": 5,
    15. "uid": "vi9mlLjGz",
    16. "name": "fixed:permissions:admin:read",
    17. "description": "Gives access to read and list roles and permissions, as well as built-in role assignments.",
    18. "global": true,
    19. "created": "2021-05-13T16:24:26+02:00"
    20. }
    21. ]

    Status codes

    CodeDescription
    200Global and organization local roles are returned.
    403Access denied
    500Unexpected error. Refer to body and/or server logs for more details.

    Get a role

    GET /api/access-control/roles/:uid

    Get a role for the given UID.

    Required permissions

    ActionScope
    roles:readroles:*

    Example request

    1. GET /api/access-control/roles/PYnDO3rMk
    2. Accept: application/json
    3. Content-Type: application/json

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "version": 2,
    5. "uid": "jZrmlLCGk",
    6. "name": "fixed:permissions:admin:edit",
    7. "description": "Gives access to create, update and delete roles, as well as manage built-in role assignments.",
    8. "global": true,
    9. "permissions": [
    10. {
    11. "action": "roles:delete",
    12. "scope": "permissions:delegate",
    13. "updated": "2021-05-13T16:24:26+02:00",
    14. "created": "2021-05-13T16:24:26+02:00"
    15. },
    16. {
    17. "action": "roles:list",
    18. "scope": "roles:*",
    19. "updated": "2021-05-13T16:24:26+02:00",
    20. "created": "2021-05-13T16:24:26+02:00"
    21. }
    22. ],
    23. "updated": "2021-05-13T16:24:26+02:00",
    24. "created": "2021-05-13T16:24:26+02:00"
    25. }

    Status codes

    CodeDescription
    200Role is returned.
    403Access denied
    500Unexpected error. Refer to body and/or server logs for more details.

    Creates a new custom role and maps given permissions to that role. Note that roles with the same prefix as Fixed Roles can’t be created.

    Required permissions

    permission:delegate scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a custom role which allows to do that. This is done to prevent escalation of privileges.

    ActionScope
    roles:writepermissions:delegate

    Example request

    JSON body schema

    Field NameDate TypeRequiredDescription
    uidstringNoUID of the role. If not present, the UID will be automatically created for you and returned in response. Refer to the Custom roles for more information.
    globalbooleanNoA flag indicating if the role is global or not. If set to false, the default org ID of the authenticated user will be used from the request. Refer to the for more information.
    versionnumberNoVersion of the role. If not present, version 0 will be assigned to the role and returned in the response. Refer to the Custom roles for more information.
    namestringYesName of the role. Refer to for more information.
    descriptionstringNoDescription of the role.
    permissionsPermissionNoIf not present, the role will be created without any permissions.

    Permission

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "uid": "jZrmlLCGka",
    5. "name": "custom:delete:create:roles",
    6. "description": "My custom role which gives users permissions to delete and create roles",
    7. "global": true,
    8. "permissions": [
    9. {
    10. "action": "roles:delete",
    11. "scope": "permissions:delegate",
    12. "updated": "2021-05-13T23:19:46+02:00",
    13. "created": "2021-05-13T23:19:46+02:00"
    14. }
    15. ],
    16. "updated": "2021-05-13T23:20:51.416518+02:00",
    17. "created": "2021-05-13T23:19:46+02:00"
    18. }

    Status codes

    CodeDescription
    200Role is updated.
    400Bad request (invalid json, missing content-type, missing or invalid fields, etc.).
    403Access denied
    500Unexpected error. Refer to body and/or server logs for more details.

    Update a custom role

    PUT /api/access-control/roles/:uid

    Update the role with the given UID, and it’s permissions with the given UID. The operation is idempotent and all permissions of the role will be replaced with what is in the request. You would need to increment the version of the role with each update, otherwise the request will fail.

    Required permissions

    permission:delegate scope ensures that users can only update custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to update a custom role which allows to do that. This is done to prevent escalation of privileges.

    ActionScope
    roles:writepermissions:delegate

    Example request

    1. PUT /api/access-control/roles/jZrmlLCGka
    2. Accept: application/json
    3. Content-Type: application/json
    4. {
    5. "version": 2,
    6. "name": "custom:delete:create:roles",
    7. "description": "My custom role which gives users permissions to delete and create roles",
    8. "permissions": [
    9. {
    10. "action": "roles:delete",
    11. "scope": "permissions:delegate"
    12. },
    13. {
    14. "action": "roles:create",
    15. "scope": "permissions:delegate"
    16. }
    17. ]
    18. }

    JSON body schema

    Field NameData TypeRequiredDescription
    versionnumberYesVersion of the role. Must be incremented for update to work.
    namestringYesName of the role.
    descriptionstringNoDescription of the role.
    permissionsList of PermissionsNoThe full list of permissions the role should have after the update.

    Permission

    Field NameData TypeRequiredDescription
    actionstringYesRefer to Permissions for full list of available actions.
    scopestringNoIf not present, no scope will be mapped to the permission. Refer to for full list of available scopes.

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "version": 3,
    5. "name": "custom:delete:create:roles",
    6. "description": "My custom role which gives users permissions to delete and create roles",
    7. "permissions": [
    8. {
    9. "scope": "permissions:delegate",
    10. "updated": "2021-05-13T23:19:46.546146+02:00",
    11. "created": "2021-05-13T23:19:46.546146+02:00"
    12. },
    13. {
    14. "action": "roles:create",
    15. "scope": "permissions:delegate",
    16. "updated": "2021-05-13T23:19:46.546146+02:00",
    17. "created": "2021-05-13T23:19:46.546146+02:00"
    18. }
    19. ],
    20. "updated": "2021-05-13T23:19:46.540987+02:00",
    21. "created": "2021-05-13T23:19:46.540986+02:00"
    22. }

    Status codes

    CodeDescription
    200Role is updated.
    400Bad request (invalid json, missing content-type, missing or invalid fields, etc.).
    403Access denied
    404Role was not found to update.
    500Unexpected error. Refer to body and/or server logs for more details.

    Delete a custom role

    DELETE /api/access-control/roles/:uid?force=false

    Required permissions

    permission:delegate scope ensures that users can only delete a custom role with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to delete a custom role which allows to do that.

    ActionScope
    roles:deletepermissions:delegate

    Example request

    1. DELETE /api/access-control/roles/jZrmlLCGka?force=true
    2. Accept: application/json

    Query parameters

    ParamTypeRequiredDescription
    forcebooleanNoWhen set to true, the role will be deleted with all it’s assignments.

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. "message": "Role deleted"
    4. }

    Status codes

    API set allows to create or remove and list current assignments.

    GET /api/access-control/builtin-roles

    Gets all built-in role assignments.

    Required permissions

    ActionScope
    roles.builtin:listroles:*

    Example request

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "Admin": [
    5. {
    6. "version": 1,
    7. "uid": "qQui_LCMk",
    8. "name": "fixed:users:org:edit",
    9. "description": "",
    10. "global": true,
    11. "updated": "2021-05-13T16:24:26+02:00",
    12. "created": "2021-05-13T16:24:26+02:00"
    13. },
    14. {
    15. "version": 1,
    16. "uid": "PeXmlYjMk",
    17. "name": "fixed:users:org:read",
    18. "description": "",
    19. "global": true,
    20. "updated": "2021-05-13T16:24:26+02:00",
    21. "created": "2021-05-13T16:24:26+02:00"
    22. }
    23. ],
    24. "Grafana Admin": [
    25. {
    26. "version": 1,
    27. "uid": "qQui_LCMk",
    28. "name": "fixed:users:org:edit",
    29. "description": "",
    30. "global": true,
    31. "updated": "2021-05-13T16:24:26+02:00",
    32. "created": "2021-05-13T16:24:26+02:00"
    33. }
    34. ]
    35. }

    Status codes

    CodeDescription
    200Built-in role assignments are returned.
    403Access denied
    500Unexpected error. Refer to body and/or server logs for more details.

    Create a built-in role assignment

    POST /api/access-control/builtin-roles

    Creates a new built-in role assignment.

    Required permissions

    permission:delegate scope ensures that users can only create built-in role assignments with the roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a built-in role assignment which will allow to do that. This is done to prevent escalation of privileges.

    ActionScope
    roles.builtin:addpermissions:delegate

    Example request

    1. POST /api/access-control/builtin-roles
    2. Accept: application/json
    3. Content-Type: application/json
    4. {
    5. "roleUid": "LPMGN99Mk",
    6. "builtinRole": "Grafana Admin",
    7. "global": false
    8. }

    JSON body schema

    Field NameDate TypeRequiredDescription
    roleUidstringYesUID of the role.
    builtinRolebooleanYesCan be one of Viewer, Editor, Admin or Grafana Admin.
    globalbooleanNoA flag indicating if the assignment is global or not. If set to false, the default org ID of the authenticated user will be used from the request to create organization local assignment. Refer to the for more information.

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {
    4. "message": "Built-in role grant added"
    5. }

    Status codes

    CodeDescription
    200Role was assigned to built-in role.
    400Bad request (invalid json, missing content-type, missing or invalid fields, etc.).
    403Access denied
    404Role not found
    500Unexpected error. Refer to body and/or server logs for more details.

    Remove a built-in role assignment

    DELETE /api/access-control/builtin-roles/:builtinRole/roles/:roleUID

    Required permissions

    permission:delegate scope ensures that users can only remove built-in role assignments with the roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to remove a built-in role assignment which allows to do that.

    ActionScope
    roles.builtin:removepermissions:delegate

    Example request

    1. DELETE /api/access-control/builtin-roles/Grafana%20Admin/roles/LPMGN99Mk?global=false
    2. Accept: application/json

    Query parameters

    ParamTypeRequiredDescription
    globalbooleanNoA flag indicating if the assignment is global or not. If set to false, the default org ID of the authenticated user will be used from the request to remove assignment. Refer to the Built-in role assignments for more information.

    Example response

    1. HTTP/1.1 200 OK
    2. Content-Type: application/json; charset=UTF-8
    3. {

    Status codes