openapi: 3.0.4
info:
  title: MyHoreca Licensing Vendor Partner API
  description: >-
    Public Vendor Partner surface: tenant-scoped Management subset for key sellers (licenses, devices, customers, Vendor
    Commerce, service accounts). Not Platform Admin. Not Platform Billing (PBL). Not Runtime device SDK. Auth:
    service-account Bearer token. Servers use a placeholder host — replace with management-api.<domain>. No live
    credentials. License key plaintext appears only on existing once-reveal operations — treat as secrets; examples must
    stay empty/masked.
  version: 1.0.0
  x-myhoreca-public-surface: partner-management
  x-myhoreca-wave: '71.2'
servers:
  - url: https://management-api.example.com
    description: Placeholder Management API base URL
paths:
  /health:
    get:
      tags:
        - Health
      operationId: GetHealth
      responses:
        '200':
          description: OK
  /ready:
    get:
      tags:
        - Health
      operationId: GetReady
      responses:
        '200':
          description: OK
  /api/v1/licenses/subscription-issues:
    post:
      tags:
        - SubscriptionLicenseIssueEndpointRouteBuilderExtensions
      summary: Issue a License from a Customer Subscription
      description: >-
        Requires licenses.manage. Tenant and actor come from the authenticated context. Plaintext key material is
        returned only on the first committed response.
      operationId: IssueSubscriptionLicense
      parameters:
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionLicenseIssueRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionLicenseIssueResponse'
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionLicenseIssueResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/aggregate:
    get:
      tags:
        - CustomerAggregateEndpointRouteBuilderExtensions
      summary: Get a customer profile and its License summaries
      description: >-
        Requires customers.read. Tenant comes only from the authenticated context. License membership is authoritative
        in BC-LIC; key material is masked.
      operationId: GetCustomerAggregate
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: licenseOffset
          in: query
          description: Zero-based License offset. Defaults to 0.
          schema:
            minimum: 0
            type: integer
            default: 0
        - name: licenseLimit
          in: query
          description: License page size from 1 through 200. Defaults to 50.
          schema:
            maximum: 200
            minimum: 1
            type: integer
            default: 50
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerAggregateResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    put:
      tags:
        - CustomerAggregateEndpointRouteBuilderExtensions
      summary: Replace a customer profile
      description: >-
        Requires customers.manage. Uses optimistic profile revision and returns only the committed BC-CUS profile; it
        performs no post-commit License or Product read.
      operationId: UpdateCustomerAggregateProfile
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerAggregateUpdateRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerAggregateProfileResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/licenses/table:
    get:
      tags:
        - CustomerLicenseTableEndpointRouteBuilderExtensions
      summary: Get the enriched License table for a customer
      description: >-
        Requires customers.read. Tenant comes only from the authenticated context. BC-LIC owns row membership;
        owner-service infrastructure failures return 503 without a partial page.
      operationId: GetCustomerLicenseTable
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: offset
          in: query
          description: Zero-based License offset. Defaults to 0.
          schema:
            minimum: 0
            type: integer
            default: 0
        - name: limit
          in: query
          description: License page size from 1 through 200. Defaults to 50.
          schema:
            maximum: 200
            minimum: 1
            type: integer
            default: 50
        - name: surface
          in: query
          description: >-
            Optional license table surface: working (Status != Archived) or archive (Status == Archived).
            Omit to return all licenses.
          schema:
            enum:
              - working
              - archive
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerLicenseTablePageResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/license-issue-candidates:
    get:
      tags:
        - CustomerLicenseIssueEndpointRouteBuilderExtensions
      summary: Get License issue candidates for a customer
      description: >-
        Requires customers.read and licenses.manage. Tenant comes only from the authenticated context. By default
        (issuableOnly=true) discovery keeps subscriptions while effectiveIssuable remains positive. With
        issuableOnly=false returns all Active|Trialing commercial rows with licensesUsed and licensesAvailable.
        Discovery is advisory; issue revalidates every owner and working-seat remaining.
      operationId: GetCustomerLicenseIssueCandidates
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: offset
          in: query
          description: Zero-based candidate offset. Defaults to 0.
          schema:
            minimum: 0
            type: integer
            default: 0
        - name: limit
          in: query
          description: Candidate page size from 1 through 200. Defaults to 50.
          schema:
            maximum: 200
            minimum: 1
            type: integer
            default: 50
        - name: issuableOnly
          in: query
          description: >-
            When true (default), return only candidates with available seats. When false, return all
            Active|Trialing connected products with licensesUsed and licensesAvailable.
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerLicenseIssueCandidatePageResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/license-issues:
    post:
      tags:
        - CustomerLicenseIssueEndpointRouteBuilderExtensions
      summary: Issue a License from a customer Subscription
      description: >-
        Requires customers.read and licenses.manage. Tenant and actor come only from the authenticated context.
        Plaintext key material is returned only on the first committed response.
      operationId: IssueCustomerSubscriptionLicense
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionLicenseIssueRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionLicenseIssueResponse'
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionLicenseIssueResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/licenses/{licenseId}/revoke:
    post:
      tags:
        - Customer License actions
      summary: Revoke a License in the exact customer scope
      description: >-
        Requires customers.read and licenses.manage. Tenant and exactly one typed actor come only from authenticated
        Management context. The acknowledged response follows one atomic LIC/AUD/MSG commit; no Idempotency-Key is used.
        Action: Revoke.
      operationId: RevokeCustomerLicense
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerLicenseTerminalTransitionRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerLicenseTerminalTransitionResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/licenses/{licenseId}/archive:
    post:
      tags:
        - Customer License actions
      summary: Archive a License in the exact customer scope
      description: >-
        Requires customers.read and licenses.manage. Tenant and exactly one typed actor come only from authenticated
        Management context. The acknowledged response follows one atomic LIC/AUD/MSG commit; no Idempotency-Key is used.
        Action: Archive.
      operationId: ArchiveCustomerLicense
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerLicenseTerminalTransitionRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerLicenseTerminalTransitionResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/customers/organizations/{organizationId}/licenses/{licenseId}/key/rotations:
    post:
      tags:
        - Customer License actions
      summary: Rotate the exact Customer License key
      description: >-
        Requires customers.read and licenses.manage. The strict body accepts only expectedPrimaryMaterialRefId and the
        Idempotency-Key header is required. Tenant and exactly one typed actor come only from authenticated Management
        context. Plaintext is returned only after the first LIC operation and Audit append complete; replay returns
        null. Responses are never cacheable.
      operationId: RotateCustomerLicenseKey
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Idempotency-Key
          in: header
          description: Required bounded durable rotation idempotency key.
          required: true
          schema:
            maxLength: 128
            minLength: 1
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LicenseKeyRotationRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerLicenseKeyRotationResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '415':
          description: Unsupported Media Type
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/licenses/{licenseId}/key/rotate:
    post:
      tags:
        - Licenses
      summary: Rotate a License key
      description: >-
        Atomic global v1 rotation. Reliable retries supply both an Idempotency-Key header and the strict
        expectedPrimaryMaterialRefId body. Omitting both enters the deprecated headerless compatibility mode, which is
        internally atomic but non-retryable over the network and returns Deprecation and Warning headers. The existing
        global success envelope is retained. Responses are never cacheable.
      operationId: RotateLicenseKey
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Idempotency-Key
          in: header
          description: >-
            Required together with the expected-primary body for reliable retries; omit both only for deprecated
            non-retryable compatibility.
          schema:
            maxLength: 128
            minLength: 1
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LicenseKeyRotationRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GlobalLicenseKeyRotationResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '415':
          description: Unsupported Media Type
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/service-accounts:
    get:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
    post:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateServiceAccountBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/service-accounts/{serviceAccountId}/credentials/rotate:
    post:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      parameters:
        - name: serviceAccountId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - enum:
                    - null
                - $ref: '#/components/schemas/RotateCredentialBody'
      responses:
        '200':
          description: OK
  /api/v1/service-accounts/{serviceAccountId}/credentials/{credentialId}/revoke:
    post:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      parameters:
        - name: serviceAccountId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: credentialId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/service-accounts/{serviceAccountId}/disable:
    post:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      parameters:
        - name: serviceAccountId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/service-accounts/me:
    get:
      tags:
        - ServiceAccountEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
  /api/v1/licenses/overview:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
  /api/v1/licenses/bulk/create:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkCreateLicensesBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/bulk/suspend:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkSuspendLicensesBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/bulk/revoke:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      description: >-
        Compatibility bulk revoke. revokedByActorId is deprecated, accepted but ignored; the actor comes only from the
        authenticated Management context. Each first-time item commits LIC/AUD/MSG atomically.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkRevokeLicensesBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LicenseReadListResponse'
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateLicenseBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LicenseReadResponse'
  /api/v1/licenses/{licenseId}/assign:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignLicenseBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/customer-site:
    put:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutLicenseCustomerSiteBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/extend:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExtendLicenseBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/suspend:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/revoke:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      description: >-
        Compatibility revoke. revokedByActorId is deprecated, accepted but ignored; the actor comes only from the
        authenticated Management context. LIC/AUD/MSG commit atomically before the response.
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RevokeLicenseBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/entitlements:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GrantEntitlementBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/custom-data:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    put:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutLicenseCustomDataBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/validity-mode:
    put:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutLicenseValidityModeBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/bind-policy-plan:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BindPolicyPlanBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/history:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/key:
    get:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/licenses/{licenseId}/key/issue:
    post:
      tags:
        - LicensesEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/devices:
    get:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDeviceBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}:
    get:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/evidence:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordEvidenceBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/installation-keys:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterInstallationKeyBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/fingerprint/signals:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpsertFingerprintSignalBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/fingerprint/assess:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/activate:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ActivateDeviceBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/{deviceId}/trials:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: deviceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartTrialBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/transfers:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RequestTransferBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/devices/transfers/{transferId}/complete:
    post:
      tags:
        - DevicesEndpointRouteBuilderExtensions
      parameters:
        - name: transferId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/price-books:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: OK
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePriceBookBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/price-books/{priceBookId}:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: priceBookId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    patch:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: priceBookId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdatePriceBookBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/price-books/{priceBookId}/activate:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: priceBookId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/price-books/{priceBookId}/retire:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: priceBookId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/offers:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: priceBookId
          in: query
          schema:
            type: string
            format: uuid
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: OK
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOfferBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/offers/{offerId}:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: offerId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    patch:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: offerId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateOfferBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/offers/{offerId}/activate:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: offerId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/offers/{offerId}/retire:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: offerId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/coupons:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: OK
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCouponBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/coupons/{couponId}/activate:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: couponId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/coupons/{couponId}/retire:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: couponId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/orders:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: status
          in: query
          schema:
            type: string
      responses:
        '200':
          description: OK
  /api/v1/commerce/orders/{orderId}:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: orderId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/orders/{orderId}/provider-checkout:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: orderId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProviderCheckoutBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/checkout-sessions:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCheckoutSessionBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/checkout-sessions/{sessionId}:
    get:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: sessionId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/commerce/checkout-sessions/{sessionId}/pay:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: sessionId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BuyerPayBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/commerce/checkout-sessions/{sessionId}/orders:
    post:
      tags:
        - CommerceEndpointRouteBuilderExtensions
      parameters:
        - name: sessionId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderFromSessionBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      responses:
        '200':
          description: OK
    post:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrganizationBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/memberships:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    post:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateMembershipBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/memberships/{membershipId}:
    delete:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: membershipId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/contacts:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    post:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateContactBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/customers/contacts/{contactId}:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    patch:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateContactBody'
        required: true
      responses:
        '200':
          description: OK
    delete:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: contactId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/sites:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    post:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSiteBody'
        required: true
      responses:
        '200':
          description: OK
  /api/v1/customers/sites/{siteId}:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: siteId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    patch:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: siteId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSiteBody'
        required: true
      responses:
        '200':
          description: OK
    delete:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: siteId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/parent:
    put:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetParentBody'
        required: true
      responses:
        '200':
          description: OK
    delete:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/organizations/{organizationId}/license-links:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: organizationId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/license-links/by-license/{licenseId}:
    get:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
    delete:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      parameters:
        - name: licenseId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
  /api/v1/customers/license-links:
    put:
      tags:
        - CustomersEndpointRouteBuilderExtensions
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpsertLicenseLinkBody'
        required: true
      responses:
        '200':
          description: OK
