> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gominerva.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Session-scoped progress for the capture UI

> Accepts EITHER a capture token OR an invite credential (the desktop polls on the invite scope while the phone captures). A direct single-use invite remains authorized for this read-only route after its successful acquire, until expiry; it cannot acquire again or authorize another mutation. Minimal progress projection: no tenant/workspace, no upload references, no OCR/jurisdiction/fraud detail. Also returns the resolved capture manifest. Path sessionId must equal the credential's sessionId.




## OpenAPI

````yaml /api-reference/idv-svc.json get /sessions/{sessionId}/status
openapi: 3.1.0
info:
  title: Minerva IDV API
  version: 1.0.0-draft
  description: >-
    Customer API for identity verification. Create verification sessions for
    profiles, deliver invites, track capture progress, and read review outcomes.
    For the end-to-end flow, see the [IDV Integration
    Guide](/api-reference/idv-integration-guide). Reviewer-safe responses never
    expose storage keys, checksums, wrapped keys, encryption context, raw OCR,
    or raw model output. Decrypted personal data is available only on `GET
    /sessions/{sessionId}/data`, to an authenticated in-scope principal, with
    fail-closed auditing.
servers:
  - url: https://api.gominerva.com/idv/v1
    description: The production API server for Minerva identity verification
security: []
tags:
  - name: sessions
    description: >-
      Verification sessions and invite delivery (application or dashboard
      authentication).
  - name: capture
    description: End-user capture flow (session or invite credentials).
  - name: review
    description: Review decisions and audited structured-data access.
  - name: workflows
    description: Workflow configuration for verification sessions.
  - name: themes
    description: Branding themes and managed logo assets.
paths:
  /sessions/{sessionId}/status:
    get:
      tags:
        - capture
      summary: Session-scoped progress for the capture UI
      description: >
        Accepts EITHER a capture token OR an invite credential (the desktop
        polls on the invite scope while the phone captures). A direct single-use
        invite remains authorized for this read-only route after its successful
        acquire, until expiry; it cannot acquire again or authorize another
        mutation. Minimal progress projection: no tenant/workspace, no upload
        references, no OCR/jurisdiction/fraud detail. Also returns the resolved
        capture manifest. Path sessionId must equal the credential's sessionId.
      parameters:
        - $ref: '#/components/parameters/SessionId'
        - name: locale
          in: query
          required: false
          schema:
            type: string
            enum:
              - en
              - fr
            default: en
          description: Language for the server-authored participant consent notice.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionProgressResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
        - sessionToken: []
        - inviteCredential: []
