SlashID OAuth2 API

The OAuth2 API from SlashID — 11 operation(s) for oauth2.

OpenAPI Specification

slashid-oauth2-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: SlashID Groups OAuth2 API
  description: "This is the [OpenAPI](https://www.openapis.org/) specification for communicating with the [SlashID](https://www.slashid.dev/) service.\n\nThe latest version of the OpenAPI API spec can be fetched from [our CDN](https://cdn.slashid.com/slashid-openapi-latest.yaml).\n\nWe recommend you use an [OpenAPI SDK generator](https://openapi.tools/#sdk) to create a client library in your programming language,\nbut you can also use this documentation to make HTTP calls directly.\n\n> **Compatibility note**: We aim to keep wire compatibility whenever we update the API, but parts of the specification may occasionally be refactored.\n  If you use an SDK generator, your code may require minor changes between versions.\n"
  version: '1.1'
  termsOfService: https://www.slashid.dev/terms-of-use/
  contact:
    name: API Support
    email: contact@slashid.dev
servers:
- url: https://api.slashid.com
  description: Production
- url: https://api.sandbox.slashid.com
  description: Sandbox
security:
- ApiKeyAuth: []
tags:
- name: OAuth2
paths:
  /oauth2/clients:
    parameters:
    - $ref: '#/components/parameters/OrgIDHeader'
    post:
      operationId: PostOauth2Clients
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin
      tags:
      - OAuth2
      summary: Create a new OAuth2 client
      description: 'Create a new client ID/secret pair that can be used with the client credentials grant type.

        A valid SlashID organization ID and API key must be used to authenticate and authorize the request.

        The client credentials can be configured.


        SlashID currently supports the following OAuth 2.0 grants:

        - client credentials

        - authorization code

        - refresh token

        The `grant_types` field may contain only the values `client_credentials` and `authorization_code`.

        Other values will return a `400` error code.


        The client credentials grant requires a client secret, and so all clients allowing that grant should be regarded

        as confidential, as defined in the OAuth 2.0 specification (https://oauth.net/2/client-types/).


        The response body will include the client ID and client secret.

        For the client credentials grant, these can be used with the `/oauth2/tokens` endpoints to obtain an access token.

        For the authorization code grant, these can be used as described in the [OAuth 2.0 specification](https://datatracker.ietf.org/doc/html/rfc6749).

        The client secret must be stored securely, and cannot be retrieved in

        subsequent API calls. If you lose the client secret, a new secret can be generated using the

        `PUT /oauth2/clients/{oauth_client_id}/secret` endpoint.'
      parameters:
      - $ref: '#/components/parameters/RequiredConsistencyHeader'
      - $ref: '#/components/parameters/RequiredConsistencyTimeoutHeader'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostOAuth2ClientRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuth2ClientWithSecret'
        '400':
          $ref: '#/components/responses/BadRequest'
    get:
      operationId: GetOauth2Clients
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin,member
      tags:
      - OAuth2
      summary: Retrieve a list of OAuth2 clients
      description: 'Retrieve a list of existing OAuth 2.0 clients for your organization.

        '
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      type: array
                      items:
                        $ref: '#/components/schemas/OAuth2Client'
        '400':
          $ref: '#/components/responses/BadRequest'
  /oauth2/clients/{oauth_client_id}:
    parameters:
    - $ref: '#/components/parameters/OrgIDHeader'
    - $ref: '#/components/parameters/OAuthClientIDPathParam'
    get:
      operationId: GetOauth2ClientsOauthClientId
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin,member
      tags:
      - OAuth2
      summary: Retrieve an OAuth2 client
      description: 'Get details on the identified client. Authenticated with a SlashID organization ID and API key; the organization ID must match or be a parent of the client owner.

        '
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuth2Client'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: DeleteOauth2ClientsOauthClientId
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin
      tags:
      - OAuth2
      summary: Delete an existing OAuth2 client
      description: 'Delete the identified client. Authenticated with a SlashID organization ID and API key; the organization ID must match or be a parent of the client owner.

        '
      parameters:
      - $ref: '#/components/parameters/RequiredConsistencyHeader'
      - $ref: '#/components/parameters/RequiredConsistencyTimeoutHeader'
      responses:
        '204':
          $ref: '#/components/responses/NoContent'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: PatchOauth2ClientsOauthClientId
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin
      tags:
      - OAuth2
      summary: Modify an existing OAuth2 client
      description: 'Update the identified client. Authenticated with a SlashID organization ID and API key; the organization ID must match or be a parent of the client owner.


        SlashID currently only supported a subset of OAuth clients, therefore we enforce that grant_types must be ["client_credentials"]. Setting this field to any other value will result in an error response with a `400` status code.

        '
      parameters:
      - $ref: '#/components/parameters/RequiredConsistencyHeader'
      - $ref: '#/components/parameters/RequiredConsistencyTimeoutHeader'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchOAuth2ClientRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuth2Client'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /oauth2/clients/{oauth_client_id}/secret:
    parameters:
    - $ref: '#/components/parameters/OrgIDHeader'
    - $ref: '#/components/parameters/OAuthClientIDPathParam'
    put:
      operationId: PutOauth2ClientsOauthClientIdSecret
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin
      tags:
      - OAuth2
      summary: Generate a new client secret
      description: 'A new client secret is created and returned. The previous secret will no longer be valid after this.

        '
      parameters:
      - $ref: '#/components/parameters/RequiredConsistencyHeader'
      - $ref: '#/components/parameters/RequiredConsistencyTimeoutHeader'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuth2ClientSecretResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /oauth2/clients/{oauth_client_id}/ui-configuration:
    parameters:
    - $ref: '#/components/parameters/OrgIDHeader'
    - $ref: '#/components/parameters/OAuthClientIDPathParam'
    get:
      operationId: GetOauth2UiConfiguration
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin,member
      summary: Retrieve the configuration for the hosted UI
      description: 'The configuration is used to theme the hosted UI.

        '
      tags:
      - OAuth2
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuthClientUIConfigurationGetResponse'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: PutOauth2UiConfiguration
      x-rbac-enabled: true
      x-rbac-allowed-groups: admin
      summary: Modify the configuration for the hosted UI
      description: 'The configuration is used to theme the hosted UI.

        '
      tags:
      - OAuth2
      parameters:
      - $ref: '#/components/parameters/RequiredConsistencyHeader'
      - $ref: '#/components/parameters/RequiredConsistencyTimeoutHeader'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OAuthClientUIConfigurationPutRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/OAuthClientUIConfigurationPutResponse'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /oauth2/authorize:
    get:
      operationId: GetOauth2Authorize
      summary: Request an authorization code
      description: 'Used to initiate an authorization code flow.


        SlashID is an OAuth 2.0 and OpenID Connect 1.0 provider.

        '
      tags:
      - OAuth2
      parameters:
      - $ref: '#/components/parameters/ScopeQueryParam'
      - $ref: '#/components/parameters/ResponseTypeQueryParam'
      - $ref: '#/components/parameters/ClientIDQueryParam'
      - $ref: '#/components/parameters/RedirectURIQueryParam'
      - $ref: '#/components/parameters/StateQueryParam'
      - $ref: '#/components/parameters/CodeChallengeQueryParam'
      - $ref: '#/components/parameters/CodeChallengeMethodQueryParam'
      - $ref: '#/components/parameters/ResponseModeQueryParam'
      - $ref: '#/components/parameters/NonceQueryParam'
      - $ref: '#/components/parameters/DisplayQueryParam'
      - $ref: '#/components/parameters/PromptQueryParam'
      - $ref: '#/components/parameters/MaxAgeQueryParam'
      - $ref: '#/components/parameters/UILocalesQueryParam'
      - $ref: '#/components/parameters/LoginHintQueryParam'
      - $ref: '#/components/parameters/ACRValuesQueryParam'
      - $ref: '#/components/parameters/HandleTypesQueryParam'
      responses:
        '200':
          description: OK
          content:
            text/html:
              schema:
                type: string
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
  /oauth2/tokens:
    post:
      operationId: PostOauth2Tokens
      tags:
      - OAuth2
      security:
      - OAuth2ClientIdSecret: []
      summary: Obtain an access token
      description: 'Obtain a new OAuth 2.0 access token using an OAuth 2.0 client ID/secret pair.

        '
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PostOAuth2TokenRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostOAuth2TokenResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
  /oauth2/tokens/revoke:
    post:
      operationId: PostOauth2TokensRevoke
      tags:
      - OAuth2
      security:
      - OAuth2ClientIdSecret: []
      summary: Revoke a token
      description: 'Revoke an OAuth 2.0 token using an OAuth 2.0 client ID/secret pair.

        '
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RevokeOAuth2TokenRequest'
      responses:
        '200':
          $ref: '#/components/responses/OK'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
  /oauth2/tokens/revoke-all:
    post:
      operationId: PostOauth2TokensRevokeAll
      tags:
      - OAuth2
      security:
      - OAuth2ClientIdSecret: []
      summary: Revoke tokens
      description: 'Revoke OAuth 2.0 tokens using an OAuth 2.0 client ID/secret pair.

        '
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RevokeAllOAuth2TokensRequest'
      responses:
        '200':
          $ref: '#/components/responses/OK'
        '400':
          $ref: '#/components/responses/BadRequest'
        '403':
          $ref: '#/components/responses/Forbidden'
  /oauth2/tokens/introspect:
    post:
      operationId: PostOauth2TokensIntrospect
      tags:
      - OAuth2
      security:
      - OAuth2ClientIdSecret: []
      summary: Introspect an access token
      description: 'Introspect an OAuth 2.0 access or refresh token using an OAuth 2.0 client ID/secret pair. Note: there is a know issue for this endpoint, whereby the expiry for refresh tokens in the response is incorrect. However, expired refresh tokens will still return a response with `active: false`.

        '
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/IntrospectOAuth2TokenRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntrospectOAuth2TokenResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
  /oauth2/tokens/mint:
    parameters:
    - $ref: '#/components/parameters/OrgIDHeader'
    post:
      operationId: PostOauth2TokensMint
      tags:
      - OAuth2
      security:
      - ApiKeyAuth: []
      summary: Mint OAuth 2.0 & OIDC tokens
      description: "This endpoint creates a set of OAuth 2.0 tokens for a specific user.\n\nTo generate a refresh token request scope `offline_access`.\nTo generate an ID token request scope `openid`.\n\nCustom claims can be specified in the request body which will be added to the token's payload.\nCustom claims are added to the token's payload.\n\nTokens created with this endpoint will have an `authenticated_methods` claim equal to [\"api\"].\n\n\nThe following claims are reserved and cannot be specified:\n  - aud\n  - exp\n  - jti\n  - iat\n  - iss\n  - nbf\n  - sub\n  - prev_token_id\n  - oid\n  - org_id\n  - user_id\n  - person_id\n  - first_token\n  - authenticated_methods\n  - oidc_tokens\n  - user_token\n  - groups\n  - roles\n  - access_token\n  - refresh_token\n  - id\n  - id_token\n  - gdpr\n  - gdpr_consent\n  - gdpr_consent_level\n  - parent_user_id\n  - parent_person_id\n  - parent_org_id\n  - parent_oid\n  - attributes\n  - custom_claims\n  - slashid\n  - slashid.dev\n  - slashid.com\n  - slashid.me\n  - sid\n\n\nWith the following request body:\n\n```\n{\n    \"custom_claims\": {\n        \"foo\": \"bar\",\n        \"baz\": {\"everything\": 42}\n    }\n}\n```\n\n\nthe token in the response will have the following payload:\n\n```\n{\n  \"authenticated_methods\": [\n    \"api\"\n  ],\n  \"baz\": {\n    \"everything\": 42\n  },\n  \"exp\": <expiration time timestamp>,\n  \"first_token\": false,\n  \"foo\": \"bar\",\n  \"iat\": <issued at timestamp>,\n  \"iss\": <token issuer>,\n  \"jti\": <token ID>,\n  \"oid\": <organisation ID>,\n  \"person_id\": <person ID>\n}\n```\n"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MintOAuth2TokensRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/APIResponseBase'
                - type: object
                  required:
                  - result
                  properties:
                    result:
                      $ref: '#/components/schemas/MintOAuth2TokensResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
  /oauth2/userinfo:
    get:
      operationId: GetOauth2Userinfo
      tags:
      - OAuth2
      summary: Retrieve a person's profile
      description: 'Given the SlashID Access Token obtained during signin, this endpoint returns a person''s profile.


        This endpoint will work only if `openid` was granted as a scope for the Access Token. The information included in the response depends on the scopes requested. For example, a scope of just `openid` may return less information than a scope of `openid profile email`.

        '
      security:
      - OAuth2AccessTokenBearer: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserinfoOAuth2Response'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: PostOauth2Userinfo
      tags:
      - OAuth2
      summary: Retrieve a person's profile
      description: 'Given the SlashID Access Token obtained during signin, this endpoint returns a person''s profile.


        This endpoint will work only if `openid` was granted as a scope for the Access Token. The information included in the response depends on the scopes requested. For example, a scope of just `openid` may return less information than a scope of `openid profile email`.

        '
      security:
      - OAuth2AccessTokenBearer: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserinfoOAuth2Response'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  responses:
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIResponseBase'
    OK:
      description: OK
    NoContent:
      description: No content
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIResponseBase'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIResponseBase'
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/APIResponseBase'
  parameters:
    RequiredConsistencyHeader:
      name: SlashID-Required-Consistency
      in: header
      description: 'The consistency level required for this request. If the consistency level is not achieved within the timeout, the request will fail with a 408 Request Timeout error.

        408 Request Timeout error indicates that request was not handled within the timeout, but it may still be handled after request timeout.

        Allowed values: * `local_region`: Wait while the request executes in the local region. * `all_regions`: Wait while the request executes across all regions.

        You can learn more about our replication model on our [Cross-region Replication Model](/docs/access/concepts/replication) page.

        '
      schema:
        type: string
        enum:
        - local_region
        - all_regions
        default: local_region
    HandleTypesQueryParam:
      in: query
      name: handle_types
      schema:
        type: string
      required: false
    ClientIDQueryParam:
      in: query
      name: client_id
      schema:
        type: string
      required: true
    PromptQueryParam:
      in: query
      name: prompt
      schema:
        type: string
        enum:
        - none
        - login
      required: false
    ScopeQueryParam:
      in: query
      name: scope
      schema:
        type: string
      required: true
    NonceQueryParam:
      in: query
      name: nonce
      schema:
        type: string
      required: false
    OrgIDHeader:
      name: SlashID-OrgID
      in: header
      schema:
        type: string
      required: true
      description: The organization ID
      example: af5fbd30-7ce7-4548-8b30-4cd59cb2aba1
    CodeChallengeQueryParam:
      in: query
      name: code_challenge
      schema:
        type: string
      required: false
    ResponseTypeQueryParam:
      in: query
      name: response_type
      schema:
        type: string
      required: true
    LoginHintQueryParam:
      in: query
      name: login_hint
      schema:
        type: string
      required: false
    CodeChallengeMethodQueryParam:
      in: query
      name: code_challenge_method
      schema:
        type: string
      required: false
    RedirectURIQueryParam:
      in: query
      name: redirect_uri
      schema:
        type: string
      required: true
    OAuthClientIDPathParam:
      name: oauth_client_id
      description: An OAuth client ID
      in: path
      required: true
      schema:
        $ref: '#/components/schemas/OAuthClientID'
    ResponseModeQueryParam:
      in: query
      name: response_mode
      schema:
        type: string
      required: false
    RequiredConsistencyTimeoutHeader:
      name: SlashID-Required-Consistency-Timeout
      in: header
      description: 'The maximum amount of seconds to wait for the requested consistency level to be achieved. If the consistency level is not achieved within this time, the request will fail with a 408 Request Timeout error.

        408 Request Timeout error indicates that request was not handled within the timeout, but it may still be handled after request timeout.

        You can learn more about our replication model on our [Cross-region Replication Model](/docs/access/concepts/replication) page.

        '
      schema:
        type: integer
        default: 30
        maximum: 120
        minimum: 1
    DisplayQueryParam:
      in: query
      name: display
      schema:
        type: string
        enum:
        - page
      required: false
    StateQueryParam:
      in: query
      name: state
      schema:
        type: string
      required: false
    UILocalesQueryParam:
      in: query
      name: ui_locales
      schema:
        type: string
      required: false
    ACRValuesQueryParam:
      in: query
      name: acr_values
      schema:
        type: string
      required: false
    MaxAgeQueryParam:
      in: query
      name: max_age
      schema:
        type: integer
        format: int32
      required: false
  schemas:
    IntrospectOAuth2TokenRequest:
      type: object
      required:
      - token
      properties:
        token:
          type: string
        token_type_hint:
          $ref: '#/components/schemas/OAuth2TokenType'
        scope:
          $ref: '#/components/schemas/OAuth2ScopesSpaceDelimited'
    OAuth2Client:
      type: object
      required:
      - client_id
      - client_name
      - grant_types
      - response_types
      - scopes
      - public
      properties:
        client_id:
          $ref: '#/components/schemas/OAuth2ClientID'
        client_name:
          $ref: '#/components/schemas/OAuth2ClientName'
        grant_types:
          $ref: '#/components/schemas/OAuth2ClientGrantTypes'
        response_types:
          $ref: '#/components/schemas/OAuth2ClientResponseTypes'
        scopes:
          $ref: '#/components/schemas/OAuth2ClientScopes'
        access_token_duration:
          $ref: '#/components/schemas/OAuth2ClientAccessTokenDuration'
        refresh_token_duration:
          $ref: '#/components/schemas/OAuth2ClientRefreshTokenDuration'
        public:
          $ref: '#/components/schemas/OAuth2ClientPublic'
        redirect_uris:
          $ref: '#/components/schemas/OAuth2ClientRedirectURIs'
        created_at:
          type: string
          format: date-time
        last_used:
          type: string
          format: date-time
    OAuthClientUIConfigurationPutResponse:
      $ref: '#/components/schemas/OAuthClientUIConfiguration'
    OAuth2ClientRedirectURIs:
      description: The client's allowed redirect URIs.
      type: array
      items:
        type: string
        format: uri
      example:
      - https://example.com/redirect
    MintOAuth2TokensRequest:
      type: object
      required:
      - person_id
      - client_id
      properties:
        person_id:
          $ref: '#/components/schemas/PersonID'
        client_id:
          $ref: '#/components/schemas/OAuth2ClientID'
        scopes:
          type: array
          items:
            type: string
        custom_claims:
          type: object
          additionalProperties: true
    PostOAuth2TokenRequestRefreshToken:
      type: object
      required:
      - grant_type
      - refresh_token
      properties:
        grant_type:
          $ref: '#/components/schemas/OAuth2GrantType'
        refresh_token:
          type: string
        scope:
          $ref: '#/components/schemas/OAuth2ScopesSpaceDelimited'
    IntrospectOAuth2TokenResponse:
      type: object
      required:
      - active
      properties:
        active:
          type: boolean
          description: Whether the token is active. False for invalid and expired tokens, and tokens that are not granted the scopes specified in the request.
        client_id:
          type: string
          description: The client ID used to create this token. Only included if `active` is `true`.
        exp:
          type: integer
          description: The expiration timestamp of the token. Only included if `active` is `true`.
        iat:
          type: integer
          description: The timestamp when the token was issued. Only included if `active` is `true`.
        scope:
          type: string
          description: The scope granted to the token. Only included if `active` is `true`.
    UserinfoOAuth2Response:
      type: object
      required:
      - sub
      - iss
      - aud
      - org_id
      properties:
        sub:
          type: string
          description: The subject granted to the token, as a person ID.
        iss:
          type: string
          description: The access token issuer.
        aud:
          type: string
          description: The audience granted to th token, that is, the OAuth2 client ID.
        org_id:
          type: string
          description: The SlashID organization ID granted to the token.
        email:
          type: string
          description: The email address of the person. Only present if the authorization request included scope `email`.
        email_verified:
          type: boolean
          description: Is `true` if the ownership of the email address was verified. `false` otherwise.
        phone_number:
          type: string
          description: The phone number of the person. Only present if the authorization request included scope `phone`.
        phone_number_verified:
          type: boolean
          description: Is `true` if the ownership of the phone number was verified. `false` otherwise.
        username:
          type: string
          description: The username of the person. Only present if the authorization request included scope `username`.
    OAuth2ClientSecretResponse:
      type: object
      required:
      - client_secret
      properties:
        client_secret:
          $ref: '#/components/schemas/OAuth2ClientSecret'
    OAuth2ClientScopes:
      description: The scopes this client is allowed to request.
      type: array
      items:
        $ref: '#/components/schemas/OAuth2Scope'
      example:
      - admin
      - user
    OAuth2ClientName:
      description: Human-friendly name to identify this client.
      type: string
      example: My Awesome Application
    PostOAuth2TokenResponseRefreshToken:
      type: object
      required:
      - access_token
      - token_type
      - expires_in
      properties:
        access_token:
          type: string
        refresh_token:
          type: string
        id_token:
          type: string
        expires_in:
          type: integer
          description: Number of seconds until the token expires.
        scope:
          $ref: '#/components/schemas/OAuth2ScopesSpaceDelimited'
        token_type:
          $ref: '#/components/schemas/OAuth2AuthTokenType'
    OAuthClientUIConfigurationPutRequest:
      $ref: '#/components/schemas/OAuthClientUIConfiguration'
    PostOAuth2TokenResponseClientCredentials:
      type: object
      required:
      - access_token
      - token_type
      - expires_in
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
          description: Number of seconds until the token expires.
        scope:
          $ref: '#/components/schemas/OAuth2ScopesSpaceDelimited'
        token_type:
          $ref: '#/components/schemas/OAuth2AuthTokenType'
    PostOAuth2TokenRequestClientCredentials:
      type: object
      required:
      - grant_type
      properties:
        scope:
          $ref: '#/components/schemas/OAuth2ScopesSpaceDelimited'
        grant_type:
          $ref: '#/components/schemas/OAuth2GrantType'
    OAuth2TokenType:
      type: string
      enum:
      - access_token
      - refresh_token
      - authorize_code
      - id_token
    APIResponseBase:
      type: object
      properties:
        meta:
          $ref: '#/components/schemas/APIMeta'
        errors:
          type: array
          items:
            $ref: '#/components/schemas/APIResponseError'
    RevokeOAuth2TokenRequest:
      type: object
      required:
      - token
      properties:
        token:
          type: string
        token_type_hint:
          $ref: '#/components/schemas/OAuth2TokenType'
    PatchOAuth2ClientRequest:
      type: object
      properties:
        client_name:
          $ref: '#/components/schemas/OAuth2ClientName'
        grant_types:
          $ref: '#/components/schemas/OAuth2ClientGrantTypes'
        scopes:
          $ref: '#/components/schemas/OAuth2ClientScopes'
        access_token_duration:
          $ref: '#/components/schemas/OAuth2ClientAccessTokenDuration'
        refresh_token_duratio

# --- truncated at 32 KB (40 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/slashid/refs/heads/main/openapi/slashid-oauth2-api-openapi.yml