openapi: 3.0.3

info:
  title: さくらのクラウドIAM API
  version: 2.1.0
  contact:
    name: SAKURA internet Inc.
  description: さくらのクラウドIAMのAPIドキュメントです

servers:
  - url: https://secure.sakura.ad.jp/cloud/api/iam/1.0

tags:
  - name: auth
    x-displayName: 認証
    description: 認証に関する機能
  - name: user
    x-displayName: ユーザ
    description: ユーザに関する機能
  - name: user-2fa
    x-displayName: ユーザ2要素認証
    description: ユーザの2要素認証に関する機能
  - name: group
    x-displayName: グループ
    description: グループに関する機能
  - name: iam-role
    x-displayName: IAMロール
    description: IAMロールに関する機能
  - name: id-role
    x-displayName: IDロール
    description: IDロールに関する機能
  - name: project
    x-displayName: プロジェクト
    description: プロジェクトに関する機能
  - name: folder
    x-displayName: フォルダ
    description: フォルダに関する機能
  - name: iam-policy
    x-displayName: IAMポリシー
    description: IAMポリシーに関する機能
  - name: id-policy
    x-displayName: IDポリシー
    description: IDポリシーに関する機能
  - name: service-principal
    x-displayName: サービスプリンシパル
    description: サービスプリンシパルに関する機能
  - name: project-apikey
    x-displayName: プロジェクトAPIキー
    description: クラウドAPIにアクセスするためのAPIキーに関する機能。
  - name: sso
    x-displayName: SSO連携
    description: SSO連携に関する機能
  - name: organization
    x-displayName: 組織
    description: IAM APIの組織に関する機能
  - name: service-policy
    x-displayName: サービスポリシー
    description: サービスポリシーに関する機能
  - name: scim
    x-displayName: ユーザープロビジョニング
    description: ユーザープロビジョニングに関する機能

security:
  - ServicePrincipalAuth: []

