Cockroach Labs Role Management API

Manage role-based access control, including assigning and removing roles for users across organization, folder, and cluster scopes.

Business capability
Identity & Access Management BC-620.20

Operations 6

GET /api/v1/roles List all RoleGrants #
GET /api/v1/roles/{user_id} Get all role grants for a user, service account, or group #
PUT /api/v1/roles/{user_id} Replace the roles for a user, service account, or group with exactly those… #
DELETE /api/v1/roles/{user_id}/{resource_type}/{resource_id}/{role_name} Remove a role from a user, service account, or group #
POST /api/v1/roles/{user_id}/{resource_type}/{resource_id}/{role_name} Add a role to a user, service account, or group #
GET /api/v1/users/persons-by-email Search person users by email address #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cockroach-labs:cockroach-labs-role-management-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cockroach-labs-role-management-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: support@cockroachlabs.com
    name: Cockroach Labs Support
    url: https://support.cockroachlabs.com
  description: An API for managing CockroachDB Cloud resources
  title: CockroachDB Cloud Role Management API
  version: '2026-09-15'
servers:
- url: https://cockroachlabs.cloud
security:
- Bearer: []
tags:
- name: Role Management
paths:
  /api/v1/roles:
    get:
      operationId: CockroachCloud_ListRoleGrants
      summary: List all RoleGrants
      description: 'Can be used by the following roles assigned at the organization scope:

        - ORG_ADMIN

        - CLUSTER_ADMIN

        - FOLDER_ADMIN

        - AUDITOR'
      parameters:
      - name: pagination.page
        in: query
        schema:
          type: string
      - name: pagination.limit
        in: query
        schema:
          type: integer
          format: int32
      - name: pagination.as_of_time
        in: query
        schema:
          type: string
          format: date-time
      - name: pagination.sort_order
        in: query
        description: " - ASC: Sort in ascending order. This is the default unless otherwise specified.\n - DESC: Sort in descending order."
        schema:
          type: string
          enum:
          - ASC
          - DESC
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListRoleGrantsResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request GET \\\n  --url 'https://cockroachlabs.cloud/api/v1/roles?pagination.page=SOME_STRING_VALUE&pagination.limit=SOME_INTEGER_VALUE&pagination.as_of_time=SOME_STRING_VALUE&pagination.sort_order=SOME_STRING_VALUE' \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'"
  /api/v1/roles/{user_id}:
    get:
      operationId: CockroachCloud_GetAllRolesForUser
      summary: Get all role grants for a user, service account, or group
      description: 'Get all role grants for a user, service account, or group by providing its ID in the user_id path parameter.


        Can be used by the following roles assigned at the organization scope:

        - ORG_ADMIN

        - CLUSTER_ADMIN

        - FOLDER_ADMIN

        - AUDITOR'
      parameters:
      - name: user_id
        in: path
        description: 'user_id is the ID of the user, service account, or group whose roles are

          being retrieved.'
        required: true
        schema:
          type: string
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAllRolesForUserResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request GET \\\n  --url https://cockroachlabs.cloud/api/v1/roles/{user_id} \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'"
    put:
      operationId: CockroachCloud_SetRolesForUser
      summary: Replace the roles for a user, service account, or group with exactly those…
      description: 'Replace the entire role set for a user, service account, or group by providing its ID in the user_id path parameter.


        Roles that will be removed or added as a result of this call must follow the CC rules for role assignment:

        https://www.cockroachlabs.com/docs/cockroachcloud/authorization#organization-user-roles'
      parameters:
      - name: user_id
        in: path
        description: user_id is the ID of the user, service account, or group.
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetRolesForUserBody'
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAllRolesForUserResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request PUT \\\n  --url https://cockroachlabs.cloud/api/v1/roles/{user_id} \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \\\n  --json '{\"roles\":[{\"name\":\"CLUSTER_ADMIN\",\"resource\":{\"id\":\"example_cluster_id\",\"type\":\"CLUSTER\"}}],\"user_id\":\"12345678-1234-1234-1234-123456789012\"}'"
  /api/v1/roles/{user_id}/{resource_type}/{resource_id}/{role_name}:
    delete:
      operationId: CockroachCloud_RemoveUserFromRole
      summary: Remove a role from a user, service account, or group
      description: 'Remove a single role from a user, service account, or group by providing its ID in the user_id path parameter. A principal''s last remaining role cannot be removed; because groups do not hold the implicit Org Member role that users and service accounts have, a group must always retain at least one other role.


        Roles that will be removed as a result of this call must follow the CC rules for role assignment:

        https://www.cockroachlabs.com/docs/cockroachcloud/authorization#organization-user-roles'
      parameters:
      - name: user_id
        in: path
        description: 'user_id is the ID of the user, service account, or group to remove the role

          from.'
        required: true
        schema:
          type: string
      - name: resource_type
        in: path
        description: resource_type is the type of resource the role applies to.
        required: true
        schema:
          type: string
          enum:
          - ORGANIZATION
          - CLUSTER
          - FOLDER
      - name: resource_id
        in: path
        description: 'resource_id is the ID of the resource the role applies to. Pass an empty

          string for organization-scoped roles.'
        required: true
        schema:
          type: string
      - name: role_name
        in: path
        description: role_name is the role to revoke.
        required: true
        schema:
          type: string
          enum:
          - BILLING_COORDINATOR
          - ORG_ADMIN
          - ORG_MEMBER
          - CLUSTER_ADMIN
          - CLUSTER_OPERATOR_WRITER
          - CLUSTER_DEVELOPER
          - CLUSTER_CREATOR
          - FOLDER_ADMIN
          - FOLDER_MOVER
          - METRICS_VIEWER
          - CLUSTER_MONITOR
          - BILLING_VIEWER
          - AUDITOR
          - CLUSTER_DATA_ACCESSOR
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAllRolesForUserResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request DELETE \\\n  --url https://cockroachlabs.cloud/api/v1/roles/{user_id}/{resource_type}/{resource_id}/{role_name} \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'"
    post:
      operationId: CockroachCloud_AddUserToRole
      summary: Add a role to a user, service account, or group
      description: 'Add a single role to a user, service account, or group by providing its ID in the user_id path parameter.


        Roles that will be added as a result of this call must follow the CC rules for role assignment:

        https://www.cockroachlabs.com/docs/cockroachcloud/authorization#organization-user-roles'
      parameters:
      - name: user_id
        in: path
        description: user_id is the ID of the user, service account, or group to add the role to.
        required: true
        schema:
          type: string
      - name: resource_type
        in: path
        description: resource_type is the type of resource the role applies to.
        required: true
        schema:
          type: string
          enum:
          - ORGANIZATION
          - CLUSTER
          - FOLDER
      - name: resource_id
        in: path
        description: 'resource_id is the ID of the resource the role applies to. Pass an empty

          string for organization-scoped roles.'
        required: true
        schema:
          type: string
      - name: role_name
        in: path
        description: role_name is the role to grant.
        required: true
        schema:
          type: string
          enum:
          - BILLING_COORDINATOR
          - ORG_ADMIN
          - ORG_MEMBER
          - CLUSTER_ADMIN
          - CLUSTER_OPERATOR_WRITER
          - CLUSTER_DEVELOPER
          - CLUSTER_CREATOR
          - FOLDER_ADMIN
          - FOLDER_MOVER
          - METRICS_VIEWER
          - CLUSTER_MONITOR
          - BILLING_VIEWER
          - AUDITOR
          - CLUSTER_DATA_ACCESSOR
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAllRolesForUserResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request POST \\\n  --url https://cockroachlabs.cloud/api/v1/roles/{user_id}/{resource_type}/{resource_id}/{role_name} \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'"
  /api/v1/users/persons-by-email:
    get:
      operationId: CockroachCloud_GetPersonUsersByEmail
      summary: Search person users by email address
      description: 'Can be used by the following roles assigned at the organization scope:

        - ORG_ADMIN

        - CLUSTER_ADMIN

        - FOLDER_ADMIN

        - AUDITOR'
      parameters:
      - name: email
        in: query
        description: an email address is required.
        required: true
        schema:
          type: string
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetPersonUsersByEmailResponse'
        '400':
          description: Returned when a request field is invalid.
          content:
            application/json:
              schema: {}
        '401':
          description: Returned when the token bearer cannot be authenticated.
          content:
            application/json:
              schema: {}
        '403':
          description: Returned when the user does not have permission to access the resource.
          content:
            application/json:
              schema: {}
        '404':
          description: Returned when the resource does not exist.
          content:
            application/json:
              schema: {}
        '500':
          description: Server error
          content:
            application/json:
              schema: {}
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      tags:
      - Role Management
      x-codeSamples:
      - lang: Shell + Curl
        source: "curl --request GET \\\n  --url 'https://cockroachlabs.cloud/api/v1/users/persons-by-email?email=SOME_STRING_VALUE' \\\n  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'"
