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

# Get a dashboard visual-reading result



## OpenAPI

````yaml /openapi.public.json get /v1/visual-readings/jobs/{id}/result
openapi: 3.1.0
info:
  title: AstroM8 Public API
  version: 1.1.0
  description: >-
    Astrology calculations, reports, customer delivery, and enterprise
    workflows. Each operation declares whether it uses an API key or a customer
    session bearer token.
servers:
  - url: https://api.astrom8.com
    description: Production
security: []
tags:
  - name: Western
    description: Natal, relationship, return, progression, and transit calculations.
  - name: Vedic
    description: Lahiri sidereal Vedic calculations, matching, timing, and remedies.
  - name: Thai Astrology
    description: Thai calendar, auspicious timing, lunar, festival, and wheel tools.
  - name: Chinese & Korean
    description: BaZi, Qi Men Dun Jia, and Saju calculations.
  - name: Horoscopes
    description: Published daily and range horoscope content.
  - name: Reports
    description: Branded report generation and asynchronous job polling.
  - name: Tarot & Numerology
    description: Tarot spreads and Pythagorean numerology.
  - name: Uranian
    description: Uranian charts, midpoints, and planetary pictures.
  - name: Developer workflow
    description: Preflight capability eligibility and credit estimates.
  - name: Visual readings
    description: >-
      Private Palm and Face Reading upload, preflight, and asynchronous job
      workflows.
  - name: Customer reports
    description: Session-authenticated report jobs and reusable brand profiles.
  - name: Customer delivery
    description: Session-authenticated webhooks and scheduled horoscope delivery.
  - name: Customer visual readings
    description: >-
      Session-authenticated visual reading jobs, economics, and delivery
      subscriptions.
  - name: Cultural Intelligence
    description: >-
      Enterprise API-key workflows for encrypted profiles, teams, and campaign
      content.
paths:
  /v1/visual-readings/jobs/{id}/result:
    get:
      tags:
        - Customer visual readings
      summary: Get a dashboard visual-reading result
      operationId: getCustomerVisualReadingResult
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            pattern: ^vrj_[a-f0-9]{24}$
            description: Visual-reading job id.
      responses:
        '200':
          description: Source-grounded Face or Palm result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VisualReadingResult'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Job not owned by the signed-in customer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonError'
        '409':
          description: The job is not complete or has no available result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonError'
        '503':
          description: The private result artifact is unavailable or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonError'
      security:
        - SessionBearerAuth: []
