openapi: 3.0.3
info:
  description: 'Registrar + Enrollment + Provisioning + Access-Request lifecycle for manufacturer onboarding. '
  title: ThingMake Service
  version: v1
paths:
  /api/v1/access-requests:
    get:
      description: 'PDP action: `thingmake:AccessRequest:List`'
      operationId: listAccessRequests
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessRequestListResponse'
          description: OK
      security:
        - bearerAuth: []
      summary: List access requests
      tags:
        - access-requests
  /api/v1/access-requests/{id}:
    get:
      description: 'PDP action: `thingmake:AccessRequest:Read`'
      operationId: getAccessRequest
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessRequestResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read an access request
      tags:
        - access-requests
  /api/v1/access-requests/{id}/approve:
    post:
      description: 'PDP action: `thingmake:AccessRequest:Approve`'
      operationId: approveAccessRequest
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveAccessRequestRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessRequestResponse'
          description: OK
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Approve an access request (sugar over Decide)
      tags:
        - access-requests
  /api/v1/access-requests/{id}/decide:
    post:
      description: 'PDP action: `thingmake:AccessRequest:Decide`'
      operationId: decideAccessRequest
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecideAccessRequestRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessRequestResponse'
          description: OK
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Decide an access request (APPROVED or REJECTED)
      tags:
        - access-requests
  /api/v1/access-requests/{id}/reject:
    post:
      description: 'PDP action: `thingmake:AccessRequest:Reject`'
      operationId: rejectAccessRequest
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectAccessRequestRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessRequestResponse'
          description: OK
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Reject an access request (sugar over Decide)
      tags:
        - access-requests
  /api/v1/enrollments:
    get:
      description: 'PDP action: `thingmake:Enrollment:List`'
      operationId: listEnrollments
      responses:
        "501":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Implemented (deferred)
      security:
        - bearerAuth: []
      summary: List enrollments (501 deferred to Phase 11)
      tags:
        - enrollments
    post:
      description: 'PDP action: `thingmake:Enrollment:Create`'
      operationId: createEnrollment
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEnrollmentRequest'
        required: true
      responses:
        "501":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Implemented (deferred)
      security:
        - bearerAuth: []
      summary: Create an enrollment (501 deferred to Phase 11)
      tags:
        - enrollments
  /api/v1/enrollments/{id}:
    get:
      description: 'PDP action: `thingmake:Enrollment:Read`'
      operationId: getEnrollment
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "501":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Implemented (deferred)
      security:
        - bearerAuth: []
      summary: Read an enrollment (501 deferred to Phase 11)
      tags:
        - enrollments
  /api/v1/factory-services:
    get:
      description: 'PDP action: `thingmake:FactoryService:List`'
      operationId: listFactoryServices
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListFactoryServicesResponse'
          description: OK
      security:
        - bearerAuth: []
      summary: List factory_services (paginated, filterable by role/state/registrar/model)
      tags:
        - factory-services
    post:
      description: 'PDP action: `thingmake:FactoryService:Create`'
      operationId: createFactoryService
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFactoryServiceRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactoryServiceCreateResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Register a model-scoped factory backend (identify/provision); returns generated AK/SK once
      tags:
        - factory-services
  /api/v1/factory-services/{id}:
    delete:
      description: 'PDP action: `thingmake:FactoryService:Delete`'
      operationId: deleteFactoryService
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Empty'
          description: No Content
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Soft-delete a factory_service (Phase 30 implements drain + GC)
      tags:
        - factory-services
    get:
      description: 'PDP action: `thingmake:FactoryService:Read`'
      operationId: getFactoryService
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactoryServiceResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Get a factory_service by id
      tags:
        - factory-services
    patch:
      description: 'PDP action: `thingmake:FactoryService:Update`'
      operationId: updateFactoryService
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateFactoryServiceRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactoryServiceResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Update endpoint_url (only mutable field via PATCH)
      tags:
        - factory-services
  /api/v1/factory-services/{id}/confirm-rotation:
    post:
      description: 'PDP action: `thingmake:FactoryService:ConfirmRotation`'
      operationId: confirmFactoryServiceRotation
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FactoryServiceResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Clear rotation_pending once the new credential is adopted; 409 if no rotation is pending
      tags:
        - factory-services
  /api/v1/factory-services/{id}/expedite-drain:
    post:
      description: 'PDP action: `thingmake:FactoryService:Drain`'
      operationId: expediteDrainFactoryService
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Empty'
          description: No Content
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Expedite drain of a soft-deleted factory_service; hard-deletes if no active saga legs reference it
      tags:
        - factory-services
  /api/v1/factory-services/{id}/health-check:
    post:
      description: 'PDP action: `thingmake:FactoryService:HealthCheck`'
      operationId: healthCheckFactoryService
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthCheckResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Synchronously probe endpoint_url /healthz; updates last_health_check_* columns
      tags:
        - factory-services
  /api/v1/factory-services/{id}/rotate-credentials:
    post:
      description: 'PDP action: `thingmake:FactoryService:RotateCredentials`'
      operationId: rotateFactoryServiceCredentials
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RotateCredentialsResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Rotate AK/SK; returns new secret_access_key once and sets rotation_pending=true
      tags:
        - factory-services
  /api/v1/identity-blacklist:
    get:
      description: 'PDP action: `thingmake:IdentityBlacklist:List`'
      operationId: listIdentityBlacklist
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListIdentityBlacklistResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
      security:
        - bearerAuth: []
      summary: List all active identity-blacklist entries (paginated; sorted by model,sn)
      tags:
        - identity-blacklist
  /api/v1/identity-blacklist/check:
    get:
      description: 'PDP action: `thingmake:IdentityBlacklist:Check`'
      operationId: checkIdentityBlacklist
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IdentityBlacklistEntryResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Check if a (model, sn) pair is on the global identity blacklist
      tags:
        - identity-blacklist
  /api/v1/identity-blacklist/deltas:
    get:
      description: 'PDP action: `thingmake:IdentityBlacklist:ListDeltas`'
      operationId: listIdentityBlacklistDeltas
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListIdentityBlacklistDeltasResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "410":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Response
      security:
        - bearerAuth: []
      summary: Poll the identity-blacklist delta feed since a cursor (72h TTL → HTTP 410)
      tags:
        - identity-blacklist
  /api/v1/identity-blacklist/snapshot.signed:
    get:
      description: 'PDP action: `thingmake:IdentityBlacklist:GetSnapshot`'
      operationId: getIdentityBlacklistSnapshot
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Empty'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "503":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Service Unavailable
      security:
        - bearerAuth: []
      summary: Download the JWS-signed identity-blacklist snapshot (application/jose+json) for fail-closed factory caching
      tags:
        - identity-blacklist
  /api/v1/provisioning-runs:
    get:
      description: 'PDP action: `thingmake:ProvisioningRun:List`'
      operationId: listProvisioningRuns
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProvisioningRunListResponse'
          description: OK
      security:
        - bearerAuth: []
      summary: List provisioning runs
      tags:
        - provisioning-runs
  /api/v1/provisioning-runs/{id}:
    get:
      description: 'PDP action: `thingmake:ProvisioningRun:Read`'
      operationId: getProvisioningRun
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProvisioningRunResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read a provisioning run
      tags:
        - provisioning-runs
  /api/v1/registrars:
    get:
      description: 'PDP action: `thingmake:Registrar:List`'
      operationId: listRegistrars
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarListResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
      security:
        - bearerAuth: []
      summary: List registrars (keyset pagination)
      tags:
        - registrars
    post:
      description: 'PDP action: `thingmake:Registrar:Create`'
      operationId: createRegistrar
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateRegistrarRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "403":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Forbidden
      security:
        - bearerAuth: []
      summary: Create a registrar
      tags:
        - registrars
  /api/v1/registrars/{id}:
    delete:
      description: 'PDP action: `thingmake:Registrar:Delete`'
      operationId: deleteRegistrar
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          description: No Content
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Delete a registrar
      tags:
        - registrars
    get:
      description: 'PDP action: `thingmake:Registrar:Read`'
      operationId: getRegistrar
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read a registrar by id
      tags:
        - registrars
    patch:
      description: 'PDP action: `thingmake:Registrar:Update`'
      operationId: updateRegistrar
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateRegistrarRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Update a registrar
      tags:
        - registrars
  /api/v1/registrars/{id}/approve:
    post:
      description: 'PDP action: `thingmake:Registrar:Approve`'
      operationId: approveRegistrar
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApproveRegistrarRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarResponse'
          description: OK
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Approve a pending registrar
      tags:
        - registrars
  /api/v1/registrars/{id}/reject:
    post:
      description: 'PDP action: `thingmake:Registrar:Reject`'
      operationId: rejectRegistrar
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RejectRegistrarRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrarResponse'
          description: OK
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Reject a pending registrar
      tags:
        - registrars
  /api/v1/state-change-subscriptions:
    get:
      description: 'PDP action: `thingmake:StateChangeSubscription:List`'
      operationId: listStateChangeSubscriptions
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListStateChangeSubscriptionsResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
      security:
        - bearerAuth: []
      summary: List webhook subscriptions for the authenticated registrar (paginated)
      tags:
        - state-change-subscriptions
    post:
      description: 'PDP action: `thingmake:StateChangeSubscription:Create`'
      operationId: createStateChangeSubscription
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateStateChangeSubscriptionRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateStateChangeSubscriptionResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "422":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Response
      security:
        - bearerAuth: []
      summary: Subscribe a factory webhook for state-change push notifications (acknowledge_polling_still_mandatory required; secret echoed once)
      tags:
        - state-change-subscriptions
  /api/v1/state-change-subscriptions/{id}:
    delete:
      description: 'PDP action: `thingmake:StateChangeSubscription:Delete`'
      operationId: deleteStateChangeSubscription
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Empty'
          description: No Content
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Soft-delete a webhook subscription
      tags:
        - state-change-subscriptions
    get:
      description: 'PDP action: `thingmake:StateChangeSubscription:Read`'
      operationId: getStateChangeSubscription
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StateChangeSubscriptionResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Get a webhook subscription by id (secret elided)
      tags:
        - state-change-subscriptions
    patch:
      description: 'PDP action: `thingmake:StateChangeSubscription:Update`'
      operationId: updateStateChangeSubscription
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateStateChangeSubscriptionRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StateChangeSubscriptionResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Update a webhook subscription (target_url, event_filter, status ACTIVE/SUSPENDED, secret); SUSPENDED→ACTIVE resets failures
      tags:
        - state-change-subscriptions
  /api/v1/state-change-subscriptions/{id}/test:
    post:
      description: 'PDP action: `thingmake:StateChangeSubscription:Test`'
      operationId: testStateChangeSubscription
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestDeliveryResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Synchronously POST a synthetic event to the subscription's target_url; always returns 200 with {delivered, delivered_status, error}
      tags:
        - state-change-subscriptions
  /api/v1/state-changes:
    get:
      description: 'PDP action: `thingmake:StateChange:List`'
      operationId: listStateChanges
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListStateChangesResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "410":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Response
      security:
        - bearerAuth: []
      summary: Poll registrar-scoped state-changes feed (?since=<cursor>; 72h TTL → HTTP 410; ?registrar_id= rejected with 400)
      tags:
        - state-changes
  /api/v1/thingmake/models:
    get:
      description: 'PDP action: `thingmake:Model:List`'
      operationId: listModels
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelListResponse'
          description: OK
      security:
        - bearerAuth: []
      summary: List device models (keyset pagination)
      tags:
        - device-models
    post:
      description: 'PDP action: `thingmake:Model:Create`'
      operationId: createModel
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateModelRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Register a device model (vid:pid, provisioning-by-model)
      tags:
        - device-models
  /api/v1/thingmake/models/{id}:
    delete:
      description: 'PDP action: `thingmake:Model:Delete`'
      operationId: deleteModel
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          description: No Content
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Delete a device model
      tags:
        - device-models
    get:
      description: 'PDP action: `thingmake:Model:Read`'
      operationId: getModel
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read a device model (public descriptor)
      tags:
        - device-models
    patch:
      description: 'PDP action: `thingmake:Model:Update`'
      operationId: updateModel
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateModelRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Update a device model
      tags:
        - device-models
  /api/v1/thingmake/models/{id}/share:
    post:
      description: 'PDP action: `thingmake:Model:Share`'
      operationId: shareModel
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ShareModelRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShareModelResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Mint a share deeplink for a recipient factory (public descriptor only)
      tags:
        - device-models
  /api/v1/thingmake/models/{id}/software:
    get:
      description: 'PDP action: `thingmake:Model:Read`'
      operationId: resolveModelSoftware
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SoftwareListResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Resolve the software/driver bundles applicable to a model's vid:pid descriptor
      tags:
        - device-models
  /api/v1/thingmake/models/import:
    post:
      description: 'PDP action: `thingmake:Model:Import`'
      operationId: importModel
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ImportModelRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "403":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Forbidden
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Import a shared model's public descriptor via deeplink
      tags:
        - device-models
  /api/v1/thingmake/software:
    get:
      description: 'PDP action: `thingmake:Software:List`'
      operationId: listSoftware
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SoftwareListResponse'
          description: OK
      security:
        - bearerAuth: []
      summary: List software/driver bundles (keyset pagination)
      tags:
        - device-models
    post:
      description: 'PDP action: `thingmake:Software:Create`'
      operationId: createSoftware
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSoftwareRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SoftwareResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Register a software/driver bundle and the vid:pid descriptor set it loads onto
      tags:
        - device-models
  /api/v1/thingmake/software/{id}:
    delete:
      description: 'PDP action: `thingmake:Software:Delete`'
      operationId: deleteSoftware
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          description: No Content
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Delete a software/driver bundle
      tags:
        - device-models
    get:
      description: 'PDP action: `thingmake:Software:Read`'
      operationId: getSoftware
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SoftwareResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read a software/driver bundle + its applicability set
      tags:
        - device-models
    patch:
      description: 'PDP action: `thingmake:Software:Update`'
      operationId: updateSoftware
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSoftwareRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SoftwareResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Update a software/driver bundle (applies_to replaces the descriptor set)
      tags:
        - device-models
  /api/v1/thingmake/vendors:
    get:
      description: 'PDP action: `thingmake:Vendor:Read`'
      operationId: getVendor
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Read the account's VID namespace
      tags:
        - device-models
    post:
      description: 'PDP action: `thingmake:Vendor:Assign`'
      operationId: assignVendor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignVendorRequest'
        required: true
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorResponse'
          description: Created
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
      security:
        - bearerAuth: []
      summary: Assign (or fetch) the account's platform VID namespace
      tags:
        - device-models
  /api/v1/things:
    get:
      description: 'PDP action: `thingmake:Thing:List`'
      operationId: listThings
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListThingsResponse'
          description: OK
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
      security:
        - bearerAuth: []
      summary: List things scoped to the authenticated registrar (paginated; ?state= filter; ?registrar_id= rejected with 400)
      tags:
        - things
  /api/v1/things/{id}:
    get:
      description: 'PDP action: `thingmake:Thing:Read`'
      operationId: getThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ThingResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Get a thing by id (404 leakage-free on cross-registrar access)
      tags:
        - things
  /api/v1/things/{id}/activate:
    post:
      description: 'PDP action: `thingmake:Thing:Activate`'
      operationId: activateThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "202":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaAcceptedResponse'
          description: Accepted
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Start ACTIVATE saga (PROVISIONED|DEACTIVATED → ACTIVATED, unified verb)
      tags:
        - things
  /api/v1/things/{id}/activation-result:
    post:
      description: 'PDP action: `thingmake:Thing:Activate`'
      operationId: activationResultThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResultWebhookRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResultWebhookResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Activation-leg result webhook
      tags:
        - things
  /api/v1/things/{id}/annihilate:
    post:
      description: 'PDP action: `thingmake:Thing:Annihilate`'
      operationId: annihilateThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "202":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnnihilatePendingResponse'
          description: Accepted
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Enter ANNIHILATION-PENDING (dual-control; second principal must confirm within 24h)
      tags:
        - things
  /api/v1/things/{id}/annihilate/confirm:
    post:
      description: 'PDP action: `thingmake:Thing:Annihilate`'
      operationId: annihilateConfirmThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "202":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaAcceptedResponse'
          description: Accepted
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "403":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Forbidden
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Confirm ANNIHILATE (distinct principal); starts 3-leg saga
      tags:
        - things
  /api/v1/things/{id}/annihilation-result:
    post:
      description: 'PDP action: `thingmake:Thing:Annihilate`'
      operationId: annihilationResultThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResultWebhookRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResultWebhookResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Annihilation-leg result webhook
      tags:
        - things
  /api/v1/things/{id}/audit:
    get:
      description: 'PDP action: `thingmake:Thing:ReadAudit`'
      operationId: getThingAudit
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListThingAuditResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Get a thing's state-transition audit trail (limit-capped at 200)
      tags:
        - things
  /api/v1/things/{id}/deactivate:
    post:
      description: 'PDP action: `thingmake:Thing:Deactivate`'
      operationId: deactivateThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "202":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaAcceptedResponse'
          description: Accepted
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Start DEACTIVATE saga (ACTIVATED → DEACTIVATED, reversible kill-switch)
      tags:
        - things
  /api/v1/things/{id}/deactivation-result:
    post:
      description: 'PDP action: `thingmake:Thing:Deactivate`'
      operationId: deactivationResultThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResultWebhookRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResultWebhookResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Deactivation-leg result webhook
      tags:
        - things
  /api/v1/things/{id}/provision:
    post:
      description: 'PDP action: `thingmake:Thing:Provision`'
      operationId: provisionThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "202":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SagaAcceptedResponse'
          description: Accepted
        "400":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Validation failed
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
        "409":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Conflict
      security:
        - bearerAuth: []
      summary: Start PROVISION saga (ROLLEDOFF → PROVISIONED)
      tags:
        - things
  /api/v1/things/{id}/provisioning-result:
    post:
      description: 'PDP action: `thingmake:Thing:Provision`'
      operationId: provisioningResultThing
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResultWebhookRequest'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResultWebhookResponse'
          description: OK
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Provisioning-leg result webhook (factory backend)
      tags:
        - things
  /api/v1/things/{id}/state:
    get:
      description: 'PDP action: `thingmake:Thing:ReadState`'
      operationId: getThingState
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ThingStateResponse'
          description: OK
        "401":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Unauthorized
        "404":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: Not Found
      security:
        - bearerAuth: []
      summary: Get a thing's current state + updated_at
      tags:
        - things
