Application Research Components API

Operations for managing component descriptors

Documentation

Specifications

Code Examples

Schemas & Data

OpenAPI Specification

application-research-components-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Application Research CNAB Bundle API Resources Components API
  version: 1.0.0
  description: 'API for managing Cloud Native Application Bundles (CNAB).


    This API provides endpoints for managing CNAB bundles, claims, claim results,

    dependencies, parameter sources, relocation mappings, and installation status.

    '
  contact:
    name: CNAB Specification
    url: https://cnab.io
  license:
    name: Apache-2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
servers:
- url: https://api.example.com/v1
  description: Production server
- url: https://staging-api.example.com/v1
  description: Staging server
security:
- bearerAuth: []
- apiKey: []
tags:
- name: Components
  description: Operations for managing component descriptors
paths:
  /components:
    get:
      tags:
      - Components
      summary: Application Research List component descriptors
      operationId: listComponents
      parameters:
      - $ref: '#/components/parameters/LimitParam'
      - $ref: '#/components/parameters/OffsetParam'
      - $ref: '#/components/parameters/ProviderFilterParam'
      responses:
        '200':
          description: List of component descriptors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentDescriptorListResponse'
              examples:
                componentList:
                  $ref: '#/components/examples/ComponentDescriptorListResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Components
      summary: Application Research Create a component descriptor
      operationId: createComponent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ComponentDescriptor'
            examples:
              webApplication:
                $ref: '#/components/examples/WebApplicationComponentDescriptor'
      responses:
        '201':
          description: Component descriptor created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentDescriptor'
              examples:
                webApplication:
                  $ref: '#/components/examples/WebApplicationComponentDescriptor'
        '400':
          $ref: '#/components/responses/BadRequest'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/InternalError'
  /components/{name}:
    parameters:
    - $ref: '#/components/parameters/ComponentNameParam'
    get:
      tags:
      - Components
      summary: Application Research Get a component descriptor by name
      operationId: getComponent
      parameters:
      - $ref: '#/components/parameters/VersionQueryParam'
      responses:
        '200':
          description: Component descriptor details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentDescriptor'
              examples:
                webApplication:
                  $ref: '#/components/examples/WebApplicationComponentDescriptor'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
    put:
      tags:
      - Components
      summary: Application Research Update a component descriptor
      operationId: updateComponent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ComponentDescriptor'
            examples:
              webApplication:
                $ref: '#/components/examples/WebApplicationComponentDescriptor'
      responses:
        '200':
          description: Component descriptor updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentDescriptor'
              examples:
                webApplication:
                  $ref: '#/components/examples/WebApplicationComponentDescriptor'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
    delete:
      tags:
      - Components
      summary: Application Research Delete a component descriptor
      operationId: deleteComponent
      parameters:
      - $ref: '#/components/parameters/VersionQueryParam'
      responses:
        '204':
          description: Component deleted successfully
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
  /components/{name}/versions:
    parameters:
    - $ref: '#/components/parameters/ComponentNameParam'
    get:
      tags:
      - Components
      summary: Application Research List all versions of a component
      operationId: listComponentVersions
      responses:
        '200':
          description: List of component versions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VersionListResponse'
              examples:
                versionList:
                  $ref: '#/components/examples/VersionListResponse'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
  /components/{name}/references:
    parameters:
    - $ref: '#/components/parameters/ComponentNameParam'
    get:
      tags:
      - Components
      summary: Application Research List component references
      operationId: listComponentReferences
      parameters:
      - $ref: '#/components/parameters/VersionQueryParam'
      responses:
        '200':
          description: List of component references
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentReferenceListResponse'
              examples:
                referenceList:
                  $ref: '#/components/examples/ComponentReferenceListResponse'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
    post:
      tags:
      - Components
      summary: Application Research Add a component reference
      operationId: addComponentReference
      parameters:
      - $ref: '#/components/parameters/VersionQueryParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ComponentReference'
            examples:
              databaseRef:
                $ref: '#/components/examples/ComponentReferenceDatabase'
      responses:
        '201':
          description: Reference added
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ComponentReference'
              examples:
                databaseRef:
                  $ref: '#/components/examples/ComponentReferenceDatabase'
        '400':
          $ref: '#/components/responses/BadRequest'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
  /transfer:
    post:
      tags:
      - Components
      summary: Application Research Transfer components between repositories
      operationId: transferComponents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferRequest'
            examples:
              transfer:
                $ref: '#/components/examples/TransferRequest'
      responses:
        '202':
          description: Transfer initiated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferResult'
              examples:
                transferResult:
                  $ref: '#/components/examples/TransferResult'
        '400':
          $ref: '#/components/responses/BadRequest'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    ComponentName:
      type: string
      description: Fully qualified component name
      maxLength: 255
      pattern: ^[a-z][-a-z0-9]*([.][a-z][-a-z0-9]*)*[.][a-z]{2,}(/[a-z][-a-z0-9_]*([.][a-z][-a-z0-9_]*)*)+$
      examples:
      - github.com/acme.org/web-application
      - github.com/ailab.org/model-training-pipeline
    Resource:
      type: object
      description: Component resource
      required:
      - name
      - type
      properties:
        name:
          $ref: '#/components/schemas/ElementName'
        type:
          type: string
          description: Resource type
          examples:
          - ociImage
          - helmChart
          - json
          - directory
        extraIdentity:
          $ref: '#/components/schemas/IdentityAttribute'
        version:
          $ref: '#/components/schemas/Version'
        relation:
          type: string
          enum:
          - local
          - external
          default: external
        labels:
          $ref: '#/components/schemas/Labels'
        srcRefs:
          type: array
          items:
            $ref: '#/components/schemas/SrcRef'
        access:
          $ref: '#/components/schemas/Access'
        input:
          $ref: '#/components/schemas/Input'
        digest:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DigestSpec'
    Provider:
      type: object
      description: Component provider information
      required:
      - name
      properties:
        name:
          type: string
          description: Provider name
          examples:
          - acme
          - ailab
          - enterprise
        labels:
          $ref: '#/components/schemas/Labels'
    ComponentDescriptorListResponse:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/ComponentDescriptor'
        total:
          type: integer
        limit:
          type: integer
        offset:
          type: integer
    ComponentReferenceListResponse:
      type: array
      items:
        $ref: '#/components/schemas/ComponentReference'
    NestedComponentDigests:
      type: object
      description: Digests for nested components
      required:
      - name
      - version
      properties:
        name:
          $ref: '#/components/schemas/ComponentName'
        version:
          $ref: '#/components/schemas/Version'
        digest:
          $ref: '#/components/schemas/DigestSpec'
        resourceDigests:
          type: array
          items:
            $ref: '#/components/schemas/NestedDigestSpec'
    VersionListResponse:
      type: object
      properties:
        componentName:
          $ref: '#/components/schemas/ComponentName'
        versions:
          type: array
          items:
            $ref: '#/components/schemas/Version'
    Source:
      type: object
      description: Component source
      required:
      - name
      - type
      properties:
        name:
          $ref: '#/components/schemas/ElementName'
        type:
          type: string
          description: Source type
          examples:
          - git
          - helmChart
          - yaml
        extraIdentity:
          $ref: '#/components/schemas/IdentityAttribute'
        version:
          $ref: '#/components/schemas/Version'
        labels:
          $ref: '#/components/schemas/Labels'
        access:
          $ref: '#/components/schemas/Access'
        input:
          $ref: '#/components/schemas/Input'
    Labels:
      type: array
      items:
        $ref: '#/components/schemas/Label'
    Access:
      type: object
      description: Access specification for resources and sources
      required:
      - type
      properties:
        type:
          type: string
          description: Access type identifier
      discriminator:
        propertyName: type
        mapping:
          localBlob: '#/components/schemas/LocalBlobAccess'
          ociArtifact: '#/components/schemas/OciArtifactAccess'
          ociBlob: '#/components/schemas/OciBlobAccess'
          helm: '#/components/schemas/HelmAccess'
          gitHub: '#/components/schemas/GitHubAccess'
          github: '#/components/schemas/GitHubAccess'
          s3: '#/components/schemas/S3Access'
          npm: '#/components/schemas/NpmAccess'
          wget: '#/components/schemas/WgetAccess'
          http: '#/components/schemas/HttpAccess'
    Error:
      type: object
      description: Error response
      required:
      - code
      - message
      properties:
        code:
          type: string
        message:
          type: string
        details:
          type: object
          additionalProperties: true
    Meta:
      type: object
      description: Component descriptor metadata
      required:
      - schemaVersion
      properties:
        schemaVersion:
          type: string
          description: Schema version identifier
          examples:
          - v2
    TransferRequest:
      type: object
      description: Request to transfer components
      required:
      - components
      - targetRepository
      properties:
        components:
          type: array
          items:
            type: object
            properties:
              name:
                $ref: '#/components/schemas/ComponentName'
              version:
                $ref: '#/components/schemas/Version'
        sourceRepository:
          $ref: '#/components/schemas/RepositoryContext'
        targetRepository:
          $ref: '#/components/schemas/RepositoryContext'
        recursive:
          type: boolean
          default: true
          description: Transfer referenced components
    SrcRef:
      type: object
      description: Reference to a component-local source
      properties:
        identitySelector:
          $ref: '#/components/schemas/IdentityAttribute'
        labels:
          $ref: '#/components/schemas/Labels'
    RepositoryContext:
      type: object
      description: Repository context for component storage
      required:
      - type
      properties:
        type:
          type: string
          enum:
          - ociRegistry
          - OCIRegistry
        baseUrl:
          type: string
          description: Base URL of the repository
        componentNameMapping:
          type: string
          enum:
          - urlPath
          - sha256-digest
    DigestSpec:
      type: object
      description: Cryptographic digest specification
      required:
      - hashAlgorithm
      - normalisationAlgorithm
      - value
      properties:
        hashAlgorithm:
          type: string
          description: Hash algorithm used
          examples:
          - SHA-256
          - SHA-512
        normalisationAlgorithm:
          type: string
          description: Normalisation algorithm used
          examples:
          - jsonNormalisation/v1
          - ociArtifactDigest/v1
        value:
          type: string
          description: The digest value
    ElementName:
      type: string
      description: Element name for resources and sources
      minLength: 2
      pattern: ^[a-z0-9]([-_+a-z0-9]*[a-z0-9])?$
      examples:
      - frontend-image
      - backend-image
      - helm-chart
    Version:
      type: string
      description: Semantic version string
      pattern: ^[v]?(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
      examples:
      - 1.0.0
      - 2.5.1
      - v1.0.0-beta.1
    Input:
      type: object
      description: Input specification for local resources
      required:
      - type
      properties:
        type:
          type: string
    Label:
      type: object
      description: A label with name-value pair
      required:
      - name
      - value
      properties:
        name:
          type: string
          description: Label name
        value: {}
        version:
          type: string
          pattern: ^v[0-9]+$
        signing:
          type: boolean
          description: Whether this label should be included in signing
        merge:
          $ref: '#/components/schemas/Merge'
    ComponentDescriptor:
      type: object
      description: Complete component descriptor
      required:
      - meta
      - component
      properties:
        meta:
          $ref: '#/components/schemas/Meta'
        component:
          $ref: '#/components/schemas/Component'
        signatures:
          type: array
          items:
            $ref: '#/components/schemas/Signature'
        nestedDigests:
          type: array
          items:
            $ref: '#/components/schemas/NestedComponentDigests'
    Signature:
      type: object
      description: Component signature
      required:
      - name
      - signature
      properties:
        name:
          type: string
          description: Signature name/identifier
        digest:
          $ref: '#/components/schemas/DigestSpec'
        signature:
          $ref: '#/components/schemas/SignatureSpec'
    ComponentReference:
      type: object
      description: Reference to another component
      required:
      - name
      - componentName
      - version
      properties:
        name:
          $ref: '#/components/schemas/ElementName'
        componentName:
          $ref: '#/components/schemas/ComponentName'
        version:
          $ref: '#/components/schemas/Version'
        extraIdentity:
          $ref: '#/components/schemas/IdentityAttribute'
        labels:
          $ref: '#/components/schemas/Labels'
        digest:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DigestSpec'
    IdentityAttribute:
      type: object
      description: Identity attributes for element identification
      additionalProperties:
        type: string
    NestedDigestSpec:
      type: object
      required:
      - name
      properties:
        name:
          type: string
        version:
          type: string
        extraIdentity:
          $ref: '#/components/schemas/IdentityAttribute'
        digest:
          $ref: '#/components/schemas/DigestSpec'
    Merge:
      type: object
      properties:
        algorithm:
          type: string
          pattern: ^[a-z][a-z0-9/_-]+$
        config: {}
    TransferResult:
      type: object
      description: Result of transfer operation
      properties:
        status:
          type: string
          enum:
          - pending
          - running
          - completed
          - failed
        transferId:
          type: string
        componentsTransferred:
          type: integer
        message:
          type: string
    Component:
      type: object
      description: Component definition
      required:
      - name
      - version
      - provider
      properties:
        name:
          $ref: '#/components/schemas/ComponentName'
        version:
          $ref: '#/components/schemas/Version'
        creationTime:
          type:
          - string
          - 'null'
          format: date-time
        repositoryContexts:
          type: array
          items:
            $ref: '#/components/schemas/RepositoryContext'
        provider:
          oneOf:
          - type: string
          - $ref: '#/components/schemas/Provider'
        labels:
          $ref: '#/components/schemas/Labels'
        sources:
          type: array
          items:
            $ref: '#/components/schemas/Source'
        resources:
          type: array
          items:
            $ref: '#/components/schemas/Resource'
        componentReferences:
          type: array
          items:
            $ref: '#/components/schemas/ComponentReference'
    SignatureSpec:
      type: object
      description: Signature specification
      required:
      - algorithm
      - value
      - mediaType
      properties:
        algorithm:
          type: string
          description: Signature algorithm
          examples:
          - RSASSA-PSS-SHA256
          - ECDSA-SHA256
        value:
          type: string
          description: The signature value
        mediaType:
          type: string
          description: Media type of the signature
          examples:
          - application/vnd.ocm.signature.rsa
  examples:
    ErrorNotFound:
      summary: Not Found Error
      description: Example not found error
      value:
        code: NOT_FOUND
        message: Component 'github.com/acme.org/unknown-component' not found
    TransferResult:
      summary: Transfer Result
      description: Example transfer result
      value:
        status: completed
        transferId: tr-abc123def456
        componentsTransferred: 3
        message: Successfully transferred 3 components including dependencies
    WebApplicationComponentDescriptor:
      summary: Web Application Component Descriptor
      description: Complete component descriptor for a web application
      value:
        meta:
          schemaVersion: v2
        component:
          name: github.com/acme.org/web-application
          version: 2.5.1
          creationTime: '2025-01-13T10:30:00Z'
          provider:
            name: acme
            labels:
            - name: team
              value: platform-engineering
          repositoryContexts:
          - type: ociRegistry
            baseUrl: ghcr.io/acme
            componentNameMapping: urlPath
          labels:
          - name: app.kubernetes.io/name
            value: web-application
          - name: environment
            value: production
            signing: true
          sources:
          - name: application-source
            type: git
            version: 2.5.1
            access:
              type: gitHub
              repoUrl: https://github.com/acme-org/web-application
              commit: a7f8d9e1c2b3a4f5e6d7c8b9a0f1e2d3c4b5a6f7
            labels:
            - name: language
              value: javascript
          - name: deployment-manifests
            type: helmChart
            version: 1.2.0
            access:
              type: helm
              helmRepository: https://charts.acme.org
              helmChart: web-app:1.2.0
          resources:
          - name: frontend-image
            type: ociImage
            version: 2.5.1
            relation: local
            access:
              type: ociArtifact
              imageReference: ghcr.io/acme-org/web-app-frontend:2.5.1@sha256:4f5d0d0684a1ed9f7ce482c87c2c4d3499468fdcea2711f0c3f6a69a7aa9147b
            labels:
            - name: component
              value: frontend
            digest:
              hashAlgorithm: SHA-256
              normalisationAlgorithm: ociArtifactDigest/v1
              value: 4f5d0d0684a1ed9f7ce482c87c2c4d3499468fdcea2711f0c3f6a69a7aa9147b
          - name: backend-image
            type: ociImage
            version: 2.5.1
            relation: local
            access:
              type: ociArtifact
              imageReference: ghcr.io/acme-org/web-app-backend:2.5.1
            srcRefs:
            - identitySelector:
                name: application-source
          - name: nginx-proxy
            type: ociImage
            version: 1.25.4
            relation: external
            access:
              type: ociArtifact
              imageReference: nginx:1.25.4
          - name: helm-chart
            type: helmChart
            relation: local
            access:
              type: localBlob
              localReference: sha256:fa7d95d13bcec2665ec944f005d0d7f28ba92c1fd7c128e9b7347d792ba5f291
              mediaType: application/x-tar+gzip
              referenceName: web-app-chart
          - name: configuration
            type: json
            relation: local
            access:
              type: localBlob
              localReference: config.json
              mediaType: application/json
          componentReferences:
          - name: database
            componentName: github.com/acme.org/postgresql-cluster
            version: 15.2.0
            labels:
            - name: dependency-type
              value: runtime
          - name: redis-cache
            componentName: github.com/acme.org/redis
            version: 7.0.5
            digest:
              hashAlgorithm: SHA-256
              normalisationAlgorithm: jsonNormalisation/v1
              value: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
        signatures:
        - name: acme-signing-authority
          digest:
            hashAlgorithm: SHA-256
            normalisationAlgorithm: jsonNormalisation/v1
            value: 7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730
          signature:
            algorithm: RSASSA-PSS-SHA256
            value: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
            mediaType: application/vnd.ocm.signature.rsa
    ErrorBadRequest:
      summary: Bad Request Error
      description: Example bad request error
      value:
        code: BAD_REQUEST
        message: Invalid component name format
        details:
          field: component.name
          pattern: ^[a-z][-a-z0-9]*([.][a-z][-a-z0-9]*)*[.][a-z]{2,}(/[a-z][-a-z0-9_]*([.][a-z][-a-z0-9_]*)*)+$
    ErrorConflict:
      summary: Conflict Error
      description: Example conflict error
      value:
        code: CONFLICT
        message: Component 'github.com/acme.org/web-application' version '2.5.1' already exists
    ErrorInternal:
      summary: Internal Error
      description: Example internal server error
      value:
        code: INTERNAL_ERROR
        message: An unexpected error occurred
        details:
          requestId: req-xyz789
    TransferRequest:
      summary: Transfer Request
      description: Example request to transfer components
      value:
        components:
        - name: github.com/acme.org/web-application
          version: 2.5.1
        sourceRepository:
          type: ociRegistry
          baseUrl: ghcr.io/acme
          componentNameMapping: urlPath
        targetRepository:
          type: ociRegistry
          baseUrl: registry.internal.company.com/ocm
          componentNameMapping: urlPath
        recursive: true
    ComponentReferenceListResponse:
      summary: Component reference list
      description: Example list of component references
      value:
      - name: database
        componentName: github.com/acme.org/postgresql-cluster
        version: 15.2.0
        labels:
        - name: dependency-type
          value: runtime
      - name: redis-cache
        componentName: github.com/acme.org/redis
        version: 7.0.5
    ComponentDescriptorListResponse:
      summary: Component descriptor list
      description: Example list of component descriptors
      value:
        items:
        - meta:
            schemaVersion: v2
          component:
            name: github.com/acme.org/web-application
            version: 2.5.1
            provider:
              name: acme
        - meta:
            schemaVersion: v2
          component:
            name: github.com/ailab.org/model-training-pipeline
            version: 4.2.0
            provider:
              name: ailab
        total: 2
        limit: 20
        offset: 0
    VersionListResponse:
      summary: Version list
      description: Example list of component versions
      value:
        componentName: github.com/acme.org/web-application
        versions:
        - 2.5.1
        - 2.5.0
        - 2.4.3
        - 2.4.2
        - 2.4.1
    ComponentReferenceDatabase:
      summary: Database Component Reference
      description: Example component reference to a database
      value:
        name: database
        componentName: github.com/acme.org/postgresql-cluster
        version: 15.2.0
        labels:
        - name: dependency-type
          value: runtime
  responses:
    BadRequest:
      description: Bad request - invalid input
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            badRequest:
              $ref: '#/components/examples/ErrorBadRequest'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            notFound:
              $ref: '#/components/examples/ErrorNotFound'
    Conflict:
      description: Resource already exists
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            conflict:
              $ref: '#/components/examples/ErrorConflict'
    InternalError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            internalError:
              $ref: '#/components/examples/ErrorInternal'
  parameters:
    OffsetParam:
      name: offset
      in: query
      description: Number of items to skip
      schema:
        type: integer
        minimum: 0
        default: 0
    VersionQueryParam:
      name: version
      in: query
      description: Component version (semver)
      schema:
        $ref: '#/components/schemas/Version'
    ComponentNameParam:
      name: name
      in: path
      required: true
      description: Component name (e.g., github.com/acme.org/web-application)
      schema:
        $ref: '#/components/schemas/ComponentName'
    LimitParam:
      name: limit
      in: query
      description: Maximum number of items to return
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
    ProviderFilterParam:
      name: provider
      in: query
      description: Filter by provider name
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT-based authentication
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: API key authentication