components:
  schemas:
    AcceptInviteBody:
      required:
        - token
        - password
        - displayName
      type: object
      properties:
        token:
          type: string
          nullable: true
        password:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
    ActivateDeviceBody:
      required:
        - licenseId
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
    AddBundleItemBody:
      required:
        - itemKind
        - catalogSkuId
        - entitlementSetId
        - sortOrder
      type: object
      properties:
        itemKind:
          type: string
        catalogSkuId:
          type: string
          format: uuid
          nullable: true
        entitlementSetId:
          type: string
          format: uuid
          nullable: true
        sortOrder:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    AddMemberBody:
      required:
        - userAccountId
      type: object
      properties:
        userAccountId:
          type: string
          format: uuid
    AddSetMemberBody:
      required:
        - entitlementDefinitionId
      type: object
      properties:
        entitlementDefinitionId:
          type: string
          format: uuid
    AssignChannelBody:
      required:
        - productId
        - productEditionId
      type: object
      properties:
        productId:
          type: string
          format: uuid
        productEditionId:
          type: string
          format: uuid
          nullable: true
    AssignLicenseBody:
      required:
        - assignedCustomerId
        - assignedResellerId
        - validFromUtc
        - validUntilUtc
        - customerSiteId
      type: object
      properties:
        assignedCustomerId:
          type: string
          format: uuid
          nullable: true
        assignedResellerId:
          type: string
          format: uuid
          nullable: true
        validFromUtc:
          type: string
          format: date-time
          nullable: true
        validUntilUtc:
          type: string
          format: date-time
          nullable: true
        customerSiteId:
          type: string
          format: uuid
          nullable: true
    AssignRoleBody:
      required:
        - userAccountId
      type: object
      properties:
        userAccountId:
          type: string
          format: uuid
    AttachArtifactBody:
      type: object
      properties:
        fileName:
          type: string
        contentType:
          type: string
          nullable: true
        contentBase64:
          type: string
    BindPolicyPlanBody:
      required:
        - policyId
        - planId
      type: object
      properties:
        policyId:
          type: string
          format: uuid
          nullable: true
        planId:
          type: string
          format: uuid
          nullable: true
    BulkCreateLicenseItemBody:
      required:
        - clientItemKey
        - code
        - displayName
        - policyId
        - planId
      type: object
      properties:
        clientItemKey:
          type: string
          nullable: true
        code:
          type: string
        displayName:
          type: string
        policyId:
          type: string
          format: uuid
          nullable: true
        planId:
          type: string
          format: uuid
          nullable: true
    BulkCreateLicensesBody:
      required:
        - idempotencyKey
        - items
      type: object
      properties:
        idempotencyKey:
          type: string
          nullable: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/BulkCreateLicenseItemBody'
          nullable: true
    BulkLicenseTargetBody:
      required:
        - clientItemKey
        - licenseId
      type: object
      properties:
        clientItemKey:
          type: string
          nullable: true
        licenseId:
          type: string
          format: uuid
    BulkRevokeLicensesBody:
      required:
        - idempotencyKey
        - reasonCode
        - reasonDetail
        - revokedByActorId
        - items
      type: object
      properties:
        idempotencyKey:
          type: string
          nullable: true
        reasonCode:
          type: string
        reasonDetail:
          type: string
          nullable: true
        revokedByActorId:
          type: string
          description: >-
            Deprecated compatibility field. Accepted but ignored; actor identity comes only from authenticated
            Management context.
          format: uuid
          nullable: true
          deprecated: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/BulkLicenseTargetBody'
          nullable: true
    BulkSuspendLicensesBody:
      required:
        - idempotencyKey
        - items
      type: object
      properties:
        idempotencyKey:
          type: string
          nullable: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/BulkLicenseTargetBody'
          nullable: true
    BuyerPayBody:
      type: object
      properties:
        outcome:
          type: string
          nullable: true
    CancelSubscriptionBody:
      type: object
      properties:
        subscriptionId:
          type: string
          format: uuid
          nullable: true
        atPeriodEnd:
          type: boolean
          nullable: true
    CheckoutBody:
      type: object
      properties:
        subscriptionId:
          type: string
          format: uuid
          nullable: true
        successUrl:
          type: string
          nullable: true
    ConfirmEnrollmentBody:
      required:
        - code
      type: object
      properties:
        code:
          type: string
          nullable: true
    CreateChannelBody:
      required:
        - code
        - displayName
        - kind
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        kind:
          type: string
          nullable: true
    CreateCheckoutSessionBody:
      type: object
      properties:
        offerId:
          type: string
          format: uuid
        customerOrgId:
          type: string
          format: uuid
          nullable: true
        couponCode:
          type: string
          nullable: true
        successUrl:
          type: string
          nullable: true
        cancelUrl:
          type: string
          nullable: true
        expiresAtUtc:
          type: string
          format: date-time
          nullable: true
    CreateContactBody:
      required:
        - code
        - displayName
        - email
        - phone
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        email:
          type: string
          nullable: true
        phone:
          type: string
          nullable: true
    CreateCouponBody:
      type: object
      properties:
        code:
          type: string
          nullable: true
        percentOff:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        amountOffMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        maxRedemptions:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        activate:
          type: boolean
          nullable: true
    CreateDelegationBody:
      required:
        - scopeKind
        - scopeTargetId
        - scopeSecondaryId
      type: object
      properties:
        scopeKind:
          $ref: '#/components/schemas/ResellerDelegationScopeKind'
        scopeTargetId:
          type: string
          format: uuid
        scopeSecondaryId:
          type: string
          format: uuid
    CreateDeviceBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
    CreateDocumentBody:
      required:
        - code
        - displayName
        - documentId
        - productId
        - environmentId
        - licenseId
        - publicConfigJson
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        documentId:
          type: string
          format: uuid
          nullable: true
        productId:
          type: string
          format: uuid
          nullable: true
        environmentId:
          type: string
          format: uuid
          nullable: true
        licenseId:
          type: string
          format: uuid
          nullable: true
        publicConfigJson:
          type: string
          nullable: true
    CreateEntitlementBody:
      required:
        - code
        - displayName
        - valueType
        - typeMetadataJson
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        valueType:
          type: string
        typeMetadataJson:
          type: string
          nullable: true
    CreateEnvironmentBody:
      required:
        - code
        - displayName
        - kind
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        kind:
          type: string
          nullable: true
    CreateFeatureLimitBody:
      required:
        - code
        - displayName
        - policyId
        - planId
        - maxValue
        - isUnlimited
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        policyId:
          type: string
          format: uuid
          nullable: true
        planId:
          type: string
          format: uuid
          nullable: true
        maxValue:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        isUnlimited:
          type: boolean
    CreateInviteBody:
      required:
        - email
        - displayName
      type: object
      properties:
        email:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
    CreateLicenseBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        policyId:
          type: string
          format: uuid
          nullable: true
        planId:
          type: string
          format: uuid
          nullable: true
        validityMode:
          type: string
          nullable: true
        periodDays:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        productId:
          type: string
          format: uuid
          nullable: true
        assignedCustomerId:
          type: string
          format: uuid
          nullable: true
        customerOrganizationId:
          type: string
          format: uuid
          nullable: true
        customerSubscriptionId:
          type: string
          format: uuid
          nullable: true
        offerVersionId:
          type: string
          format: uuid
          nullable: true
        issueMode:
          type: string
          nullable: true
        notes:
          type: string
          nullable: true
    CreateMembershipBody:
      required:
        - userAccountId
      type: object
      properties:
        userAccountId:
          type: string
          format: uuid
    CreateNamedCatalogBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
    CreateOfferBody:
      type: object
      properties:
        priceBookId:
          type: string
          format: uuid
        code:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
          nullable: true
        billingInterval:
          type: string
          nullable: true
        catalogRef:
          type: string
          nullable: true
        policyRef:
          type: string
          nullable: true
        providerPriceRef:
          type: string
          nullable: true
        activate:
          type: boolean
          nullable: true
    CreateOrderFromSessionBody:
      type: object
      properties:
        quantity:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    CreateOrganizationBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
    CreatePlanBody:
      type: object
      properties:
        code:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        limitsJson:
          type: string
          nullable: true
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
          nullable: true
        interval:
          type: string
          nullable: true
        visibility:
          type: string
          nullable: true
        providerPriceRef:
          type: string
          nullable: true
        activate:
          type: boolean
          nullable: true
    CreatePolicyBody:
      required:
        - code
        - displayName
        - bundleValidity
        - offlineGracePeriod
        - localLeaseDuration
        - floatingLeaseDuration
        - heartbeatInterval
        - borrowDuration
        - maintenanceWindowStartsAtUtc
        - maintenanceWindowEndsAtUtc
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        bundleValidity:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        offlineGracePeriod:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        localLeaseDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        floatingLeaseDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        heartbeatInterval:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        borrowDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        maintenanceWindowStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        maintenanceWindowEndsAtUtc:
          type: string
          format: date-time
          nullable: true
    CreatePoolBody:
      required:
        - licenseId
        - capacity
        - featureCode
        - scopeKey
        - relayId
        - customerSiteId
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        capacity:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        featureCode:
          type: string
          nullable: true
        scopeKey:
          type: string
          nullable: true
        relayId:
          type: string
          format: uuid
          nullable: true
        customerSiteId:
          type: string
          format: uuid
          nullable: true
    CreatePriceBookBody:
      type: object
      properties:
        code:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        currency:
          type: string
          nullable: true
        activate:
          type: boolean
          nullable: true
    CreateProductBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
    CreateRelayBody:
      required:
        - code
        - displayName
        - siteCode
        - licenseId
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        siteCode:
          type: string
        licenseId:
          type: string
          format: uuid
          nullable: true
    CreateReleaseDraftBody:
      type: object
      properties:
        productId:
          type: string
          format: uuid
        version:
          type: string
        channel:
          type: string
        title:
          type: string
          nullable: true
        releaseNotes:
          type: string
          nullable: true
    CreateServiceAccountBody:
      required:
        - tenantId
        - code
        - displayName
        - permissionCodes
        - credentialLifetime
      type: object
      properties:
        tenantId:
          type: string
          format: uuid
        code:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
        permissionCodes:
          type: array
          items:
            type: string
          nullable: true
        credentialLifetime:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
    CreateSiteBody:
      required:
        - code
        - displayName
        - addressLine
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        addressLine:
          type: string
          nullable: true
    CreateSkuBody:
      required:
        - productId
        - code
        - displayName
        - productEditionId
        - entitlementSetId
      type: object
      properties:
        productId:
          type: string
          format: uuid
        code:
          type: string
        displayName:
          type: string
        productEditionId:
          type: string
          format: uuid
          nullable: true
        entitlementSetId:
          type: string
          format: uuid
          nullable: true
    CreateTemplateBody:
      required:
        - code
        - displayName
        - bundleValidity
        - offlineGracePeriod
        - localLeaseDuration
        - floatingLeaseDuration
        - heartbeatInterval
        - borrowDuration
        - maintenanceWindowStartsAtUtc
        - maintenanceWindowEndsAtUtc
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        bundleValidity:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        offlineGracePeriod:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        localLeaseDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        floatingLeaseDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        heartbeatInterval:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        borrowDuration:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
        maintenanceWindowStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        maintenanceWindowEndsAtUtc:
          type: string
          format: date-time
          nullable: true
    CreateTenantBody:
      required:
        - code
        - displayName
      type: object
      properties:
        code:
          type: string
          nullable: true
        displayName:
          type: string
          nullable: true
    CreateWebhookEndpointBody:
      required:
        - displayName
        - url
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        url:
          type: string
          nullable: true
    CustomerAggregateLicensePageResponse:
      required:
        - offset
        - limit
        - totalCount
        - items
      type: object
      properties:
        offset:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        limit:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        totalCount:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/CustomerAggregateLicenseResponse'
    CustomerAggregateLicenseResponse:
      required:
        - licenseId
        - productResolutionStatus
        - status
        - issueMode
        - migrationState
        - keyMaskStatus
        - validityMode
        - createdAtUtc
        - updatedAtUtc
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        productId:
          type: string
          format: uuid
          nullable: true
        productDisplayName:
          type: string
          nullable: true
        productResolutionStatus:
          type: string
        status:
          type: string
        issueMode:
          type: string
        migrationState:
          type: string
        customerSubscriptionId:
          type: string
          format: uuid
          nullable: true
        offerVersionId:
          type: string
          format: uuid
          nullable: true
        maskedKey:
          type: string
          nullable: true
        keyMaskStatus:
          type: string
        validityMode:
          type: string
        periodDays:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        validFromUtc:
          type: string
          format: date-time
          nullable: true
        validUntilUtc:
          type: string
          format: date-time
          nullable: true
        graceEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        emergencyExtensionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
    CustomerAggregatePrimaryContactRequest:
      required:
        - displayName
        - email
      type: object
      properties:
        contactId:
          type: string
          format: uuid
          nullable: true
        displayName:
          maxLength: 256
          minLength: 1
          type: string
        email:
          maxLength: 320
          minLength: 1
          type: string
          format: email
        phone:
          maxLength: 64
          minLength: 0
          type: string
          nullable: true
    CustomerAggregatePrimaryContactResponse:
      required:
        - contactId
        - displayName
        - email
        - status
      type: object
      properties:
        contactId:
          type: string
          format: uuid
        displayName:
          type: string
        email:
          type: string
        phone:
          type: string
          nullable: true
        status:
          type: string
    CustomerAggregateProfileResponse:
      required:
        - organizationId
        - displayName
        - status
        - revision
      type: object
      properties:
        organizationId:
          type: string
          format: uuid
        displayName:
          type: string
        notes:
          type: string
          nullable: true
        status:
          type: string
        revision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        primaryContact:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/CustomerAggregatePrimaryContactResponse'
    CustomerAggregateResponse:
      required:
        - profile
        - licenses
      type: object
      properties:
        profile:
          $ref: '#/components/schemas/CustomerAggregateProfileResponse'
        licenses:
          $ref: '#/components/schemas/CustomerAggregateLicensePageResponse'
    CustomerAggregateUpdateRequest:
      required:
        - expectedRevision
        - displayName
        - primaryContact
      type: object
      properties:
        expectedRevision:
          maximum: 9223372036854776000
          minimum: 1
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        displayName:
          maxLength: 256
          minLength: 1
          type: string
        notes:
          maxLength: 4000
          minLength: 0
          type: string
          nullable: true
        primaryContact:
          $ref: '#/components/schemas/CustomerAggregatePrimaryContactRequest'
    CustomerContactStatus:
      type: integer
    CustomerLicenseIssueCandidatePageResponse:
      required:
        - offset
        - limit
        - totalCount
        - items
      type: object
      properties:
        offset:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        limit:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        totalCount:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/CustomerLicenseIssueCandidateResponse'
    CustomerLicenseIssueCandidateResponse:
      required:
        - customerSubscriptionId
        - productId
        - productDisplayName
        - vendorOfferId
        - offerVersionId
        - tariffDisplayName
        - tariffVersionNumber
        - subscriptionStatus
        - autoRenew
        - subscriptionStartsAtUtc
        - subscriptionEndsAtUtc
        - trialEndsAtUtc
        - licensesUsed
        - licensesAvailable
      type: object
      properties:
        customerSubscriptionId:
          type: string
          format: uuid
        productId:
          type: string
          format: uuid
        productDisplayName:
          type: string
        vendorOfferId:
          type: string
          format: uuid
        offerVersionId:
          type: string
          format: uuid
        tariffDisplayName:
          type: string
        tariffVersionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        subscriptionStatus:
          type: string
        autoRenew:
          type: boolean
        subscriptionStartsAtUtc:
          type: string
          format: date-time
        subscriptionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        trialEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        licensesUsed:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        licensesAvailable:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    CustomerLicenseKeyRotationResponse:
      required:
        - operationId
        - licenseId
        - keyMaterialRefId
        - maskedKey
        - formatVersion
        - createdAtUtc
        - plaintextKey
        - isIdempotentReplay
      type: object
      properties:
        operationId:
          type: string
          format: uuid
        licenseId:
          type: string
          format: uuid
        keyMaterialRefId:
          type: string
          format: uuid
        maskedKey:
          type: string
        formatVersion:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        createdAtUtc:
          type: string
          format: date-time
        plaintextKey:
          type: string
          nullable: true
        isIdempotentReplay:
          type: boolean
    CustomerLicenseTableItemResponse:
      required:
        - licenseId
        - productId
        - productDisplayName
        - productResolutionStatus
        - status
        - issueMode
        - migrationState
        - customerSubscriptionId
        - offerVersionId
        - tariffDisplayName
        - tariffVersionNumber
        - tariffResolutionStatus
        - subscriptionStatus
        - autoRenew
        - subscriptionEndsAtUtc
        - maskedKey
        - keyMaskStatus
        - validityMode
        - periodDays
        - validFromUtc
        - validUntilUtc
        - graceEndsAtUtc
        - emergencyExtensionEndsAtUtc
        - deviceSummaryStatus
        - boundDeviceCount
        - activeDeviceCount
        - usageStatus
        - usageValue
        - usageUnit
        - usageWindowStartsAtUtc
        - usageWindowEndsAtUtc
        - usageObservedAtUtc
        - createdAtUtc
        - updatedAtUtc
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        productId:
          type: string
          format: uuid
          nullable: true
        productDisplayName:
          type: string
          nullable: true
        productResolutionStatus:
          type: string
        status:
          type: string
        issueMode:
          type: string
        migrationState:
          type: string
        customerSubscriptionId:
          type: string
          format: uuid
          nullable: true
        offerVersionId:
          type: string
          format: uuid
          nullable: true
        tariffDisplayName:
          type: string
          nullable: true
        tariffVersionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        tariffResolutionStatus:
          type: string
        subscriptionStatus:
          type: string
          nullable: true
        autoRenew:
          type: boolean
          nullable: true
        subscriptionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        maskedKey:
          type: string
          nullable: true
        keyMaskStatus:
          type: string
        validityMode:
          type: string
        periodDays:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        validFromUtc:
          type: string
          format: date-time
          nullable: true
        validUntilUtc:
          type: string
          format: date-time
          nullable: true
        graceEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        emergencyExtensionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        deviceSummaryStatus:
          type: string
        boundDeviceCount:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        activeDeviceCount:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        usageStatus:
          type: string
        usageValue:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?$
          format: double
        usageUnit:
          type: string
          nullable: true
        usageWindowStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        usageWindowEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        usageObservedAtUtc:
          type: string
          format: date-time
          nullable: true
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
    CustomerLicenseTablePageResponse:
      required:
        - offset
        - limit
        - totalCount
        - items
      type: object
      properties:
        offset:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        limit:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        totalCount:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/CustomerLicenseTableItemResponse'
    CustomerLicenseTerminalTransitionRequest:
      required:
        - expectedStatus
        - reasonCode
      type: object
      properties:
        expectedStatus:
          type: string
          description: Exact case-sensitive source status precondition.
        reasonCode:
          type: string
          description: Required safe reason code; normalized to lowercase.
        reasonDetail:
          type: string
          description: Optional bounded safe detail; never copied to audit or integration-event payloads.
          nullable: true
      description: Strict customer-scoped terminal request. Unknown or duplicate JSON members are rejected.
    CustomerLicenseTerminalTransitionResponse:
      required:
        - operationId
        - effectId
        - licenseId
        - action
        - fromStatus
        - toStatus
        - completedAtUtc
        - isIdempotentReplay
      type: object
      properties:
        operationId:
          type: string
          format: uuid
        effectId:
          type: string
          format: uuid
        licenseId:
          type: string
          format: uuid
        action:
          type: string
        fromStatus:
          type: string
        toStatus:
          type: string
        completedAtUtc:
          type: string
          format: date-time
        isIdempotentReplay:
          type: boolean
    CustomerSiteStatus:
      type: integer
    ErrorResponse:
      required:
        - code
        - message
        - correlationId
      type: object
      properties:
        code:
          type: string
        message:
          type: string
        correlationId:
          type: string
        details:
          type: object
          nullable: true
        documentationUrl:
          type: string
          nullable: true
      description: Typed public API error body (`docs/contracts/error-contract.md`).
    ExportAirGapBody:
      required:
        - relayInstanceId
        - licenseId
        - iss
        - aud
        - environmentId
        - signingEnvironment
        - scopeKey
        - floatingCapacity
      type: object
      properties:
        relayInstanceId:
          type: string
          format: uuid
        licenseId:
          type: string
          format: uuid
        iss:
          type: string
        aud:
          type: string
        environmentId:
          type: string
        signingEnvironment:
          type: string
        scopeKey:
          type: string
          nullable: true
        floatingCapacity:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    ExtendLicenseBody:
      required:
        - newValidUntilUtc
        - graceEndsAtUtc
        - emergencyExtensionEndsAtUtc
      type: object
      properties:
        newValidUntilUtc:
          type: string
          format: date-time
        graceEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        emergencyExtensionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
    FoundationValidateRequest:
      required:
        - name
      type: object
      properties:
        name:
          minLength: 1
          type: string
      description: Request used only to exercise invalid-model → error-contract mapping.
    GlobalLicenseKeyRotationResponse:
      required:
        - licenseId
        - materialRefId
        - publicPrefix
        - publicSuffix
        - kind
        - plaintext
        - formatVersion
        - createdAtUtc
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        materialRefId:
          type: string
          format: uuid
        publicPrefix:
          type: string
        publicSuffix:
          type: string
        kind:
          type: string
        plaintext:
          type: string
          nullable: true
        formatVersion:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        createdAtUtc:
          type: string
          format: date-time
    GrantEntitlementBody:
      required:
        - code
        - displayName
        - catalogEntitlementDefinitionId
        - catalogEntitlementDefinitionCode
        - catalogEntitlementSetId
        - catalogEntitlementSetCode
      type: object
      properties:
        code:
          type: string
        displayName:
          type: string
        catalogEntitlementDefinitionId:
          type: string
          format: uuid
          nullable: true
        catalogEntitlementDefinitionCode:
          type: string
          nullable: true
        catalogEntitlementSetId:
          type: string
          format: uuid
          nullable: true
        catalogEntitlementSetCode:
          type: string
          nullable: true
    IssueGrantBody:
      type: object
      properties:
        artifactId:
          type: string
          format: uuid
        subjectType:
          type: string
        subjectId:
          type: string
        entitlementRef:
          type: string
          nullable: true
        lifetimeSeconds:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    LicenseCustomDataBody:
      type: object
      properties:
        string1:
          type: string
          nullable: true
        string2:
          type: string
          nullable: true
        bool1:
          type: boolean
          nullable: true
        bool2:
          type: boolean
          nullable: true
        number1:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
        number2:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
        number3:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
    LicenseCustomDataReadResponse:
      type: object
      properties:
        string1:
          type: string
          nullable: true
        string2:
          type: string
          nullable: true
        bool1:
          type: boolean
          nullable: true
        bool2:
          type: boolean
          nullable: true
        number1:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
        number2:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
        number3:
          pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$
          format: double
    LicenseKeyRotationRequest:
      required:
        - expectedPrimaryMaterialRefId
      type: object
      properties:
        expectedPrimaryMaterialRefId:
          type: string
          format: uuid
      additionalProperties: false
    LicenseReadListResponse:
      required:
        - tenantId
        - items
      type: object
      properties:
        tenantId:
          type: string
          format: uuid
        items:
          type: array
          items:
            $ref: '#/components/schemas/LicenseReadResponse'
    LicenseReadResponse:
      required:
        - id
        - tenantId
        - code
        - displayName
        - status
        - validityMode
        - issueMode
        - migrationState
        - customData
      type: object
      properties:
        id:
          type: string
          format: uuid
        tenantId:
          type: string
          format: uuid
        code:
          type: string
        displayName:
          type: string
        status:
          type: string
        assignedCustomerId:
          type: string
          format: uuid
          nullable: true
        customerOrganizationId:
          type: string
          format: uuid
          nullable: true
        assignedResellerId:
          type: string
          format: uuid
          nullable: true
        customerSiteId:
          type: string
          format: uuid
          nullable: true
        validFromUtc:
          type: string
          format: date-time
          nullable: true
        validUntilUtc:
          type: string
          format: date-time
          nullable: true
        validityMode:
          type: string
        periodDays:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        graceEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        emergencyExtensionEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        policyId:
          type: string
          format: uuid
          nullable: true
        planId:
          type: string
          format: uuid
          nullable: true
        productId:
          type: string
          format: uuid
          nullable: true
        customerSubscriptionId:
          type: string
          format: uuid
          nullable: true
        offerVersionId:
          type: string
          format: uuid
          nullable: true
        issueMode:
          type: string
        migrationState:
          type: string
        notes:
          type: string
          nullable: true
        customData:
          $ref: '#/components/schemas/LicenseCustomDataReadResponse'
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
    LoginRequestBody:
      required:
        - email
        - password
        - tenantId
      type: object
      properties:
        email:
          type: string
          nullable: true
        password:
          type: string
          nullable: true
        tenantId:
          type: string
          format: uuid
          nullable: true
    MaterializeTemplateBody:
      required:
        - policyCode
        - displayName
      type: object
      properties:
        policyCode:
          type: string
        displayName:
          type: string
          nullable: true
    PasswordResetConfirmBody:
      required:
        - token
        - newPassword
      type: object
      properties:
        token:
          type: string
          nullable: true
        newPassword:
          type: string
          nullable: true
    PasswordResetRequestBody:
      required:
        - email
      type: object
      properties:
        email:
          type: string
          nullable: true
    PatchPortalMembershipRoleBody:
      type: object
      properties:
        portalRole:
          type: string
          nullable: true
    PlatformPlanLimits:
      type: object
      properties:
        projects:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        activeLicenses:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        devices:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        admins:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        apiRequestBudget:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        relayAvailable:
          type: boolean
    PlatformPlanListResponse:
      required:
        - items
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/PlatformPlanResponse'
    PlatformPlanResponse:
      required:
        - id
        - code
        - displayName
        - status
        - visibility
        - limitsJson
        - limits
        - currency
        - interval
      type: object
      properties:
        id:
          type: string
          format: uuid
        code:
          type: string
        displayName:
          type: string
        description:
          type: string
          nullable: true
        status:
          type: string
        visibility:
          type: string
        limitsJson:
          type: string
        limits:
          $ref: '#/components/schemas/PlatformPlanLimits'
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
        interval:
          type: string
        providerPriceRef:
          type: string
          nullable: true
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
    ProductTariffDraftAggregateApiResponse:
      required:
        - productId
        - offset
        - limit
        - total
        - items
      type: object
      properties:
        productId:
          type: string
          format: uuid
        offset:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        limit:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        total:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/ProductTariffSeriesApiResponse'
        managementOptions:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/ProductTariffManagementOptionsApiResponse'
    ProductTariffDraftApiResponse:
      required:
        - offerVersionId
        - versionNumber
        - revision
        - status
        - technicalPackageResolutionStatus
        - completenessStatus
      type: object
      properties:
        offerVersionId:
          type: string
          format: uuid
        versionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        revision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        status:
          type: string
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        billingInterval:
          type: string
          nullable: true
        policyDisplayName:
          type: string
          nullable: true
        technicalPackageResolutionStatus:
          type: string
        effectiveStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        effectiveEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        completenessStatus:
          type: string
    ProductTariffDraftCreateApiRequest:
      required:
        - creationMode
      type: object
      anyOf:
        - $ref: '#/components/schemas/ProductTariffDraftCreateApiRequestCreateNewTariffDraftApiRequest'
        - $ref: '#/components/schemas/ProductTariffDraftCreateApiRequestCreateNextTariffDraftApiRequest'
      discriminator:
        propertyName: creationMode
        mapping:
          NewTariff: '#/components/schemas/ProductTariffDraftCreateApiRequestCreateNewTariffDraftApiRequest'
          NextVersion: '#/components/schemas/ProductTariffDraftCreateApiRequestCreateNextTariffDraftApiRequest'
    ProductTariffDraftCreateApiRequestCreateNewTariffDraftApiRequest:
      required:
        - displayName
        - priceBookId
        - amountMinorUnits
        - billingInterval
        - policyId
        - expectedPolicyDefinitionHash
      properties:
        creationMode:
          enum:
            - NewTariff
          type: string
        displayName:
          type: string
        description:
          type: string
          nullable: true
        priceBookId:
          type: string
          format: uuid
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        billingInterval:
          type: string
        policyId:
          type: string
          format: uuid
        expectedPolicyDefinitionHash:
          type: string
        effectiveStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        effectiveEndsAtUtc:
          type: string
          format: date-time
          nullable: true
    ProductTariffDraftCreateApiRequestCreateNextTariffDraftApiRequest:
      required:
        - vendorOfferId
        - expectedLatestOfferVersionId
        - expectedLatestRevision
        - amountMinorUnits
        - billingInterval
        - policyId
        - expectedPolicyDefinitionHash
      properties:
        creationMode:
          enum:
            - NextVersion
          type: string
        vendorOfferId:
          type: string
          format: uuid
        expectedLatestOfferVersionId:
          type: string
          format: uuid
        expectedLatestRevision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        billingInterval:
          type: string
        policyId:
          type: string
          format: uuid
        expectedPolicyDefinitionHash:
          type: string
        effectiveStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        effectiveEndsAtUtc:
          type: string
          format: date-time
          nullable: true
    ProductTariffDraftCreationApiResponse:
      required:
        - productId
        - vendorOfferId
        - offerVersionId
        - versionNumber
        - revision
        - status
        - amountMinorUnits
        - currency
        - billingInterval
        - isIdempotentReplay
      type: object
      properties:
        productId:
          type: string
          format: uuid
        vendorOfferId:
          type: string
          format: uuid
        offerVersionId:
          type: string
          format: uuid
        versionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        revision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        status:
          type: string
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
        billingInterval:
          type: string
        effectiveStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        effectiveEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        isIdempotentReplay:
          type: boolean
    ProductTariffManagementOptionsApiResponse:
      required:
        - priceBooks
        - technicalPackages
      type: object
      properties:
        priceBooks:
          type: array
          items:
            $ref: '#/components/schemas/ProductTariffPriceBookCandidateApiResponse'
        technicalPackages:
          type: array
          items:
            $ref: '#/components/schemas/ProductTechnicalPackageCandidateApiResponse'
    ProductTariffPriceBookCandidateApiResponse:
      required:
        - priceBookId
        - displayName
        - currency
      type: object
      properties:
        priceBookId:
          type: string
          format: uuid
        displayName:
          type: string
        currency:
          type: string
    ProductTariffPublicationApiResponse:
      required:
        - productId
        - vendorOfferId
        - offerVersionId
        - versionNumber
        - revision
        - status
        - publishedAtUtc
        - isIdempotentReplay
      type: object
      properties:
        productId:
          type: string
          format: uuid
        vendorOfferId:
          type: string
          format: uuid
        offerVersionId:
          type: string
          format: uuid
        versionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        revision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        status:
          type: string
        publishedAtUtc:
          type: string
          format: date-time
        isIdempotentReplay:
          type: boolean
    ProductTariffPublishActionApiResponse:
      required:
        - allowed
        - blockingReason
      type: object
      properties:
        allowed:
          type: boolean
        blockingReason:
          type: string
    ProductTariffSeriesApiResponse:
      required:
        - vendorOfferId
        - tariffDisplayName
        - priceBookDisplayName
        - currency
        - latestVersionNumber
        - latestOfferVersionId
        - latestRevision
        - latestStatus
        - canCreateNextDraft
      type: object
      properties:
        vendorOfferId:
          type: string
          format: uuid
        tariffDisplayName:
          type: string
        description:
          type: string
          nullable: true
        priceBookDisplayName:
          type: string
        currency:
          type: string
        latestVersionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        latestOfferVersionId:
          type: string
          format: uuid
        latestRevision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        latestStatus:
          type: string
        draft:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/ProductTariffDraftApiResponse'
        canCreateNextDraft:
          type: boolean
    ProductTariffVersionHistoryApiResponse:
      required:
        - productId
        - vendorOfferId
        - tariffDisplayName
        - priceBookDisplayName
        - offset
        - limit
        - total
        - items
      type: object
      properties:
        productId:
          type: string
          format: uuid
        vendorOfferId:
          type: string
          format: uuid
        tariffDisplayName:
          type: string
        description:
          type: string
          nullable: true
        priceBookDisplayName:
          type: string
        offset:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        limit:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        total:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/ProductTariffVersionHistoryItemApiResponse'
    ProductTariffVersionHistoryItemApiResponse:
      required:
        - offerVersionId
        - versionNumber
        - revision
        - status
        - technicalPackageResolutionStatus
        - createdAtUtc
        - updatedAtUtc
        - completenessStatus
      type: object
      properties:
        offerVersionId:
          type: string
          format: uuid
        versionNumber:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
        revision:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        status:
          type: string
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
          nullable: true
        billingInterval:
          type: string
          nullable: true
        policyDisplayName:
          type: string
          nullable: true
        technicalPackageResolutionStatus:
          type: string
        effectiveStartsAtUtc:
          type: string
          format: date-time
          nullable: true
        effectiveEndsAtUtc:
          type: string
          format: date-time
          nullable: true
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
        publishedAtUtc:
          type: string
          format: date-time
          nullable: true
        retiredAtUtc:
          type: string
          format: date-time
          nullable: true
        completenessStatus:
          type: string
        publishAction:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/ProductTariffPublishActionApiResponse'
    ProductTechnicalPackageCandidateApiResponse:
      required:
        - policyId
        - displayName
        - expectedPolicyDefinitionHash
      type: object
      properties:
        policyId:
          type: string
          format: uuid
        displayName:
          type: string
        expectedPolicyDefinitionHash:
          type: string
    ProviderCheckoutBody:
      type: object
      properties:
        successUrl:
          type: string
          nullable: true
        cancelUrl:
          type: string
          nullable: true
    PublicPlatformPlanCatalogResponse:
      required:
        - contractVersion
        - items
      type: object
      properties:
        contractVersion:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/PublicPlatformPlanResponse'
    PublicPlatformPlanLimitsResponse:
      required:
        - projects
        - activeLicenses
        - devices
        - admins
        - apiRequestBudget
        - relayAvailable
      type: object
      properties:
        projects:
          type: integer
          format: int64
          nullable: true
        activeLicenses:
          type: integer
          format: int64
          nullable: true
        devices:
          type: integer
          format: int64
          nullable: true
        admins:
          type: integer
          format: int64
          nullable: true
        apiRequestBudget:
          type: integer
          format: int64
          nullable: true
        relayAvailable:
          type: boolean
    PublicPlatformPlanPriceResponse:
      required:
        - amountMinorUnits
        - currency
        - interval
      type: object
      properties:
        amountMinorUnits:
          type: integer
          format: int64
        currency:
          type: string
        interval:
          type: string
    PublicPlatformPlanResponse:
      required:
        - platformPlanId
        - code
        - displayName
        - description
        - status
        - visibility
        - price
        - limits
        - createdAtUtc
        - updatedAtUtc
      type: object
      properties:
        platformPlanId:
          type: string
          format: uuid
        code:
          type: string
        displayName:
          type: string
        description:
          type: string
          nullable: true
        status:
          type: string
        visibility:
          type: string
        price:
          $ref: '#/components/schemas/PublicPlatformPlanPriceResponse'
        limits:
          $ref: '#/components/schemas/PublicPlatformPlanLimitsResponse'
        createdAtUtc:
          type: string
          format: date-time
        updatedAtUtc:
          type: string
          format: date-time
    PublicSignupBody:
      required:
        - tenantCode
        - tenantDisplayName
        - email
        - password
        - ownerDisplayName
      type: object
      properties:
        tenantCode:
          type: string
          nullable: true
        tenantDisplayName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        password:
          type: string
          nullable: true
        ownerDisplayName:
          type: string
          nullable: true
    PublishReleaseBody:
      type: object
      properties:
        correlationId:
          type: string
          nullable: true
    PutLicenseCustomDataBody:
      type: object
      properties:
        customData:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/LicenseCustomDataBody'
    PutLicenseCustomerSiteBody:
      required:
        - customerSiteId
      type: object
      properties:
        customerSiteId:
          type: string
          format: uuid
          nullable: true
    PutLicenseValidityModeBody:
      required:
        - validityMode
        - periodDays
      type: object
      properties:
        validityMode:
          type: string
          nullable: true
        periodDays:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    RecordEvidenceBody:
      required:
        - kind
        - evidencePayload
        - label
        - collectedAtUtc
      type: object
      properties:
        kind:
          type: string
        evidencePayload:
          type: string
        label:
          type: string
          nullable: true
        collectedAtUtc:
          type: string
          format: date-time
          nullable: true
    RedeemGrantBody:
      type: object
      properties:
        bearerToken:
          type: string
    RedeemGrantResponse:
      type: object
      properties:
        grantId:
          type: string
          format: uuid
        tenantId:
          type: string
          format: uuid
        releaseId:
          type: string
          format: uuid
        expiresAtUtc:
          type: string
          format: date-time
        downloadUrl:
          type: string
          nullable: true
        urlExpiresAtUtc:
          type: string
          format: date-time
          nullable: true
        artifact: {}
    RefreshRequestBody:
      required:
        - refreshToken
      type: object
      properties:
        refreshToken:
          type: string
          nullable: true
    RegisterInstallationKeyBody:
      required:
        - plaintextMaterial
        - kind
        - opaqueProviderRef
      type: object
      properties:
        plaintextMaterial:
          type: string
        kind:
          type: string
          nullable: true
        opaqueProviderRef:
          type: string
          nullable: true
    RequestTransferBody:
      required:
        - licenseId
        - sourceDeviceId
        - targetDeviceId
        - policyAllowReassign
        - requiresManualApproval
        - approved
        - reasonCode
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        sourceDeviceId:
          type: string
          format: uuid
        targetDeviceId:
          type: string
          format: uuid
        policyAllowReassign:
          type: boolean
        requiresManualApproval:
          type: boolean
        approved:
          type: boolean
        reasonCode:
          type: string
          nullable: true
    ResellerDelegationScopeKind:
      type: integer
    ResellerDelegationStatus:
      type: integer
    ResellerQuotaKind:
      type: integer
    RevokeKeyBody:
      required:
        - reason
      type: object
      properties:
        reason:
          type: string
          nullable: true
    RevokeLicenseBody:
      required:
        - reasonCode
        - reasonDetail
        - revokedByActorId
      type: object
      properties:
        reasonCode:
          type: string
        reasonDetail:
          type: string
          nullable: true
        revokedByActorId:
          type: string
          description: >-
            Deprecated compatibility field. Accepted but ignored; actor identity comes only from authenticated
            Management context.
          format: uuid
          nullable: true
          deprecated: true
    RotateCredentialBody:
      required:
        - credentialLifetime
      type: object
      properties:
        credentialLifetime:
          pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$
          type: string
          nullable: true
    RotateKeyBody:
      required:
        - environment
      type: object
      properties:
        environment:
          type: string
          nullable: true
    RotateSecretBody:
      required:
        - value
        - opaqueProviderRef
        - expiresAtUtc
        - isSingleUse
      type: object
      properties:
        value:
          type: string
        opaqueProviderRef:
          type: string
          nullable: true
        expiresAtUtc:
          type: string
          format: date-time
          nullable: true
        isSingleUse:
          type: boolean
          nullable: true
    SendChallengeSmsBody:
      required:
        - challengeToken
      type: object
      properties:
        challengeToken:
          type: string
          nullable: true
    SetMemberStatusBody:
      required:
        - status
      type: object
      properties:
        status:
          type: string
          nullable: true
    SetParentBody:
      required:
        - parentCustomerOrganizationId
      type: object
      properties:
        parentCustomerOrganizationId:
          type: string
          format: uuid
          nullable: true
    SetSecretBody:
      required:
        - runtimeConfigDocumentId
        - secretId
        - class
        - value
        - opaqueProviderRef
        - expiresAtUtc
        - isSingleUse
      type: object
      properties:
        runtimeConfigDocumentId:
          type: string
          format: uuid
        secretId:
          type: string
          format: uuid
          nullable: true
        class:
          type: string
        value:
          type: string
        opaqueProviderRef:
          type: string
          nullable: true
        expiresAtUtc:
          type: string
          format: date-time
          nullable: true
        isSingleUse:
          type: boolean
    StartEnrollmentBody:
      required:
        - factorType
        - label
        - phoneE164
      type: object
      properties:
        factorType:
          type: string
          nullable: true
        label:
          type: string
          nullable: true
        phoneE164:
          type: string
          nullable: true
    StartTrialBody:
      required:
        - licenseId
        - verificationKind
        - evidencePayload
        - startsAtUtc
        - endsAtUtc
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        verificationKind:
          type: string
        evidencePayload:
          type: string
        startsAtUtc:
          type: string
          format: date-time
          nullable: true
        endsAtUtc:
          type: string
          format: date-time
          nullable: true
    StepUpBody:
      required:
        - code
        - recoveryCode
        - method
      type: object
      properties:
        code:
          type: string
          nullable: true
        recoveryCode:
          type: string
          nullable: true
        method:
          type: string
          nullable: true
    SubscriptionLicenseIssueRequest:
      required:
        - customerSubscriptionId
      type: object
      properties:
        customerSubscriptionId:
          type: string
          format: uuid
        correlationId:
          type: string
          format: uuid
          nullable: true
    SubscriptionLicenseIssueResponse:
      required:
        - licenseId
        - licenseCode
        - keyMaterialRefId
        - snapshotId
        - snapshotVersion
        - snapshotHash
        - maskedKey
        - issueMode
        - isIdempotentReplay
      type: object
      properties:
        licenseId:
          type: string
          format: uuid
        licenseCode:
          type: string
        keyMaterialRefId:
          type: string
          format: uuid
        snapshotId:
          type: string
          format: uuid
        snapshotVersion:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        snapshotHash:
          type: string
        maskedKey:
          type: string
        plaintextKey:
          type: string
          nullable: true
        issueMode:
          type: string
        isIdempotentReplay:
          type: boolean
    UpdateCapacityBody:
      required:
        - capacity
      type: object
      properties:
        capacity:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    UpdateContactBody:
      required:
        - displayName
        - email
        - phone
        - status
      type: object
      properties:
        displayName:
          type: string
        email:
          type: string
          nullable: true
        phone:
          type: string
          nullable: true
        status:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/CustomerContactStatus'
    UpdateDelegationStatusBody:
      required:
        - status
      type: object
      properties:
        status:
          $ref: '#/components/schemas/ResellerDelegationStatus'
    UpdateDocumentBody:
      required:
        - displayName
        - publicConfigJson
        - productId
        - environmentId
        - licenseId
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        publicConfigJson:
          type: string
          nullable: true
        productId:
          type: string
          format: uuid
          nullable: true
        environmentId:
          type: string
          format: uuid
          nullable: true
        licenseId:
          type: string
          format: uuid
          nullable: true
    UpdateEntitlementBody:
      required:
        - displayName
        - typeMetadataJson
        - status
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        typeMetadataJson:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
    UpdateOfferBody:
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
          nullable: true
        billingInterval:
          type: string
          nullable: true
        catalogRef:
          type: string
          nullable: true
        policyRef:
          type: string
          nullable: true
        providerPriceRef:
          type: string
          nullable: true
    UpdatePlanBody:
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        limitsJson:
          type: string
          nullable: true
        amountMinorUnits:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int64
        currency:
          type: string
          nullable: true
        interval:
          type: string
          nullable: true
        visibility:
          type: string
          nullable: true
        providerPriceRef:
          type: string
          nullable: true
    UpdatePriceBookBody:
      type: object
      properties:
        displayName:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        currency:
          type: string
          nullable: true
    UpdateReleaseDraftBody:
      type: object
      properties:
        productId:
          type: string
          format: uuid
          nullable: true
        version:
          type: string
          nullable: true
        channel:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        releaseNotes:
          type: string
          nullable: true
    UpdateSiteBody:
      required:
        - displayName
        - addressLine
        - status
      type: object
      properties:
        displayName:
          type: string
        addressLine:
          type: string
          nullable: true
        status:
          oneOf:
            - enum:
                - null
            - $ref: '#/components/schemas/CustomerSiteStatus'
    UpsertFingerprintSignalBody:
      required:
        - kind
        - signalPayload
        - isMatched
        - collectedAtUtc
      type: object
      properties:
        kind:
          type: string
        signalPayload:
          type: string
        isMatched:
          type: boolean
          nullable: true
        collectedAtUtc:
          type: string
          format: date-time
          nullable: true
    UpsertLicenseLinkBody:
      required:
        - resellerOrganizationId
        - licenseId
      type: object
      properties:
        resellerOrganizationId:
          type: string
          format: uuid
        licenseId:
          type: string
          format: uuid
    UpsertMfaPolicyBody:
      required:
        - requireMfa
      type: object
      properties:
        requireMfa:
          type: boolean
    UpsertQuotaBody:
      required:
        - kind
        - limitValue
      type: object
      properties:
        kind:
          $ref: '#/components/schemas/ResellerQuotaKind'
        limitValue:
          pattern: ^-?(?:0|[1-9]\d*)$
          format: int32
    UpsertRestrictionsBody:
      required:
        - allowLicenseAssign
        - allowActivation
      type: object
      properties:
        allowLicenseAssign:
          type: boolean
        allowActivation:
          type: boolean
    VerifyMfaChallengeBody:
      required:
        - challengeToken
        - code
        - recoveryCode
        - method
      type: object
      properties:
        challengeToken:
          type: string
          nullable: true
        code:
          type: string
          nullable: true
        recoveryCode:
          type: string
          nullable: true
        method:
          type: string
          nullable: true