paths:
  /compat/users:
    get:
      operationId: listUsers
      tags:
        - user
      summary: ユーザ一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: ordering
          in: query
          description: |
            並び替えキー
            * `code` - ユーザコード昇順
            * `-code` - ユーザコード降順
          schema:
            type: string
            enum: ["code", "-code"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/User"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createUser
      tags:
        - user
      summary: ユーザを作成する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  example: ユーザの名前
                  description: ユーザの名前
                password:
                  type: string
                  example: "********"
                  description: |
                    ユーザのパスワード
                    英数字とASCII標準文字における記号 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のみ受け付ける
                    英字と数字を必ず含める必要がある
                code:
                  type: string
                  example: user_code
                  description: ユーザコード
                description:
                  type: string
                  example: ユーザの説明
                email:
                  type: string
                  format: email
                  description: SSOプロファイル有効時に外部IdPのログインで利用するメールアドレス
              required:
                - name
                - password
                - code
                - description
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: ユーザコードやメールアドレスの重複
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /compat/users/{user_id}:
    parameters:
      - $ref: "#/components/parameters/UserID"
    get:
      operationId: readUser
      tags:
        - user
      summary: 指定したユーザを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateUser
      tags:
        - user
      summary: 指定したユーザを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
              properties:
                name:
                  type: string
                  example: ユーザの名前
                password:
                  type: string
                  example: "********"
                description:
                  type: string
                  example: ユーザの説明
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
    delete:
      operationId: deleteUser
      tags:
        - user
      summary: 指定したユーザを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /compat/users/{user_id}/deactivate-otp:
    parameters:
      - $ref: "#/components/parameters/UserID"
    post:
      operationId: deactivateOtp
      tags:
        - user-2fa
      summary: ユーザのOTPを無効化する
      description: |
        指定したユーザのワンタイムパスワード認証を無効化します。
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/trusted-devices:
    parameters:
      - $ref: "#/components/parameters/UserID"
    get:
      operationId: listTrustedDevices
      tags:
        - user-2fa
      summary: ユーザの信頼済みデバイス一覧を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/UserTrustedDevice"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/trusted-devices/{trusted_device_id}:
    parameters:
      - $ref: "#/components/parameters/UserID"
      - $ref: "#/components/parameters/TrustedDeviceID"
    delete:
      operationId: deleteTrustedDevice
      tags:
        - user-2fa
      summary: ユーザの信頼済みデバイスを削除する
      responses:
        "204":
          description: No Content
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/clear-trusted-devices:
    parameters:
      - $ref: "#/components/parameters/UserID"
    post:
      operationId: clearTrustedDevices
      tags:
        - user-2fa
      summary: ユーザの全信頼済みデバイスを削除する
      responses:
        "204":
          description: No Content
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/register-email:
    parameters:
      - $ref: "#/components/parameters/UserID"
    post:
      operationId: registerEmail
      tags:
        - user
      summary: ユーザにメールアドレスを登録する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
              properties:
                email:
                  type: string
                  description: メールアドレス
                  example: "user@example.com"
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: メールアドレスが重複している
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/unregister-email:
    parameters:
      - $ref: "#/components/parameters/UserID"
    post:
      operationId: unregisterEmail
      tags:
        - user
      summary: ユーザのメールアドレスを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/security-keys:
    parameters:
      - $ref: "#/components/parameters/UserID"
    get:
      operationId: listSecurityKeys
      tags:
        - user-2fa
      summary: ユーザのセキュリティキー一覧を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/UserSecurityKey"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/users/{user_id}/security-keys/{security_key_id}:
    parameters:
      - $ref: "#/components/parameters/UserID"
      - $ref: "#/components/parameters/SecurityKeyID"
    get:
      operationId: readSecurityKey
      tags:
        - user-2fa
      summary: ユーザのセキュリティキーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserSecurityKey"
              examples:
                Response1:
                  summary: 登録直後のレスポンス
                  value:
                    id: 1
                    name: ""
                    sign_count: 0
                    aaguid: "00000000-0000-0000-0000-000000000000"
                    registered_at: "2025-08-27T10:00:00.123456+09:00"
                    last_used_at: null
                Response2:
                  summary: ログイン認証で利用後のレスポンス
                  value:
                    id: 1
                    name: "ユーザが設定した名前"
                    sign_count: 1
                    aaguid: "00000000-0000-0000-0000-000000000000"
                    registered_at: "2025-08-27T10:00:00.123456+09:00"
                    last_used_at: "2025-08-27T11:00:00.123456+09:00"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したセキュリティキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    delete:
      operationId: deleteSecurityKey
      tags:
        - user-2fa
      summary: ユーザのセキュリティキーを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したセキュリティキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /groups:
    get:
      operationId: listGroups
      tags:
        - group
      summary: グループ一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: ordering
          in: query
          description: |
            並び替えキー
            * `name` - グループ名昇順
            * `-name` - グループ名降順
          schema:
            type: string
            enum: ["name", "-name"]
        - name: compat_user_id
          in: query
          description: 所属するユーザIDでの絞り込み
          schema:
            type: integer
            example: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/Group"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createGroup
      tags:
        - group
      summary: グループを作成する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  example: マイグループ
                  description: グループの名前
                description:
                  type: string
                  example: グループの説明
              required:
                - name
                - description
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Group"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: グループ数の上限到達
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /groups/{group_id}:
    parameters:
      - $ref: "#/components/parameters/GroupID"
    get:
      operationId: readGroup
      tags:
        - group
      summary: 指定したグループを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Group"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したグループが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateGroup
      tags:
        - group
      summary: 指定したグループを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
              properties:
                name:
                  type: string
                  example: グループの名前
                description:
                  type: string
                  example: グループの説明
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Group"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したグループが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
    delete:
      operationId: deleteGroup
      tags:
        - group
      summary: 指定したグループを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したグループが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /groups/{group_id}/memberships:
    parameters:
      - $ref: "#/components/parameters/GroupID"
    get:
      operationId: listMemberships
      tags:
        - group
      summary: グループの所属情報を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GroupMemberships"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したグループが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateMemberships
      tags:
        - group
      summary: グループの所属情報を更新する
      requestBody:
        description: グループの所属情報
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - compat_users
              properties:
                compat_users:
                  type: array
                  items:
                    type: object
                    required:
                      - id
                    properties:
                      id:
                        type: integer
                        description: ユーザID
                        example: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GroupMemberships"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したグループが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /iam-roles:
    get:
      operationId: listIamRoles
      tags:
        - iam-role
      summary: IAMロール一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/IamRole"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /iam-roles/{iam_role_id}:
    parameters:
      - $ref: "#/components/parameters/IamRoleID"
    get:
      operationId: readIamRole
      tags:
        - iam-role
      summary: 指定したIAMロールを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/IamRole"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したIAMロールが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /id-roles:
    get:
      operationId: listIdRoles
      tags:
        - id-role
      summary: IDロール一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/IdRole"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /id-roles/{id_role_id}:
    parameters:
      - $ref: "#/components/parameters/IdRoleID"
    get:
      operationId: readIdRole
      tags:
        - id-role
      summary: 指定したIDロールを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/IdRole"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したIAMロールが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /projects:
    get:
      operationId: listProjects
      tags:
        - project
      summary: プロジェクト一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: ordering
          in: query
          description: |
            並び替えキー

            * `code` - プロジェクトコード昇順
            * `-code` - プロジェクトコード降順
          schema:
            type: string
            enum: ["code", "-code"]
        - name: iam_role
          in: query
          description: IAMロールでの絞り込み。カンマ区切りで複数指定可能
          schema:
            type: string
            example: resource-creator,billing-viewer
        - name: parent_folder_id
          in: query
          description: 親のフォルダIDでの絞り込み。
          schema:
            type: integer
            example: 1
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/Project"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createProject
      tags:
        - project
      summary: プロジェクトを作成する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - code
                - name
                - description
              properties:
                code:
                  type: string
                  example: my-sakura-project-code
                  description: プロジェクトコード
                parent_folder_id:
                  type: integer
                  example: 112000000000
                  description: プロジェクトのフォルダID
                name:
                  type: string
                  example: My Sakura Project
                  description: プロジェクトの名前
                description:
                  type: string
                  example: My Sakura Project details
                  description: プロジェクトの説明
      responses:
        "201":
          description: プロジェクトの作成に成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                ParentIdNotFound:
                  summary: 親フォルダが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: parant_not_found
                    detail: 親フォルダが見つかりません。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: プロジェクトコードの重複
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /move-projects:
    post:
      operationId: moveProjects
      tags:
        - project
      summary: プロジェクトを一括で移動する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MoveProjects"
      responses:
        "204":
          description: 成功
        "400":
          description: "不正なリクエスト"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                ProjectIdNotFound:
                  summary: 指定されたプロジェクトが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: project_not_found
                    detail: 指定されたプロジェクトが見つかりません。
                    errors: {}
                ParentIdNotFound:
                  summary: 親フォルダが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: parant_not_found
                    detail: 親フォルダが見つかりません。
                    errors: {}
                DuplicateProjectNames:
                  summary: 同じ階層に同じ名前のプロジェクトを登録できない
                  value:
                    type: about:blank
                    status: 400
                    title: duplicate_project_names
                    detail: 同じ階層に同じ名前のプロジェクトを登録できません。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: フォルダが存在しない。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /projects/{project_id}:
    parameters:
      - $ref: "#/components/parameters/ProjectID"
    get:
      operationId: readProject
      tags:
        - project
      summary: 指定したプロジェクトを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したプロジェクトが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateProject
      tags:
        - project
      summary: 指定したプロジェクトを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
              properties:
                name:
                  type: string
                  description: プロジェクトの名前
                  example: My Sakura Project
                description:
                  type: string
                  description: プロジェクトの説明
                  example: My Sakura Project details
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したプロジェクトが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
    delete:
      operationId: deleteProject
      tags:
        - project
      summary: 指定したプロジェクトを削除する
      responses:
        "204":
          description: プロジェクトの削除に成功しました
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したプロジェクトが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: プロジェクト配下にリソースが存在する
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /projects/{project_id}/iam-policy:
    parameters:
      - $ref: "#/components/parameters/ProjectID"
    get:
      operationId: readProjectIamPolicy
      tags:
        - iam-policy
      summary: プロジェクトIAMポリシーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したプロジェクトが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateProjectIamPolicy
      tags:
        - iam-policy
      summary: プロジェクトIAMポリシーを更新する
      requestBody:
        description: プロジェクトIAMポリシーの情報を含んだJSON
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - bindings
              properties:
                bindings:
                  type: array
                  items:
                    $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                LowestGrantableResourceInvalid:
                  summary: 付与可能な最低階層を満たしていない
                  value:
                    type: about:blank
                    status: 400
                    title: invalid
                    detail: Invalid input.
                    errors:
                      role:
                        - message: '"folder-admin"はフォルダ階層以上にのみ付与可能です'
                          code: invalid
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したプロジェクトが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /folders/{folder_id}/iam-policy:
    parameters:
      - $ref: "#/components/parameters/FolderID"
    get:
      operationId: readFolderIamPolicy
      tags:
        - iam-policy
      summary: フォルダIAMポリシーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したフォルダが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateFolderIamPolicy
      tags:
        - iam-policy
      summary: フォルダIAMポリシーを更新する
      requestBody:
        description: フォルダIAMポリシーの情報を含んだJSON
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - bindings
              properties:
                bindings:
                  type: array
                  items:
                    $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                LowestGrantableResourceInvalid:
                  summary: 付与可能な最低階層を満たしていない
                  value:
                    type: about:blank
                    status: 400
                    title: invalid
                    detail: Invalid input.
                    errors:
                      role:
                        - message: '"servicepolicy-admin"は組織階層以上にのみ付与可能です'
                          code: invalid
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したフォルダが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /organization-iam-policy:
    get:
      operationId: readOrganizationIamPolicy
      tags:
        - iam-policy
      summary: 組織IAMポリシーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateOrganizationIamPolicy
      tags:
        - iam-policy
      summary: 組織IAMポリシーを更新する
      requestBody:
        description: 組織IAMポリシーの情報を含んだJSON
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - bindings
              properties:
                bindings:
                  type: array
                  items:
                    $ref: "#/components/schemas/IamPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IamPolicy"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /organization-id-policy:
    get:
      operationId: readOrganizationIdPolicy
      tags:
        - id-policy
      summary: 組織IDポリシーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IdPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: identity-admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateOrganizationIdPolicy
      tags:
        - id-policy
      summary: 組織IDポリシーを更新する
      requestBody:
        description: 組織IDポリシーの情報を含んだJSON
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - bindings
              properties:
                bindings:
                  type: array
                  items:
                    $ref: "#/components/schemas/IdPolicy"
              example:
                bindings:
                  - role:
                      type: preset
                      id: identity-admin
                    principals:
                      - type: user
                        id: 111111111111
                      - type: group
                        id: 1
                      - type: service-principal
                        id: 111111111111
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - bindings
                properties:
                  bindings:
                    type: array
                    items:
                      $ref: "#/components/schemas/IdPolicy"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /service-principals:
    get:
      operationId: listServicePrincipals
      tags:
        - service-principal
      summary: サービスプリンシパル一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: project_id
          in: query
          description: プロジェクトID
          schema:
            type: integer
        - name: ordering
          in: query
          description: |
            並び替えキー
            * `name` - サービスプリンシパル名昇順
            * `-name` - サービスプリンシパル名降順
          schema:
            type: string
            enum: ["name", "-name"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/ServicePrincipal"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createServicePrincipal
      tags:
        - service-principal
      summary: サービスプリンシパルを作成する
      requestBody:
        description: サービスプリンシパルの情報
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - project_id
                - name
                - description
              properties:
                project_id:
                  type: integer
                  description: プロジェクトID
                  example: 1
                name:
                  type: string
                  description: サービスプリンシパル名
                  example: Sakura Service Principal
                description:
                  type: string
                  description: サービスプリンシパルの説明
                  example: サービスプリンシパルの説明
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipal"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: プロジェクトあたりサービスプリンシパル数の上限到達
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}:
    parameters:
      - $ref: "#/components/parameters/ServicePrincipalID"
    get:
      operationId: readServicePrincipal
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipal"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateServicePrincipal
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: サービスプリンシパル名
                  example: Sakura Service Principal
                description:
                  type: string
                  description: サービスプリンシパルの説明
                  example: サービスプリンシパルの説明
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipal"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    delete:
      operationId: deleteServicePrincipal
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: サービスプリンシパルがリソースに関連付けられている
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/oauth2/token:
    post:
      operationId: issueServicePrincipalToken
      tags:
        - service-principal
      summary: RFC 7523 (JWT Bearer Token Grant) に基づき、署名済みJWTを使って一時的なサービスプリンシパルトークンを取得する
      security: []
      description: |
        登録済みサービスプリンシパルキーの秘密鍵を使い、以下のようなJWTを署名してください。

        #### JWTのヘッダー

        ```json
        {
          "alg": "RS256",
          "kid": "$SERVICE_PRINCIPAL_KEY_KID",
          "typ": "JWT"
        }
        ```

        ### JWTのペイロード

        ```json
        {
          "aud": "https://secure.sakura.ad.jp/cloud/api/iam/1.0/service-principals/oauth2/token",
          "exp": 現在のUnix time + 5分,
          "iat": 現在のUnix time,
          "iss": "$SERVICE_PRINCIPAL_RESOURCE_ID",
          "sub": "$SERVICE_PRINCIPAL_RESOURCE_ID"
        }
        ```
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: "#/components/schemas/ServicePrincipalJWTGrantRequest"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipalOAuth2AccessToken"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}/keys:
    get:
      operationId: listServicePrincipalKeys
      tags:
        - service-principal
      summary: サービスプリンシパルキー一覧を取得する
      parameters:
        - $ref: "#/components/parameters/ServicePrincipalID"
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: ordering
          in: query
          description: |
            並び替えキー
            * `created_at` - 作成日時昇順
            * `-created_at` - 作成日時降順
            * `key_expires_at` - 有効期限昇順
            * `-key_expires_at` - 有効期限降順
          schema:
            type: string
            enum:
              ["created_at", "-created_at", "key_expires_at", "-key_expires_at"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/ServicePrincipalKey"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}/upload-key:
    post:
      operationId: uploadServicePrincipalKey
      tags:
        - service-principal
      summary: ユーザ生成の鍵をサービスプリンシパルキーとして登録する
      parameters:
        - $ref: "#/components/parameters/ServicePrincipalID"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                public_key:
                  $ref: "#/components/schemas/ServiceprincipalKeyPublicKey"
              required:
                - public_key
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipalKey"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: 上限に達している
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}/keys/{service_principal_key_id}/enable:
    post:
      operationId: enableServicePrincipalKey
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルキーを有効化する
      parameters:
        - $ref: "#/components/parameters/ServicePrincipalID"
        - $ref: "#/components/parameters/ServicePrincipalKeyID"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipalKey"
              example:
                id: 00000000-0000-0000-0000-000000000000
                kid: 1234567890abcdef1234567890abcdef12345678
                status: enabled
                key_origin: user
                public_key: BEGIN PUBLIC KEY\n...\nEND PUBLIC KEY
                created_at: "2023-10-01T00:00:00Z"
                key_expires_at: "2024-10-01T00:00:00Z"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}/keys/{service_principal_key_id}/disable:
    post:
      operationId: disableServicePrincipalKey
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルキーを無効化する
      parameters:
        - $ref: "#/components/parameters/ServicePrincipalID"
        - $ref: "#/components/parameters/ServicePrincipalKeyID"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ServicePrincipalKey"
              example:
                id: 00000000-0000-0000-0000-000000000000
                kid: 1234567890abcdef1234567890abcdef12345678
                status: disabled
                key_origin: user
                public_key: BEGIN PUBLIC KEY\n...\nEND PUBLIC KEY
                created_at: "2023-10-01T00:00:00Z"
                key_expires_at: "2024-10-01T00:00:00Z"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /service-principals/{service_principal_id}/keys/{service_principal_key_id}:
    delete:
      operationId: deleteServicePrincipalKey
      tags:
        - service-principal
      summary: 指定したサービスプリンシパルキーを削除する
      parameters:
        - $ref: "#/components/parameters/ServicePrincipalID"
        - $ref: "#/components/parameters/ServicePrincipalKeyID"
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したサービスプリンシパルキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /compat/api-keys:
    get:
      operationId: listApiKeys
      tags:
        - project-apikey
      summary: APIキー一覧を取得する
      description: サービスプリンシパルによる操作の場合、サービスプリンシパルが所属するプロジェクトとは異なるプロジェクトのAPIキーは操作できません。
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: ordering
          in: query
          description: |
            並び替えキー
            * `name` - APIキー名昇順
            * `-name` - APIキー名降順
          schema:
            type: string
            enum: ["name", "-name"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/ProjectApiKey"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createApiKey
      tags:
        - project-apikey
      summary: APIキーを作成する
      description: サービスプリンシパルによる操作の場合、サービスプリンシパルが所属するプロジェクトとは異なるプロジェクトのAPIキーは操作できません。
      requestBody:
        description: APIキーの情報
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - project_id
                - name
                - description
                - iam_roles
              properties:
                project_id:
                  type: integer
                  description: プロジェクトID
                name:
                  type: string
                  description: APIキー名
                description:
                  type: string
                  description: APIキーの説明
                server_resource_id:
                  type: string
                  description: APIキーがシングルサーバコントロールパネルで利用される場合は必須
                iam_roles:
                  type: array
                  description: IAMのロール
                  items:
                    type: string
                zone_id:
                  type: string
                  description: ゾーンを指定。APIキーがシングルサーバコントロールパネルで利用される場合は必須。
            examples:
              resource-api-key:
                summary: リソース操作APIキー
                value:
                  project_id: 123456789123
                  name: リソース操作APIキー
                  description: 通常のリソース操作用
                  iam_roles:
                    - admin
              single-server-api-key:
                summary: シングルサーバAPIキー
                value:
                  project_id: 123456789123
                  name: シングルサーバAPIキー
                  description: シングルサーバコントロールパネル用
                  server_resource_id: "111222333444"
                  iam_roles:
                    - viewer
                    - editor
                  zone_id: is1a
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectApiKeyWithSecret"
              examples:
                resource-api-key:
                  $ref: "#/components/examples/ProjectApiKeyResourceWithSecret"
                single-server-api-key:
                  $ref: "#/components/examples/ProjectApiKeySingleServerWithSecret"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
              examples:
                Response1:
                  summary: このアクションを実行する権限がない
                  value:
                    type: "about:blank"
                    status: 403
                    title: "permission_denied"
                    detail: "このアクションを実行する権限がありません。"
                Response2:
                  summary: サービスポリシーを違反した
                  value:
                    type: "about:blank"
                    status: 403
                    title: "permission_denied"
                    detail: |-
                      要求された操作は許可されていません。サービスポリシーを違反しました。
                      iam-disable-api-key-creationの内容を確認してください。
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /compat/api-keys/{apikey_id}:
    parameters:
      - $ref: "#/components/parameters/ProjectApiKeyID"
    get:
      operationId: readApiKey
      tags:
        - project-apikey
      summary: 指定したAPIキーを取得する
      description: サービスプリンシパルによる操作の場合、サービスプリンシパルが所属するプロジェクトとは異なるプロジェクトのAPIキーは操作できません。
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectApiKey"
              examples:
                resource-api-key:
                  $ref: "#/components/examples/ProjectApiKeyResource"
                single-server-api-key:
                  $ref: "#/components/examples/ProjectApiKeySingleServer"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したAPIキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateApiKey
      tags:
        - project-apikey
      summary: 指定したAPIキーを更新する
      description: サービスプリンシパルによる操作の場合、サービスプリンシパルが所属するプロジェクトとは異なるプロジェクトのAPIキーは操作できません。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
                - iam_roles
              properties:
                name:
                  type: string
                  description: APIキー名
                description:
                  type: string
                  description: APIキーの説明
                server_resource_id:
                  type: string
                  description: APIキーがシングルサーバコントロールパネルで利用される場合のみ変更可能
                iam_roles:
                  type: array
                  description: IAMのロール。
                  items:
                    type: string
                zone_id:
                  type: string
                  description: ゾーンを指定。APIキーがシングルサーバコントロールパネルで利用される場合のみ変更可能
            examples:
              resource-api-key:
                summary: リソース操作APIキー
                value:
                  name: リソース操作APIキー
                  description: 通常のリソース操作用
                  iam_roles: [admin]
              single-server-api-key:
                summary: シングルサーバAPIキー
                value:
                  name: シングルサーバAPIキー
                  description: シングルサーバコントロールパネル用
                  server_resource_id: "111222333444"
                  iam_roles: [viewer, editor]
                  zone_id: is1a
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectApiKey"
              examples:
                resource-api-key:
                  $ref: "#/components/examples/ProjectApiKeyResource"
                single-server-api-key:
                  $ref: "#/components/examples/ProjectApiKeySingleServer"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したAPIキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
    delete:
      operationId: deleteApiKey
      tags:
        - project-apikey
      summary: 指定したAPIキーを削除する
      description: サービスプリンシパルによる操作の場合、サービスプリンシパルが所属するプロジェクトとは異なるプロジェクトのAPIキーは操作できません。
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したAPIキーが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"

  /sso-profiles:
    get:
      operationId: listSsoProfiles
      tags:
        - sso
      summary: SSOプロファイル一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/SSOProfile"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createSsoProfile
      tags:
        - sso
      summary: SSOプロファイルを作成する
      requestBody:
        description: IdPの情報
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
                - idp_entity_id
                - idp_login_url
                - idp_logout_url
                - idp_certificate
              properties:
                name:
                  type: string
                  description: SSOプロファイル名
                  example: SSOプロファイル1
                description:
                  type: string
                  description: SSOプロファイルの説明
                  example: SSOプロファイル1の説明
                idp_entity_id:
                  type: string
                  description: IdPのエンティティID
                idp_login_url:
                  type: string
                  description: IdPのログインURL
                idp_logout_url:
                  type: string
                  description: IdPのログアウトURL
                idp_certificate:
                  type: string
                  description: IdPのX.509証明書
            examples:
              partial-fields:
                value:
                  name: SSOプロファイル1
                  description: SSOプロファイル1の説明
                  idp_entity_id: ""
                  idp_login_url: ""
                  idp_logout_url: ""
                  idp_certificate: ""
                summary: "IdPの情報を後で設定する場合"
              complete-fields:
                value:
                  name: SSOプロファイル1
                  description: SSOプロファイル1の説明
                  idp_entity_id: "https://idp.example.com/ile2ephei7saeph6"
                  idp_login_url: "https://idp.example.com/ile2ephei7saeph6/sso/login"
                  idp_logout_url: "https://idp.example.com/ile2ephei7saeph6/sso/logout"
                  idp_certificate: "-----BEGIN CERTIFICATE-----\nMIIDqjCCApKgAwIBA<snip>\n-----END CERTIFICATE-----"
                summary: "全てのフィールドを作成時に指定する場合"

      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SSOProfile"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: 上限に達している
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /sso-profiles/{sso_profile_id}:
    parameters:
      - $ref: "#/components/parameters/SSOProfileID"
    get:
      operationId: readSsoProfile
      tags:
        - sso
      summary: 指定したSSOプロファイルを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SSOProfile"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateSsoProfile
      tags:
        - sso
      summary: 指定したSSOプロファイルを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - description
                - idp_entity_id
                - idp_login_url
                - idp_logout_url
                - idp_certificate
              properties:
                name:
                  type: string
                  description: SSOプロファイル名
                  example: SSOプロファイル1
                description:
                  type: string
                  description: SSOプロファイルの説明
                  example: SSOプロファイル1の説明
                idp_entity_id:
                  type: string
                  description: IdPのエンティティID
                  example: "https://idp.example.com/ile2ephei7saeph6"
                idp_login_url:
                  type: string
                  description: IdPのログインURL
                  example: "https://idp.example.com/ile2ephei7saeph6/sso/login"
                idp_logout_url:
                  type: string
                  description: IdPのログアウトURL
                  example: "https://idp.example.com/ile2ephei7saeph6/sso/logout"
                idp_certificate:
                  type: string
                  description: IdPのX.509証明書
                  example: "-----BEGIN CERTIFICATE-----\nMIIDqjCCApKgAwIBA<snip>\n-----END CERTIFICATE-----"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SSOProfile"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    delete:
      operationId: deleteSsoProfile
      tags:
        - sso
      summary: 指定したSSOプロファイルを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: 割り当て済みのため削除できない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /sso-profiles/{sso_profile_id}/assign:
    parameters:
      - $ref: "#/components/parameters/SSOProfileID"
    post:
      operationId: assignSsoProfile
      tags:
        - sso
      summary: 指定したSSOプロファイルを割り当てる
      description: 割当を行うと会員配下のクラウドユーザすべてで該当SSOプロファイルが有効になります。
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SSOProfile"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: |
            以下のいずれかの理由で失敗
            - 他に割り当て済みのSSOプロファイルがあるため割り当てできない
            - 設定が不十分なSSOプロファイルを割り当てようとしている
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /sso-profiles/{sso_profile_id}/unassign:
    parameters:
      - $ref: "#/components/parameters/SSOProfileID"
    post:
      operationId: unassignSsoProfile
      tags:
        - sso
      summary: 指定したSSOプロファイルの割り当てを外す
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SSOProfile"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /folders:
    post:
      operationId: createFolder
      tags:
        - folder
      summary: フォルダを作成する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: フォルダ名
                  example: 本番環境用
                description:
                  type: string
                  description: フォルダの説明
                  example: My Sakura Folder description
                parent_id:
                  type: integer
                  nullable: true
                  description: 親フォルダID
                  default: null
                  example: 1
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Folder"
        "400":
          description: "不正なリクエスト"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                ParentIdNotFound:
                  summary: 親フォルダが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: parant_not_found
                    detail: 親フォルダが見つかりません。
                    errors: {}
                DuplicateFolderNames:
                  summary: 同じ階層に同じ名前のフォルダを登録できない
                  value:
                    type: about:blank
                    status: 400
                    title: duplicate_folder_names
                    detail: 同じ階層に同じ名前のフォルダを登録できません。
                    errors: {}
                FolderRegistrationLimitOver:
                  summary: フォルダの登録数上限◯◯を超えている
                  value:
                    type: about:blank
                    status: 400
                    title: folder_registration_limit_over
                    detail: フォルダの登録数上限◯◯を超えています。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    get:
      operationId: listFolders
      tags:
        - folder
      summary: フォルダ一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: folder_name
          in: query
          description: フォルダ名での絞り込み。
          schema:
            type: string
            example: フォルダ名
        - name: parent_id
          in: query
          description: 親のフォルダIDでの絞り込み。
          schema:
            type: integer
            example: 1
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/Folder"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /folders/{folder_id}:
    parameters:
      - $ref: "#/components/parameters/FolderID"
    put:
      operationId: updateFolder
      tags:
        - folder
      summary: 特定のフォルダの情報を更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: フォルダ名
                  example: フォルダ名
                description:
                  type: string
                  description: フォルダの説明
                  example: My Sakura Folder description
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Folder"
        "400":
          description: "不正なリクエスト"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                DuplicateFolderNames:
                  summary: 同じ階層に同じ名前のフォルダを登録できない
                  value:
                    type: about:blank
                    status: 400
                    title: duplicate_folder_names
                    detail: |
                      同じ階層に同じ名前のフォルダを登録できません。
                      フォルダ名を変更してください。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: フォルダが存在しない。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    delete:
      operationId: deleteFolder
      tags:
        - folder
      summary: フォルダを削除する
      responses:
        "204":
          description: 成功
        "400":
          description: "不正なリクエスト"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                FolderIsNotEmpty:
                  summary: 削除前に下の階層にフォルダかプロジェクトがあれば削除できない。
                  value:
                    type: about:blank
                    status: 400
                    title: exist_dependency_folders_or_projects
                    detail: 下の階層にフォルダまたはプロジェクトがあります。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: フォルダが存在しない。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
    get:
      operationId: readFolder
      tags:
        - folder
      summary: 特定のフォルダの情報を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Folder"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /move-folders:
    post:
      operationId: moveFolders
      tags:
        - folder
      summary: フォルダを移動する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MoveFolders"
      responses:
        "204":
          description: 成功
        "400":
          description: "不正なリクエスト"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
              examples:
                FolderIdNotFount:
                  summary: 指定されたフォルダが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: folder_not_found
                    detail: 指定されたフォルダが見つかりません
                    errors: {}
                ParentIdNotFound:
                  summary: 親フォルダが見つからない
                  value:
                    type: about:blank
                    status: 400
                    title: parant_not_found
                    detail: 親フォルダが見つかりません。
                    errors: {}
                DuplicateFolderNames:
                  summary: 同じ階層に同じ名前のフォルダを登録できない
                  value:
                    type: about:blank
                    status: 400
                    title: duplicate_folder_names
                    detail: 同じ階層に同じ名前のフォルダを登録できません。
                    errors: {}
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: フォルダが存在しない。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /organization:
    get:
      operationId: readOrganization
      tags:
        - organization
      summary: 組織を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Organization"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したSSOプロファイルが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateOrganization
      tags:
        - organization
      summary: 組織を更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: 組織名
                  example: 組織名
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Organization"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /organization-service-policy:
    put:
      operationId: updateOrganizationServicePolicy
      tags:
        - organization
      summary: 組織のサービスポリシーを更新する
      description: 組織のサービスポリシーを構成するルールの設定値を更新するエンドポイント。設定を更新するルールをリクエストボディで指定する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - rules
              properties:
                rules:
                  type: array
                  items:
                    $ref: "#/components/schemas/Rule"
            examples:
              listAndBoolRules:
                summary: List型・Bool型の両方を設定する場合
                value:
                  rules:
                    - code: example.rule.list
                      spec:
                        contents:
                          - allow_all: true
                            deny_all: false
                            values:
                              allowed_values: ["example1", "example2"]
                      is_active: true
                      is_dry_run: false
                    - code: example.rule.bool
                      spec:
                        contents:
                          - enforce: true
                      is_active: false
                      is_dry_run: false
              listRulesAllowAll:
                summary: List型ルール allow_allを指定する場合
                value:
                  rules:
                    - code: example.rule.list
                      spec:
                        contents:
                          - allow_all: true
                            deny_all: false
                            values: {}
                      is_active: true
                      is_dry_run: false
              listRulesDenyAll:
                summary: List型ルール deny_allを指定する場合
                value:
                  rules:
                    - code: example.rule.list
                      spec:
                        contents:
                          - allow_all: false
                            deny_all: true
                            values: {}
                      is_active: true
                      is_dry_run: false
              listRulesAllowedValues:
                summary: List型ルール allowed_valuesを指定する場合
                value:
                  rules:
                    - code: example.rule.list
                      spec:
                        contents:
                          - allow_all: false
                            deny_all: false
                            values:
                              allowed_values: ["example1", "example2"]
                      is_active: true
                      is_dry_run: false
              listRulesDeniedValues:
                summary: List型ルール denied_valuesを指定する場合
                value:
                  rules:
                    - code: example.rule.list
                      spec:
                        contents:
                          - allow_all: false
                            deny_all: false
                            values:
                              denied_values: ["example1", "example2"]
                      is_active: true
                      is_dry_run: false
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  rules:
                    type: array
                    items:
                      $ref: "#/components/schemas/RuleResponse"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: サービスポリシーが有効化されていない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    get:
      operationId: readOrganizationServicePolicy
      tags:
        - organization
      summary: 組織のサービスポリシーを構成するルールを取得する
      parameters:
        - name: is_active
          in: query
          description: 有効かどうか
          schema:
            type: boolean
        - name: is_dry_run
          in: query
          description: ドライランかどうか
          schema:
            type: boolean
        - name: name
          in: query
          description: ルール名
          schema:
            type: string
        - name: code
          in: query
          description: ルールのコード
          schema:
            type: string
        - name: type
          in: query
          description: ルールのタイプ
          schema:
            type: string
            enum: ["bool", "list"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  rules:
                    type: array
                    items:
                      $ref: "#/components/schemas/RuleResponse"
              examples:
                listRulesActiveDryRun:
                  summary: List型ルール ルールが有効かつドライランのとき
                  value:
                    rules:
                      - code: example.rule.code1
                        name: Example List Rule
                        spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: true
                              deny_all: true
                        dry_run_spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: false
                              deny_all: true
                        is_active: true
                        is_dry_run: true
                listRulesActiveNotDryRun:
                  summary: List型ルール ルールが有効かつ非ドライランのとき
                  value:
                    rules:
                      - code: example.rule.code1
                        name: Example List Rule
                        spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: true
                              deny_all: true
                        dry_run_spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: false
                              deny_all: true
                        is_active: true
                        is_dry_run: false
                listRulesDisableDryRun:
                  summary: List型ルール ルールが無効かつドライランのとき
                  value:
                    rules:
                      - code: example.rule.code1
                        name: Example List Rule
                        spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: true
                              deny_all: true
                        dry_run_spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: false
                              deny_all: true
                        is_active: false
                        is_dry_run: true
                listRulesDisableNotDryRun:
                  summary: List型ルール ルールが無効かつ非ドライランのとき
                  value:
                    rules:
                      - code: example.rule.code1
                        name: Example List Rule
                        spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: true
                              deny_all: true
                        dry_run_spec:
                          contents:
                            - values:
                                allowed_values: ["example1"]
                                denied_values: ["example2"]
                              allow_all: false
                              deny_all: true
                        is_active: false
                        is_dry_run: false
                BoolRulesActiveDryRun:
                  summary: Bool型ルール ルールが有効かつドライランのとき
                  value:
                    rules:
                      - code: example.rule.code2
                        name: Example Bool Rule
                        spec:
                          contents:
                            - enforce: true
                        dry_run_spec:
                          contents:
                            - enforce: true
                        is_active: true
                        is_dry_run: true
                BoolRulesActiveNotDryRun:
                  summary: Bool型ルール ルールが有効かつ非ドライランのとき
                  value:
                    rules:
                      - code: example.rule.code2
                        name: Example Bool Rule
                        spec:
                          contents:
                            - enforce: true
                        dry_run_spec:
                          contents:
                            - enforce: true
                        is_active: true
                        is_dry_run: false
                BoolRulesDisableDryRun:
                  summary: Bool型ルール ルールが無効かつドライランのとき
                  value:
                    rules:
                      - code: example.rule.code2
                        name: Example Bool Rule
                        spec:
                          contents:
                            - enforce: true
                        dry_run_spec:
                          contents:
                            - enforce: true
                        is_active: false
                        is_dry_run: true
                BoolRulesDisableNotDryRun:
                  summary: Bool型ルール ルールが無効かつ非ドライランのとき
                  value:
                    rules:
                      - code: example.rule.code2
                        name: Example Bool Rule
                        spec:
                          contents:
                            - enforce: true
                        dry_run_spec:
                          contents:
                            - enforce: true
                        is_active: false
                        is_dry_run: false

        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /enable-service-policy:
    post:
      operationId: enableServicePolicy
      tags:
        - service-policy
      summary: サービスポリシーを有効化する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: サービスポリシーがすでに有効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
  /disable-service-policy:
    post:
      operationId: disableServicePolicy
      tags:
        - service-policy
      summary: サービスポリシーを無効化する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: サービスポリシーがすでに無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
  /service-policy-status:
    get:
      operationId: checkServicePolicyStatus
      tags:
        - service-policy
      summary: サービスポリシーの有効状態を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - enabled
                properties:
                  enabled:
                    type: boolean
                    description: "有効かどうか"
                    readOnly: true
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
        "503":
          description: 一時的な処理エラー
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http503ServiceUnavailable"
  /service-policy-rule-templates:
    get:
      operationId: listServicePolicyRuleTemplates
      tags:
        - service-policy
      summary: ルールテンプレートの一覧を取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
        - name: name
          in: query
          description: ルールテンプレート名
          schema:
            type: string
        - name: code
          in: query
          description: ルールテンプレートのコード
          schema:
            type: string
        - name: type
          in: query
          description: ルールテンプレートのタイプ
          schema:
            type: string
            enum: ["boolean", "list"]
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/RuleTemplate"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /organization-password-policy:
    get:
      operationId: readOrganizationPasswordPolicy
      tags:
        - auth
      summary: 組織のパスワードポリシーを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PasswordPolicy"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateOrganizationPasswordPolicy
      tags:
        - auth
      summary: 組織のパスワードポリシーを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PasswordPolicy"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PasswordPolicy"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
  /organization-auth-conditions:
    get:
      operationId: readOrganizationAuthConditions
      tags:
        - auth
      summary: 組織の認証条件を取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuthConditions"
              examples:
                Response1:
                  summary: すべてのネットワークからの認証を許可
                  value:
                    ip_restriction:
                      mode: allow_all
                    require_two_factor_auth:
                      enabled: false
                    datetime_restriction:
                      after: "2025-09-01T00:00:00+09:00"
                      before: "2025-10-01T00:00:00+09:00"
                Response2:
                  summary: 指定したネットワークからの認証を許可
                  value:
                    ip_restriction:
                      mode: allow_list
                      source_network:
                        ["192.0.2.0/24", "198.51.100.0/24", "203.0.113.0/24"]
                    require_two_factor_auth:
                      enabled: false
                    datetime_restriction:
                      after: "2025-09-01T00:00:00+09:00"
                      before: "2025-10-01T00:00:00+09:00"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateOrganizationAuthConditions
      tags:
        - auth
      summary: 組織の認証条件を更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AuthConditions"
            examples:
              Request1:
                summary: すべてのネットワークからの認証を許可
                value:
                  ip_restriction:
                    mode: allow_all
                  require_two_factor_auth:
                    enabled: false
                  datetime_restriction:
                    after: "2025-09-01T00:00:00+09:00"
                    before: "2025-10-01T00:00:00+09:00"
              Request2:
                summary: 指定したネットワークからの認証を許可
                value:
                  ip_restriction:
                    mode: allow_list
                    source_network:
                      ["192.0.2.0/24", "198.51.100.0/24", "203.0.113.0/24"]
                  require_two_factor_auth:
                    enabled: false
                  datetime_restriction:
                    after: "2025-09-01T00:00:00+09:00"
                    before: "2025-10-01T00:00:00+09:00"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuthConditions"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

  /auth/context:
    get:
      summary: 認証情報のコンテキストを取得
      security:
        - ProjectApiKeyAuth: []
        - ServicePrincipalAuth: []
      description: APIキー・サービスプリンシパルの属性情報を取得する。usacloudなどOSSプロダクトからの利用を想定としたAPI。
      operationId: readAuthContext
      tags:
        - auth
      responses:
        "200":
          description: 認証情報のコンテキストの取得に成功
          content:
            application/json:
              schema:
                type: object
                required:
                  - resource_id
                  - auth_type
                  - limited_to_project_id
                  - member_code
                properties:
                  resource_id:
                    type: integer
                    format: int64
                    nullable: false
                    description: APIキーのIDまたはサービスプリンシパルのID
                    example: 987654321098
                  auth_type:
                    type: string
                    nullable: false
                    enum: [apikey, service_principal]
                    description: 認証種別。APIキーまたはサービスプリンシパル。
                  limited_to_project_id:
                    type: integer
                    nullable: true
                    description: 操作可能なプロジェクトのID。現状、APIキー・サービスプリンシパルが属するプロジェクトのIDが設定されるが、将来的に操作可能なプロジェクトの制限が撤廃された場合にはnullが設定される可能性がある。
                    example: 123456789012
                  member_code:
                    type: string
                    nullable: false
                    description: APIキー・サービスプリンシパルに紐づく会員IDを取得する
                    example: aaa00000
        "401":
          description: 認証に失敗
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"

  /scim-configurations:
    get:
      operationId: listScimConfigurations
      tags:
        - scim
      summary: ユーザープロビジョニングを取得する
      parameters:
        - $ref: "#/components/parameters/PaginationPage"
        - $ref: "#/components/parameters/PaginationPerPage"
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                allOf:
                  - type: object
                    required:
                      - items
                    properties:
                      items:
                        type: array
                        items:
                          $ref: "#/components/schemas/ScimConfigurationPublic"
                  - $ref: "#/components/schemas/Pagination"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    post:
      operationId: createScimConfiguration
      tags:
        - scim
      summary: ユーザープロビジョニングを作成する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: ユーザープロビジョニング名
                  example: MicrosoftEntraID
      responses:
        "201":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScimConfiguration"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "409":
          description: 既にユーザープロビジョニングが存在する
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
  /scim-configurations/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: ユーザープロビジョニングID
        schema:
          type: string
          format: uuid
    get:
      operationId: readScimConfiguration
      tags:
        - scim
      summary: ユーザープロビジョニングを取得する
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScimConfigurationPublic"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザープロビジョニングが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    put:
      operationId: updateScimConfiguration
      tags:
        - scim
      summary: ユーザープロビジョニングを更新する
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
              properties:
                name:
                  type: string
                  description: ユーザープロビジョニング名
                  example: MicrosoftEntraID
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScimConfigurationPublic"
        "400":
          description: 不正なリクエスト
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http400BadRequest"
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザープロビジョニングが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
    delete:
      operationId: deleteScimConfiguration
      tags:
        - scim
      summary: ユーザープロビジョニングを削除する
      responses:
        "204":
          description: 成功
        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザープロビジョニングが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "409":
          description: |
            - 削除対象のユーザープロビジョニングから作成されたユーザーが存在する
            - 削除対象のユーザープロビジョニングから作成されたグループが存在する
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http409Conflict"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"
  /scim-configurations/{id}/regenerate-token:
    parameters:
      - name: id
        in: path
        required: true
        description: ユーザープロビジョニングID
        schema:
          type: string
          format: uuid
    post:
      operationId: regenerateScimConfigurationToken
      tags:
        - scim
      summary: ユーザープロビジョニングのシークレットトークンを再発行する
      description: |
        この操作によって既にあるシークレットトークンは無効化されます。ユーザープロビジョニングのクライアント側に新しいシークレットトークンを再設定する必要があります。
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  secret_token:
                    type: string
                    description: 再発行されたユーザープロビジョニングのシークレットトークン
                example:
                  secret_token: your-secret-token

        "401":
          description: 認証情報が無効
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http401Unauthorized"
        "403":
          description: アクセス権限がない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http403Forbidden"
        "404":
          description: 指定したユーザープロビジョニングが存在しない
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http404NotFound"
        "429":
          description: APIリクエストのレートリミット超過
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Http429TooManyRequests"

components:
  securitySchemes:
    ServicePrincipalAuth:
      description: |
        サービスプリンシパル認証
        - サービスプリンシパルのアクセストークンを指定
      type: http
      scheme: bearer
    ProjectApiKeyAuth:
      description: |
        APIキー認証
        - ユーザー名に発行したAPIキーのアクセストークンを指定
        - パスワードに発行したAPIキーのアクセストークンシークレットを指定
      type: http
      scheme: basic

  parameters:
    PaginationPage:
      in: query
      name: page
      schema:
        type: integer
    PaginationPerPage:
      in: query
      name: per_page
      schema:
        type: integer
    UserID:
      in: path
      name: user_id
      description: ユーザID
      required: true
      schema:
        type: integer
    GroupID:
      in: path
      name: group_id
      description: グループID
      required: true
      schema:
        type: integer
    TrustedDeviceID:
      in: path
      name: trusted_device_id
      description: ユーザID
      required: true
      schema:
        type: integer
    SecurityKeyID:
      in: path
      name: security_key_id
      description: セキュリティキーID
      required: true
      schema:
        type: integer
    IamRoleID:
      in: path
      name: iam_role_id
      description: IAMロールID
      required: true
      schema:
        type: string
    IdRoleID:
      in: path
      name: id_role_id
      description: IDロールID
      required: true
      schema:
        type: string
    ProjectID:
      in: path
      name: project_id
      description: プロジェクトID
      required: true
      schema:
        type: integer
    FolderID:
      in: path
      name: folder_id
      description: フォルダID
      required: true
      schema:
        type: integer
    ServicePrincipalID:
      in: path
      name: service_principal_id
      description: サービスプリンシパルID
      required: true
      schema:
        type: integer
        example: 123456789123
    ServicePrincipalKeyID:
      in: path
      name: service_principal_key_id
      description: サービスプリンシパルキーID
      required: true
      schema:
        type: string
        format: uuid
        example: 00000000-0000-0000-0000-000000000000
    ProjectApiKeyID:
      in: path
      name: apikey_id
      description: APIキーID
      required: true
      schema:
        type: integer
    SSOProfileID:
      in: path
      name: sso_profile_id
      description: SSOプロファイルID
      required: true
      schema:
        type: integer

  schemas:
    Http400BadRequest:
      type: object
      required:
        - type
        - status
        - title
        - detail
        - errors
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 400
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: invalid
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: 不正な入力です。
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: object
              required:
                - message
                - code
              properties:
                message:
                  type: string
                  description: エラー内容を説明した文字列
                code:
                  type: string
                  description: エラーの内容を表す文字列
            description: リクエストボディの特定キーに関するエラー
          properties:
            non_field_errors:
              type: array
              items:
                type: object
                required:
                  - message
                  - code
                properties:
                  message:
                    type: string
                    description: エラー内容を説明した文字列
                  code:
                    type: string
                    description: エラーの内容を表す文字列
              description: リクエストボディの特定キーに関係しないエラー
          example:
            {
              "key1":
                [{ "message": "この項目は必須です。", "code": "required" }],
              "key2":
                [{ "message": "有効な値ではありません。", "code": "invalid" }],
              "key3":
                [
                  {
                    "message": "この項目は少なくとも*文字以上にしてください。",
                    "code": "min_length",
                  },
                ],
              "key4":
                [
                  {
                    "message": "この項目が*文字より長くならないようにしてください。",
                    "code": "max_length",
                  },
                ],
            }

    Http401Unauthorized:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 401
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: authentication_failed
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: 認証情報が含まれていません。

    Http403Forbidden:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 403
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: permission_denied
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: このアクションを実行する権限がありません。

    Http404NotFound:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 404
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: not_found
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: 見つかりませんでした。

    Http409Conflict:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 409
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: conflict
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: 状態の競合によりリクエストを処理できません。

    Http429TooManyRequests:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 429
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: throttled
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: リクエストの処理は絞られました。 60秒後に利用可能になります。

    Http503ServiceUnavailable:
      type: object
      required:
        - type
        - status
        - title
        - detail
      properties:
        type:
          type: string
          description: 問題を説明するドキュメントへのURI（基本的にはabout:blank）
          example: about:blank
        status:
          type: integer
          description: HTTPステータスコード
          example: 503
        title:
          type: string
          description: 問題を表す簡単な文字列
          example: temporary_unavailable
        detail:
          type: string
          description: 問題の詳細を説明した文字列（人が読んで問題解決に繋がるような説明）
          example: 一時的にエラーが発生しました。

    Pagination:
      type: object
      required:
        - count
        - next
        - previous
      properties:
        count:
          type: integer
          description: データ総数
          example: 100
        next:
          type: string
          format: uri
          nullable: true
          description: 次のページへのURL
          example: "https://api.example.com/?page=3&per_page=10"
        previous:
          type: string
          format: uri
          nullable: true
          description: 前のページへのURL
          example: "https://api.example.com/?per_page=10"

    IamRole:
      type: object
      required:
        - id
        - name
        - description
        - category
        - lowest_grantable_resource
      properties:
        id:
          type: string
          description: IAMロールID
          readOnly: true
          example: viewer
        name:
          type: string
          description: IAMロール名
          example: 管理者
        description:
          type: string
          description: IAMロールの説明
          example: 管理者権限のIAMロール
        category:
          type: string
          description: IAMロールのカテゴリ
          example: "apprun"
        lowest_grantable_resource:
          type: string
          enum: ["organization", "folder", "project"]
          description: |
            このIAMロールを付与可能な最低階層。
            * `"organization"` - 組織
            * `"folder"` - フォルダ
            * `"project"` - プロジェクト
          example: folder

    IdRole:
      type: object
      required:
        - id
        - name
        - description
      properties:
        id:
          type: string
          description: IDロールID
          readOnly: true
          example: identity-admin
        name:
          type: string
          description: IDロール名
          example: ID管理者
        description:
          type: string
          description: IDロールの説明
          example: 管理者権限のIDロール

    Project:
      type: object
      required:
        - id
        - code
        - name
        - description
        - status
        - created_at
        - updated_at
        - parent_folder_id
      properties:
        id:
          type: integer
          description: プロジェクトID
          readOnly: true
          example: 111111111111
        code:
          type: string
          description: プロジェクトコード
          maxLength: 64
          example: my-sakura-project-code
        name:
          type: string
          description: プロジェクトの名前
          example: My Sakura Project
        description:
          type: string
          description: プロジェクトの説明
          example: My Sakura Project description
        status:
          type: string
          description: プロジェクトのステータス
          enum: ["available"]
          readOnly: true
          example: "available"
        parent_folder_id:
          type: integer
          nullable: true
          description: 親フォルダID
          readOnly: true
          example: 1
        created_at:
          type: string
          description: 作成日時
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          example: 2024-05-02T16:32:23Z
    MoveProjects:
      type: object
      required:
        - project_ids
        - parent_folder_id
      properties:
        project_ids:
          type: array
          items:
            type: integer
          description: 移動するプロジェクトID
          example: [1, 2, 3]
        parent_folder_id:
          type: integer
          description: 移動先のフォルダID
          nullable: true
          example: 1

    User:
      type: object
      required:
        - id
        - member
        - name
        - code
        - status
        - description
        - otp
        - is_security_key_registered
        - email
        - is_passwordless
        - created_at
        - updated_at
      properties:
        id:
          type: integer
          description: ユーザID
          readOnly: true
          example: 111111111111
        member:
          type: object
          readOnly: true
          required:
            - id
            - code
          properties:
            id:
              type: integer
              description: 会員のID
              example: 1
            code:
              type: string
              description: 会員ID(xxx00000)
              example: abc01234
        name:
          type: string
          description: ユーザ名
          example: ユーザの名前
        code:
          type: string
          description: ユーザコード
          readOnly: true
          example: user_code
        status:
          type: string
          description: ユーザのステータス
          enum: ["available"]
          readOnly: true
          example: "available"
        description:
          type: string
          description: ユーザの説明
          example: ユーザの説明
        otp:
          type: object
          required:
            - status
            - has_recovery_code
          properties:
            status:
              type: string
              description: |
                OTP設定状態
                * deactivated OTP無効状態
                * activated OTP有効状態
                * activating OTP有効化中
              enum: [deactivated, activated, activating]
              example: deactivated
            has_recovery_code:
              type: boolean
              description: リカバリーコード作成済みかどうか
              example: false
        is_security_key_registered:
          type: boolean
          description: セキュリティキーを登録済みかどうか
        email:
          type: string
          description: メールアドレス
          readOnly: true
          example: "user@example.com"
        is_passwordless:
          type: boolean
          description: パスワードレス認証かどうか
          readOnly: true
          example: false
        created_at:
          type: string
          description: 作成日時
          readOnly: true
          example: 2024-05-02T16:32:23Z
        updated_at:
          type: string
          description: 更新日時
          readOnly: true
          example: 2024-05-02T16:32:23Z

    UserTrustedDevice:
      type: object
      required:
        - id
        - name
        - created_at
      properties:
        id:
          type: integer
          description: ユーザの信頼済みデバイスID
          example: 1
        name:
          type: string
          description: 名前
          example: xxxxxxxx
          minLength: 1
          maxLength: 32
        created_at:
          type: string
          format: date-time
          description: 作成日時
          example: "2021-01-01T00:00:01+09:00"

    UserSecurityKey:
      type: object
      required:
        - id
        - name
        - sign_count
        - aaguid
        - registered_at
        - last_used_at
      properties:
        id:
          type: integer
          description: セキュリティキーID
          minimum: 1
        name:
          type: string
          description: セキュリティキー名
          example: ユーザが任意に設定する名前
        sign_count:
          type: integer
          description: 使用回数
        aaguid:
          type: string
          example: a25342c0-3cdc-4414-8e46-f4807fca511c
          description: セキュリティキーの識別子
        registered_at:
          type: string
          format: date-time
          description: 登録日時
        last_used_at:
          type: string
          format: date-time
          nullable: true
          description: 最終使用日時

    Group:
      type: object
      required:
        - id
        - name
        - description
        - created_at
        - updated_at
      properties:
        id:
          type: integer
          description: グループID
          readOnly: true
          example: 1
        name:
          type: string
          description: グループ名
          example: グループの名前
        description:
          type: string
          description: グループの説明
          example: グループの説明
        created_at:
          type: string
          description: 作成日時
          readOnly: true
          example: 2024-05-02T16:32:23Z
        updated_at:
          type: string
          description: 更新日時
          readOnly: true
          example: 2024-05-02T16:32:23Z

    GroupMemberships:
      type: object
      required:
        - compat_users
      properties:
        compat_users:
          type: array
          items:
            type: object
            required:
              - id
            properties:
              id:
                type: integer
                description: ユーザID
                example: 111111111111

    ServicePrincipal:
      type: object
      required:
        - id
        - project_id
        - name
        - description
      properties:
        id:
          type: integer
          description: サービスプリンシパルID
          readOnly: true
          example: 1
        project_id:
          type: integer
          description: プロジェクトID
          example: 1
        name:
          type: string
          description: サービスプリンシパル名
          example: Sakura Service Principal
        description:
          type: string
          description: サービスプリンシパルの説明
          example: サービスプリンシパルの説明
        created_at:
          type: string
          description: 作成日時
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          example: 2024-05-02T14:30:00Z

    ServicePrincipalKey:
      type: object
      required:
        - id
        - kid
        - status
        - key_origin
        - public_key
        - created_at
      properties:
        id:
          type: string
          description: サービスプリンシパルキーID
          readOnly: true
          format: uuid
          example: 00000000-0000-0000-0000-000000000000
        kid:
          type: string
          description: 公開鍵のkid
          readOnly: true
          example: 1234567890abcdef1234567890abcdef12345678
        status:
          type: string
          description: |
            サービスプリンシパルキーの状態
            * enabled 有効
            * disabled 無効
          enum: [enabled, disabled]
          example: enabled
        key_origin:
          type: string
          description: |
            鍵の生成元
          readOnly: true
          enum: [user]
          example: user
        public_key:
          $ref: "#/components/schemas/ServiceprincipalKeyPublicKey"
        created_at:
          type: string
          description: 作成日時
          example: 2024-05-01T14:30:00Z
        key_expires_at:
          type: string
          description: 有効期限
          example: 2024-05-01T14:30:00Z
          nullable: true

    ServiceprincipalKeyPublicKey:
      type: string
      description: |
        PEM形式の公開鍵文字列
        RSA鍵のみをサポート
        鍵長は2048ビット以上かつ4096ビット以下をサポート
      example: BEGIN PUBLIC KEY\n...\nEND PUBLIC KEY

    ServicePrincipalJWTGrantRequest:
      type: object
      required:
        - grant_type
        - assertion
      properties:
        grant_type:
          type: string
          description: 固定値 JWT Bearer Grant Type
          enum:
            - urn:ietf:params:oauth:grant-type:jwt-bearer
          example: urn:ietf:params:oauth:grant-type:jwt-bearer
        assertion:
          type: string
          description: サービスプリンシパルキーで署名されたJWT
          example: eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

    ServicePrincipalOAuth2AccessToken:
      type: object
      required:
        - access_token
        - token_expired_at
      properties:
        access_token:
          type: string
          description: アクセストークン
          example: "abcdefghijklmnopqrstuvwxyz0123456789-._~+/ABCDEFGHIJKLMN"
        token_type:
          type: string
          description: トークンの種類
          example: Bearer
        token_expired_at:
          type: string
          format: date-time
          description: アクセストークンの有効期限 (ISO 8601形式)
          example: "2021-01-01T00:00:01+09:00"
        expires_in:
          type: integer
          description: アクセストークンの有効期限（秒単位）
          example: 3600

    ProjectApiKey:
      type: object
      required:
        - id
        - project_id
        - name
        - description
        - access_token
        - iam_roles
      properties:
        id:
          type: integer
          description: APIキーID
          readOnly: true
          example: 111222333444
        project_id:
          type: integer
          description: プロジェクトID
          example: 123456789123
        name:
          type: string
          description: APIキー名
          example: リソース操作APIキー
        description:
          type: string
          description: APIキーの説明
          example: 通常のリソース操作用
        access_token:
          type: string
          description: アクセストークン
          example: "********"
        server_resource_id:
          type: string
          description: APIキーがシングルサーバコントロールパネルで利用される場合は必須。
          nullable: true
          example: null
        iam_roles:
          type: array
          description: IAMのロール。
          example: [viewer, editor, admin]
          items:
            type: string
        zone_id:
          type: string
          description: ゾーンを指定。APIキーがシングルサーバコントロールパネルで利用される場合は必須。
          nullable: true
          example: null
        created_at:
          type: string
          description: 作成日時
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          example: 2024-05-02T14:30:00Z

    ProjectApiKeyWithSecret:
      allOf:
        - $ref: "#/components/schemas/ProjectApiKey"
        - type: object
          required:
            - access_token_secret
          properties:
            access_token_secret:
              type: string
              description: アクセストークンシークレット
              example: "********"

    IamPolicy:
      type: object
      properties:
        role:
          type: object
          properties:
            type:
              type: string
              enum: ["preset"]
            id:
              type: string
              description: IAMロールID
              example: admin
        principals:
          type: array
          items:
            $ref: "#/components/schemas/Principal"

    IdPolicy:
      type: object
      properties:
        role:
          type: object
          properties:
            type:
              type: string
              enum: ["preset"]
            id:
              type: string
              description: IDロールID
              example: identity-admin
        principals:
          type: array
          items:
            $ref: "#/components/schemas/Principal"

    Principal:
      type: object
      properties:
        type:
          type: string
          description: プリンシパルのタイプ
          example: user
        id:
          type: integer
          description: プリンシパルのID
          example: 111111111111

    SSOProfile:
      type: object
      required:
        - id
        - name
        - description
        - sp_entity_id
        - sp_acs_url
        - idp_entity_id
        - idp_login_url
        - idp_logout_url
        - idp_certificate
        - assigned
        - created_at
        - updated_at
      properties:
        id:
          type: integer
          description: SSOプロファイルID
          readOnly: true
          example: 1
        name:
          type: string
          description: SSOプロファイル名
          example: SSOプロファイル1
        description:
          type: string
          description: SSOプロファイルの説明
          example: SSOプロファイル1の説明
        sp_entity_id:
          type: string
          description: SPのエンティティID
          readOnly: true
          example: "https://sp.example.com/samlrp/ang5eizeevahvooy"
        sp_acs_url:
          type: string
          description: SPのAssertion Consumer Service URL
          readOnly: true
          example: "https://sp.example.com/samlrp/ang5eizeevahvooy/acs"
        idp_entity_id:
          type: string
          description: IdPのエンティティID
          example: "https://idp.example.com/ile2ephei7saeph6"
        idp_login_url:
          type: string
          description: IdPのログインURL
          example: "https://idp.example.com/ile2ephei7saeph6/sso/login"
        idp_logout_url:
          type: string
          description: IdPのログアウトURL
          example: "https://idp.example.com/ile2ephei7saeph6/sso/logout"
        idp_certificate:
          type: string
          description: IdPのX.509証明書
          example: "-----BEGIN CERTIFICATE-----\nMIIDqjCCApKgAwIBA<snip>\n-----END CERTIFICATE-----"
        assigned:
          type: boolean
          description: このプロファイルを割り当ているかどうか
          readOnly: true
        created_at:
          type: string
          description: 作成日時
          readOnly: true
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          readOnly: true
          example: 2024-05-02T14:30:00Z

    Organization:
      type: object
      required:
        - name
      properties:
        id:
          type: integer
          readOnly: true
          description: 組織のリソースID
          example: 123456789123
        name:
          type: string
          description: 組織名
          example: 組織名

    Folder:
      type: object
      required:
        - id
        - type
        - name
        - parent_id
        - description
        - created_at
        - updated_at
      properties:
        id:
          type: integer
          description: フォルダID
          readOnly: true
          example: 1
        name:
          type: string
          description: フォルダ名
          example: フォルダ名
        parent_id:
          type: integer
          nullable: true
          description: 親フォルダID
          default: null
          example: 1
        description:
          type: string
          description: フォルダの説明
          example: My Sakura Folder description
        created_at:
          type: string
          description: 作成日時
          readOnly: true
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          readOnly: true
          example: 2024-05-02T14:30:00Z
    MoveFolders:
      type: object
      required:
        - folder_ids
        - parent_id
      properties:
        folder_ids:
          type: array
          items:
            type: integer
          description: 移動するフォルダID
          example: [1, 2, 3, 4, 5]
        parent_id:
          type: integer
          description: 移動先のフォルダID
          nullable: true
          example: 1

    RuleTemplate:
      type: object
      properties:
        code:
          type: string
          description: ルールテンプレートコード
          example: example.template.code
        description:
          type: string
          description: ルールテンプレートの説明
          example: ルールテンプレートの説明
        name:
          type: string
          description: ルールテンプレート名
          example: ルールテンプレート1
        type:
          type: string
          description: ルールテンプレートのタイプ
          example: boolean
        supports_dry_run:
          type: boolean
          description: ドライランがサポートされているかどうか
          example: true
        prefixes:
          type: array
          items:
            type: string
          description: ルールテンプレートのプレフィックス
          example: [is]
    RuleContent:
      type: object
      properties:
        values:
          type: object
          properties:
            allowed_values:
              type: array
              items:
                type: string
              description: 許可する値のリスト
            denied_values:
              type: array
              items:
                type: string
              description: 拒否する値のリスト
        allow_all:
          type: boolean
          description: すべての値を許可する。リスト型ルールの場合のみ設定可能。
        deny_all:
          type: boolean
          description: すべての値を許可する。リスト型ルールの場合のみ設定可能。
        enforce:
          type: boolean
          description: ブール型ルールを強制するかどうか
    RuleSpec:
      type: object
      description: spec, dry_run_specのどちらか一方は必須
      properties:
        contents:
          type: array
          items:
            $ref: "#/components/schemas/RuleContent"
    Rule:
      type: object
      required:
        - code
        - is_active
        - is_dry_run
      allOf:
        - type: object
          properties:
            code:
              type: string
              description: ルールテンプレートのコード
            spec:
              $ref: "#/components/schemas/RuleSpec"
            dry_run_spec:
              $ref: "#/components/schemas/RuleSpec"
        - $ref: "#/components/schemas/RuleStatus"
    RuleResponse:
      allOf:
        - type: object
          properties:
            code:
              type: string
              description: ルールテンプレートのコード
            name:
              type: string
              description: ルール名
              example: Example Rule
            spec:
              $ref: "#/components/schemas/RuleSpec"
            dry_run_spec:
              $ref: "#/components/schemas/RuleSpec"
        - $ref: "#/components/schemas/RuleStatus"
    RuleStatus:
      type: object
      properties:
        is_active:
          type: boolean
          description: ルールが有効かどうか
          example: true
        is_dry_run:
          type: boolean
          description: ルールがドライランかどうか
          example: false
    PasswordPolicy:
      type: object
      required:
        - min_length
        - require_uppercase
        - require_lowercase
        - require_symbols
      properties:
        min_length:
          type: integer
          description: パスワードの最小文字数 (8文字以上64文字以下; デフォルトは`8`)
          example: 8
        require_uppercase:
          type: boolean
          description: |
            大文字を必須とするか (デフォルトは`false`)
            `false` であっても英字自体は必須
          example: false
        require_lowercase:
          type: boolean
          description: |
            小文字を必須とするか (デフォルトは`false`)
            `false` であっても英字自体は必須
          example: false
        require_symbols:
          type: boolean
          description: 記号を必須とするか (デフォルトは`false`)
          example: false
    AuthConditions:
      type: object
      required:
        - ip_restriction
        - require_two_factor_auth
        - datetime_restriction
      properties:
        ip_restriction:
          type: object
          required:
            - mode
          description: 認証を許可するIPサブネットワーク (デフォルトはすべて許可)
          oneOf:
            - type: object
              properties:
                mode:
                  type: string
                  enum: [allow_all]
                  description: |
                    allow_all = すべて許可
                    allow_list = source_networkで許可リスト指定
            - type: object
              properties:
                mode:
                  type: string
                  enum: [allow_list]
                  description: |
                    allow_all = すべて許可
                    allow_list = source_networkで許可リスト指定
                source_network:
                  type: array
                  items:
                    type: string
                    description: IPv4のCIDR表記
                  description: modeがallow_listの場合のみ必須
        require_two_factor_auth:
          type: object
          properties:
            enabled:
              type: boolean
              description: 2要素認証によるログインを必須とするかどうか (デフォルトは `false`)
          required:
            - enabled
          example:
            enabled: false
        datetime_restriction:
          type: object
          required:
            - after
            - before
          properties:
            after:
              type: string
              format: date-time
              description: 日時がこの時間より後であることを要求 (ISO 8601形式; デフォルトは未設定 (`null`))
              nullable: true
              example: "2025-09-01T00:00:00+09:00"
            before:
              type: string
              format: date-time
              description: 日時がこの時間より前であることを要求 (ISO 8601形式; デフォルトは未設定 (`null`))
              nullable: true
              example: "2025-10-01T00:00:00+09:00"
    ScimConfigurationBase:
      type: object
      required:
        - id
        - name
        - base_url
        - created_at
        - updated_at
      properties:
        id:
          type: string
          format: uuid
          description: ユーザープロビジョニングID
          readOnly: true
        name:
          type: string
          description: ユーザープロビジョニング名
          example: MicrosoftEntraID
        base_url:
          type: string
          format: uri
          description: ユーザープロビジョニングエンドポイントのベースURL（ユーザープロビジョニングIDを含む）
          readOnly: true
          example: "https://secure.sakura.ad.jp/cloud/api/iam/1.0/scim/550e8400-e29b-41d4-a716-446655440000/v2/"
        created_at:
          type: string
          description: 作成日時
          readOnly: true
          example: 2024-05-01T14:30:00Z
        updated_at:
          type: string
          description: 更新日時
          readOnly: true
          example: 2024-05-02T14:30:00Z
    ScimConfiguration:
      allOf:
        - $ref: "#/components/schemas/ScimConfigurationBase"
        - type: object
          required:
            - secret_token
          properties:
            secret_token:
              type: string
              description: ユーザープロビジョニングの認証に使用するシークレットトークン
              readOnly: true
              example: "your_secret_token"
    ScimConfigurationPublic:
      allOf:
        - $ref: "#/components/schemas/ScimConfigurationBase"
  examples:
    ProjectApiKeyResource:
      summary: リソース操作APIキー
      value:
        id: 111222333444
        project_id: 123456789123
        name: リソース操作APIキー
        description: 通常のリソース操作用
        access_token: "********"
        server_resource_id: null
        iam_roles: [viewer, editor, admin]
        zone_id: null
        created_at: 2024-05-01T14:30:00Z
        updated_at: 2024-05-02T14:30:00Z
    ProjectApiKeySingleServer:
      summary: シングルサーバAPIキー
      value:
        id: 222333444555
        project_id: 123456789123
        name: シングルサーバAPIキー
        description: シングルサーバコントロールパネル用
        access_token: "********"
        server_resource_id: "321987654321"
        iam_roles: [viewer, editor, admin]
        zone_id: "is1a"
        created_at: 2024-05-01T14:30:00Z
        updated_at: 2024-05-02T14:30:00Z
    ProjectApiKeyResourceWithSecret:
      summary: リソース操作APIキー（シークレットあり）
      value:
        id: 111222333444
        project_id: 123456789123
        name: リソース操作APIキー
        description: 通常のリソース操作用
        access_token: "********"
        access_token_secret: "********"
        server_resource_id: null
        iam_roles: [viewer, editor, admin]
        zone_id: null
        created_at: 2024-05-01T14:30:00Z
        updated_at: 2024-05-02T14:30:00Z
    ProjectApiKeySingleServerWithSecret:
      summary: シングルサーバAPIキー（シークレットあり）
      value:
        id: 222333444555
        project_id: 123456789123
        name: シングルサーバAPIキー
        description: シングルサーバコントロールパネル用
        access_token: "********"
        access_token_secret: "********"
        server_resource_id: "321987654321"
        iam_roles: [viewer, editor, admin]
        zone_id: "is1a"
        created_at: 2024-05-01T14:30:00Z
        updated_at: 2024-05-02T14:30:00Z
