# Generated from openapi.json — do not edit by hand.
# Regenerate: pnpm openapi:sync
openapi: 3.1.0
info:
  title: Hoist Assets API
  description: PPSR + ABN due diligence for Australian asset finance. Org-only scope (organisation-grantor + serial-number searches, no PII) — does not search individuals.
  version: 1.0.0
  termsOfService: https://hoistai.com/terms/
  contact:
    name: Hoist Assets API access
    url: https://hoistai.com/contact/
  license:
    name: Proprietary
    url: https://hoistai.com/terms/
servers:
  - url: https://api.assets.hoistai.com/v1
    description: Published v1 contract and reachability host. Health/auth responses confirm setup only; live PPSR/ABN source traffic and paid operations require account access and source readiness.
  - url: https://api.assets.hoistai.com/v1?sandbox=true
    description: Sandbox/sample mode on the v1 contract host. Fixtures only; no real register traffic or billing.
components:
  schemas:
    EvidencePackError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
          description: Always false on a non-2xx response
        code:
          type: string
          enum:
            - invalid_input
            - invalid_id
            - not_found
            - r2_unavailable
            - pdf_render_error
            - upstream_error
        message:
          type: string
    AssetInvoiceCanonicalIdentifier:
      type: object
      required:
        - kind
        - raw
        - canonical
        - display
      properties:
        kind:
          type: string
          enum:
            - vin
            - chassis_number
            - engine_number
            - serial_number
        raw:
          type: string
        canonical:
          type: string
        display:
          type: string
    EvidencePackSubject:
      type: object
      required:
        - abn
        - vin
        - purpose
      properties:
        abn:
          type:
            - string
            - 'null'
        vin:
          type:
            - string
            - 'null'
        purpose:
          type:
            - string
            - 'null'
    EvidencePackSourceTrust:
      type: object
      description: Additive, OpenAPI-safe source trust metadata derived from the static source manifest. Does not include source credentials, raw queries, query hashes, raw payload refs, or Evidence Pack internals.
      required:
        - source_id
        - owner
        - detail
        - freshness
        - snapshot
        - parser
        - limitations
      properties:
        source_id:
          type: string
          description: Canonical manifest source id for this check. Alias rows such as ppsr-org and ppsr-serial map to afsa-ppsr.
        owner:
          type: object
          required:
            - name
            - kind
            - jurisdiction
            - website
          properties:
            name:
              type: string
            kind:
              type: string
              enum:
                - hoist
                - government
                - regulator
                - intergovernmental
            jurisdiction:
              type: string
            website:
              type: string
              format: uri
        detail:
          type: string
          description: How Hoist obtains or snapshots the source without exposing credentials.
        freshness:
          type: object
          required:
            - cadence
          properties:
            cadence:
              type: string
        snapshot:
          type: object
          required:
            - source_version
          properties:
            source_version:
              type: string
        parser:
          type: object
          required:
            - parser_version
            - notes
          properties:
            parser_version:
              type: string
            notes:
              type: string
        limitations:
          type: array
          items:
            type: string
      additionalProperties: false
    EvidencePackSourceCheck:
      type: object
      required:
        - source
        - verdict
        - freshness
        - certificate_sha256
        - source_snapshot_id
        - raw_artifact_ref
      properties:
        source:
          type: string
        verdict:
          type: string
        freshness:
          type: string
          format: date-time
        certificate_sha256:
          type:
            - string
            - 'null'
        source_trust:
          $ref: '#/components/schemas/EvidencePackSourceTrust'
        source_snapshot_id:
          type:
            - string
            - 'null'
          description: Stable source snapshot identifier used by audit-grade Evidence Packs, when the source publishes one.
        raw_artifact_ref:
          type:
            - string
            - 'null'
          description: Audit-bucket artifact reference for the source-check projection. This is a reference, not a raw upstream payload.
    EvidencePackRiskFlag:
      type: object
      required:
        - code
        - category
        - severity
        - message
        - confidence
        - evidence_refs
        - source_refs
        - source_backing
        - recommended_next_check
      properties:
        code:
          type: string
        category:
          type: string
          enum:
            - identity_risk
            - licence_risk
            - asset_encumbrance_risk
            - sanctions_risk
            - insolvency_risk
            - address_risk
            - charity_status_risk
            - procurement_risk
            - director_or_control_risk
            - source_conflict_risk
          description: Typed risk ontology category for source interpretation.
        severity:
          type: string
          enum:
            - info
            - low
            - medium
            - high
            - critical
        message:
          type: string
        confidence:
          type: number
          minimum: 0
          maximum: 1
        evidence_refs:
          type: array
          items:
            type: string
        source_refs:
          type: array
          items:
            type: string
        source_backing:
          type: string
          description: Plain-language source backing for the flag. This is evidence wording, not a clearance claim.
        recommended_next_check:
          type: string
      additionalProperties: false
    EvidencePackEnvelope:
      type: object
      required:
        - ok
        - export_id
        - download_url
        - generated_at
        - verdict
        - confidence
        - subject
        - source_checks
        - risk_flags
        - recommended_next_check
        - risk_explanation
        - risk_score
        - human_review_items
        - r2_key
        - audit_manifest_key
        - machine_pack
        - human_pack
        - audit_pack
      properties:
        ok:
          type: boolean
          const: true
        export_id:
          type: string
          description: Canonical pack identifier (UUID v4).
        download_url:
          type: string
          description: Worker-relative path for retrieving the Due Diligence Record PDF (GET /v1/exports/{id}).
        generated_at:
          type: string
          format: date-time
        verdict:
          type: string
        confidence:
          type: number
          minimum: 0
          maximum: 1
        subject:
          $ref: '#/components/schemas/EvidencePackSubject'
        source_checks:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackSourceCheck'
        risk_flags:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackRiskFlag'
        human_review_items:
          type: array
          items:
            type: string
        r2_key:
          type: string
        audit_manifest_key:
          type: string
          description: R2 key for the audit artifact manifest JSON stored beside the PDF.
        machine_pack:
          $ref: '#/components/schemas/EvidencePackMachinePack'
        human_pack:
          $ref: '#/components/schemas/EvidencePackHumanPack'
        audit_pack:
          $ref: '#/components/schemas/EvidencePackAuditPack'
        risk_score:
          type: integer
          minimum: 0
          maximum: 100
          description: 0-100 source-interpretation risk score computed from typed risk flags.
        risk_explanation:
          $ref: '#/components/schemas/EvidencePackRiskExplanation'
        recommended_next_check:
          type: string
          description: Next source-backed check or review action recommended by the risk ontology.
    AbnLookupError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
          description: Always false on a non-2xx response
        code:
          type: string
          enum:
            - invalid_abn
            - abn_not_found
            - rate_limited
            - upstream_error
            - network_error
            - parse_error
          description: Stable error sentinel. Clients should branch on this rather than parsing message.
        message:
          type: string
          description: Human-readable error message. May change between releases — do not parse.
    AddressLookupError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - invalid_source_version
            - incomplete_address
            - invalid_state
            - invalid_postcode
            - unsupported_street_type
            - shard_read_failed
            - unauthorized
          description: Stable error sentinel. Clients should branch on this rather than parsing message.
        message:
          type: string
          description: Human-readable error message. May change between releases - do not parse.
    AddressLookupRequest:
      type: object
      required:
        - source_version
        - raw_address
      properties:
        source_version:
          type: string
          minLength: 1
          description: G-NAF source snapshot version to query.
          example: GNAF-2026-05
        raw_address:
          type: string
          minLength: 1
          description: Single-line Australian address. Parsed by the shared address normalizer before lookup.
          example: 10 Main St, Sydney NSW 2000
        limit:
          type: integer
          minimum: 1
          maximum: 25
          default: 10
          description: Maximum candidate count. Values above 25 are capped by the service.
      additionalProperties: false
    AddressLookupMismatchFlag:
      type: object
      required:
        - severity
        - code
        - message
      properties:
        severity:
          type: string
          enum:
            - low
            - medium
        code:
          type: string
          enum:
            - fuzzy_street_name
            - suburb_mismatch
            - postcode_mismatch
            - state_mismatch
            - ambiguous_match
        message:
          type: string
        input_component:
          type: string
        candidate_component:
          type: string
      additionalProperties: false
    AddressLookupCandidate:
      type: object
      required:
        - gnaf_pid
        - full_address
        - locality
        - state
        - postcode
        - latitude
        - longitude
        - geocode_type
        - source
        - evidence
        - match
      properties:
        gnaf_pid:
          type: string
        full_address:
          type: string
        locality:
          type: string
        state:
          type: string
          enum:
            - ACT
            - NSW
            - NT
            - QLD
            - SA
            - TAS
            - VIC
            - WA
        postcode:
          type: string
          pattern: ^[0-9]{4}$
        latitude:
          type:
            - number
            - 'null'
        longitude:
          type:
            - number
            - 'null'
        geocode_type:
          type:
            - string
            - 'null'
        source:
          type: object
          required:
            - source_id
            - source_version
            - source_kind
            - registry_truth
            - snapshot_backed
          properties:
            source_id:
              type: string
              const: gnaf
            source_version:
              type: string
            source_kind:
              type: string
              const: versioned_snapshot
            registry_truth:
              type: string
              const: snapshot_not_realtime
            snapshot_backed:
              type: boolean
              const: true
          additionalProperties: false
        evidence:
          type: object
          required:
            - r2_shard_key
            - row_offset
          properties:
            r2_shard_key:
              type: string
            row_offset:
              type: integer
              minimum: 0
          additionalProperties: false
        match:
          type: object
          required:
            - method
            - confidence
            - component_scores
            - mismatch_flags
          properties:
            method:
              type: string
              enum:
                - exact_normalized
                - fuzzy_components
            confidence:
              type: number
              minimum: 0
              maximum: 1
            component_scores:
              type: object
              required:
                - street_number
                - street_name
                - street_type
                - suburb
                - state
                - postcode
              properties:
                street_number:
                  type: number
                  minimum: 0
                  maximum: 1
                street_name:
                  type: number
                  minimum: 0
                  maximum: 1
                street_type:
                  type: number
                  minimum: 0
                  maximum: 1
                suburb:
                  type: number
                  minimum: 0
                  maximum: 1
                state:
                  type: number
                  minimum: 0
                  maximum: 1
                postcode:
                  type: number
                  minimum: 0
                  maximum: 1
              additionalProperties: false
            mismatch_flags:
              type: array
              items:
                $ref: '#/components/schemas/AddressLookupMismatchFlag'
          additionalProperties: false
      additionalProperties: false
    AddressLookupResponse:
      type: object
      required:
        - ok
        - tool
        - status
        - matched_on
        - normalized_address_key
        - confidence
        - mismatch_flags
        - candidate_count
        - candidates
      properties:
        ok:
          type: boolean
          const: true
        tool:
          type: string
          const: address_lookup
        status:
          type: string
          enum:
            - exact_match
            - fuzzy_match
            - ambiguous
            - no_match
        matched_on:
          type: string
          enum:
            - normalized_full_address
            - address_components
            - none
        normalized_address_key:
          type: string
        confidence:
          type: number
          minimum: 0
          maximum: 1
        mismatch_flags:
          type: array
          items:
            $ref: '#/components/schemas/AddressLookupMismatchFlag'
        candidate_count:
          type: integer
          minimum: 0
        candidates:
          type: array
          items:
            $ref: '#/components/schemas/AddressLookupCandidate'
      additionalProperties: false
    WhatChangedError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - snapshot_not_found
            - snapshot_mismatch
            - ambiguous_target
            - storage_error
            - unauthorized
          description: Stable error sentinel. Clients should branch on this rather than parsing message.
        message:
          type: string
          description: Human-readable error message. May change between releases - do not parse.
      additionalProperties: false
    WhatChangedRequest:
      type: object
      required:
        - tenant_id
        - account_id
      oneOf:
        - required:
            - previous_pack_id
            - current_pack_id
        - required:
            - target_type
            - target_hash
            - from
            - to
      properties:
        tenant_id:
          type: string
          minLength: 1
          description: Tenant scope for the monitor evidence snapshots.
        account_id:
          type: string
          minLength: 1
          description: Account scope for the monitor evidence snapshots.
        previous_pack_id:
          type: string
          minLength: 1
          description: Evidence pack ID for the earlier snapshot.
          example: pack_previous
        current_pack_id:
          type: string
          minLength: 1
          description: Evidence pack ID for the later snapshot.
          example: pack_current
        target_type:
          type: string
          enum:
            - ABN
            - ACN
            - VIN
            - address
          description: Monitor target type for a target/time-range comparison.
        target_hash:
          type: string
          minLength: 1
          description: Privacy-preserving monitor target hash. Raw address input is never accepted here.
        subscription_id:
          type: string
          minLength: 1
          description: Optional monitor subscription ID used to disambiguate duplicate target monitors.
        from:
          type: integer
          minimum: 1
          description: Inclusive created_at lower bound in epoch milliseconds.
        to:
          type: integer
          minimum: 1
          description: Inclusive created_at upper bound in epoch milliseconds.
      additionalProperties: false
    WhatChangedSourceVersion:
      type: object
      required:
        - source_id
        - source_version
        - observed_at
      properties:
        source_id:
          type: string
        source_version:
          type: string
        observed_at:
          type: integer
      additionalProperties: false
    WhatChangedRiskFlag:
      type: object
      required:
        - code
        - severity
      properties:
        code:
          type: string
        severity:
          type: string
          enum:
            - info
            - low
            - medium
            - high
        evidence_ref:
          type: string
      additionalProperties: false
    WhatChangedSnapshotRef:
      type: object
      required:
        - snapshot_id
        - subscription_id
        - role
        - evidence_pack_id
        - evidence_pack_ref
        - target_type
        - target_hash
        - created_at
        - source_observed_at
        - source_versions
        - risk_flags
      properties:
        snapshot_id:
          type: string
        subscription_id:
          type: string
        role:
          type: string
          enum:
            - baseline
            - check
        evidence_pack_id:
          type: string
        evidence_pack_ref:
          type:
            - string
            - 'null'
        target_type:
          type: string
          enum:
            - ABN
            - ACN
            - VIN
            - address
        target_hash:
          type: string
        created_at:
          type: integer
        source_observed_at:
          type: integer
        source_versions:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedSourceVersion'
        risk_flags:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedRiskFlag'
      additionalProperties: false
    WhatChangedEvidenceRef:
      type: object
      required:
        - snapshot_id
        - evidence_pack_id
        - evidence_pack_ref
      properties:
        snapshot_id:
          type: string
        evidence_pack_id:
          type: string
        evidence_pack_ref:
          type:
            - string
            - 'null'
        fact_evidence_ref:
          type: string
      additionalProperties: false
    WhatChangedStructuredDiff:
      type: object
      required:
        - kind
        - severity
        - field
        - old_value
        - new_value
        - old_hash
        - new_hash
        - evidence
      properties:
        kind:
          type: string
          enum:
            - identity
            - registration
            - status
            - address
            - risk
            - source_version
            - unknown
        severity:
          type: string
          enum:
            - info
            - low
            - medium
            - high
        field:
          type: string
        old_value:
          type:
            - string
            - 'null'
        new_value:
          type:
            - string
            - 'null'
        old_hash:
          type:
            - string
            - 'null'
        new_hash:
          type:
            - string
            - 'null'
        evidence:
          type: object
          required:
            - previous
            - current
          properties:
            previous:
              $ref: '#/components/schemas/WhatChangedEvidenceRef'
            current:
              $ref: '#/components/schemas/WhatChangedEvidenceRef'
          additionalProperties: false
      additionalProperties: false
    WhatChangedResponse:
      type: object
      required:
        - ok
        - tool
        - selector
        - outcome
        - severity
        - target
        - previous_snapshot
        - current_snapshot
        - change_count
        - changes
        - generated_at
      properties:
        ok:
          type: boolean
          const: true
        tool:
          type: string
          const: what_changed
        selector:
          type: string
          enum:
            - pack_pair
            - target_window
        outcome:
          type: string
          enum:
            - no_change
            - changed
        severity:
          type: string
          enum:
            - info
            - low
            - medium
            - high
        target:
          type: object
          required:
            - type
            - hash
          properties:
            type:
              type: string
              enum:
                - ABN
                - ACN
                - VIN
                - address
            hash:
              type: string
          additionalProperties: false
        previous_snapshot:
          $ref: '#/components/schemas/WhatChangedSnapshotRef'
        current_snapshot:
          $ref: '#/components/schemas/WhatChangedSnapshotRef'
        change_count:
          type: integer
          minimum: 0
        changes:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedStructuredDiff'
        generated_at:
          type: integer
      additionalProperties: false
    ConfirmNoChangesError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - unauthorized
            - monitor_not_found
            - baseline_not_captured
            - baseline_mismatch
            - recheck_failed
        message:
          type: string
      additionalProperties: false
    ConfirmNoChangesComparisonFact:
      type: object
      required:
        - field
        - value_hash
      properties:
        field:
          type: string
        value_hash:
          type: string
        normalized_value:
          type: string
        evidence_ref:
          type: string
      additionalProperties: false
    ConfirmNoChangesComparison:
      type: object
      required:
        - fingerprint
        - fact_hashes
      properties:
        fingerprint:
          type: string
        fact_hashes:
          type: array
          items:
            type: string
        facts:
          type: array
          items:
            $ref: '#/components/schemas/ConfirmNoChangesComparisonFact'
      additionalProperties: false
    ConfirmNoChangesCurrentEvidence:
      type: object
      required:
        - evidence_pack_id
        - comparison
        - source_versions
        - source_observed_at
      properties:
        evidence_pack_id:
          type: string
          minLength: 1
        evidence_pack_ref:
          type: string
        comparison:
          $ref: '#/components/schemas/ConfirmNoChangesComparison'
        source_versions:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/WhatChangedSourceVersion'
        source_observed_at:
          type: integer
          minimum: 1
        risk_flags:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedRiskFlag'
      additionalProperties: false
    ConfirmNoChangesRequest:
      type: object
      required:
        - tenant_id
        - account_id
        - subscription_id
        - baseline_evidence_pack_id
        - current_evidence
      properties:
        tenant_id:
          type: string
          minLength: 1
        account_id:
          type: string
          minLength: 1
        subscription_id:
          type: string
          minLength: 1
        baseline_evidence_pack_id:
          type: string
          minLength: 1
        idempotency_key:
          type: string
          minLength: 1
        current_evidence:
          $ref: '#/components/schemas/ConfirmNoChangesCurrentEvidence'
      additionalProperties: false
    ConfirmNoChangesCheckRef:
      type: object
      required:
        - check_id
        - status
        - trigger
        - baseline_snapshot_id
        - result_snapshot_id
        - evidence_pack_id
        - audit_correlation_id
        - completed_at
      properties:
        check_id:
          type: string
        status:
          type: string
          enum:
            - queued
            - running
            - no_change
            - changed
            - failed
        trigger:
          type: string
          const: before_funding
        baseline_snapshot_id:
          type:
            - string
            - 'null'
        result_snapshot_id:
          type:
            - string
            - 'null'
        evidence_pack_id:
          type:
            - string
            - 'null'
        audit_correlation_id:
          type: string
        completed_at:
          type:
            - integer
            - 'null'
      additionalProperties: false
    ConfirmNoChangesSnapshotRef:
      type: object
      required:
        - snapshot_id
        - evidence_pack_id
        - evidence_pack_ref
        - source_versions
        - source_observed_at
        - created_at
      properties:
        snapshot_id:
          type: string
        evidence_pack_id:
          type: string
        evidence_pack_ref:
          type:
            - string
            - 'null'
        source_versions:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedSourceVersion'
        source_observed_at:
          type: integer
        created_at:
          type: integer
      additionalProperties: false
    ConfirmNoChangesResponse:
      type: object
      required:
        - ok
        - tool
        - outcome
        - subscription_id
        - check
        - baseline_snapshot
        - current_snapshot
        - change_count
        - severity
        - changes
        - generated_at
      properties:
        ok:
          type: boolean
          const: true
        tool:
          type: string
          const: confirm_no_changes
        outcome:
          type: string
          enum:
            - no_changes
            - changes_detected
        subscription_id:
          type: string
        check:
          $ref: '#/components/schemas/ConfirmNoChangesCheckRef'
        baseline_snapshot:
          $ref: '#/components/schemas/ConfirmNoChangesSnapshotRef'
        current_snapshot:
          $ref: '#/components/schemas/ConfirmNoChangesSnapshotRef'
        change_count:
          type: integer
          minimum: 0
        severity:
          type: string
          enum:
            - info
            - low
            - medium
            - high
        changes:
          type: array
          items:
            $ref: '#/components/schemas/WhatChangedStructuredDiff'
        generated_at:
          type: string
          format: date-time
      additionalProperties: false
    MonitorOwner:
      type: object
      required:
        - tenant_id
        - account_id
      properties:
        tenant_id:
          type: string
          minLength: 1
          maxLength: 128
        account_id:
          type: string
          minLength: 1
          maxLength: 128
        user_id:
          type: string
          minLength: 1
          maxLength: 128
        oauth_grant_id:
          type: string
          minLength: 1
          maxLength: 128
      additionalProperties: false
    MonitorTarget:
      oneOf:
        - type: object
          required:
            - type
            - abn
          properties:
            type:
              type: string
              const: ABN
            abn:
              type: string
              minLength: 1
              maxLength: 32
          additionalProperties: false
        - type: object
          required:
            - type
            - acn
          properties:
            type:
              type: string
              const: ACN
            acn:
              type: string
              minLength: 1
              maxLength: 32
          additionalProperties: false
        - type: object
          required:
            - type
            - vin
          properties:
            type:
              type: string
              const: VIN
            vin:
              type: string
              minLength: 1
              maxLength: 64
          additionalProperties: false
        - type: object
          required:
            - type
            - address_hash
          properties:
            type:
              type: string
              const: address
            address_hash:
              type: string
              minLength: 1
              maxLength: 256
            gnaf_pid:
              type: string
              minLength: 1
              maxLength: 128
            locality:
              type: string
              minLength: 1
              maxLength: 128
            state:
              type: string
              enum:
                - ACT
                - NSW
                - NT
                - QLD
                - SA
                - TAS
                - VIC
                - WA
            postcode:
              type: string
              minLength: 1
              maxLength: 16
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: banned_disqualified_person
              description: Verify against ASIC Banned and Disqualified Persons public snapshot.
            document_number:
              type: string
              minLength: 1
              description: ASIC source document number where available. Matches still require independent identity review.
            name:
              type: string
              minLength: 1
              description: Person name. Same-name matches require manual review and do not prove identity.
          anyOf:
            - required:
                - document_number
            - required:
                - name
          additionalProperties: false
    MonitorNotificationPreference:
      type: object
      required:
        - channel
        - destination_ref
        - triggers
      properties:
        channel:
          type: string
          enum:
            - connector
            - email
            - webhook
        destination_ref:
          type: string
          minLength: 1
          maxLength: 512
        triggers:
          type: array
          items:
            type: string
            enum:
              - any_change
              - risk_change
              - check_failed
          minItems: 1
          maxItems: 8
      additionalProperties: false
    MonitorCreateRequest:
      type: object
      required:
        - tenant_id
        - account_id
        - target
        - interval
      properties:
        tenant_id:
          type: string
          minLength: 1
          maxLength: 128
        account_id:
          type: string
          minLength: 1
          maxLength: 128
        oauth_grant_id:
          type: string
          minLength: 1
          maxLength: 128
        target:
          $ref: '#/components/schemas/MonitorTarget'
        interval:
          type: string
          enum:
            - daily
            - weekly
            - monthly
            - before_funding
        next_check_not_before:
          type:
            - integer
            - 'null'
          minimum: 0
        idempotency_key:
          type: string
          minLength: 1
          maxLength: 256
        notification_preferences:
          type: array
          items:
            $ref: '#/components/schemas/MonitorNotificationPreference'
          maxItems: 16
      additionalProperties: false
    MonitorRevokeRequest:
      type: object
      required:
        - tenant_id
        - account_id
        - cancellation_reason
        - cancellation_audit_reason
      properties:
        tenant_id:
          type: string
          minLength: 1
          maxLength: 128
        account_id:
          type: string
          minLength: 1
          maxLength: 128
        oauth_grant_id:
          type: string
          minLength: 1
          maxLength: 128
        cancellation_reason:
          type: string
          enum:
            - user_revoked
            - grant_revoked
            - billing_ended
            - tenant_deleted
            - operator_disabled
        cancellation_audit_reason:
          type: string
          minLength: 1
          maxLength: 512
      additionalProperties: false
    MonitorSubscription:
      type: object
      required:
        - subscription_id
        - scope
        - owner
        - target
        - cadence
        - status
        - baseline
        - notifications
        - privacy
        - created_at
        - updated_at
      properties:
        subscription_id:
          type: string
        scope:
          type: string
          const: assets:monitor
        owner:
          $ref: '#/components/schemas/MonitorOwner'
        target:
          $ref: '#/components/schemas/MonitorTarget'
        cadence:
          type: object
          required:
            - interval
            - next_check_not_before
          properties:
            interval:
              type: string
              enum:
                - daily
                - weekly
                - monthly
                - before_funding
            next_check_not_before:
              type:
                - integer
                - 'null'
              minimum: 0
          additionalProperties: false
        status:
          type: object
          required:
            - state
            - since
          properties:
            state:
              type: string
              enum:
                - pending_baseline
                - active
                - paused
                - canceled
                - failed
            since:
              type: integer
              minimum: 0
            next_check_not_before:
              type: integer
              minimum: 0
            pause_reason:
              type: string
              enum:
                - user_paused
                - billing_hold
                - operator_hold
            resume_not_before:
              type: integer
              minimum: 0
            canceled_at:
              type: integer
              minimum: 0
            cancellation:
              type: object
              required:
                - reason
                - audit_reason
              properties:
                reason:
                  type: string
                  enum:
                    - user_revoked
                    - grant_revoked
                    - billing_ended
                    - tenant_deleted
                    - operator_disabled
                audit_reason:
                  type: string
              additionalProperties: false
            failure_code:
              type: string
            retryable:
              type: boolean
            retry_after_ms:
              type: integer
              minimum: 0
          additionalProperties: false
        baseline:
          type: object
          required:
            - status
          properties:
            status:
              type: string
              enum:
                - pending
                - captured
                - failed
            requested_at:
              type: integer
              minimum: 0
            snapshot:
              type: object
              additionalProperties: true
            failed_at:
              type: integer
              minimum: 0
            failure_code:
              type: string
            retry_after_ms:
              type: integer
              minimum: 0
          additionalProperties: false
        notifications:
          type: array
          items:
            $ref: '#/components/schemas/MonitorNotificationPreference'
        privacy:
          type: object
          required:
            - user_query_stored
            - address_input_stored
            - individual_grantor_allowed
            - stores_free_text_as_hash_only
          properties:
            user_query_stored:
              type: boolean
              const: false
            address_input_stored:
              type: boolean
              const: false
            individual_grantor_allowed:
              type: boolean
              const: false
            stores_free_text_as_hash_only:
              type: boolean
              const: true
          additionalProperties: false
        created_at:
          type: integer
          minimum: 0
        updated_at:
          type: integer
          minimum: 0
      additionalProperties: false
    MonitorResponse:
      type: object
      required:
        - ok
        - monitor
        - audit
        - evidence
      properties:
        ok:
          type: boolean
          const: true
        monitor:
          $ref: '#/components/schemas/MonitorSubscription'
        audit:
          type: object
          required:
            - monitor_id
            - correlation_id
          properties:
            monitor_id:
              type: string
            correlation_id:
              type: string
            last_event:
              type: string
              enum:
                - monitor_created
                - monitor_revoked
          additionalProperties: false
        evidence:
          type: object
          required:
            - baseline_status
          properties:
            baseline_status:
              type: string
              enum:
                - pending
                - captured
                - failed
            snapshot_id:
              type: string
            evidence_pack_id:
              type: string
          additionalProperties: false
      additionalProperties: false
    MonitorListResponse:
      type: object
      required:
        - ok
        - monitors
        - count
      properties:
        ok:
          type: boolean
          const: true
        monitors:
          type: array
          items:
            $ref: '#/components/schemas/MonitorResponse'
        count:
          type: integer
          minimum: 0
      additionalProperties: false
    MonitorError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - invalid_owner
            - invalid_target
            - invalid_interval
            - invalid_cancellation_reason
            - monitor_not_found
            - monitor_forbidden
            - monitor_terminal
            - unauthorized
            - monitor_operation_failed
        message:
          type: string
      additionalProperties: false
    PpsrSearchError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
          description: Always false on a non-2xx response
        code:
          type: string
          enum:
            - invalid_input
            - not_found
            - rate_limited
            - upstream_error
            - network_error
            - audit_persist_failed
            - billing_cap_reached
            - unauthorized
          description: Stable error sentinel. Clients should branch on this rather than parsing message.
        message:
          type: string
          description: Human-readable error message. May change between releases — do not parse.
    PpsrSearchRequest:
      type: object
      required:
        - subject_kind
      description: 'Discriminated request body. Pass either { subject_kind: "organisation", acn: .. } or { subject_kind: "serial_number", serial: .., type: .. }.'
      properties:
        subject_kind:
          type: string
          enum:
            - organisation
            - serial_number
          description: 'Search target: by company (ACN) or by serial number (VIN/motor/aircraft/watercraft).'
        acn:
          type: string
          description: 9-digit Australian Company Number; required when subject_kind is "organisation". Spaces and hyphens accepted.
          pattern: ^[0-9 -]{9,11}$
          example: 123 456 789
        purpose:
          type: string
          description: Optional free-text purpose recorded with the search for the user's own records (max 256 chars). Not used for access control.
          maxLength: 256
        serial:
          type: string
          description: Serial number; required when subject_kind is "serial_number". Letters, digits, hyphens; 3-32 chars.
          minLength: 3
          maxLength: 32
          example: VIN1234567890ABCD
        type:
          type: string
          enum:
            - vin
            - motor
            - aircraft
            - watercraft
          description: Serial type bucket; required when subject_kind is "serial_number".
    PpsrPaidSearchRequest:
      description: Strict canonical paid PPSR search request. Extra top-level fields such as user_id, serial_type, confirm_cost, asset_type, source_status, and as_of are rejected.
      oneOf:
        - type: object
          additionalProperties: false
          required:
            - subject_kind
            - acn
          properties:
            subject_kind:
              type: string
              enum:
                - organisation
              description: 'Search target: by company (ACN).'
            acn:
              type: string
              description: 9-digit Australian Company Number. Spaces and hyphens accepted.
              pattern: ^[0-9 -]{9,11}$
              example: 123 456 789
            purpose:
              type: string
              description: Optional free-text purpose recorded with the search for the user's own records (max 256 chars). Not used for access control.
              maxLength: 256
        - type: object
          additionalProperties: false
          required:
            - subject_kind
            - serial
            - type
          properties:
            subject_kind:
              type: string
              enum:
                - serial_number
              description: 'Search target: by serial number (VIN/motor/aircraft/watercraft).'
            serial:
              type: string
              description: Serial number. Letters, digits, hyphens; 3-32 chars.
              minLength: 3
              maxLength: 32
              example: VIN1234567890ABCD
            type:
              type: string
              enum:
                - vin
                - motor
                - aircraft
                - watercraft
              description: Serial type bucket.
    PpsrCostBreakdown:
      type: object
      required:
        - cost_cents
        - gst_cents
        - total_cents
        - cost_aud
        - gst_aud
        - total_aud
        - currency
      properties:
        cost_cents:
          type: integer
          description: Ex-GST search fee in Australian cents.
          example: 200
        gst_cents:
          type: integer
          description: GST amount in Australian cents.
          example: 20
        total_cents:
          type: integer
          description: Inclusive total in Australian cents.
          example: 220
        cost_aud:
          type: string
          description: Ex-GST search fee formatted as `N.NN`.
          example: '2.00'
        gst_aud:
          type: string
          description: GST formatted as `N.NN`.
          example: '0.20'
        total_aud:
          type: string
          description: Inclusive total formatted as `N.NN`.
          example: '2.20'
        currency:
          type: string
          enum:
            - AUD
          description: Currency code.
    AsicLicenceLookupRequest:
      type: object
      required:
        - licence_number
      additionalProperties: false
      properties:
        licence_number:
          type: string
          description: Six-digit AFSL/ACL number. AFSL/ACL prefixes and spaces are accepted.
        licence_type:
          type: string
          enum:
            - afsl
            - acl
          description: Optional ASIC licence type filter.
        include_current_extract:
          type: boolean
          default: false
          description: When true, request the paid ASIC current-extract confirmation gate instead of fixture lookup.
        user_confirmation_for_paid_searches:
          type: boolean
          default: false
          description: Explicit user confirmation for paid ASIC searches.
        budget_gate_confirmed:
          type: boolean
          default: false
          description: Budget gate confirmation for paid ASIC searches.
    AsicLicenceRecord:
      type: object
      required:
        - licence_number
        - licence_type
        - status
        - holder_name
        - holder_acn
        - holder_abn
        - authorised_services
        - issued_on
        - expires_on
        - cancelled_on
        - source
        - source_version
      properties:
        licence_number:
          type: string
        licence_type:
          type: string
          enum:
            - afsl
            - acl
        status:
          type: string
          enum:
            - current
            - expired
            - cancelled
        holder_name:
          type: string
        holder_acn:
          type:
            - string
            - 'null'
        holder_abn:
          type:
            - string
            - 'null'
        authorised_services:
          type: array
          items:
            type: string
        issued_on:
          type: string
          format: date
        expires_on:
          type:
            - string
            - 'null'
          format: date
        cancelled_on:
          type:
            - string
            - 'null'
          format: date
        source:
          type: string
          const: asic-fixture
        source_version:
          type: string
    AsicLicenceLookupResponse:
      oneOf:
        - type: object
          required:
            - ok
            - tool
            - status
            - licence
            - live_search_dispatched
            - pending_confirmation
            - confidence
          properties:
            ok:
              type: boolean
              const: true
            tool:
              type: string
              const: lookup_licence
            status:
              type: string
              const: found
            licence:
              $ref: '#/components/schemas/AsicLicenceRecord'
            live_search_dispatched:
              type: boolean
              const: false
            pending_confirmation:
              type: 'null'
            confidence:
              type: number
              const: 1
        - type: object
          required:
            - ok
            - tool
            - status
            - licence_number
            - live_search_dispatched
            - pending_confirmation
          properties:
            ok:
              type: boolean
              const: true
            tool:
              type: string
              const: lookup_licence
            status:
              type: string
              const: pending_confirmation
            licence_type:
              type:
                - string
                - 'null'
              enum:
                - afsl
                - acl
                - null
            licence_number:
              type: string
            live_search_dispatched:
              type: boolean
              const: false
            pending_confirmation:
              type: object
        - type: object
          required:
            - ok
            - tool
            - status
            - licence_number
            - live_search_dispatched
            - provider_status
          properties:
            ok:
              type: boolean
              const: true
            tool:
              type: string
              const: lookup_licence
            status:
              type: string
              const: ready_for_paid_dispatch
            licence_type:
              type:
                - string
                - 'null'
              enum:
                - afsl
                - acl
                - null
            licence_number:
              type: string
            live_search_dispatched:
              type: boolean
              const: false
            provider_status:
              type: string
              const: not_wired
            cost_cents_estimate:
              type: integer
            currency:
              type: string
              const: AUD
    AsicLicenceLookupError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - licence_not_found
            - unauthorized
        message:
          type: string
    VerifyProfessionalRequest:
      oneOf:
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: liquidator
              description: Verify against ASIC Registered and Official Liquidators.
            registered_liquidator_number:
              type: string
              minLength: 1
              description: ASIC Registered Liquidator number, spaces optional.
            official_liquidator_number:
              type: string
              minLength: 1
              description: ASIC Official Liquidator number, spaces optional.
            name:
              type: string
              minLength: 1
              description: Liquidator name. Same-name matches require manual review.
          anyOf:
            - required:
                - registered_liquidator_number
            - required:
                - official_liquidator_number
            - required:
                - name
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: banned_disqualified_person
              description: Verify against ASIC Banned and Disqualified Persons public snapshot.
            document_number:
              type: string
              minLength: 1
              description: ASIC source document number where available. Matches still require independent identity review.
            name:
              type: string
              minLength: 1
              description: Person name. Same-name matches require manual review and do not prove identity.
          anyOf:
            - required:
                - document_number
            - required:
                - name
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: financial_adviser
              description: Verify against the ASIC Financial Advisers Register public snapshot.
            adviser_number:
              type: string
              minLength: 1
              description: ASIC Financial Advisers Register adviser number, leading zeroes preserved.
            financial_adviser_number:
              type: string
              minLength: 1
              description: Alias for adviser_number.
            name:
              type: string
              minLength: 1
              description: Adviser name. Same-name matches require manual review.
          anyOf:
            - required:
                - adviser_number
            - required:
                - financial_adviser_number
            - required:
                - name
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: afs_representative
              description: Verify against ASIC AFS Representatives public snapshot.
            representative_number:
              type: string
              minLength: 1
              description: ASIC AFS representative number, leading zeroes preserved.
            afs_representative_number:
              type: string
              minLength: 1
              description: Alias for representative_number.
            licence_number:
              type: string
              minLength: 1
              description: Linked AFSL number.
            afs_licence_number:
              type: string
              minLength: 1
              description: Alias for licence_number.
            name:
              type: string
              minLength: 1
              description: Representative name. Same-name matches require manual review.
            abn:
              type: string
              minLength: 1
              description: Representative ABN, spaces optional.
            acn:
              type: string
              minLength: 1
              description: Representative ACN, spaces optional.
          anyOf:
            - required:
                - representative_number
            - required:
                - afs_representative_number
            - required:
                - licence_number
            - required:
                - afs_licence_number
            - required:
                - name
            - required:
                - abn
            - required:
                - acn
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: credit_representative
              description: Verify against ASIC Credit Representatives public snapshot.
            representative_number:
              type: string
              minLength: 1
              description: ASIC credit representative number.
            credit_representative_number:
              type: string
              minLength: 1
              description: Alias for representative_number.
            licence_number:
              type: string
              minLength: 1
              description: Linked credit licence number.
            credit_licence_number:
              type: string
              minLength: 1
              description: Alias for licence_number.
            name:
              type: string
              minLength: 1
              description: Representative name. Same-name matches require manual review.
            abn:
              type: string
              minLength: 1
              description: Representative ABN, spaces optional.
            acn:
              type: string
              minLength: 1
              description: Representative ACN, spaces optional.
            representative_identifier:
              type: string
              minLength: 1
              description: Representative ABN/ACN-style identifier from the source row.
          anyOf:
            - required:
                - representative_number
            - required:
                - credit_representative_number
            - required:
                - licence_number
            - required:
                - credit_licence_number
            - required:
                - name
            - required:
                - abn
            - required:
                - acn
            - required:
                - representative_identifier
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: registered_auditor
              description: Verify against ASIC Registered Auditors public snapshot.
            auditor_number:
              type: string
              minLength: 1
              description: ASIC Registered Auditor number.
            registered_auditor_number:
              type: string
              minLength: 1
              description: Alias for auditor_number.
            name:
              type: string
              minLength: 1
              description: Auditor name. Same-name matches require manual review.
            acn:
              type: string
              minLength: 1
              description: Registered auditor firm ACN, spaces optional.
          anyOf:
            - required:
                - auditor_number
            - required:
                - registered_auditor_number
            - required:
                - name
            - required:
                - acn
          additionalProperties: false
        - type: object
          required:
            - kind
          properties:
            kind:
              type: string
              const: smsf_auditor
              description: Verify against ASIC SMSF Auditors public snapshot.
            auditor_number:
              type: string
              minLength: 1
              description: ASIC SMSF Auditor number.
            smsf_auditor_number:
              type: string
              minLength: 1
              description: Alias for auditor_number.
            name:
              type: string
              minLength: 1
              description: SMSF auditor name. Same-name matches require manual review.
            abn:
              type: string
              minLength: 1
              description: SMSF auditor person ABN, spaces optional.
          anyOf:
            - required:
                - auditor_number
            - required:
                - smsf_auditor_number
            - required:
                - name
            - required:
                - abn
          additionalProperties: false
    VerifyProfessionalAddress:
      type: object
      required:
        - town
        - state
        - postcode
        - country
      properties:
        town:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        postcode:
          type:
            - string
            - 'null'
        country:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalMatch:
      oneOf:
        - $ref: '#/components/schemas/VerifyProfessionalLiquidatorMatch'
        - $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserMatch'
        - $ref: '#/components/schemas/VerifyProfessionalBannedDisqualifiedPersonMatch'
        - $ref: '#/components/schemas/VerifyProfessionalAfsRepresentativeMatch'
        - $ref: '#/components/schemas/VerifyProfessionalCreditRepresentativeMatch'
        - $ref: '#/components/schemas/VerifyProfessionalRegisteredAuditorMatch'
        - $ref: '#/components/schemas/VerifyProfessionalSmsfAuditorMatch'
    VerifyProfessionalEvidence:
      type: object
      required:
        - evidence_id
        - raw_payload_ref
        - source_id
        - source_version
        - fetched_at
        - source_effective_date
        - certificate_sha256
        - cost_cents
        - result_summary
      properties:
        evidence_id:
          type: string
        raw_payload_ref:
          type: string
        source_id:
          type: string
          enum:
            - asic-liquidators
            - asic-financial-advisers
            - asic-banned-disqualified
            - asic-afs-licensees
            - asic-credit-licensees
            - asic-auditors
        source_version:
          type: string
        fetched_at:
          type: integer
        source_effective_date:
          type:
            - string
            - 'null'
        certificate_sha256:
          type: string
          pattern: ^[0-9a-f]{64}$
        cost_cents:
          type: integer
          minimum: 0
        result_summary:
          type: string
      additionalProperties: false
    VerifyProfessionalResponse:
      type: object
      required:
        - ok
        - status
        - source_id
        - source_version
        - source_effective_date
        - matches
        - evidence
        - summary
        - manual_review_required
      properties:
        ok:
          type: boolean
          const: true
        status:
          type: string
          enum:
            - source_backed_match
            - not_found
        source_id:
          type: string
          enum:
            - asic-liquidators
            - asic-financial-advisers
            - asic-banned-disqualified
            - asic-afs-licensees
            - asic-credit-licensees
            - asic-auditors
        source_version:
          type: string
        source_effective_date:
          type:
            - string
            - 'null'
        matches:
          type: array
          items:
            $ref: '#/components/schemas/VerifyProfessionalMatch'
        evidence:
          $ref: '#/components/schemas/VerifyProfessionalEvidence'
        summary:
          type: string
        manual_review_required:
          type: boolean
      additionalProperties: false
    VerifyProfessionalError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - source_unavailable
            - unauthorized
        message:
          type: string
      additionalProperties: false
    VerifyProfessionalFinancialAdviserAddress:
      type: object
      required:
        - locality
        - state
        - postcode
        - country
      properties:
        locality:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        postcode:
          type:
            - string
            - 'null'
        country:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalFinancialAdviserLicence:
      type: object
      required:
        - name
        - number
        - abn
        - controlled_by
      properties:
        name:
          type:
            - string
            - 'null'
        number:
          type:
            - string
            - 'null'
        abn:
          type:
            - string
            - 'null'
        controlled_by:
          type: array
          items:
            type: string
      additionalProperties: false
    VerifyProfessionalFinancialAdviserRepresentative:
      type: object
      required:
        - name
        - number
        - abn
      properties:
        name:
          type:
            - string
            - 'null'
        number:
          type:
            - string
            - 'null'
        abn:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalFinancialAdviserDisciplinaryAction:
      type: object
      required:
        - start_date
        - end_date
        - type
        - description
      properties:
        start_date:
          type:
            - string
            - 'null'
        end_date:
          type:
            - string
            - 'null'
        type:
          type:
            - string
            - 'null'
        description:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalLiquidatorMatch:
      type: object
      required:
        - source_id
        - register_name
        - liquidator_name
        - registered_liquidator_number
        - official_liquidator_number
        - registered_liquidator_start_date
        - official_liquidator_start_date
        - status
        - suspension_date
        - principal_business_address
        - firm_membership
        - record_key
      properties:
        source_id:
          type: string
          const: asic-liquidators
        register_name:
          type:
            - string
            - 'null'
        liquidator_name:
          type: string
        registered_liquidator_number:
          type:
            - string
            - 'null'
        official_liquidator_number:
          type:
            - string
            - 'null'
        registered_liquidator_start_date:
          type:
            - string
            - 'null'
        official_liquidator_start_date:
          type:
            - string
            - 'null'
        status:
          type:
            - string
            - 'null'
        suspension_date:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalAddress'
        firm_membership:
          type: array
          items:
            type: string
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalFinancialAdviserMatch:
      type: object
      required:
        - source_id
        - register_name
        - adviser_name
        - adviser_number
        - adviser_role
        - adviser_sub_type
        - adviser_role_status
        - adviser_abn
        - first_provided_advice_year
        - licence
        - adviser_start_date
        - adviser_end_date
        - overall_registration_status
        - registration_status_under_afsl
        - registration_start_date_under_afsl
        - registration_end_date_under_afsl
        - cpd_failure_year
        - principal_business_address
        - appointing_representative
        - disciplinary_action
        - product_authorisations
        - able_to_provide_tfas
        - qualifications_and_training
        - memberships
        - further_restrictions
        - record_key
      properties:
        source_id:
          type: string
          const: asic-financial-advisers
        register_name:
          type:
            - string
            - 'null'
        adviser_name:
          type: string
        adviser_number:
          type:
            - string
            - 'null'
        adviser_role:
          type:
            - string
            - 'null'
        adviser_sub_type:
          type:
            - string
            - 'null'
        adviser_role_status:
          type:
            - string
            - 'null'
        adviser_abn:
          type:
            - string
            - 'null'
        first_provided_advice_year:
          type:
            - string
            - 'null'
        licence:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserLicence'
        adviser_start_date:
          type:
            - string
            - 'null'
        adviser_end_date:
          type:
            - string
            - 'null'
        overall_registration_status:
          type:
            - string
            - 'null'
        registration_status_under_afsl:
          type:
            - string
            - 'null'
        registration_start_date_under_afsl:
          type:
            - string
            - 'null'
        registration_end_date_under_afsl:
          type:
            - string
            - 'null'
        cpd_failure_year:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserAddress'
        appointing_representative:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserRepresentative'
        disciplinary_action:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserDisciplinaryAction'
        product_authorisations:
          type: array
          items:
            type: string
        able_to_provide_tfas:
          type:
            - string
            - 'null'
        qualifications_and_training:
          type: array
          items:
            type: string
        memberships:
          type: array
          items:
            type: string
        further_restrictions:
          type:
            - string
            - 'null'
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalBannedDisqualifiedPersonMatch:
      type: object
      required:
        - source_id
        - register_name
        - person_name
        - banning_type
        - document_number
        - start_date
        - end_date
        - address
        - comments
        - record_key
      properties:
        source_id:
          type: string
          const: asic-banned-disqualified
        register_name:
          type:
            - string
            - 'null'
        person_name:
          type: string
        banning_type:
          type:
            - string
            - 'null'
        document_number:
          type:
            - string
            - 'null'
        start_date:
          type:
            - string
            - 'null'
        end_date:
          type:
            - string
            - 'null'
        address:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserAddress'
        comments:
          type:
            - string
            - 'null'
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalAfsRepresentativeMatch:
      type: object
      required:
        - source_id
        - register_name
        - representative_number
        - licence_number
        - representative_name
        - representative_abn
        - representative_acn
        - other_role
        - start_date
        - status
        - end_date
        - principal_business_address
        - cross_endorse
        - may_appoint
        - appointed_by
        - authorisations
        - same_auth
        - related_business_names
        - record_key
      properties:
        source_id:
          type: string
          const: asic-afs-licensees
        register_name:
          type:
            - string
            - 'null'
        representative_number:
          type:
            - string
            - 'null'
        licence_number:
          type:
            - string
            - 'null'
        representative_name:
          type: string
        representative_abn:
          type:
            - string
            - 'null'
        representative_acn:
          type:
            - string
            - 'null'
        other_role:
          type:
            - string
            - 'null'
        start_date:
          type:
            - string
            - 'null'
        status:
          type:
            - string
            - 'null'
        end_date:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalFinancialAdviserAddress'
        cross_endorse:
          type:
            - string
            - 'null'
        may_appoint:
          type:
            - string
            - 'null'
        appointed_by:
          type:
            - string
            - 'null'
        authorisations:
          type: array
          items:
            type: string
        same_auth:
          type:
            - string
            - 'null'
        related_business_names:
          type: array
          items:
            type: string
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalCreditRepresentativeAddress:
      type: object
      required:
        - locality
        - state
        - postcode
      properties:
        locality:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        postcode:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalCreditRepresentativeMatch:
      type: object
      required:
        - source_id
        - register_name
        - representative_number
        - licence_number
        - representative_name
        - representative_identifier
        - start_date
        - end_date
        - principal_business_address
        - edrs
        - authorisations
        - cross_endorse
        - record_key
      properties:
        source_id:
          type: string
          const: asic-credit-licensees
        register_name:
          type:
            - string
            - 'null'
        representative_number:
          type:
            - string
            - 'null'
        licence_number:
          type:
            - string
            - 'null'
        representative_name:
          type: string
        representative_identifier:
          type:
            - string
            - 'null'
        start_date:
          type:
            - string
            - 'null'
        end_date:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalCreditRepresentativeAddress'
        edrs:
          type:
            - string
            - 'null'
        authorisations:
          type: array
          items:
            type: string
        cross_endorse:
          type:
            - string
            - 'null'
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalRegisteredAuditorAddress:
      type: object
      required:
        - locality
        - state
        - postcode
        - country
      properties:
        locality:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        postcode:
          type:
            - string
            - 'null'
        country:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalSmsfAuditorAddress:
      type: object
      required:
        - locality
        - state
        - postcode
      properties:
        locality:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        postcode:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalRegisteredAuditorMatch:
      type: object
      required:
        - source_id
        - register_name
        - auditor_number
        - auditor_name
        - auditor_acn
        - start_date
        - status
        - suspension_date
        - principal_business_address
        - record_key
      properties:
        source_id:
          type: string
          const: asic-auditors
        register_name:
          type:
            - string
            - 'null'
        auditor_number:
          type:
            - string
            - 'null'
        auditor_name:
          type: string
        auditor_acn:
          type:
            - string
            - 'null'
        start_date:
          type:
            - string
            - 'null'
        status:
          type:
            - string
            - 'null'
        suspension_date:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalRegisteredAuditorAddress'
        record_key:
          type: string
      additionalProperties: false
    VerifyProfessionalSmsfAuditorCondition:
      type: object
      required:
        - attribute_type
        - capacity
        - condition_number
        - capacity_firm_name
        - capacity_start_date
        - condition
        - condition_detail
        - condition_start_date
      properties:
        attribute_type:
          type:
            - string
            - 'null'
        capacity:
          type:
            - string
            - 'null'
        condition_number:
          type:
            - string
            - 'null'
        capacity_firm_name:
          type:
            - string
            - 'null'
        capacity_start_date:
          type:
            - string
            - 'null'
        condition:
          type:
            - string
            - 'null'
        condition_detail:
          type:
            - string
            - 'null'
        condition_start_date:
          type:
            - string
            - 'null'
      additionalProperties: false
    VerifyProfessionalSmsfAuditorMatch:
      type: object
      required:
        - source_id
        - register_name
        - auditor_number
        - auditor_name
        - status
        - person_abn
        - registration_date
        - suspension_start_date
        - suspension_end_date
        - principal_business_address
        - conditions
        - record_key
      properties:
        source_id:
          type: string
          const: asic-auditors
        register_name:
          type:
            - string
            - 'null'
        auditor_number:
          type:
            - string
            - 'null'
        auditor_name:
          type: string
        status:
          type:
            - string
            - 'null'
        person_abn:
          type:
            - string
            - 'null'
        registration_date:
          type:
            - string
            - 'null'
        suspension_start_date:
          type:
            - string
            - 'null'
        suspension_end_date:
          type:
            - string
            - 'null'
        principal_business_address:
          $ref: '#/components/schemas/VerifyProfessionalSmsfAuditorAddress'
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/VerifyProfessionalSmsfAuditorCondition'
        record_key:
          type: string
      additionalProperties: false
    EvidencePackMachinePack:
      type: object
      description: Machine-readable signed EvidencePack projection. pack is null when signing is unavailable because EVIDENCE_PACK_HMAC_KEY is absent.
      required:
        - format
        - signing_status
        - pack
        - evidence_item_count
        - finding_count
      properties:
        format:
          type: string
          const: signed_evidence_pack_v1
        signing_status:
          type: string
          enum:
            - signed
            - unavailable
        pack:
          type:
            - object
            - 'null'
          description: Canonical signed EvidencePack when signing_status is signed. Purpose text is represented only as purpose_hash.
          additionalProperties: true
        evidence_item_count:
          type: integer
          minimum: 0
        finding_count:
          type: integer
          minimum: 0
      additionalProperties: false
    EvidencePackHumanPack:
      type: object
      required:
        - format
        - report_title
        - content_type
        - page_count
        - r2_key
        - artifact_ref
        - sha256
        - download_url
        - generated_at
      properties:
        format:
          type: string
          const: due_diligence_record_pdf_v1
        report_title:
          type: string
          const: Due Diligence Record
        content_type:
          type: string
          const: application/pdf
        page_count:
          type: integer
          minimum: 1
        r2_key:
          type: string
        artifact_ref:
          type: string
        sha256:
          type: string
          pattern: ^[a-f0-9]{64}$
        download_url:
          type: string
        generated_at:
          type: string
          format: date-time
      additionalProperties: false
    EvidencePackAuditPackArtifact:
      type: object
      required:
        - artifact_id
        - artifact_type
        - r2_key
        - artifact_ref
        - content_type
        - sha256
        - retention_policy
      properties:
        artifact_id:
          type: string
        artifact_type:
          type: string
          enum:
            - human_report_pdf
            - audit_manifest_json
            - source_check_projection
        r2_key:
          type: string
        artifact_ref:
          type: string
        content_type:
          type: string
          enum:
            - application/pdf
            - application/json
        sha256:
          type:
            - string
            - 'null'
          pattern: ^[a-f0-9]{64}$
        retention_policy:
          type: string
          const: account_audit_retention
      additionalProperties: false
    EvidencePackAuditPackSourceSnapshot:
      type: object
      required:
        - source
        - source_snapshot_id
        - source_version
        - parser_version
      properties:
        source:
          type: string
        source_snapshot_id:
          type:
            - string
            - 'null'
        source_version:
          type:
            - string
            - 'null'
        parser_version:
          type:
            - string
            - 'null'
      additionalProperties: false
    EvidencePackAuditPack:
      type: object
      required:
        - manifest_version
        - pack_id
        - generated_at
        - retention_policy
        - manifest_r2_key
        - manifest_artifact_ref
        - artifacts
        - source_snapshots
        - raw_artifact_refs
      properties:
        manifest_version:
          type: string
          const: audit_artifact_manifest_v1
        pack_id:
          type: string
        generated_at:
          type: string
          format: date-time
        retention_policy:
          type: string
          const: account_audit_retention
        manifest_r2_key:
          type: string
        manifest_artifact_ref:
          type: string
        artifacts:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackAuditPackArtifact'
        source_snapshots:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackAuditPackSourceSnapshot'
        raw_artifact_refs:
          type: array
          items:
            type: string
      additionalProperties: false
    EvidencePackRiskCategorySummary:
      type: object
      required:
        - category
        - severity
        - flag_count
        - summary
      properties:
        category:
          $ref: '#/components/schemas/EvidencePackRiskFlag/properties/category'
        severity:
          $ref: '#/components/schemas/EvidencePackRiskFlag/properties/severity'
        flag_count:
          type: integer
          minimum: 0
        summary:
          type: string
      additionalProperties: false
    EvidencePackRiskExplanation:
      type: object
      required:
        - summary
        - category_summaries
        - scoring_model
      properties:
        summary:
          type: string
          description: Source-backed risk interpretation summary. Avoids legal/commercial clearance wording.
        category_summaries:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackRiskCategorySummary'
        scoring_model:
          type: string
          enum:
            - max_severity_weighted_by_confidence_v1
      additionalProperties: false
    VerificationPolicyRequirements:
      type: object
      additionalProperties: false
      properties:
        gst_required:
          type: boolean
        licence_required:
          type: boolean
        charity_status_required:
          type: boolean
    VerificationPolicyEvidenceSubject:
      type: object
      additionalProperties: false
      properties:
        abn:
          type: string
          nullable: true
        acn:
          type: string
          nullable: true
        vin:
          type: string
          nullable: true
        amount_cents:
          type: integer
          nullable: true
          minimum: 0
    VerificationPolicyEvidenceSourceCheck:
      type: object
      additionalProperties: false
      required:
        - source
        - verdict
      properties:
        source:
          type: string
        verdict:
          type: string
        freshness:
          type: string
          nullable: true
        source_snapshot_id:
          type: string
          nullable: true
        raw_artifact_ref:
          type: string
          nullable: true
    VerificationPolicyEvidence:
      type: object
      additionalProperties: false
      properties:
        pack_id:
          type: string
          nullable: true
        subject:
          $ref: '#/components/schemas/VerificationPolicyEvidenceSubject'
        source_checks:
          type: array
          items:
            $ref: '#/components/schemas/VerificationPolicyEvidenceSourceCheck'
        risk_flags:
          type: array
          items:
            $ref: '#/components/schemas/EvidencePackRiskFlag'
        risk_score:
          type: integer
          nullable: true
          minimum: 0
          maximum: 100
    VerificationPolicyEvaluateRequest:
      type: object
      additionalProperties: false
      required:
        - evidence
      properties:
        policy_template:
          type: string
          enum:
            - asset_finance_under_50k_v1
            - supplier_onboarding_v1
          default: asset_finance_under_50k_v1
        organization_id:
          type: string
          nullable: true
        policy_id:
          type: string
          nullable: true
        policy_version:
          type: string
          nullable: true
        requirements:
          $ref: '#/components/schemas/VerificationPolicyRequirements'
        evidence:
          $ref: '#/components/schemas/VerificationPolicyEvidence'
    VerificationPolicyRuleResult:
      type: object
      additionalProperties: false
      required:
        - rule_id
        - status
        - severity
        - message
        - source_refs
        - evidence_refs
        - recommended_next_action
      properties:
        rule_id:
          type: string
        status:
          type: string
          enum:
            - satisfied
            - failed
            - needs_review
            - missing_evidence
        severity:
          type: string
          enum:
            - info
            - review
            - blocking
        message:
          type: string
        source_refs:
          type: array
          items:
            type: string
        evidence_refs:
          type: array
          items:
            type: string
        recommended_next_action:
          type: string
    VerificationPolicyEnvelope:
      type: object
      additionalProperties: false
      required:
        - ok
        - schema_version
        - policy
        - outcome
        - summary
        - rule_results
        - missing_evidence
        - review_items
        - failure_reasons
        - recommended_next_action
      properties:
        ok:
          type: boolean
          enum:
            - true
        schema_version:
          type: string
          enum:
            - 1.0.0
        policy:
          type: object
          additionalProperties: false
          required:
            - template_id
            - policy_version
            - organization_id
            - policy_id
          properties:
            template_id:
              type: string
              enum:
                - asset_finance_under_50k_v1
                - supplier_onboarding_v1
            policy_version:
              type: string
            organization_id:
              type: string
              nullable: true
            policy_id:
              type: string
              nullable: true
        outcome:
          type: string
          enum:
            - pass
            - fail
            - needs_review
            - missing_evidence
        summary:
          type: string
        rule_results:
          type: array
          items:
            $ref: '#/components/schemas/VerificationPolicyRuleResult'
        missing_evidence:
          type: array
          items:
            $ref: '#/components/schemas/VerificationPolicyRuleResult'
        review_items:
          type: array
          items:
            $ref: '#/components/schemas/VerificationPolicyRuleResult'
        failure_reasons:
          type: array
          items:
            $ref: '#/components/schemas/VerificationPolicyRuleResult'
        recommended_next_action:
          type: string
    VerificationPolicyError:
      type: object
      additionalProperties: false
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          enum:
            - false
        code:
          type: string
          enum:
            - invalid_input
            - unknown_policy_template
        message:
          type: string
    DecisionMemoryOutcome:
      type: string
      enum:
        - accepted
        - rejected
        - needs_review
        - false_positive
        - resolved_manually
        - escalated
        - approved_despite_risk
    DecisionMemorySubjectType:
      type: string
      enum:
        - evidence_pack
        - risk_flag
        - source_assertion
        - source_match
        - policy_evaluation
    DecisionMemoryEvent:
      type: object
      required:
        - decision_id
        - org_id
        - reviewer_user_id
        - outcome
        - subject_type
        - evidence_pack_id
        - policy_id
        - policy_version
        - policy_evaluation_id
        - risk_flag_code
        - risk_flag_ref
        - source_assertion_id
        - source_match_ref
        - reviewer_action_refs
        - reason_codes
        - notes
        - metadata
        - schema_version
        - created_at
      properties:
        decision_id:
          type: string
        org_id:
          type: string
        reviewer_user_id:
          type: string
          description: Server-trusted reviewer id from the authenticated bearer context.
        outcome:
          $ref: '#/components/schemas/DecisionMemoryOutcome'
        subject_type:
          $ref: '#/components/schemas/DecisionMemorySubjectType'
        evidence_pack_id:
          type:
            - string
            - 'null'
        policy_id:
          type:
            - string
            - 'null'
        policy_version:
          type:
            - string
            - 'null'
        policy_evaluation_id:
          type:
            - string
            - 'null'
        risk_flag_code:
          type:
            - string
            - 'null'
        risk_flag_ref:
          type:
            - string
            - 'null'
        source_assertion_id:
          type:
            - string
            - 'null'
        source_match_ref:
          type:
            - string
            - 'null'
        reviewer_action_refs:
          type: array
          items:
            type: string
        reason_codes:
          type: array
          items:
            type: string
        notes:
          type:
            - string
            - 'null'
          maxLength: 2000
        metadata:
          type: object
          additionalProperties: true
        schema_version:
          type: string
          const: 1.0.0
        created_at:
          type: integer
          description: Unix epoch milliseconds.
      additionalProperties: false
    DecisionMemoryRecordRequest:
      type: object
      required:
        - org_id
        - outcome
        - subject_type
      properties:
        decision_id:
          type: string
        org_id:
          type: string
        outcome:
          $ref: '#/components/schemas/DecisionMemoryOutcome'
        subject_type:
          $ref: '#/components/schemas/DecisionMemorySubjectType'
        evidence_pack_id:
          type: string
        policy_id:
          type: string
        policy_version:
          type: string
        policy_evaluation_id:
          type: string
        risk_flag_code:
          type: string
        risk_flag_ref:
          type: string
        source_assertion_id:
          type: string
        source_match_ref:
          type: string
        reviewer_action_refs:
          type: array
          items:
            type: string
        reason_codes:
          type: array
          items:
            type: string
        notes:
          type: string
          maxLength: 2000
        metadata:
          type: object
          additionalProperties: true
      additionalProperties: false
      description: Record append-only reviewer feedback. reviewer_user_id is resolved from bearer authentication and is not accepted in the request body.
    DecisionMemoryRecordEnvelope:
      type: object
      required:
        - ok
        - event
      properties:
        ok:
          type: boolean
          const: true
        event:
          $ref: '#/components/schemas/DecisionMemoryEvent'
    DecisionMemoryListEnvelope:
      type: object
      required:
        - ok
        - events
        - count
      properties:
        ok:
          type: boolean
          const: true
        events:
          type: array
          items:
            $ref: '#/components/schemas/DecisionMemoryEvent'
        count:
          type: integer
    DecisionMemoryError:
      type: object
      required:
        - ok
        - code
        - message
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          enum:
            - invalid_input
            - unauthorized
            - duplicate_decision
            - decision_memory_operation_failed
        message:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API-Key
    oauth2:
      type: oauth2
      x-issuer: https://mcp.assets.hoistai.com
      x-authorization-server-metadata-url: https://mcp.assets.hoistai.com/.well-known/oauth-authorization-server
      x-protected-resource-metadata-url: https://mcp.assets.hoistai.com/.well-known/oauth-protected-resource
      x-resource: https://mcp.assets.hoistai.com/mcp
      x-registration-url: https://mcp.assets.hoistai.com/oauth/register
      x-revocation-url: https://mcp.assets.hoistai.com/oauth/revoke
      flows:
        authorizationCode:
          authorizationUrl: https://mcp.assets.hoistai.com/oauth/authorize
          tokenUrl: https://mcp.assets.hoistai.com/oauth/token
          scopes:
            ppsr:search.org: Run PPSR organisation-grantor searches by ACN
            ppsr:search.serial: Run PPSR serial-number searches by VIN, chassis, motor, aircraft, or watercraft identifier
            abn:lookup: Run ABN and business-name lookups
            gst:status: Read GST registration status
            assets:receipts: Read Due Diligence Records and evidence receipts
            exports:write: Create Evidence Pack exports and audit artifacts
            assets:monitor: Monitor approved entities and assets for source-backed changes
            mcp:account.receipts: Read session-scoped MCP account receipts