tags:
  - name: Health
  - name: Public Platform Plans
  - name: ProductTariffDraftEndpointRouteBuilderExtensions
  - name: ProductTariffPublishHistoryEndpointRouteBuilderExtensions
  - name: SubscriptionLicenseIssueEndpointRouteBuilderExtensions
  - name: OfflineEndpointRouteBuilderExtensions
  - name: BillingWebhooksEndpointRouteBuilderExtensions
  - name: CommerceWebhooksEndpointRouteBuilderExtensions
  - name: CustomerAggregateEndpointRouteBuilderExtensions
  - name: CustomerLicenseTableEndpointRouteBuilderExtensions
  - name: CustomerLicenseIssueEndpointRouteBuilderExtensions
  - name: Customer License actions
  - name: Licenses
  - name: AuthEndpointRouteBuilderExtensions
  - name: PublicSignupEndpointRouteBuilderExtensions
  - name: MfaEndpointRouteBuilderExtensions
  - name: TenantEndpointRouteBuilderExtensions
  - name: MemberEndpointRouteBuilderExtensions
  - name: InviteEndpointRouteBuilderExtensions
  - name: RoleEndpointRouteBuilderExtensions
  - name: RbacEndpointRouteBuilderExtensions
  - name: ServiceAccountEndpointRouteBuilderExtensions
  - name: IntegrationsEndpointRouteBuilderExtensions
  - name: SecurityEndpointRouteBuilderExtensions
  - name: SecurityKeysEndpointRouteBuilderExtensions
  - name: CatalogEndpointRouteBuilderExtensions
  - name: PoliciesEndpointRouteBuilderExtensions
  - name: LicensesEndpointRouteBuilderExtensions
  - name: DevicesEndpointRouteBuilderExtensions
  - name: RelaysEndpointRouteBuilderExtensions
  - name: FloatingEndpointRouteBuilderExtensions
  - name: RuntimeConfigEndpointRouteBuilderExtensions
  - name: BillingEndpointRouteBuilderExtensions
  - name: CommerceEndpointRouteBuilderExtensions
  - name: ReleasesEndpointRouteBuilderExtensions
  - name: AuditEndpointRouteBuilderExtensions
  - name: AnalyticsEndpointRouteBuilderExtensions
  - name: CustomersEndpointRouteBuilderExtensions
  - name: PortalEndpointRouteBuilderExtensions
  - name: ResellersEndpointRouteBuilderExtensions
  - name: FoundationValidation