components:
  schemas:
    VisualReadingResult:
      oneOf:
        - type: object
          properties:
            job_id:
              type: string
              pattern: ^vrj_[a-f0-9]{24}$
              description: Visual-reading job id.
            family:
              const: face
            locale:
              type: string
              enum:
                - th
                - en
            observations:
              type: object
              properties:
                observations:
                  type: array
                  maxItems: 8
                  items:
                    oneOf:
                      - type: object
                        properties:
                          key:
                            const: face_outline
                          value:
                            type: string
                            enum:
                              - oval
                              - round
                              - square
                              - oblong
                              - heart
                              - diamond
                              - triangular
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: forehead_proportion
                          value:
                            type: string
                            enum:
                              - narrow
                              - balanced
                              - broad
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: eyebrow_shape
                          value:
                            type: string
                            enum:
                              - straight
                              - arched
                              - angled
                              - rounded
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: eye_spacing
                          value:
                            type: string
                            enum:
                              - close
                              - balanced
                              - wide
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: nose_bridge
                          value:
                            type: string
                            enum:
                              - low
                              - medium
                              - high
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: cheekbone_visibility
                          value:
                            type: string
                            enum:
                              - subtle
                              - moderate
                              - prominent
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: lip_shape
                          value:
                            type: string
                            enum:
                              - thin
                              - balanced
                              - full
                              - bowed
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: chin_outline
                          value:
                            type: string
                            enum:
                              - rounded
                              - pointed
                              - square
                              - broad
                              - narrow
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                    - unusable
                limitations:
                  type: array
                  items:
                    type: string
                    enum:
                      - blur
                      - low_light
                      - glare
                      - shadow
                      - crop
                      - occlusion
                      - low_resolution
                      - perspective
                      - duplicate_capture
                      - wrong_subject
                      - partial_visibility
                      - asymmetrical_capture
                      - cross_model_consensus
              required:
                - observations
                - capture_quality
                - limitations
            quality:
              type: object
              properties:
                capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                coverage:
                  type: number
                  minimum: 0
                  maximum: 1
                observed_signals:
                  type: array
                  items:
                    type: string
                omitted_signals:
                  type: array
                  items:
                    type: string
                limitation_codes:
                  type: array
                  items:
                    type: string
                    enum:
                      - blur
                      - low_light
                      - glare
                      - shadow
                      - crop
                      - occlusion
                      - low_resolution
                      - perspective
                      - duplicate_capture
                      - wrong_subject
                      - partial_visibility
                      - asymmetrical_capture
                      - cross_model_consensus
              required:
                - capture_quality
                - coverage
                - observed_signals
                - omitted_signals
                - limitation_codes
            provenance:
              type: object
              properties:
                provider:
                  type: string
                model:
                  type: string
                method_version:
                  type: string
                observation_schema_version:
                  type: string
                prompt_version:
                  type: string
                rule_set_version:
                  type: string
                narrative_version:
                  type: string
                renderer_version:
                  type: string
              required:
                - provider
                - model
                - method_version
                - observation_schema_version
                - prompt_version
                - rule_set_version
                - narrative_version
                - renderer_version
            rule_hits:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  observation_key:
                    type: string
                  observation_value:
                    type: string
                  source_id:
                    type: string
                    enum:
                      - simms-physiognomy-1887
                      - cheiro-language-of-the-hand-1898
                  source_locator:
                    type: string
                    description: Page locator in the public-domain source.
                  dimension_keys:
                    type: array
                    items:
                      type: string
                  evidence_weight:
                    type: number
                    minimum: 0
                    maximum: 1
                required:
                  - id
                  - observation_key
                  - observation_value
                  - source_id
                  - source_locator
                  - dimension_keys
                  - evidence_weight
            dimensions:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                  label:
                    type: string
                  score:
                    type: integer
                    minimum: 0
                    maximum: 100
                    description: Visual-evidence coverage, not a score of the person.
                  band:
                    type: string
                    enum:
                      - insufficient_evidence
                      - limited_evidence
                      - moderate_evidence
                      - strong_evidence
                  evidence_count:
                    type: integer
                    minimum: 0
                required:
                  - key
                  - label
                  - score
                  - band
                  - evidence_count
            reading:
              type: object
              properties:
                rule_set_version:
                  type: string
                family:
                  const: face
                reading_notice:
                  type: string
                capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                cards:
                  type: array
                  items:
                    type: object
                    properties:
                      signal:
                        type: string
                      observation:
                        type: string
                      confidence:
                        type:
                          - number
                          - 'null'
                        minimum: 0
                        maximum: 1
                      framing:
                        type: string
                    required:
                      - signal
                      - observation
                      - confidence
                      - framing
                rule_hits:
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                      observation_key:
                        type: string
                      observation_value:
                        type: string
                      source_id:
                        type: string
                        enum:
                          - simms-physiognomy-1887
                          - cheiro-language-of-the-hand-1898
                      source_locator:
                        type: string
                        description: Page locator in the public-domain source.
                      dimension_keys:
                        type: array
                        items:
                          type: string
                      evidence_weight:
                        type: number
                        minimum: 0
                        maximum: 1
                    required:
                      - id
                      - observation_key
                      - observation_value
                      - source_id
                      - source_locator
                      - dimension_keys
                      - evidence_weight
                dimensions:
                  type: array
                  items:
                    type: object
                    properties:
                      key:
                        type: string
                      label:
                        type: string
                      score:
                        type: integer
                        minimum: 0
                        maximum: 100
                        description: Visual-evidence coverage, not a score of the person.
                      band:
                        type: string
                        enum:
                          - insufficient_evidence
                          - limited_evidence
                          - moderate_evidence
                          - strong_evidence
                      evidence_count:
                        type: integer
                        minimum: 0
                    required:
                      - key
                      - label
                      - score
                      - band
                      - evidence_count
                limitations:
                  type: array
                  items:
                    type: string
              required:
                - rule_set_version
                - family
                - reading_notice
                - capture_quality
                - cards
                - rule_hits
                - dimensions
                - limitations
            narrative:
              type: object
              properties:
                narrative_version:
                  type: string
                grounded_rule_ids:
                  type: array
                  items:
                    type: string
                paragraphs:
                  type: array
                  minItems: 1
                  items:
                    type: string
              required:
                - narrative_version
                - grounded_rule_ids
                - paragraphs
          required:
            - job_id
            - family
            - locale
            - observations
            - quality
            - provenance
            - rule_hits
            - dimensions
            - reading
            - narrative
        - type: object
          properties:
            job_id:
              type: string
              pattern: ^vrj_[a-f0-9]{24}$
              description: Visual-reading job id.
            family:
              const: palm
            locale:
              type: string
              enum:
                - th
                - en
            observations:
              type: object
              properties:
                observations:
                  type: array
                  maxItems: 50
                  description: >-
                    Up to 50 orthogonal left/right Palm signals. A category is
                    valid only for its specific observation key.
                  items:
                    oneOf:
                      - type: object
                        properties:
                          key:
                            const: left_hand_shape
                          value:
                            type: string
                            enum:
                              - square
                              - rectangular
                              - broad
                              - narrow
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_finger_proportion
                          value:
                            type: string
                            enum:
                              - short
                              - balanced
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_thumb_openness
                          value:
                            type: string
                            enum:
                              - close
                              - moderate
                              - open
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_mount_balance
                          value:
                            type: string
                            enum:
                              - low
                              - balanced
                              - prominent
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_secondary_line_visibility
                          value:
                            type: string
                            enum:
                              - not_visible
                              - limited
                              - clear
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_life_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_life_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_life_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_life_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_life_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_head_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_head_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_head_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_head_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_head_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_heart_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_heart_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_heart_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_heart_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_heart_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_fate_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_fate_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_fate_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_fate_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: left_fate_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_hand_shape
                          value:
                            type: string
                            enum:
                              - square
                              - rectangular
                              - broad
                              - narrow
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_finger_proportion
                          value:
                            type: string
                            enum:
                              - short
                              - balanced
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_thumb_openness
                          value:
                            type: string
                            enum:
                              - close
                              - moderate
                              - open
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_mount_balance
                          value:
                            type: string
                            enum:
                              - low
                              - balanced
                              - prominent
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_secondary_line_visibility
                          value:
                            type: string
                            enum:
                              - not_visible
                              - limited
                              - clear
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_life_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_life_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_life_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_life_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_life_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_head_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_head_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_head_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_head_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_head_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_heart_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_heart_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_heart_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_heart_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_heart_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_fate_line_depth
                          value:
                            type: string
                            enum:
                              - not_visible
                              - faint
                              - clear
                              - deep
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_fate_line_length
                          value:
                            type: string
                            enum:
                              - not_visible
                              - short
                              - medium
                              - long
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_fate_line_path
                          value:
                            type: string
                            enum:
                              - not_visible
                              - straight
                              - curved
                              - sweeping
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_fate_line_continuity
                          value:
                            type: string
                            enum:
                              - not_visible
                              - continuous
                              - chained
                              - broken
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                      - type: object
                        properties:
                          key:
                            const: right_fate_line_ending
                          value:
                            type: string
                            enum:
                              - not_visible
                              - single
                              - forked
                              - double
                          visible:
                            const: true
                          confidence:
                            type: number
                            minimum: 0
                            maximum: 1
                        required:
                          - key
                          - value
                          - visible
                left_capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                    - unusable
                right_capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                    - unusable
                limitations:
                  type: array
                  items:
                    type: string
                    enum:
                      - blur
                      - low_light
                      - glare
                      - shadow
                      - crop
                      - occlusion
                      - low_resolution
                      - perspective
                      - duplicate_capture
                      - wrong_subject
                      - partial_visibility
                      - asymmetrical_capture
                      - cross_model_consensus
              required:
                - observations
                - left_capture_quality
                - right_capture_quality
                - limitations
            capture:
              type: object
              properties:
                dominant_hand:
                  type: string
                  enum:
                    - left
                    - right
                capture_handedness:
                  type: object
                  properties:
                    left_upload:
                      const: left
                    right_upload:
                      const: right
                    mirrored_preview:
                      type: boolean
                  required:
                    - left_upload
                    - right_upload
                    - mirrored_preview
              required:
                - dominant_hand
                - capture_handedness
            quality:
              type: object
              properties:
                capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                coverage:
                  type: number
                  minimum: 0
                  maximum: 1
                observed_signals:
                  type: array
                  items:
                    type: string
                omitted_signals:
                  type: array
                  items:
                    type: string
                limitation_codes:
                  type: array
                  items:
                    type: string
                    enum:
                      - blur
                      - low_light
                      - glare
                      - shadow
                      - crop
                      - occlusion
                      - low_resolution
                      - perspective
                      - duplicate_capture
                      - wrong_subject
                      - partial_visibility
                      - asymmetrical_capture
                      - cross_model_consensus
              required:
                - capture_quality
                - coverage
                - observed_signals
                - omitted_signals
                - limitation_codes
            provenance:
              type: object
              properties:
                provider:
                  type: string
                model:
                  type: string
                method_version:
                  type: string
                observation_schema_version:
                  type: string
                prompt_version:
                  type: string
                rule_set_version:
                  type: string
                narrative_version:
                  type: string
                renderer_version:
                  type: string
              required:
                - provider
                - model
                - method_version
                - observation_schema_version
                - prompt_version
                - rule_set_version
                - narrative_version
                - renderer_version
            rule_hits:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  observation_key:
                    type: string
                  observation_value:
                    type: string
                  source_id:
                    type: string
                    enum:
                      - simms-physiognomy-1887
                      - cheiro-language-of-the-hand-1898
                  source_locator:
                    type: string
                    description: Page locator in the public-domain source.
                  dimension_keys:
                    type: array
                    items:
                      type: string
                  evidence_weight:
                    type: number
                    minimum: 0
                    maximum: 1
                required:
                  - id
                  - observation_key
                  - observation_value
                  - source_id
                  - source_locator
                  - dimension_keys
                  - evidence_weight
            dimensions:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                  label:
                    type: string
                  score:
                    type: integer
                    minimum: 0
                    maximum: 100
                    description: Visual-evidence coverage, not a score of the person.
                  band:
                    type: string
                    enum:
                      - insufficient_evidence
                      - limited_evidence
                      - moderate_evidence
                      - strong_evidence
                  evidence_count:
                    type: integer
                    minimum: 0
                required:
                  - key
                  - label
                  - score
                  - band
                  - evidence_count
            reading:
              type: object
              properties:
                rule_set_version:
                  type: string
                family:
                  const: palm
                reading_notice:
                  type: string
                capture_quality:
                  type: string
                  enum:
                    - usable
                    - limited
                cards:
                  type: array
                  items:
                    type: object
                    properties:
                      signal:
                        type: string
                      observation:
                        type: string
                      confidence:
                        type:
                          - number
                          - 'null'
                        minimum: 0
                        maximum: 1
                      framing:
                        type: string
                    required:
                      - signal
                      - observation
                      - confidence
                      - framing
                rule_hits:
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                      observation_key:
                        type: string
                      observation_value:
                        type: string
                      source_id:
                        type: string
                        enum:
                          - simms-physiognomy-1887
                          - cheiro-language-of-the-hand-1898
                      source_locator:
                        type: string
                        description: Page locator in the public-domain source.
                      dimension_keys:
                        type: array
                        items:
                          type: string
                      evidence_weight:
                        type: number
                        minimum: 0
                        maximum: 1
                    required:
                      - id
                      - observation_key
                      - observation_value
                      - source_id
                      - source_locator
                      - dimension_keys
                      - evidence_weight
                dimensions:
                  type: array
                  items:
                    type: object
                    properties:
                      key:
                        type: string
                      label:
                        type: string
                      score:
                        type: integer
                        minimum: 0
                        maximum: 100
                        description: Visual-evidence coverage, not a score of the person.
                      band:
                        type: string
                        enum:
                          - insufficient_evidence
                          - limited_evidence
                          - moderate_evidence
                          - strong_evidence
                      evidence_count:
                        type: integer
                        minimum: 0
                    required:
                      - key
                      - label
                      - score
                      - band
                      - evidence_count
                limitations:
                  type: array
                  items:
                    type: string
              required:
                - rule_set_version
                - family
                - reading_notice
                - capture_quality
                - cards
                - rule_hits
                - dimensions
                - limitations
            narrative:
              type: object
              properties:
                narrative_version:
                  type: string
                grounded_rule_ids:
                  type: array
                  items:
                    type: string
                paragraphs:
                  type: array
                  minItems: 1
                  items:
                    type: string
              required:
                - narrative_version
                - grounded_rule_ids
                - paragraphs
          required:
            - job_id
            - family
            - locale
            - observations
            - capture
            - quality
            - provenance
            - rule_hits
            - dimensions
            - reading
            - narrative
      discriminator:
        propertyName: family
      description: >-
        Canonical source-grounded visual reading. Dimension scores measure
        evidence coverage only.
    JsonError:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: >-
            Stable slug (e.g. unauthorized, payment_required,
            internal_server_error).
        message:
          type: string
          description: Human-readable message safe for clients.
        code:
          type: string
          description: Optional provider-specific code.
        request_id:
          type: string
          description: Correlation id when middleware sets it.
  responses:
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/JsonError'
          example:
            error: unauthorized
            message: Invalid API key
            code: '401'
            request_id: 01HQXYZ...
  securitySchemes:
    SessionBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: astrom8_sess_*
      description: >-
        Customer session token returned by /auth/login. This is distinct from an
        API key.

````