components:
  schemas:
    AccessRequestListResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/AccessRequestResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    AccessRequestResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        decided_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        decided_by:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        decision_reason:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        expires_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: areq-01HXXXXXXXX
          items: null
          ref: ""
        purpose:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        requester_sub:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: PENDING
          items: null
          ref: ""
    AnnihilatePendingResponse:
      type: object
      required: []
      props:
        expires_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        requested_by:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        thing:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
    ApproveAccessRequestRequest:
      type: object
      required: []
      props:
        reason:
          type: string
          format: ""
          example: approved per playbook
          items: null
          ref: ""
    ApproveRegistrarRequest:
      type: object
      required: []
      props:
        note:
          type: string
          format: ""
          example: Approved per onboarding checklist 2026-06-19
          items: null
          ref: ""
    AssignVendorRequest:
      type: object
      required: []
      props:
        display_name:
          type: string
          format: ""
          example: Acme Robotics
          items: null
          ref: ""
    CreateEnrollmentRequest:
      type: object
      required:
        - registrar_id
        - thing_id
        - model
      props:
        model:
          type: string
          format: ""
          example: amr-100
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-01HXXXXXXXX
          items: null
          ref: ""
        thing_id:
          type: string
          format: ""
          example: thing-amr-100-001
          items: null
          ref: ""
    CreateFactoryServiceRequest:
      type: object
      required:
        - registrar_id
        - model_id
        - role
        - endpoint_url
      props:
        endpoint_url:
          type: string
          format: ""
          example: https://factory.acme-robotics.example.com
          items: null
          ref: ""
        model_id:
          type: string
          format: ""
          example: 550e8400-e29b-41d4-a716-446655440000
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        role:
          type: string
          format: ""
          example: identify
          items: null
          ref: ""
    CreateModelRequest:
      type: object
      required:
        - pid
        - device_class
        - provisioning_method
      props:
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        device_class:
          type: string
          format: ""
          example: fgai_schemas.robotics.v1
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        hw_revision:
          type: string
          format: ""
          example: rev-c
          items: null
          ref: ""
        pid:
          type: string
          format: ""
          example: rb-100
          items: null
          ref: ""
        provisioning_config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        provisioning_method:
          type: string
          format: ""
          example: certificate
          items: null
          ref: ""
        vendor_secret:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
    CreateRegistrarRequest:
      type: object
      required:
        - name
      props:
        config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: Manufacturer of industrial AMRs
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: ACME Robotics Inc.
          items: null
          ref: ""
        name:
          type: string
          format: ""
          example: acme-robotics
          items: null
          ref: ""
    CreateSoftwareRequest:
      type: object
      required:
        - artifact_id
        - version
        - kind
      props:
        applies_to:
          type: array
          format: ""
          example: null
          items:
            type: object
            format: ""
            example: null
            items: null
            ref: ""
          ref: ""
        artifact_id:
          type: string
          format: ""
          example: hawkbit://amr-driver
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        kind:
          type: string
          format: ""
          example: driver
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        version:
          type: string
          format: ""
          example: 1.2.0
          items: null
          ref: ""
    CreateStateChangeSubscriptionRequest:
      type: object
      required:
        - target_url
        - webhook_secret
        - acknowledge_polling_still_mandatory
      props:
        acknowledge_polling_still_mandatory:
          type: boolean
          format: ""
          example: true
          items: null
          ref: ""
        event_filter:
          type: object
          format: ""
          example:
            new_states:
              - ACTIVATED
          items: null
          ref: ""
        target_url:
          type: string
          format: ""
          example: https://factory.example.com/webhooks/state-change
          items: null
          ref: ""
        webhook_secret:
          type: string
          format: ""
          example: shared-secret-256-bit
          items: null
          ref: ""
    CreateStateChangeSubscriptionResponse:
      type: object
      required: []
      props:
        consecutive_failures:
          type: integer
          format: ""
          example: 0
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        event_filter:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: 01HXXXXXXXX
          items: null
          ref: ""
        polling_contract_url:
          type: string
          format: ""
          example: https://docs.fgai/thingmake/contracts/state-changes-feed
          items: null
          ref: ""
        polling_mandatory:
          type: boolean
          format: ""
          example: true
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        status:
          type: string
          format: ""
          example: ACTIVE
          items: null
          ref: ""
        target_url:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        webhook_secret:
          type: string
          format: ""
          example: shared-secret-echoed-once
          items: null
          ref: ""
    DecideAccessRequestRequest:
      type: object
      required:
        - decision
      props:
        decision:
          type: string
          format: ""
          example: APPROVED
          items: null
          ref: ""
        reason:
          type: string
          format: ""
          example: vetted via support ticket SUP-1234
          items: null
          ref: ""
    Empty:
      type: object
      required: []
      props: {}
    FactoryServiceCreateResponse:
      type: object
      required: []
      props:
        access_key_id:
          type: string
          format: ""
          example: AKIAEXAMPLEXXXXXXXXX
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        endpoint_url:
          type: string
          format: ""
          example: https://factory.acme-robotics.example.com
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: fs-01HXXXXXXXX
          items: null
          ref: ""
        model_id:
          type: string
          format: ""
          example: 550e8400-e29b-41d4-a716-446655440000
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        role:
          type: string
          format: ""
          example: identify
          items: null
          ref: ""
        secret_access_key:
          type: string
          format: ""
          example: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: ACTIVE
          items: null
          ref: ""
    FactoryServiceResponse:
      type: object
      required: []
      props:
        access_key_id:
          type: string
          format: ""
          example: AKIAEXAMPLEXXXXXXXXX
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        endpoint_url:
          type: string
          format: ""
          example: https://factory.acme-robotics.example.com
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: fs-01HXXXXXXXX
          items: null
          ref: ""
        last_health_check_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        last_health_check_status:
          type: string
          format: ""
          example: OK
          items: null
          ref: ""
        model_id:
          type: string
          format: ""
          example: 550e8400-e29b-41d4-a716-446655440000
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        role:
          type: string
          format: ""
          example: identify
          items: null
          ref: ""
        rotation_pending:
          type: boolean
          format: ""
          example: false
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: ACTIVE
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    HealthCheckResponse:
      type: object
      required: []
      props:
        checked_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        error:
          type: string
          format: ""
          example: ""
          items: null
          ref: ""
        http_status:
          type: integer
          format: ""
          example: 200
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: fs-01HXXXXXXXX
          items: null
          ref: ""
        latency_ms:
          type: integer
          format: ""
          example: 42
          items: null
          ref: ""
        status:
          type: string
          format: ""
          example: OK
          items: null
          ref: ""
    IdentityBlacklistDeltaResponse:
      type: object
      required: []
      props:
        actor:
          type: string
          format: ""
          example: admin@flexgalaxy
          items: null
          ref: ""
        change_type:
          type: string
          format: ""
          example: INSERT
          items: null
          ref: ""
        model:
          type: string
          format: ""
          example: RX-7900
          items: null
          ref: ""
        reason:
          type: string
          format: ""
          example: cloned serial
          items: null
          ref: ""
        seq:
          type: integer
          format: int64
          example: 17
          items: null
          ref: ""
        sn:
          type: string
          format: ""
          example: SN12345
          items: null
          ref: ""
        ts:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    IdentityBlacklistEntryResponse:
      type: object
      required: []
      props:
        blacklisted_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        blacklisted_by:
          type: string
          format: ""
          example: admin@flexgalaxy
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: 01HXXXXXXXX
          items: null
          ref: ""
        model:
          type: string
          format: ""
          example: RX-7900
          items: null
          ref: ""
        reason:
          type: string
          format: ""
          example: cloned serial
          items: null
          ref: ""
        sn:
          type: string
          format: ""
          example: SN12345
          items: null
          ref: ""
    ImportModelRequest:
      type: object
      required:
        - deeplink_token
      props:
        deeplink_token:
          type: string
          format: ""
          example: eyJ...==.abc
          items: null
          ref: ""
    ListFactoryServicesResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/FactoryServiceResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    ListIdentityBlacklistDeltasResponse:
      type: object
      required: []
      props:
        has_more:
          type: boolean
          format: ""
          example: null
          items: null
          ref: ""
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/IdentityBlacklistDeltaResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    ListIdentityBlacklistResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/IdentityBlacklistEntryResponse'
          ref: ""
        limit:
          type: integer
          format: ""
          example: 50
          items: null
          ref: ""
        offset:
          type: integer
          format: ""
          example: 0
          items: null
          ref: ""
        total:
          type: integer
          format: ""
          example: 42
          items: null
          ref: ""
    ListStateChangeSubscriptionsResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/StateChangeSubscriptionResponse'
          ref: ""
        limit:
          type: integer
          format: ""
          example: 50
          items: null
          ref: ""
        offset:
          type: integer
          format: ""
          example: 0
          items: null
          ref: ""
        total:
          type: integer
          format: ""
          example: 12
          items: null
          ref: ""
    ListStateChangesResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/StateChangeResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: MjAyNi0wNi0yMlQwMDoxNToyMlp8NDI
          items: null
          ref: ""
    ListThingAuditResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/StateAuditResponse'
          ref: ""
    ListThingsResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/ThingResponse'
          ref: ""
        limit:
          type: integer
          format: ""
          example: 50
          items: null
          ref: ""
        offset:
          type: integer
          format: ""
          example: 0
          items: null
          ref: ""
        total:
          type: integer
          format: ""
          example: 42
          items: null
          ref: ""
    ModelListResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/ModelResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    ModelResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: acct-oem-a
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        device_class:
          type: string
          format: ""
          example: fgai_schemas.robotics.v1
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        has_vendor_secret:
          type: boolean
          format: ""
          example: null
          items: null
          ref: ""
        hw_revision:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: 9f1c2b3a-...
          items: null
          ref: ""
        imported_from_frn:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        model_frn:
          type: string
          format: ""
          example: frn:acct-oem-a:thingmake:model/9f1c2b3a-...
          items: null
          ref: ""
        origin_vid:
          type: string
          format: ""
          example: v0001
          items: null
          ref: ""
        pid:
          type: string
          format: ""
          example: rb-100
          items: null
          ref: ""
        provisioning_config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        provisioning_method:
          type: string
          format: ""
          example: certificate
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: DRAFT
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        vid:
          type: string
          format: ""
          example: v0001
          items: null
          ref: ""
    Problem:
      type: object
      required:
        - type
        - title
        - status
      props:
        detail:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        instance:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        status:
          type: integer
          format: int32
          example: null
          items: null
          ref: ""
        title:
          type: string
          format: ""
          example: Registrar not found
          items: null
          ref: ""
        trace_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        type:
          type: string
          format: uri
          example: https://docs.fgai/thingmake/errors/registrar-not-found
          items: null
          ref: ""
    ProvisioningRunListResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/ProvisioningRunResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    ProvisioningRunResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        failed:
          type: integer
          format: ""
          example: 2
          items: null
          ref: ""
        finished_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: prun-01HXXXXXXXX
          items: null
          ref: ""
        model_id:
          type: string
          format: ""
          example: amr-100
          items: null
          ref: ""
        name:
          type: string
          format: ""
          example: acme-batch-1
          items: null
          ref: ""
        provisioned:
          type: integer
          format: ""
          example: 48
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        started_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        status:
          type: string
          format: ""
          example: COMPLETED
          items: null
          ref: ""
        total:
          type: integer
          format: ""
          example: 50
          items: null
          ref: ""
    RegistrarListResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/RegistrarResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: reg-01HXXXXXXXY
          items: null
          ref: ""
    RegistrarResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: acct-123
          items: null
          ref: ""
        approved_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        approved_by:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: reg-01HXXXXXXXX
          items: null
          ref: ""
        name:
          type: string
          format: ""
          example: acme-robotics
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: PENDING
          items: null
          ref: ""
    RejectAccessRequestRequest:
      type: object
      required:
        - reason
      props:
        reason:
          type: string
          format: ""
          example: requested account not in scope
          items: null
          ref: ""
    RejectRegistrarRequest:
      type: object
      required:
        - reason
      props:
        reason:
          type: string
          format: ""
          example: failed compliance check
          items: null
          ref: ""
    ResultWebhookRequest:
      type: object
      required:
        - saga_id
        - leg_id
        - success
      props:
        error:
          type: string
          format: ""
          example: upstream timeout
          items: null
          ref: ""
        leg_id:
          type: integer
          format: int32
          example: 1
          items: null
          ref: ""
        payload:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        saga_id:
          type: string
          format: ""
          example: 01HABCDEF1234567890...
          items: null
          ref: ""
        success:
          type: boolean
          format: ""
          example: true
          items: null
          ref: ""
    ResultWebhookResponse:
      type: object
      required: []
      props:
        acknowledged:
          type: boolean
          format: ""
          example: null
          items: null
          ref: ""
        already_complete:
          type: boolean
          format: ""
          example: null
          items: null
          ref: ""
        leg_id:
          type: integer
          format: int32
          example: null
          items: null
          ref: ""
        saga_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        saga_state:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        thing_state:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    RotateCredentialsResponse:
      type: object
      required: []
      props:
        access_key_id:
          type: string
          format: ""
          example: AKIANEWEXAMPLEXXXXXX
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: fs-01HXXXXXXXX
          items: null
          ref: ""
        rotated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        rotation_pending:
          type: boolean
          format: ""
          example: true
          items: null
          ref: ""
        secret_access_key:
          type: string
          format: ""
          example: wJalrXUtnFEMI/K7MDENG/bPxRfiCYNEWKEYXXXXX
          items: null
          ref: ""
    SagaAcceptedResponse:
      type: object
      required: []
      props:
        saga_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: PENDING
          items: null
          ref: ""
        thing:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        verb:
          type: string
          format: ""
          example: ACTIVATE
          items: null
          ref: ""
    ShareModelRequest:
      type: object
      required:
        - recipient_account_id
      props:
        recipient_account_id:
          type: string
          format: ""
          example: acct-oem-factory-b
          items: null
          ref: ""
        ttl_seconds:
          type: integer
          format: ""
          example: 86400
          items: null
          ref: ""
    ShareModelResponse:
      type: object
      required: []
      props:
        deeplink_token:
          type: string
          format: ""
          example: eyJ...==.abc
          items: null
          ref: ""
        expires_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        model_frn:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        recipient_account_id:
          type: string
          format: ""
          example: acct-oem-b
          items: null
          ref: ""
    SoftwareListResponse:
      type: object
      required: []
      props:
        items:
          type: array
          format: ""
          example: null
          items:
            type: ""
            format: ""
            example: null
            items: null
            ref: '#/components/schemas/SoftwareResponse'
          ref: ""
        next_cursor:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
    SoftwareResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: acct-oem-a
          items: null
          ref: ""
        applies_to:
          type: array
          format: ""
          example: null
          items:
            type: object
            format: ""
            example: null
            items: null
            ref: ""
          ref: ""
        artifact_id:
          type: string
          format: ""
          example: hawkbit://amr-driver
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        kind:
          type: string
          format: ""
          example: driver
          items: null
          ref: ""
        software_frn:
          type: string
          format: ""
          example: frn:acct-oem-a:thingmake:software/1a2b...
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: PUBLISHED
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        version:
          type: string
          format: ""
          example: 1.2.0
          items: null
          ref: ""
    StateAuditResponse:
      type: object
      required: []
      props:
        from_state:
          type: string
          format: ""
          example: PROVISIONED
          items: null
          ref: ""
        id:
          type: integer
          format: int64
          example: 17
          items: null
          ref: ""
        saga_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        thing_id:
          type: string
          format: ""
          example: thing-01HXXXXXXXX
          items: null
          ref: ""
        to_state:
          type: string
          format: ""
          example: ACTIVATING
          items: null
          ref: ""
        transition_actor:
          type: string
          format: ""
          example: user:alice
          items: null
          ref: ""
        transitioned_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        verb:
          type: string
          format: ""
          example: ACTIVATE
          items: null
          ref: ""
    StateChangeResponse:
      type: object
      required: []
      props:
        audit_ref:
          type: integer
          format: int64
          example: 17
          items: null
          ref: ""
        new_state:
          type: string
          format: ""
          example: ACTIVATING
          items: null
          ref: ""
        old_state:
          type: string
          format: ""
          example: PROVISIONED
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        saga_id:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        seq:
          type: integer
          format: int64
          example: 42
          items: null
          ref: ""
        thing_id:
          type: string
          format: ""
          example: thing-01HXXXXXXXX
          items: null
          ref: ""
        ts:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    StateChangeSubscriptionResponse:
      type: object
      required: []
      props:
        consecutive_failures:
          type: integer
          format: ""
          example: 0
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        event_filter:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: 01HXXXXXXXX
          items: null
          ref: ""
        last_delivery_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        status:
          type: string
          format: ""
          example: ACTIVE
          items: null
          ref: ""
        target_url:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    TestDeliveryResponse:
      type: object
      required: []
      props:
        delivered:
          type: boolean
          format: ""
          example: true
          items: null
          ref: ""
        delivered_status:
          type: integer
          format: int32
          example: 200
          items: null
          ref: ""
        error:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        subscription_id:
          type: string
          format: ""
          example: 01HXXXXXXXX
          items: null
          ref: ""
    ThingResponse:
      type: object
      required: []
      props:
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        id:
          type: string
          format: ""
          example: thing-01HXXXXXXXX
          items: null
          ref: ""
        model:
          type: string
          format: ""
          example: amr-100
          items: null
          ref: ""
        registrar_id:
          type: string
          format: ""
          example: reg-acme-robotics
          items: null
          ref: ""
        sn:
          type: string
          format: ""
          example: SN-000001
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: ACTIVATED
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    ThingStateResponse:
      type: object
      required: []
      props:
        state:
          type: string
          format: ""
          example: ACTIVATED
          items: null
          ref: ""
        thing_id:
          type: string
          format: ""
          example: thing-01HXXXXXXXX
          items: null
          ref: ""
        updated_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
    UpdateFactoryServiceRequest:
      type: object
      required:
        - endpoint_url
      props:
        endpoint_url:
          type: string
          format: ""
          example: https://factory-v2.acme-robotics.example.com
          items: null
          ref: ""
    UpdateModelRequest:
      type: object
      required: []
      props:
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        device_class:
          type: string
          format: ""
          example: fgai_schemas.robotics.v1
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        hw_revision:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        provisioning_config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        provisioning_method:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        vendor_secret:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
    UpdateRegistrarRequest:
      type: object
      required: []
      props:
        config:
          type: object
          format: ""
          example: null
          items: null
          ref: ""
        description:
          type: string
          format: ""
          example: Updated description
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: ACME Robotics Inc.
          items: null
          ref: ""
        name:
          type: string
          format: ""
          example: acme-robotics
          items: null
          ref: ""
    UpdateSoftwareRequest:
      type: object
      required: []
      props:
        applies_to:
          type: array
          format: ""
          example: null
          items:
            type: object
            format: ""
            example: null
            items: null
            ref: ""
          ref: ""
        description:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        kind:
          type: string
          format: ""
          example: driver
          items: null
          ref: ""
        state:
          type: string
          format: ""
          example: PUBLISHED
          items: null
          ref: ""
    UpdateStateChangeSubscriptionRequest:
      type: object
      required: []
      props:
        event_filter:
          type: object
          format: ""
          example:
            new_states:
              - DEACTIVATED
              - ANNIHILATED
          items: null
          ref: ""
        status:
          type: string
          format: ""
          example: ACTIVE
          items: null
          ref: ""
        target_url:
          type: string
          format: ""
          example: https://factory.example.com/v2/webhooks/state-change
          items: null
          ref: ""
        webhook_secret:
          type: string
          format: ""
          example: new-shared-secret
          items: null
          ref: ""
    VendorResponse:
      type: object
      required: []
      props:
        account_id:
          type: string
          format: ""
          example: acct-oem-a
          items: null
          ref: ""
        created_at:
          type: string
          format: date-time
          example: null
          items: null
          ref: ""
        display_name:
          type: string
          format: ""
          example: null
          items: null
          ref: ""
        vid:
          type: string
          format: ""
          example: v0001
          items: null
          ref: ""
  securitySchemes:
    bearerAuth:
      bearerFormat: JWT
      scheme: bearer
      type: http
security:
  - bearerAuth: []