components:
  schemas:
    SetRolesForUserBody:
      type: object
      properties:
        roles:
          description: roles is the complete set of roles for the user, service account, or group.
          type: array
          items:
            $ref: '#/components/schemas/BuiltInRole'
      example:
        roles:
        - name: CLUSTER_ADMIN
          resource:
            id: example_cluster_id
            type: CLUSTER
        user_id: 12345678-1234-1234-1234-123456789012
      required:
      - roles
    Any:
      description: "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nIn its binary encoding, an `Any` is an ordinary message; but in other wire\nforms like JSON, it has a special encoding. The format of the type URL is\ndescribed on the `type_url` field.\n\nProtobuf APIs provide utilities to interact with `Any` values:\n\n- A 'pack' operation accepts a message and constructs a generic `Any` wrapper\n  around it.\n- An 'unpack' operation reads the content of an `Any` message, either into an\n  existing message or a new one. Unpack operations must check the type of the\n  value they unpack against the declared `type_url`.\n- An 'is' operation decides whether an `Any` contains a message of the given\n  type, i.e. whether it can 'unpack' that type.\n\nThe JSON format representation of an `Any` follows one of these cases:\n\n- For types without special-cased JSON encodings, the JSON format\n  representation of the `Any` is the same as that of the message, with an\n  additional `@type` field which contains the type URL.\n- For types with special-cased JSON encodings (typically called 'well-known'\n  types, listed in https://protobuf.dev/programming-guides/json/#any), the\n  JSON format representation has a key `@type` which contains the type URL\n  and a key `value` which contains the JSON-serialized value.\n\nThe text format representation of an `Any` is like a message with one field\nwhose name is the type URL in brackets. For example, an `Any` containing a\n`foo.Bar` message may be written `[type.googleapis.com/foo.Bar] { a: 2 }`."
      type: object
      properties:
        '@type':
          description: 'Identifies the type of the serialized Protobuf message with a URI reference

            consisting of a prefix ending in a slash and the fully-qualified type name.


            Example: type.googleapis.com/google.protobuf.StringValue


            This string must contain at least one `/` character, and the content after

            the last `/` must be the fully-qualified name of the type in canonical

            form, without a leading dot. Do not write a scheme on these URI references

            so that clients do not attempt to contact them.


            The prefix is arbitrary and Protobuf implementations are expected to

            simply strip off everything up to and including the last `/` to identify

            the type. `type.googleapis.com/` is a common default prefix that some

            legacy implementations require. This prefix does not indicate the origin of

            the type, and URIs containing it are not expected to respond to any

            requests.


            All type URL strings must be legal URI references with the additional

            restriction (for the text format) that the content of the reference

            must consist only of alphanumeric characters, percent-encoded escapes, and

            characters in the following set (not including the outer backticks):

            `/-.~_!$&()*+,;=`. Despite our allowing percent encodings, implementations

            should not unescape them to prevent confusion with existing parsers. For

            example, `type.googleapis.com%2FFoo` should be rejected.


            In the original design of `Any`, the possibility of launching a type

            resolution service at these type URLs was considered but Protobuf never

            implemented one and considers contacting these URLs to be problematic and

            a potential security issue. Do not attempt to contact type URLs.'
          type: string
      additionalProperties: {}
    GetAllRolesForUserResponse:
      type: object
      properties:
        group_roles:
          type: array
          items:
            $ref: '#/components/schemas/BuiltInFromGroups'
        roles:
          type: array
          items:
            $ref: '#/components/schemas/BuiltInRole'
    UserRoleGrants:
      type: object
      properties:
        roles:
          description: roles is the complete set of roles for the user, service account, or group.
          type: array
          items:
            $ref: '#/components/schemas/BuiltInRole'
        user_id:
          description: user_id is the ID of the user, service account, or group.
          type: string
      example:
        roles:
        - name: CLUSTER_ADMIN
          resource:
            id: example_cluster_id
            type: CLUSTER
        user_id: 12345678-1234-1234-1234-123456789012
      required:
      - user_id
      - roles
    ListRoleGrantsResponse:
      type: object
      properties:
        grants:
          type: array
          items:
            $ref: '#/components/schemas/UserRoleGrants'
        pagination:
          $ref: '#/components/schemas/KeysetPaginationResponse'
        user_group_grants:
          type: array
          items:
            $ref: '#/components/schemas/UserGroupRoleGrant'
    UserGroupRoleGrant:
      type: object
      properties:
        group_roles:
          type: array
          items:
            $ref: '#/components/schemas/BuiltInFromGroups'
        user_id:
          type: string
    Resource:
      type: object
      properties:
        id:
          type: string
        type:
          $ref: '#/components/schemas/ResourceType.Type'
      required:
      - type
    Status:
      type: object
      properties:
        code:
          type: integer
          format: int32
        details:
          type: array
          items:
            $ref: '#/components/schemas/Any'
        message:
          type: string
    GetPersonUsersByEmailResponse:
      type: object
      properties:
        user:
          $ref: '#/components/schemas/PersonUserInfo'
      required:
      - users
    PersonUserInfo:
      type: object
      properties:
        email:
          description: email is an email address.
          type: string
        id:
          description: id is the user id.
          type: string
      required:
      - id
      title: person_user_info contains information about a person
    OrganizationUserRole.Type:
      description: " - FOLDER_ADMIN: Preview: A folder admin role.\n - FOLDER_MOVER: Preview: A folder mover role.\n - AUDITOR: Limited Access: An auditor role with org-wide, read-only visibility into configuration, identity, authorization, audit logs, and cluster metadata.\n - CLUSTER_DATA_ACCESSOR: Limited Access: A cluster data accessor role with SQL and data access to clusters (databases, SQL shell, DB Console) without cluster-management privileges."
      type: string
      enum:
      - BILLING_COORDINATOR
      - ORG_ADMIN
      - ORG_MEMBER
      - CLUSTER_ADMIN
      - CLUSTER_OPERATOR_WRITER
      - CLUSTER_DEVELOPER
      - CLUSTER_CREATOR
      - FOLDER_ADMIN
      - FOLDER_MOVER
      - METRICS_VIEWER
      - CLUSTER_MONITOR
      - BILLING_VIEWER
      - AUDITOR
      - CLUSTER_DATA_ACCESSOR
    KeysetPaginationResponse:
      type: object
      properties:
        next_page:
          type: string
        previous_page:
          type: string
    BuiltInFromGroups:
      type: object
      properties:
        group_names:
          type: array
          items:
            type: string
        role:
          $ref: '#/components/schemas/BuiltInRole'
    BuiltInRole:
      type: object
      properties:
        name:
          $ref: '#/components/schemas/OrganizationUserRole.Type'
        resource:
          $ref: '#/components/schemas/Resource'
      required:
      - name
      - resource
    ResourceType.Type:
      description: " - ORGANIZATION: An organization.\n - CLUSTER: A cluster resource.\n - FOLDER: Preview: A folder resource."
      type: string
      enum:
      - ORGANIZATION
      - CLUSTER
      - FOLDER
    SetRolesForUserRequest:
      type: object
      description: Request body for setting all roles for a user.
      required:
      - roles
      properties:
        roles:
          type: array
          description: Complete set of role grants to assign to the user.
          items:
            type: object
    Error:
      type: object
      description: Standard error response returned by the API.
      properties:
        code:
          type: integer
          description: HTTP status code of the error.
        message:
          type: string
          description: Human-readable description of the error.
        details:
          type: array
          description: Additional detail objects providing error context.
          items:
            type: object
    PaginationResponse:
      type: object
      description: Pagination metadata included in list responses.
      properties:
        next:
          type: string
          description: Token or cursor for retrieving the next page of results.
        last:
          type: string
          description: Token or cursor for the last page of results.
        time:
          type: string
          format: date-time
          description: Server time at which the paginated query was executed.
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
    bearerAuth:
      type: http
      scheme: bearer
      description: Bearer token authentication. Generate a token in the CockroachDB Cloud Console under Organization Settings > API Access.
  parameters:
    paginationPage:
      name: pagination.page
      in: query
      description: Page number for paginated results, starting from 1.
      schema:
        type: string
    resourceId:
      name: id
      in: path
      required: true
      description: Unique identifier of the resource.
      schema:
        type: string
    paginationAsOfTime:
      name: pagination.as_of_time
      in: query
      description: RFC3339 timestamp to return results as they were at a specific point in time (time-travel query).
      schema:
        type: string
        format: date-time
    userId:
      name: user_id
      in: path
      required: true
      description: Unique identifier of the user.
      schema:
        type: string
    paginationLimit:
      name: pagination.limit
      in: query
      description: Maximum number of results to return per page.
      schema:
        type: integer
        format: int32
        minimum: 1
        maximum: 500
    paginationSortOrder:
      name: pagination.sort_order
      in: query
      description: Sort direction for paginated results. Accepted values are ASC and DESC.
      schema:
        type: string
        enum:
        - ASC
        - DESC
    roleName:
      name: role_name
      in: path
      required: true
      description: Name of the role to grant or revoke.
      schema:
        type: string
    resourceType:
      name: resource_type
      in: path
      required: true
      description: Type of resource the role is scoped to. Accepted values include ORGANIZATION, FOLDER, CLUSTER.
      schema:
        type: string
        enum:
        - ORGANIZATION
        - FOLDER
        - CLUSTER
  responses:
    Unauthorized:
      description: Authentication credentials are missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: The request body or parameters are invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
externalDocs:
  description: Use the CockroachDB Cloud API
  url: https://www.cockroachlabs.com/docs/cockroachcloud/cloud-api.html