security:
  - bearerAuth: []
paths:
  /_health:
    get:
      operationId: getHealth
      summary: Liveness probe
      description: Returns a public health envelope confirming API reachability. No authentication required. This is a setup signal only; it is not a claim that production source endpoints or paid operations are open.
      security: []
      responses:
        '200':
          description: API is healthy
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - version
                  - time
                properties:
                  ok:
                    type: boolean
                    const: true
                    description: Always true on a 200 response
                  version:
                    type: string
                    description: Worker package version (semver)
                    example: 0.0.700
                  time:
                    type: string
                    format: date-time
                    description: ISO 8601 timestamp of the probe
                    example: '2026-05-20T12:00:00.000Z'
  /ppsr/preview:
    post:
      operationId: ppsrPreview
      summary: Preview the price of a PPSR search
      description: 'Returns the planned cost (ex-GST + GST + total in AUD) for a PPSR org-grantor or serial-number search WITHOUT hitting the register. No audit emission, no R2 write, no per-call fee. Paid PPSR dispatch requires account, billing, confirmation, and source readiness. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PpsrSearchRequest'
      responses:
        '200':
          description: Price quote returned
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PpsrCostBreakdown'
                  - type: object
                    required:
                      - ok
                      - subject_kind
                      - estimate_token
                    properties:
                      ok:
                        type: boolean
                        const: true
                      subject_kind:
                        type: string
                        enum:
                          - organisation
                          - serial_number
                      estimate_token:
                        type: string
                        description: Opaque token (hex 32 chars) that future paid-search confirmation flows may use to bind a preview to its search. Informational only.
                        example: ab12cd34ef56789012345678abcdef01
        '400':
          description: Invalid request body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
  /ppsr/search:
    post:
      operationId: ppsrSearch
      summary: Run a PPSR organisation or serial-number search
      description: 'Contract for a PPSR search (org-grantor by ACN OR serial-number by VIN/motor/aircraft/watercraft). Returns the search reference, financing-statement registrations, certificate-XML descriptor, and cost breakdown when the operation is enabled. Org-only scope: never searches individuals. Today the public validation path uses deterministic sample data and stub certificate XML. Real AFSA/PPSR dispatch is not open until source and billing gates pass. Auth: bearer credential when provisioned.'
      security:
        - oauth2:
            - ppsr:search.org
        - oauth2:
            - ppsr:search.serial
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PpsrPaidSearchRequest'
      responses:
        '200':
          description: Search ran successfully
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PpsrCostBreakdown'
                  - type: object
                    required:
                      - ok
                      - subject_kind
                      - search_ref
                      - searched_at
                      - registration_count
                      - registrations
                      - certificate
                      - audit_metadata
                    properties:
                      ok:
                        type: boolean
                        const: true
                      subject_kind:
                        type: string
                        enum:
                          - organisation
                          - serial_number
                      search_ref:
                        type: string
                        description: AFSA/partner-issued reference number for this search.
                        example: PPSR-MOCK-ORG-001
                      searched_at:
                        type: string
                        format: date-time
                        description: ISO-8601 timestamp from the provider for when the search ran.
                      registration_count:
                        type: integer
                        minimum: 0
                        description: Count of financing-statement registrations returned.
                      registrations:
                        type: array
                        description: Compact projection of each registration. Org-only-safe (no individual-grantor PII).
                        items:
                          type: object
                          required:
                            - registration_number
                            - registration_kind
                            - start_time
                            - end_time
                            - collateral_class
                            - collateral_summary
                            - secured_party_name
                          properties:
                            registration_number:
                              type: string
                            registration_kind:
                              type: string
                            start_time:
                              type: string
                              format: date-time
                            end_time:
                              type:
                                - string
                                - 'null'
                              format: date-time
                            collateral_class:
                              type: string
                            collateral_summary:
                              type: string
                            secured_party_name:
                              type: string
                      certificate:
                        type:
                          - object
                          - 'null'
                        description: Certificate descriptor if the provider issued one. Null for "not found" sentinels or partner providers without cert support.
                        required:
                          - r2_key
                          - sha256
                          - content_type
                          - bytes
                        properties:
                          r2_key:
                            type: string
                            example: ppsr-certs/2026-05-20/01234567-89ab-cdef-0123-456789abcdef.xml
                          sha256:
                            type: string
                            pattern: ^[0-9a-f]{64}$
                          content_type:
                            type: string
                            enum:
                              - application/xml
                          bytes:
                            type: integer
                            minimum: 0
                      audit_metadata:
                        type: object
                        description: Audit metadata used by MCP tool handlers to construct the register_search_initiated / _completed audit pair (rule 17). Echoed for HTTP callers for observability.
                        required:
                          - search_id
                          - input_hash
                          - subject_kind
                          - started_at_ms
                          - finished_at_ms
                          - duration_ms
                        properties:
                          search_id:
                            type: string
                          input_hash:
                            type: string
                            pattern: ^[0-9a-f]{32}$
                          subject_kind:
                            type: string
                            enum:
                              - organisation
                              - serial_number
                          started_at_ms:
                            type: integer
                          finished_at_ms:
                            type: integer
                          duration_ms:
                            type: integer
                            minimum: 0
        '400':
          description: Invalid request body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '403':
          description: Bearer token is valid but missing the required PPSR search scope for this subject_kind.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '429':
          description: Monthly billing cap reached for this user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '502':
          description: Upstream provider failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
      x-hoist-required-scopes:
        organisation: ppsr:search.org
        serial_number: ppsr:search.serial
  /asic/company/lookup:
    post:
      operationId: lookupCompany
      summary: Look up an ASIC company fixture
      description: 'sample-data ASIC company lookup by ACN, ABN, or exact normalised company name. Uses local ASIC open-data sample data only: no live ASIC dispatch, no secrets, and no paid ASIC product search.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                acn:
                  type: string
                  description: Australian Company Number, spaces or hyphens accepted.
                abn:
                  type: string
                  description: Australian Business Number, spaces or hyphens accepted.
                company_name:
                  type: string
                  description: Exact company name matched after deterministic normalisation.
              additionalProperties: false
      responses:
        '200':
          description: ASIC company fixture matched.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - tool
                  - status
                  - company
                  - matched_on
                  - source
                  - generated_at
                properties:
                  ok:
                    type: boolean
                    const: true
                  tool:
                    type: string
                    const: company_lookup
                  status:
                    type: string
                    const: found
                  company:
                    type: object
                    required:
                      - acn
                      - abn
                      - name
                      - status
                      - entity_type
                      - registered_at
                      - deregistered_at
                      - current_name
                      - risk_flags
                    properties:
                      acn:
                        type: string
                      abn:
                        type:
                          - string
                          - 'null'
                      name:
                        type: string
                      status:
                        type: string
                        enum:
                          - registered
                          - deregistered
                      entity_type:
                        type: string
                      registered_at:
                        type: string
                        format: date
                      deregistered_at:
                        type:
                          - string
                          - 'null'
                        format: date
                      current_name:
                        type: boolean
                      risk_flags:
                        type: array
                        items:
                          type: string
                  matched_on:
                    type: string
                    enum:
                      - acn
                      - abn
                      - company_name
                  source:
                    type: object
                    required:
                      - provider
                      - dataset
                      - resource_id
                      - extract_date
                      - licence
                      - live_search_dispatched
                      - paid_searches_dispatched
                    properties:
                      provider:
                        type: string
                        const: asic-data-gov-fixture
                      dataset:
                        type: string
                        const: ASIC Company Dataset
                      resource_id:
                        type: string
                      extract_date:
                        type: string
                        format: date
                      licence:
                        type: string
                      live_search_dispatched:
                        type: boolean
                        const: false
                      paid_searches_dispatched:
                        type: boolean
                        const: false
                  generated_at:
                    type: string
                    format: date-time
        '400':
          description: Invalid input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
        '404':
          description: No matching company fixture.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
  /address/lookup:
    post:
      operationId: addressLookup
      summary: Look up an Australian address against G-NAF
      description: 'Returns G-NAF snapshot-backed address candidates, confidence, and mismatch flags from the shared address lookup service. No caller query text is persisted. Protected validation route; use only where access is provisioned. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddressLookupRequest'
      responses:
        '200':
          description: Address lookup completed. A no-match lookup still returns 200 with status=no_match and an empty candidates list.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressLookupResponse'
        '400':
          description: Invalid request body or address/source input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressLookupError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressLookupError'
        '502':
          description: G-NAF shard read failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddressLookupError'
  /what-changed:
    post:
      operationId: whatChanged
      summary: Compare monitor evidence snapshots
      description: 'Returns a structured no-change or changed diff between evidence pack snapshots, or between the first and latest owned snapshots for a target/time range. Raw address input and source payloads are not accepted or returned. Protected route; delivery surfaces require account access and source readiness. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WhatChangedRequest'
      responses:
        '200':
          description: Snapshot comparison completed. No-change comparisons return 200 with outcome=no_change and an empty changes array.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedResponse'
        '400':
          description: Invalid request body, selector, or non-comparable snapshots.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedError'
        '404':
          description: No owned monitor evidence snapshots matched the requested selector.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedError'
        '409':
          description: Target/time-range selector matched multiple monitor subscriptions and needs subscription_id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedError'
        '500':
          description: Snapshot diff storage or projection failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WhatChangedError'
  /recheck-before-funding:
    post:
      operationId: confirmNoChanges
      summary: Recheck monitor evidence before funding
      description: 'Runs an explicit before-funding monitor check against a captured baseline and returns outcome=no_changes or outcome=changes_detected with evidence pack references. The caller supplies the current evidence payload produced by the source check; this endpoint does not create monitors, deliver notifications, or expose what_changed selectors. Protected route; delivery surfaces require account access and source readiness. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConfirmNoChangesRequest'
      responses:
        '200':
          description: Before-funding recheck completed. No-change and changed outcomes both return 200 with structured evidence references.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesResponse'
        '400':
          description: Invalid request body or current evidence payload.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesError'
        '404':
          description: No owned monitor subscription matched the requested subscription ID.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesError'
        '409':
          description: Captured baseline is missing or does not match the expected baseline evidence pack ID.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesError'
        '500':
          description: Before-funding recheck failed while running the monitor check.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmNoChangesError'
  /monitors:
    post:
      operationId: monitorEntityOrAsset
      summary: Create an entity or asset monitor
      description: Creates a monitor subscription for an ABN, ACN, VIN, or address using the shared monitoring lifecycle service. The route records monitor audit events and returns durable subscription metadata; queue runners, delivery adapters, CLI, and MCP surfaces are separate endpoints.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitorCreateRequest'
      responses:
        '201':
          description: Monitor subscription created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorResponse'
        '400':
          description: Invalid owner, target, interval, or request body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '500':
          description: Monitor operation failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
    get:
      operationId: listMonitors
      summary: List monitor subscriptions
      description: Lists monitor subscriptions for the authenticated user and supplied tenant/account owner context.
      security:
        - bearerAuth: []
      parameters:
        - name: tenant_id
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
        - name: account_id
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - pending_baseline
              - active
              - paused
              - canceled
              - failed
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Monitor subscriptions for the requested owner context.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorListResponse'
        '400':
          description: Invalid owner or limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
  /monitors/{id}:
    get:
      operationId: getMonitorStatus
      summary: Get monitor subscription status
      description: Returns a single monitor subscription for the authenticated user and supplied tenant/account owner context.
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
        - name: tenant_id
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
        - name: account_id
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
      responses:
        '200':
          description: Monitor subscription status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorResponse'
        '400':
          description: Invalid owner or monitor id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '403':
          description: Monitor belongs to a different authenticated user or owner context.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '404':
          description: Monitor not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
    delete:
      operationId: revokeMonitor
      summary: Revoke a monitor subscription
      description: Revokes an active monitor subscription for the authenticated user and supplied owner context.
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitorRevokeRequest'
      responses:
        '200':
          description: Monitor subscription revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorResponse'
        '400':
          description: Invalid owner, monitor id, or revocation reason.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '401':
          description: Missing or invalid bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '403':
          description: Monitor belongs to a different authenticated user or owner context.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '404':
          description: Monitor not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
        '409':
          description: Monitor is already terminal and cannot be revoked again.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorError'
  /asic/business-name/lookup:
    post:
      operationId: verifyBusinessNameRegistration
      summary: Look up an ASIC business name
      description: Looks up an ASIC Business Names public snapshot row by exact, alternate, or deterministic normalised name. Uses stored source snapshots when available, falls back to sample fixtures when no snapshot exists, and never dispatches a live or paid ASIC search.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - business_name
              properties:
                business_name:
                  type: string
                  description: Business name to match against the ASIC Business Names public snapshot.
                abn:
                  type: string
                  description: Optional 11-digit ABN to constrain the source snapshot match.
              additionalProperties: false
      responses:
        '200':
          description: Business-name source snapshot or fallback fixture matched. No live or paid ASIC search was dispatched.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - tool
                  - business_name
                  - status
                  - registered_at
                  - cancelled_at
                  - state_of_registration
                  - abn
                  - bn_state_number
                  - match
                  - source
                  - raw
                  - risk_flags
                  - live_search_dispatched
                  - paid_searches_dispatched
                  - generated_at
                properties:
                  ok:
                    type: boolean
                    const: true
                  tool:
                    type: string
                    const: lookup_business_name
                  business_name:
                    type: string
                  status:
                    type: string
                    enum:
                      - registered
                      - cancelled
                  registered_at:
                    type: string
                    format: date
                  cancelled_at:
                    type:
                      - string
                      - 'null'
                    format: date
                  state_of_registration:
                    type: string
                  abn:
                    type:
                      - string
                      - 'null'
                  bn_state_number:
                    type: string
                  match:
                    type: object
                    required:
                      - method
                      - confidence
                      - query
                      - matched_name
                    properties:
                      method:
                        type: string
                        enum:
                          - exact_normalised
                          - alternate_name
                          - fuzzy_token
                      confidence:
                        type: number
                        minimum: 0
                        maximum: 1
                      query:
                        type: string
                      matched_name:
                        type: string
                  source:
                    type: object
                    description: ASIC data.gov.au snapshot provenance. `source_version` is present for source_records-backed public snapshots.
                  raw:
                    type: object
                    description: Raw ASIC Business Names source fields.
                  risk_flags:
                    type: array
                    items:
                      type: object
                      required:
                        - severity
                        - code
                        - message
                      properties:
                        severity:
                          type: string
                          enum:
                            - low
                            - medium
                        code:
                          type: string
                        message:
                          type: string
                  live_search_dispatched:
                    type: boolean
                    const: false
                  paid_searches_dispatched:
                    type: boolean
                    const: false
                  generated_at:
                    type: string
                    format: date-time
        '400':
          description: Invalid input or malformed JSON.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - invalid_input
                  message:
                    type: string
        '401':
          description: Missing or invalid bearer identity.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - unauthorized
                  message:
                    type: string
        '404':
          description: No matching ASIC business-name source snapshot or fallback fixture was found.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - business_name_not_found
                  message:
                    type: string
  /verify-payment-or-invoice:
    post:
      operationId: verifyPaymentOrInvoice
      summary: Verify an invoice or payment before sending money
      description: 'Check an invoice, quote, or supplier payment instruction for deterministic consistency signals before the user pays. Parses untrusted invoice text locally, extracts ABN/ACN/business/payment fields, and returns a compact card with hard limitation language. Bank account ownership is NOT independently verified; callers must confirm payment details through a known independent channel. Protected route; production source and billing operations require account access and source readiness. Auth: bearer credential; the authenticated userId is derived from the bearer, not from the request body.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Provide `document_text` or at least one structured invoice/payment field. All fields are flat primitives; nested objects and arrays are rejected by the service.
              properties:
                document_text:
                  type: string
                  description: Raw invoice/payment text from paste or OCR. Treated as untrusted input and never reflected verbatim.
                supplier_name:
                  type: string
                business_name:
                  type: string
                abn:
                  type: string
                  description: Australian Business Number (11 digits, spaces optional).
                acn:
                  type: string
                  description: Australian Company Number (9 digits, spaces optional).
                invoice_number:
                  type: string
                invoice_amount:
                  oneOf:
                    - type: string
                    - type: number
                gst_amount:
                  oneOf:
                    - type: string
                    - type: number
                bsb:
                  type: string
                  description: BSB shape only; does not verify bank-account ownership.
                account_number:
                  type: string
                  description: Account-number shape only; does not verify bank-account ownership.
                remittance_email:
                  type: string
                payment_reference:
                  type: string
                asset_vin:
                  type: string
                  description: Optional supplied asset VIN to compare against invoice text.
                asset_chassis_number:
                  type: string
                  description: Optional supplied asset chassis number to compare against invoice text.
                asset_serial_number:
                  type: string
                  description: Optional supplied asset serial number to compare against invoice text.
      responses:
        '200':
          description: Invoice/payment check completed. Bank-account ownership is explicitly not verified.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - card
                  - generated_at
                properties:
                  ok:
                    type: boolean
                    const: true
                  card:
                    type: object
                    required:
                      - tool
                      - verdict
                      - confidence
                      - extracted_fields
                      - verified_fields
                      - not_verified_fields
                      - supported_inputs
                      - risk_flags
                      - human_review_items
                      - disclaimer
                      - composition_hooks
                      - asset_invoice_identifier_consistency
                      - pending_confirmation
                    properties:
                      tool:
                        type: string
                        const: verify_payment_or_invoice
                      verdict:
                        type: string
                        enum:
                          - needs_review
                      confidence:
                        type: number
                        minimum: 0
                        maximum: 1
                      extracted_fields:
                        type: object
                        description: Deterministically extracted or caller-supplied fields. Raw document_text is not returned.
                        properties:
                          abn:
                            type:
                              - string
                              - 'null'
                          acn:
                            type:
                              - string
                              - 'null'
                          supplier_name:
                            type:
                              - string
                              - 'null'
                          business_name:
                            type:
                              - string
                              - 'null'
                          invoice_number:
                            type:
                              - string
                              - 'null'
                          invoice_amount:
                            type:
                              - string
                              - 'null'
                          gst_amount:
                            type:
                              - string
                              - 'null'
                          bsb:
                            type:
                              - string
                              - 'null'
                          account_number:
                            type:
                              - string
                              - 'null'
                          remittance_email:
                            type:
                              - string
                              - 'null'
                          payment_reference:
                            type:
                              - string
                              - 'null'
                      verified_fields:
                        type: array
                        items:
                          type: string
                        description: Fields the current service can structurally verify. `account_number` is intentionally excluded.
                      not_verified_fields:
                        type: array
                        items:
                          type: string
                        description: Includes `bank_account_ownership` on every success response.
                      supported_inputs:
                        type: array
                        items:
                          type: string
                      risk_flags:
                        type: array
                        items:
                          type: object
                          required:
                            - severity
                            - code
                            - message
                          properties:
                            severity:
                              type: string
                              enum:
                                - medium
                                - high
                            code:
                              type: string
                            message:
                              type: string
                      human_review_items:
                        type: array
                        items:
                          type: string
                      disclaimer:
                        type: string
                        description: 'Always: Bank account ownership is NOT independently verified. Confirm payment details through a known independent channel before sending money.'
                      composition_hooks:
                        type: object
                        description: Planned future composition points for verify_counterparty and verify_asset.
                      asset_invoice_identifier_consistency:
                        type: object
                        description: Optional VIN/chassis/serial consistency check between supplied asset identifiers and invoice text. Mismatches add a high-risk flag but do not block unrelated invoice verification output.
                        required:
                          - status
                          - asset_identifiers
                          - invoice_identifiers
                          - matched_identifiers
                          - mismatches
                          - human_review_item
                        properties:
                          status:
                            type: string
                            enum:
                              - not_applicable
                              - match
                              - mismatch
                              - invoice_identifier_missing
                              - asset_identifier_missing
                          asset_identifiers:
                            type: array
                            items:
                              $ref: '#/components/schemas/AssetInvoiceCanonicalIdentifier'
                          invoice_identifiers:
                            type: array
                            items:
                              $ref: '#/components/schemas/AssetInvoiceCanonicalIdentifier'
                          matched_identifiers:
                            type: array
                            items:
                              $ref: '#/components/schemas/AssetInvoiceCanonicalIdentifier'
                          mismatches:
                            type: array
                            items:
                              type: object
                              required:
                                - kind
                                - asset
                                - invoice
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - vin
                                    - chassis_number
                                    - engine_number
                                    - serial_number
                                asset:
                                  $ref: '#/components/schemas/AssetInvoiceCanonicalIdentifier'
                                invoice:
                                  $ref: '#/components/schemas/AssetInvoiceCanonicalIdentifier'
                          human_review_item:
                            type:
                              - string
                              - 'null'
                      pending_confirmation:
                        type:
                          - object
                          - 'null'
                        description: Present when invoice text contains asset identifiers and a paid PPSR/verify_asset search would require explicit user confirmation. No paid search is dispatched by this endpoint.
                        required:
                          - status
                          - required_before
                          - reason
                          - confirmation_field
                          - asset_identifiers
                          - paid_searches_dispatched
                          - recommended_action
                        properties:
                          status:
                            type: string
                            const: pending_confirmation
                          required_before:
                            type: string
                            const: paid_ppsr_search
                          reason:
                            type: string
                          confirmation_field:
                            type: string
                            const: user_confirmation_for_paid_search
                          asset_identifiers:
                            type: array
                            items:
                              type: object
                              required:
                                - kind
                                - value
                              properties:
                                kind:
                                  type: string
                                  enum:
                                    - vin
                                    - chassis_number
                                    - serial_number
                                value:
                                  type: string
                          paid_searches_dispatched:
                            type: boolean
                            const: false
                          recommended_action:
                            type: string
                  generated_at:
                    type: string
                    format: date-time
        '400':
          description: Invalid request body or insufficient invoice/payment fields.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - invalid_input
                  message:
                    type: string
        '401':
          description: Authenticated user identity is required.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - unauthorized
                  message:
                    type: string
  /verify-counterparty:
    post:
      operationId: verifyCounterparty
      summary: Verify an Australian counterparty
      description: 'Verify a counterparty business against fixture-backed Australian register shapes (ABN + PPSR). Returns a compact Evidence Card with source-attributed facts, consistency findings, and audit metadata. Org-only scope: does not search individuals. Real ABN and AFSA/PPSR source traffic is not open until source and billing gates pass. Auth: bearer credential when provisioned; the authenticated userId is derived from the bearer, NOT from the request body.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: 'At least one of `abn` or `acn` is required. `business_name` alone is insufficient until the ABR name-search adapter ships. ha-h6ak: the previous `user_id` body field is removed — the authenticated userId is derived from the OAuth bearer token.'
              properties:
                abn:
                  type: string
                  description: Australian Business Number (11 digits, spaces optional).
                  pattern: ^[0-9 ]{11,13}$
                  example: 51 824 753 556
                acn:
                  type: string
                  description: Australian Company Number (9 digits, spaces optional).
                  pattern: ^[0-9 ]{9,11}$
                  example: 123 456 789
                business_name:
                  type: string
                  description: Legal entity name. Used for soft-matching against ABR results when an `abn` is also supplied. NOT sufficient as the sole identifier.
                trading_name:
                  type: string
                  description: Trading-as / brand name. Recorded for context only.
                address:
                  type: string
                  description: Single-line formatted address. Used for G-NAF consistency with approved access.
                email_domain:
                  type: string
                  description: Email DOMAIN ONLY (e.g. "hoistai.com"). Full email addresses are rejected — emails are banned audit fields.
                  example: hoistai.com
                phone:
                  type: string
                  description: Contact phone. Advisory metadata only — never used for identification.
                context:
                  type: string
                  description: Human-readable verification purpose. Stored as provenance metadata. Not used for access-control decisions.
      responses:
        '200':
          description: Counterparty verified. Returns a compact Evidence Card plus audit metadata.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - card
                  - entity_candidates
                  - pack_id
                  - generated_at
                  - audit_metadata
                properties:
                  ok:
                    type: boolean
                    const: true
                  card:
                    type: object
                    description: 'Compact Evidence Card (<2KB JSON-serialised). Mirrors `EvidenceCard` from src/canonical/evidence-card.ts. Source-attributed facts only — no raw input reflected. The previous schema shorthand (`verdict / confidence / evidence_summary / findings`) was aspirational and never matched the implementation; Stage-2 PR #311 review aligned this schema to the canonical type (ha-w8e3 follow-up).'
                    required:
                      - headline_verdict
                      - one_sentence_reason
                      - risk_flags
                      - source_checks
                      - recommended_actions
                      - pack_id
                      - generated_at
                    properties:
                      headline_verdict:
                        type: string
                        enum:
                          - pass
                          - review_required
                          - high_risk
                          - insufficient_data
                        description: 'Top-level verdict derived from findings severity. `pass`: no critical/high findings. `review_required`: at least one high finding. `high_risk`: at least one critical finding. `insufficient_data`: no evidence items returned.'
                      one_sentence_reason:
                        type: string
                        description: One sentence explaining the verdict, written for a financial professional audience.
                      risk_flags:
                        type: array
                        description: Top N risk flags from findings (severity-sorted, critical first). Capped at 5 by default.
                        items:
                          type: object
                          required:
                            - finding_id
                            - severity
                            - message
                          properties:
                            finding_id:
                              type: string
                              description: Unique finding ID for back-reference to the full pack.
                            severity:
                              type: string
                              enum:
                                - critical
                                - high
                                - medium
                                - low
                                - info
                            message:
                              type: string
                              description: Human-readable risk description. Must not contain raw PII.
                            recommended_action:
                              type: string
                              description: Optional next action for the reviewer.
                      source_checks:
                        type: array
                        description: Per-source check summaries — one row per unique source_id in the pack. Capped at 10 by default.
                        items:
                          type: object
                          required:
                            - source_id
                            - source_checked_at
                            - result_summary
                          properties:
                            source_id:
                              type: string
                              description: Source adapter ID, e.g. "abr-lookup", "afsa-ppsr".
                            source_checked_at:
                              type: integer
                              description: Unix epoch milliseconds of the most recent fetch from this source.
                            result_summary:
                              type: string
                              description: Short human-readable result description.
                      recommended_actions:
                        type: array
                        description: Recommended actions from risk_flag findings (deduplicated, ordered by finding severity descending).
                        items:
                          type: string
                      pack_id:
                        type: string
                        description: pack_id of the source EvidencePack — back-reference pointer. Mirrors the envelope's top-level pack_id.
                      shareable_url:
                        type: string
                        description: 'Public shareable URL for this card, if a base URL was configured. Format: `<baseUrl>/evidence/<pack_id>`.'
                      generated_at:
                        type: integer
                        description: 'Unix epoch milliseconds copied from the source pack''s `generated_at`. NOTE: the envelope''s top-level `generated_at` is the same instant serialised as ISO-8601.'
                  entity_candidates:
                    type: array
                    description: Deterministic company identity candidates derived from caller ACN and ABN-backed data. Carries ABN-to-ACN cross-walk evidence before live ASIC access is available.
                    items:
                      type: object
                      required:
                        - kind
                        - abn
                        - acn
                        - entity_name
                        - entity_type
                        - source
                        - confidence
                        - evidence_ids
                      properties:
                        kind:
                          type: string
                          const: company
                        abn:
                          type:
                            - string
                            - 'null'
                          description: Canonical spaced ABN when the candidate is ABN-backed.
                        acn:
                          type: string
                          description: Canonical spaced ACN.
                        entity_name:
                          type:
                            - string
                            - 'null'
                          description: ABN-backed entity name when available.
                        entity_type:
                          type:
                            - string
                            - 'null'
                          description: ABN-backed entity type when available.
                        source:
                          type: string
                          enum:
                            - abn_record
                            - caller_acn
                            - abn_record_and_caller_acn
                        confidence:
                          type: number
                          minimum: 0
                          maximum: 1
                        evidence_ids:
                          type: array
                          items:
                            type: string
                  pack_id:
                    type: string
                    description: Pack UUID — used by downstream tools like `create_due_diligence_pack`.
                    example: 01900000-0000-7000-8000-000000000000
                  generated_at:
                    type: string
                    format: date-time
                    description: ISO-8601 generation timestamp.
                  audit_metadata:
                    type: object
                    description: Audit metadata for MCP tool handlers and HTTP callers.
                    required:
                      - search_id
                      - input_hash
                      - register
                      - subject_kind
                      - initiated_at_ms
                      - completed_at_ms
                      - duration_ms
                    properties:
                      search_id:
                        type: string
                        description: UUIDv7 identifier shared by both audit events.
                      input_hash:
                        type: string
                        pattern: ^[0-9a-f]{64}$
                        description: Full SHA-256 (64 lowercase hex chars) of the canonical verify_counterparty input string.
                      register:
                        type: string
                        enum:
                          - abn
                          - ppsr
                      subject_kind:
                        type: string
                        enum:
                          - abn
                          - organisation
                      initiated_at_ms:
                        type: integer
                        description: Date.now() snapshot from when the service call started.
                      completed_at_ms:
                        type: integer
                        description: Date.now() snapshot from when the service returned.
                      duration_ms:
                        type: integer
                        minimum: 0
                        description: Duration in milliseconds.
        '400':
          description: Invalid request (missing required fields, full email supplied as email_domain, etc.)
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - invalid_input
                  message:
                    type: string
        '429':
          description: Monthly billing cap reached for this user.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - billing_cap_reached
                  message:
                    type: string
        '502':
          description: Source fetch failed (upstream provider error).
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - code
                  - message
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                    enum:
                      - source_fetch_failed
                  message:
                    type: string
  /ppsr/batch:
    post:
      summary: Batch PPSR (CSV in, ZIP out)
  /abn/{abn}:
    get:
      operationId: abnLookup
      summary: ABN lookup
      description: 'Look up an Australian Business Number against the ABN contract shape. Returns entity name, type, status, and registered address summary when enabled. Org-only: does not search individuals. Production ABN traffic is not open until source and billing gates pass; use sample flows unless access is explicitly provisioned. Auth: bearer credential when provisioned.'
      security:
        - oauth2:
            - abn:lookup
        - bearerAuth: []
      parameters:
        - name: abn
          in: path
          required: true
          description: 11-digit Australian Business Number. Spaces and hyphens are accepted and stripped server-side.
          schema:
            type: string
            pattern: ^[0-9 -]{11,16}$
            example: 12 345 678 901
      responses:
        '200':
          description: ABN found
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - abn
                  - entityName
                  - entityType
                  - status
                  - abnRegisteredDate
                  - acn
                  - state
                  - postcode
                properties:
                  ok:
                    type: boolean
                    const: true
                    description: Always true on a 200 response
                  abn:
                    type: string
                    description: Normalised 11-digit ABN (no spaces)
                    example: '12345678901'
                  entityName:
                    type: string
                    description: Registered entity name from the ABR
                    example: MOCK BUILDING SUPPLIES PTY LTD
                  entityType:
                    type: string
                    description: Entity type (e.g. Australian Private Company, Partnership)
                    example: Australian Private Company
                  status:
                    type: string
                    description: 'Current ABN status: Active or Cancelled'
                    example: Active
                  abnRegisteredDate:
                    type: string
                    description: ISO date the ABN was first registered
                    example: '2010-03-15'
                  acn:
                    type:
                      - string
                      - 'null'
                    description: ACN if the entity has one (companies + registered bodies); null otherwise
                    example: 123 456 789
                  state:
                    type:
                      - string
                      - 'null'
                    description: Primary business location state code (NSW/VIC/etc.) or null
                    example: NSW
                  postcode:
                    type:
                      - string
                      - 'null'
                    description: Primary business location postcode or null
                    example: '2000'
        '400':
          description: Invalid ABN input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '403':
          description: Bearer token is valid but missing the abn:lookup scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpsrSearchError'
        '404':
          description: ABN not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
        '429':
          description: Upstream rate limit hit
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
        '502':
          description: Upstream ABR error (network / parse / non-2xx)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AbnLookupError'
      x-hoist-required-scopes:
        - abn:lookup
  /abn/{abn}/history:
    get:
      summary: ABN history
  /gst/{abn}:
    get:
      summary: GST registration as at date
  /receipts/due-diligence:
    get:
      operationId: showDueDiligenceReceipt
      summary: Due-diligence receipt for the authenticated user
      description: 'Retrieve the PPSR / ABN register-search audit chain for the AUTHENTICATED user: initiated, completed, and failed searches with certificate hashes and costs. PII-free; no raw query payloads. Production records require account access; use only where access is provisioned. The userId is derived from the bearer credential. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      parameters:
        - name: limit
          in: query
          required: false
          description: Maximum number of receipt records to return (default 50, hard cap 200).
          schema:
            type: integer
            minimum: 1
            maximum: 200
        - name: cursor
          in: query
          required: false
          description: Key-based cursor from a previous response for pagination.
          schema:
            type: string
        - name: from_date
          in: query
          required: false
          description: ISO-8601 inclusive lower bound on the event timestamp.
          schema:
            type: string
            format: date-time
        - name: to_date
          in: query
          required: false
          description: ISO-8601 inclusive upper bound on the event timestamp.
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Receipt envelope containing PPSR-domain audit records
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - data
                  - generated_at
                  - user_id_hash
                  - freshness
                  - partial
                  - confidence
                  - data_source
                properties:
                  ok:
                    type: boolean
                    const: true
                  data:
                    type: object
                    required:
                      - records
                      - nextCursor
                    properties:
                      records:
                        type: array
                        items:
                          type: object
                          required:
                            - search_id
                            - register
                            - status
                          properties:
                            search_id:
                              type: string
                            register:
                              type: string
                            status:
                              type: string
                              enum:
                                - initiated
                                - completed
                                - failed
                            subject_kind:
                              type: string
                            initiated_at:
                              type: number
                            completed_at:
                              type: number
                            failed_at:
                              type: number
                            cert_sha256:
                              type: string
                            cost_cents:
                              type: number
                            reason:
                              type: string
                      nextCursor:
                        type:
                          - string
                          - 'null'
                  generated_at:
                    type: string
                    format: date-time
                  user_id_hash:
                    type: string
                    description: First 24 hex chars of SHA-256(userId)
                  freshness:
                    type: string
                    format: date-time
                  partial:
                    type: boolean
                  confidence:
                    type: number
                  data_source:
                    type: string
                    const: hoist_assets_audit_due_diligence
        '400':
          description: Missing or invalid user_id
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                  message:
                    type: string
        '502':
          description: R2 audit-bucket scan failure
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    const: false
                  code:
                    type: string
                  message:
                    type: string
  /records/{id}:
    get:
      summary: Retrieve a record (PDF or JSON)
  /records/{id}/verify:
    get:
      summary: Verify a record hash
  /records:
    get:
      summary: List recent records
  /exports:
    post:
      operationId: createEvidencePack
      summary: Create an Evidence Pack
      description: 'Build an Evidence Pack containing machine-pack JSON, the Due Diligence Record PDF metadata, audit artifact manifest refs, source checks, timestamps, risk flags, confidence, and human review items when source-backed production operations are enabled. Sample packs may be available for validation. Production PDFs and paid source-backed packs require account access. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: At least one of abn or vin is required.
              properties:
                abn:
                  type: string
                  description: Australian Business Number of the subject organisation (11 digits, spaces optional).
                vin:
                  type: string
                  description: Vehicle Identification Number (up to 17 chars).
                purpose:
                  type: string
                  description: Human-readable purpose for the evidence pack. Stored as provenance metadata only.
      responses:
        '200':
          description: Evidence Pack created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackEnvelope'
        '400':
          description: Invalid input (e.g. neither abn nor vin provided)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
        '502':
          description: Upstream (PDF renderer or R2 storage) failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
        '503':
          description: Evidence Pack storage not available (env.AUDIT binding missing)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
  /exports/{id}:
    get:
      operationId: getEvidencePack
      summary: Retrieve an Evidence Pack PDF
      description: 'Stream the Due Diligence Record PDF bytes for a previously-created Evidence Pack. The id is the canonical UUID returned by POST /v1/exports. Production PDF retrieval requires account access; use only where access is provisioned. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          description: Pack identifier (UUID v4 8-4-4-4-12 hex shape).
          schema:
            type: string
            pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
      responses:
        '200':
          description: PDF bytes for the Due Diligence Record inside the Evidence Pack
          content:
            application/pdf:
              schema:
                type: string
                format: binary
          headers:
            x-hoist-r2-key:
              schema:
                type: string
              description: R2 key of the stored PDF.
            x-hoist-audit-manifest-key:
              schema:
                type: string
              description: R2 key of the audit artifact manifest JSON.
            x-hoist-source-snapshot-ids:
              schema:
                type: string
              description: Comma-separated source snapshot identifiers represented in the pack.
            x-hoist-raw-artifact-refs:
              schema:
                type: string
              description: Comma-separated audit artifact refs represented in the pack.
        '400':
          description: Invalid id shape
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
        '404':
          description: Evidence Pack not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
        '502':
          description: Upstream (R2) failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
        '503':
          description: Evidence Pack storage not available (env.AUDIT binding missing)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvidencePackError'
  /asic/licence/lookup:
    post:
      operationId: asicLicenceLookup
      summary: ASIC AFSL/ACL licence lookup
      description: 'Look up an ASIC Australian Financial Services Licence or Australian Credit Licence status from sample-data provider data. No live ASIC dispatch or secrets are used. Paid current extracts return a confirmation gate and provider-not-wired status. Protected validation route; live ASIC current extracts are not claimed. Auth: bearer credential when provisioned.'
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AsicLicenceLookupRequest'
      responses:
        '200':
          description: Licence lookup result or paid-search confirmation gate
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsicLicenceLookupResponse'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsicLicenceLookupError'
        '401':
          description: Missing or invalid bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsicLicenceLookupError'
        '404':
          description: Licence not found in sample-data provider data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsicLicenceLookupError'
  /usage:
    get:
      summary: Current usage and remaining allowance
  /verify-professional:
    post:
      operationId: verifyProfessional
      summary: Verify a professional register record
      description: Verify a professional-register role against source-backed ASIC public snapshots. Supports liquidators, financial advisers, banned/disqualified persons, AFS representatives, credit representatives, Registered Auditors, and SMSF Auditors. Representative, auditor-condition, suspension, and same-name matches require manual review before relying on them as authority evidence.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerifyProfessionalRequest'
      responses:
        '200':
          description: Professional verification result with source-backed evidence wording
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyProfessionalResponse'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyProfessionalError'
        '401':
          description: Missing or invalid bearer token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyProfessionalError'
        '503':
          description: Required ASIC public-source snapshot is unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerifyProfessionalError'
      x-hoist-required-scopes:
        - professional:verify
  /policies/evaluate:
    post:
      operationId: checkVerificationPolicy
      summary: Evaluate a verification policy
      description: Evaluate an Evidence Pack projection against a workflow policy template. Returns pass, fail, needs_review, or missing_evidence with rule-level source references. This applies customer/workflow thresholds above source-backed evidence and risk flags; it does not mutate Evidence Packs or source assertions.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VerificationPolicyEvaluateRequest'
      responses:
        '200':
          description: Policy evaluation result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerificationPolicyEnvelope'
        '400':
          description: Invalid input or unknown policy template
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerificationPolicyError'
  /decision-memory/events:
    post:
      operationId: recordDecisionMemory
      summary: Record decision-memory feedback
      description: Record an append-only reviewer outcome event against an Evidence Pack, risk flag, source assertion, source match, or policy evaluation. The event is stored separately from source facts and does not mutate Evidence Packs, risk flags, source assertions, or policy results.
      security:
        - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecisionMemoryRecordRequest'
      responses:
        '201':
          description: Decision-memory event recorded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryRecordEnvelope'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryError'
        '401':
          description: Missing authenticated reviewer identity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryError'
        '409':
          description: Duplicate decision id
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryError'
    get:
      operationId: listDecisionMemoryEvents
      summary: List decision-memory feedback
      description: List append-only reviewer outcome events for future policy/risk tuning. Results are filtered by org_id and optional evidence/policy/source references.
      security:
        - bearerAuth: []
      parameters:
        - name: org_id
          in: query
          required: true
          schema:
            type: string
        - name: evidence_pack_id
          in: query
          required: false
          schema:
            type: string
        - name: policy_id
          in: query
          required: false
          schema:
            type: string
        - name: policy_version
          in: query
          required: false
          schema:
            type: string
        - name: policy_evaluation_id
          in: query
          required: false
          schema:
            type: string
        - name: risk_flag_code
          in: query
          required: false
          schema:
            type: string
        - name: source_assertion_id
          in: query
          required: false
          schema:
            type: string
        - name: source_match_ref
          in: query
          required: false
          schema:
            type: string
        - name: reviewer_user_id
          in: query
          required: false
          schema:
            type: string
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Decision-memory events
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryListEnvelope'
        '400':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionMemoryError'
x-org-only-scope: 'Hoist Assets operates under an org-only scope: organisation-grantor and serial-number searches only, no PII. The API does NOT accept individual-grantor searches and will reject them with a 400 response before any search runs. See https://hoistai.com/trust/npii-boundary.'