components:
  parameters:
    SessionId:
      name: sessionId
      in: path
      required: true
      schema:
        type: string
  schemas:
    SessionProgressResponse:
      type: object
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/SessionProgress'
    SessionProgress:
      type: object
      description: >-
        Token-plane projection. No tenant/workspace, no upload refs, no
        OCR/jurisdiction/fraud detail.
      required:
        - status
        - privacy_contact_email
        - consent_notice_locale
        - consent_notice_version
        - consent_notice_text
        - consent_notice_digest
        - capture_manifest
        - step_manifest
        - flow_steps
        - steps
      properties:
        status:
          $ref: '#/components/schemas/SessionStatus'
        privacy_contact_email:
          oneOf:
            - type: string
              format: email
            - type: string
              maxLength: 0
          description: >-
            Consumer-facing privacy/deletion contact for the consent notice;
            empty only for legacy/dev sessions.
        consent_notice_locale:
          type: string
          enum:
            - en
            - fr
          description: >-
            Language of the exact server-authored consent notice returned in
            this response.
        consent_notice_version:
          type: string
          description: >-
            Server-authored consent notice version shown before capture starts;
            empty only when no consent contact is configured.
        consent_notice_text:
          type: string
          description: >-
            Exact server-authored notice text that the verification page
            displays and record-consent persists; empty only when no consent
            contact is configured.
        consent_notice_digest:
          type: string
          pattern: ^(|sha256:[0-9a-f]{64})$
          description: >-
            SHA-256 receipt of the exact consent_notice_text bytes; empty only
            when the notice is empty.
        capture_manifest:
          $ref: '#/components/schemas/CaptureManifest'
        step_manifest:
          $ref: '#/components/schemas/StepManifest'
        flow_steps:
          type: array
          description: >-
            Per-step states in manifest order (v2). The legacy `steps` kind
            array is unchanged.
          items:
            $ref: '#/components/schemas/FlowStepState'
        face_match_performed:
          type: boolean
        steps:
          type: array
          items:
            type: object
            required:
              - kind
              - reserved
              - uploaded
            properties:
              kind:
                $ref: '#/components/schemas/CaptureKind'
              reserved:
                type: boolean
              uploaded:
                type: boolean
        completion:
          type: object
          additionalProperties: false
          required:
            - action
          description: >
            Optional sanitized completion capability. Present only on the
            authenticated token-plane projection for sessions created with the
            corresponding application-only override.
          properties:
            action:
              type: string
              enum:
                - close_tab
                - return_link
            return_url:
              type: string
              format: uri
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              example: idv_session_not_found
            message:
              type: string
    SessionStatus:
      type: string
      description: >
        FLOW axis only since the status split: assessment outcomes live on
        `review_status` (the gate's recommendation stays on the assessment
        block) and `assessed` replaces the legacy conflated
        approved/rejected/requires_review terminal statuses. Terminal flow
        states are assessed, failed, canceled, deleted.
      enum:
        - collecting_artifacts
        - ready_for_assessment
        - queued
        - assessing
        - assessed
        - failed
        - canceled
        - deleted
    CaptureManifest:
      type: object
      required:
        - workflow
        - required_kinds
      properties:
        workflow:
          $ref: '#/components/schemas/WorkflowLabel'
        required_kinds:
          type: array
          description: >
            Derived from the liveness/id_capture steps: skipped optional capture
            steps contribute nothing, and a declared one-sided document type
            (passport, sides=auto) drops id_back.
          items:
            $ref: '#/components/schemas/CaptureKind'
    StepManifest:
      type: object
      description: The resolved, persisted step manifest (canonical order; config echoed).
      required:
        - steps
      properties:
        steps:
          type: array
          items:
            $ref: '#/components/schemas/FlowStep'
    FlowStepState:
      type: object
      description: >
        Consumer-safe per-step progress. detail carries only capture kinds,
        answer COUNTS (never values), and manifest document ids; no
        fraud/OCR/jurisdiction data ever appears on the token plane.
      required:
        - step_id
        - type
        - required
        - state
        - detail
      properties:
        step_id:
          type: string
        type:
          $ref: '#/components/schemas/StepType'
        required:
          type: boolean
        state:
          type: string
          enum:
            - pending
            - in_progress
            - complete
            - skipped
        detail:
          type: object
          properties:
            captured_kinds:
              type: array
              items:
                $ref: '#/components/schemas/CaptureKind'
            remaining_kinds:
              type: array
              items:
                $ref: '#/components/schemas/CaptureKind'
            answered_count:
              type: integer
              minimum: 0
            question_count:
              type: integer
              minimum: 0
            uploaded_document_ids:
              type: array
              items:
                type: string
            remaining_document_ids:
              type: array
              items:
                type: string
    CaptureKind:
      type: string
      enum:
        - liveness_front
        - liveness_left
        - liveness_right
        - id_front
        - id_back
    WorkflowLabel:
      type: string
      description: >
        Derived legacy label on responses. Custom step manifests that match a
        preset's capture shape reuse the preset label; capture-free manifests
        are labeled `custom`.
      enum:
        - liveness_and_id
        - liveness_only
        - id_only
        - custom
    FlowStep:
      type: object
      required:
        - step_id
        - type
      properties:
        step_id:
          type: string
          pattern: ^[a-z0-9_-]{1,64}$
          description: Unique per session.
        type:
          $ref: '#/components/schemas/StepType'
        required:
          type: boolean
          default: true
          description: false => the consumer may skip the step.
        title:
          type: string
          minLength: 1
          maxLength: 200
          description: Optional display override.
        config:
          $ref: '#/components/schemas/StepConfig'
    StepType:
      type: string
      enum:
        - liveness
        - id_capture
        - questionnaire
        - document_upload
    StepConfig:
      type: object
      description: >-
        Type-specific step config. Only the fields for the step type are
        allowed.
      properties:
        accepted_id_types:
          type: array
          maxItems: 20
          description: >
            id_capture only. Empty/omitted = any supported built-in type plus
            any custom_id_types configured on the same step.
          items:
            $ref: '#/components/schemas/DeclarableIdType'
        custom_id_types:
          type: array
          maxItems: 20
          description: >
            id_capture only. Workflow-local document categories that can be
            referenced from accepted_id_types and declared by the applicant.
          items:
            $ref: '#/components/schemas/CustomIdType'
        sides:
          $ref: '#/components/schemas/IdCaptureSides'
        questions:
          type: array
          minItems: 1
          maxItems: 50
          description: questionnaire only.
          items:
            $ref: '#/components/schemas/Question'
        documents:
          type: array
          minItems: 1
          maxItems: 5
          description: >-
            document_upload only; the full workflow supports at most five
            documents.
          items:
            $ref: '#/components/schemas/DocumentSpec'
    DeclarableIdType:
      description: >
        Id types a consumer can declare or configure in accepted_id_types.
        Built-ins are listed explicitly; workflow-local custom ids must be
        defined in the id_capture step's custom_id_types. `unknown` is an
        inference outcome, not declarable. `passport` is the one-sided built-in
        type - declaring it drops id_back when sides=auto.
      anyOf:
        - type: string
          enum:
            - driver_license
            - government_id
            - health_card
            - passport
            - national_id
            - permanent_resident_card
            - residence_permit
            - other
        - type: string
          pattern: ^[a-z0-9_-]{1,64}$
          not:
            enum:
              - driver_license
              - government_id
              - health_card
              - passport
              - national_id
              - permanent_resident_card
              - residence_permit
              - other
              - unknown
    CustomIdType:
      type: object
      required:
        - id_type
        - label
        - sides
      properties:
        id_type:
          type: string
          pattern: ^[a-z0-9_-]{1,64}$
          description: >
            Workflow-local id type identifier. Must not match a built-in ID type
            or `unknown`; accepted_id_types can reference it only within the
            same id_capture step.
        label:
          type: string
          minLength: 1
          maxLength: 120
          description: >-
            Human-readable document type label shown to applicants and
            reviewers.
        description:
          type: string
          maxLength: 1000
          description: >
            Optional workflow-admin guidance describing the ID, authenticity
            requirements, and specific details reviewers or the assessment agent
            should inspect for this custom type.
        sides:
          type: string
          enum:
            - one_sided
            - two_sided
          description: Capture side requirement when the custom type is declared.
    IdCaptureSides:
      type: string
      description: >-
        auto adapts to the declared document type; one_sided never demands
        id_back.
      enum:
        - auto
        - two_sided
        - one_sided
      default: auto
    Question:
      type: object
      required:
        - question_id
        - label
        - type
      properties:
        question_id:
          type: string
          pattern: ^[a-z0-9_-]{1,64}$
          description: Unique within the step.
        label:
          type: string
          minLength: 1
          maxLength: 500
        type:
          $ref: '#/components/schemas/QuestionType'
        required:
          type: boolean
          default: true
        required_when:
          allOf:
            - $ref: '#/components/schemas/QuestionRequiredWhen'
          description: >-
            Mutually exclusive with required=true; required defaults to false
            when this field is present.
        visible_when:
          allOf:
            - $ref: '#/components/schemas/QuestionCondition'
          description: >
            Shows this otherwise-optional question only when the earlier,
            always-shown and required boolean question has the specified value.
            Mutually exclusive with required=true. If required_when is also
            present, both fields must contain the same condition.
        options:
          type: array
          maxItems: 50
          description: Required for select/multi_select; forbidden otherwise.
          items:
            $ref: '#/components/schemas/QuestionOption'
    DocumentSpec:
      type: object
      required:
        - document_id
        - label
      properties:
        document_id:
          type: string
          pattern: ^[a-z0-9_-]{1,64}$
          description: Unique within the full workflow.
        label:
          type: string
          minLength: 1
          maxLength: 200
        description:
          type: string
          maxLength: 1000
        accepted_content_types:
          type: array
          minItems: 1
          maxItems: 4
          uniqueItems: true
          description: Defaults to [application/pdf, image/jpeg, image/png] when omitted.
          items:
            type: string
            enum:
              - application/pdf
              - image/jpeg
              - image/png
              - image/webp
        required:
          type: boolean
          default: true
    QuestionType:
      type: string
      enum:
        - text
        - textarea
        - select
        - multi_select
        - date
        - country
        - boolean
    QuestionRequiredWhen:
      type: object
      required:
        - question_id
        - equals
      description: >
        Makes an otherwise-optional question required when an earlier,
        always-shown and unconditionally required boolean question has the
        specified value.
      properties:
        question_id:
          type: string
          pattern: ^[a-z0-9_-]{1,64}$
        equals:
          type: boolean
    QuestionCondition:
      allOf:
        - $ref: '#/components/schemas/QuestionRequiredWhen'
      description: >
        Matches an earlier, always-shown and unconditionally required boolean
        question against the specified value.
    QuestionOption:
      type: object
      required:
        - value
        - label
      properties:
        value:
          type: string
          minLength: 1
          maxLength: 128
        label:
          type: string
          minLength: 1
          maxLength: 200
  responses:
    Unauthorized:
      description: >-
        Missing or invalid credentials (uniform for token plane, no existence
        oracle)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    sessionToken:
      type: http
      scheme: bearer
      bearerFormat: opaque
      description: >-
        `Authorization: Bearer idvs_<token>`: one-time value from
        create/acquire. Header only; never a query param.
    inviteCredential:
      type: http
      scheme: bearer
      bearerFormat: opaque
      description: >-
        `Authorization: Bearer idvi_<code>`: long-lived invite credential
        emailed to the end user. Header only; never a query param.

````