{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/openephemeris-com/json-schema/openephemeris-com-natal-chart-enhanced-response-schema.json",
  "title": "NatalChartEnhancedResponse",
  "description": "Enhanced natal chart response with additional calculations.\n\nAdjusted to match test expectations: aspects as a list, optional aspect_matrix,\npermissive calculation_metadata, and chart_type echo.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/openephemeris-com-openapi.json#/components/schemas/NatalChartEnhancedResponse",
  "additionalProperties": true,
  "properties": {
    "angles": {
      "allOf": [
        {
          "$ref": "#/$defs/AnglesResponse"
        }
      ],
      "description": "Chart angles. Present on every response EXCEPT when configuration.coordinate_system is heliocentric or barycentric: with no observer on Earth there is no horizon, hence no Ascendant or Midheaven, and the key is omitted rather than zeroed.",
      "x-oe-absent-when-coordinate-system": [
        "heliocentric",
        "barycentric"
      ]
    },
    "arabic_parts": {
      "$ref": "#/$defs/ArabicPartsResponse",
      "description": "Arabic parts payload"
    },
    "aspect_matrix": {
      "$ref": "#/$defs/AspectMatrixResponse",
      "description": "Aspect matrix summary"
    },
    "aspect_patterns": {
      "anyOf": [
        {
          "items": {
            "$ref": "#/$defs/AspectPattern"
          },
          "type": "array"
        }
      ],
      "description": "Detected aspect patterns (Grand Trine, T-Square, Yod, Kite, Stellium, Grand Cross)",
      "title": "Aspect Patterns"
    },
    "aspect_perfection": {
      "$ref": "#/$defs/AspectPerfection"
    },
    "aspects": {
      "description": "Enhanced aspects list",
      "items": {
        "$ref": "#/$defs/EnhancedAspectResponse"
      },
      "title": "Aspects",
      "type": "array"
    },
    "calculation_metadata": {
      "allOf": [
        {
          "$ref": "#/$defs/CalculationMetadata"
        }
      ],
      "description": "Calculation metadata"
    },
    "chart_type": {
      "anyOf": [
        {
          "type": "string"
        }
      ],
      "description": "Chart type identifier",
      "title": "Chart Type"
    },
    "declination_aspects": {
      "anyOf": [
        {
          "items": {
            "$ref": "#/$defs/DeclinationAspect"
          },
          "type": "array"
        }
      ],
      "description": "Declination-based aspects",
      "title": "Declination Aspects"
    },
    "element_balance": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "number"
          },
          "type": "object"
        }
      ],
      "description": "Elemental balance",
      "title": "Element Balance"
    },
    "elongations": {
      "anyOf": [
        {
          "type": "object"
        }
      ],
      "description": "Sun-relative elongations (per-body separation and signed east/west delta) (opt-in).",
      "title": "Elongations"
    },
    "fixed_stars": {
      "$ref": "#/$defs/FixedStarsResponse",
      "description": "Fixed star data"
    },
    "gauquelin_sectors": {
      "$ref": "#/$defs/GauquelinSectors"
    },
    "harmonics": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "object"
          },
          "type": "object"
        }
      ],
      "description": "Harmonic chart positions keyed by harmonic number",
      "title": "Harmonics"
    },
    "hemisphere_emphasis": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "number"
          },
          "type": "object"
        }
      ],
      "description": "Hemisphere weights",
      "title": "Hemisphere Emphasis"
    },
    "houses": {
      "allOf": [
        {
          "$ref": "#/$defs/HousesResponse"
        }
      ],
      "description": "House information. Present on every response EXCEPT when configuration.coordinate_system is heliocentric or barycentric (no horizon, no houses); the key is then omitted rather than emptied.",
      "x-oe-absent-when-coordinate-system": [
        "heliocentric",
        "barycentric"
      ]
    },
    "human_design_gates": {
      "anyOf": [
        {
          "type": "object"
        }
      ],
      "description": "Human Design / I Ching gate + line mappings from ecliptic longitude (math-only; includes mapping version) (opt-in).",
      "title": "Human Design Gates"
    },
    "lunar_phase": {
      "anyOf": [
        {
          "type": "object"
        }
      ],
      "description": "Lunar phase context (phase name, illumination, phase angle, waxing/waning, days-to-new/full) (opt-in).",
      "title": "Lunar Phase"
    },
    "midpoints": {
      "anyOf": [
        {
          "items": {
            "type": "object"
          },
          "type": "array"
        }
      ],
      "description": "Calculated midpoints between planet pairs",
      "title": "Midpoints"
    },
    "omitted_bodies": {
      "description": "Bodies that were requested (or are in the chosen object_set/asteroid_groups) but not computed because the chart date is outside the span of their own JPL kernel. Absent when nothing was omitted. Each entry carries the body's valid_from/valid_to. Applies to the bodies that have a per-body kernel (the centaurs, trans-Neptunian objects and extended asteroids: 1600-2200 CE); the planets, nodes and sb441 main-belt asteroids cover 1550-2650 and a date outside that is rejected outright.",
      "items": {
        "$ref": "#/$defs/OmittedBody"
      },
      "title": "Omitted Bodies",
      "type": [
        "array",
        "null"
      ]
    },
    "patterns_by_type": {
      "anyOf": [
        {
          "additionalProperties": {
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "type": "object"
        }
      ],
      "description": "Patterns organized by type for easier filtering",
      "title": "Patterns By Type"
    },
    "planets": {
      "additionalProperties": {
        "$ref": "#/$defs/PlanetResponse"
      },
      "description": "Planetary positions keyed by name",
      "title": "Planets",
      "type": "object"
    },
    "sect_determination": {
      "$ref": "#/$defs/SectDeterminationResponse",
      "description": "Sect analysis"
    },
    "solar_relationships": {
      "anyOf": [
        {
          "type": "object"
        }
      ],
      "description": "Solar relationship / visibility classifications (e.g., cazimi/combust/under-beams) and Mercury/Venus morning/evening star context.",
      "title": "Solar Relationships"
    },
    "subject": {
      "allOf": [
        {
          "$ref": "#/$defs/SubjectResponse"
        }
      ],
      "description": "Subject information"
    },
    "success": {
      "default": true,
      "description": "Response success status",
      "title": "Success",
      "type": "boolean"
    },
    "traditional_points": {
      "additionalProperties": true,
      "description": "Present on /ephemeris/natal-chart when traditional_points asks for it (never on the comparative routes that reuse this schema). almuten_figuris {points (the five places: sun, moon, ascendant, lot_of_fortune, prenatal_syzygy with its kind and instant), scores (per planet: total and, per point, domicile 5, exaltation 4, triplicity 3, term 2 (Egyptian, Ptolemy), face 1 (Chaldean)), winners (several on a tie), conventions}; hayz (the seven planets: planet_sect, planet_gender, above_horizon, sign_gender, halb, hayz, and mercury_phase for Mercury; Al-Biruni's rule); lunar_mansions {moon: {number 1-28, id, name_ar, transliteration, meaning, degrees_in}, mansion_width_deg, zodiac (28 equal mansions from 0 Aries of the chart's zodiac: tropical by default, as Picatrix and Agrippa)}.",
      "type": "object"
    },
    "visual": {
      "$ref": "#/$defs/VisualResult",
      "description": "Inline chart wheel visual, present only when include_visual=true was requested."
    },
    "void_of_course": {
      "anyOf": [
        {
          "type": "object"
        }
      ],
      "description": "Void-of-Course Moon context (status, start/end window, last major aspect, sign context) (opt-in).",
      "title": "Void Of Course"
    }
  },
  "required": [
    "subject",
    "planets",
    "houses",
    "angles",
    "calculation_metadata"
  ],
  "type": "object",
  "$defs": {
    "AccidentalDignityInfo": {
      "additionalProperties": false,
      "description": "Accidental dignity information for a body (tags-only).",
      "properties": {
        "tags": {
          "description": "Accidental dignity tags (planets-only).",
          "items": {
            "type": "string"
          },
          "title": "Tags",
          "type": "array"
        }
      },
      "title": "AccidentalDignityInfo",
      "type": "object"
    },
    "AnglesResponse": {
      "additionalProperties": true,
      "description": "Chart angles data in response.",
      "properties": {
        "ascendant": {
          "description": "Ascendant longitude in degrees",
          "title": "Ascendant",
          "type": "number"
        },
        "descendant": {
          "description": "Descendant longitude in degrees",
          "title": "Descendant",
          "type": "number"
        },
        "imum_coeli": {
          "description": "Imum Coeli longitude in degrees",
          "title": "Imum Coeli",
          "type": "number"
        },
        "midheaven": {
          "description": "Midheaven longitude in degrees",
          "title": "Midheaven",
          "type": "number"
        }
      },
      "required": [
        "ascendant",
        "midheaven",
        "descendant",
        "imum_coeli"
      ],
      "title": "AnglesResponse",
      "type": "object"
    },
    "ArabicPartResponse": {
      "description": "Individual Arabic part calculation.",
      "properties": {
        "canonical_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Original Arabic part identifier (without lot_ prefix)",
          "title": "Canonical Name"
        },
        "custom": {
          "description": "True for a lot from custom_lots.",
          "type": "boolean"
        },
        "degree_symbol": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Degree display",
          "title": "Degree Symbol"
        },
        "display_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Human-friendly display name",
          "title": "Display Name"
        },
        "formula_used": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Which formula variation was executed",
          "title": "Formula Used"
        },
        "house": {
          "anyOf": [
            {
              "type": "integer"
            }
          ],
          "description": "House position (1-12)",
          "title": "House"
        },
        "longitude": {
          "description": "Longitude in degrees",
          "title": "Longitude",
          "type": "number"
        },
        "name": {
          "description": "Arabic part registry key",
          "title": "Name",
          "type": "string"
        },
        "sign": {
          "description": "Zodiac sign",
          "title": "Sign",
          "type": "string"
        },
        "sign_longitude": {
          "description": "Longitude within sign",
          "title": "Sign Longitude",
          "type": "number"
        },
        "symbol": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Traditional symbol",
          "title": "Symbol"
        }
      },
      "required": [
        "name",
        "longitude",
        "sign",
        "sign_longitude"
      ],
      "title": "ArabicPartResponse",
      "type": "object"
    },
    "ArabicPartsResponse": {
      "additionalProperties": false,
      "description": "Canonical Arabic parts payload for enhanced responses.",
      "properties": {
        "arabic_parts": {
          "additionalProperties": {
            "$ref": "#/$defs/ArabicPartResponse"
          },
          "description": "Arabic parts keyed by registry name",
          "title": "Arabic Parts",
          "type": "object"
        },
        "calculation_time_ms": {
          "description": "Computation time in milliseconds",
          "title": "Calculation Time Ms",
          "type": "number"
        },
        "formulas_used": {
          "description": "Ordered list of formulas executed",
          "items": {
            "type": "string"
          },
          "title": "Formulas Used",
          "type": "array"
        },
        "hermetic_lot_names": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Sorted subset of arabic part keys that map to canonical Hermetic lots",
          "title": "Hermetic Lot Names"
        },
        "sect_determination": {
          "description": "Sect analysis metadata used for formula selection",
          "title": "Sect Determination",
          "type": "object"
        },
        "total_parts_calculated": {
          "description": "Number of parts returned",
          "title": "Total Parts Calculated",
          "type": "integer"
        }
      },
      "required": [
        "arabic_parts",
        "sect_determination",
        "formulas_used",
        "calculation_time_ms",
        "total_parts_calculated"
      ],
      "title": "ArabicPartsResponse",
      "type": "object"
    },
    "AspectMatrixResponse": {
      "additionalProperties": true,
      "description": "Complete aspect matrix for all planetary pairs.\n\nRelaxed to allow additional performance fields provided by enhanced calculator.",
      "properties": {
        "aspect_counts": {
          "anyOf": [
            {
              "additionalProperties": {
                "type": "integer"
              },
              "type": "object"
            }
          ],
          "description": "Count by aspect type",
          "title": "Aspect Counts"
        },
        "aspects": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/AspectResponse"
              },
              "type": "array"
            }
          ],
          "description": "All aspects found",
          "title": "Aspects"
        },
        "calculation_time_ms": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Calculation time in ms",
          "title": "Calculation Time Ms"
        },
        "major_aspects": {
          "anyOf": [
            {
              "type": "integer"
            }
          ],
          "description": "Major aspect count",
          "title": "Major Aspects"
        },
        "matrix": {
          "anyOf": [
            {
              "additionalProperties": {
                "additionalProperties": {
                  "$ref": "#/$defs/AspectResponse"
                },
                "type": "object"
              },
              "type": "object"
            }
          ],
          "description": "Matrix format of aspects",
          "title": "Matrix"
        },
        "minor_aspects": {
          "anyOf": [
            {
              "type": "integer"
            }
          ],
          "description": "Minor aspect count",
          "title": "Minor Aspects"
        },
        "orb_config_used": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Orb configuration used",
          "title": "Orb Config Used"
        },
        "patterns": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/AspectPattern"
              },
              "type": "array"
            }
          ],
          "description": "Identified aspect patterns",
          "title": "Patterns"
        },
        "total_aspects": {
          "anyOf": [
            {
              "type": "integer"
            }
          ],
          "description": "Total number of aspects",
          "title": "Total Aspects"
        }
      },
      "title": "AspectMatrixResponse",
      "type": "object"
    },
    "AspectPattern": {
      "additionalProperties": false,
      "description": "Identified aspect pattern.",
      "properties": {
        "aspects": {
          "description": "Aspects forming the pattern",
          "items": {
            "type": "string"
          },
          "title": "Aspects",
          "type": "array"
        },
        "complete": {
          "description": "Is pattern complete",
          "title": "Complete",
          "type": "boolean"
        },
        "orb_tolerance": {
          "description": "Maximum orb in pattern",
          "title": "Orb Tolerance",
          "type": "number"
        },
        "pattern_type": {
          "description": "Pattern type (T-square, Grand Trine, etc.)",
          "title": "Pattern Type",
          "type": "string"
        },
        "planets": {
          "description": "Planets involved",
          "items": {
            "type": "string"
          },
          "title": "Planets",
          "type": "array"
        },
        "strength": {
          "description": "Pattern strength (0-1)",
          "title": "Strength",
          "type": "number"
        }
      },
      "required": [
        "pattern_type",
        "planets",
        "aspects",
        "strength",
        "orb_tolerance",
        "complete"
      ],
      "title": "AspectPattern",
      "type": "object"
    },
    "AspectPerfection": {
      "description": "Exact perfection instant of every natal aspect (#1173).",
      "properties": {
        "aspects": {
          "items": {
            "$ref": "#/$defs/AspectPerfectionRow"
          },
          "type": "array"
        },
        "timezone": {
          "type": "string"
        },
        "window_days": {
          "format": "double",
          "type": "number"
        }
      },
      "type": "object"
    },
    "AspectPerfectionRow": {
      "properties": {
        "angle": {
          "format": "double",
          "type": "number"
        },
        "aspect": {
          "type": "string"
        },
        "body1": {
          "type": "string"
        },
        "body1_id": {
          "type": "integer"
        },
        "body2": {
          "type": "string"
        },
        "body2_id": {
          "type": "integer"
        },
        "exact": {
          "description": "The instant the aspect is exact, in the birthplace offset; null when not within 3 years.",
          "format": "date-time",
          "type": [
            "string",
            "null"
          ]
        },
        "minutes_from_birth": {
          "description": "Negative: perfected before birth (separating). Positive: perfects after birth (applying).",
          "format": "double",
          "type": [
            "number",
            "null"
          ]
        },
        "orb_at_birth": {
          "format": "double",
          "type": "number"
        },
        "perfects": {
          "description": "before_birth, after_birth or not_within_window.",
          "type": "string"
        }
      },
      "required": [
        "body1",
        "body1_id",
        "body2",
        "body2_id",
        "aspect",
        "angle",
        "perfects"
      ],
      "type": "object"
    },
    "AspectResponse": {
      "additionalProperties": true,
      "description": "Individual aspect information (legacy format).",
      "properties": {
        "angle": {
          "description": "Aspect angle in degrees",
          "title": "Angle",
          "type": "number"
        },
        "applying": {
          "description": "Is aspect applying",
          "title": "Applying",
          "type": "boolean"
        },
        "aspect": {
          "description": "Aspect name",
          "title": "Aspect",
          "type": "string"
        },
        "object1": {
          "description": "First object name",
          "title": "Object1",
          "type": "string"
        },
        "object2": {
          "description": "Second object name",
          "title": "Object2",
          "type": "string"
        },
        "orb": {
          "description": "Orb in degrees",
          "title": "Orb",
          "type": "number"
        }
      },
      "required": [
        "object1",
        "object2",
        "aspect",
        "angle",
        "orb",
        "applying"
      ],
      "title": "AspectResponse",
      "type": "object"
    },
    "AyanamsaEnum": {
      "description": "Supported sidereal ayanamsa options (krishnamurti is KP old, krishnamurti_vp291 KP new). All six are computed from the same IAU 2006 general-precession model, so each is epoch-dependent rather than a frozen constant; they differ by up to ~2.3 degrees, which is enough to move a body across a sign boundary. Defaults to lahiri when zodiac_type is sidereal and no system is named.",
      "enum": [
        "lahiri",
        "fagan_bradley",
        "krishnamurti",
        "krishnamurti_vp291",
        "raman",
        "yukteshwar"
      ],
      "title": "AyanamsaEnum",
      "type": "string"
    },
    "CalculationMetadata": {
      "additionalProperties": true,
      "description": "Metadata about chart calculations.\n\nRelaxed to allow minimal fields used by tests while remaining forward-compatible.",
      "properties": {
        "ascendant_on_left": {
          "default": true,
          "description": "When true (default), the Ascendant is placed at the 9 o'clock (West/left) position � matching the convention used by Astro.com, Solar Fire, and all major astrology software. Set to false to use the ecliptic-fixed (Aries-pinned) orientation instead.",
          "title": "Ascendant on Left",
          "type": [
            "boolean",
            "null"
          ]
        },
        "ayanamsa": {
          "anyOf": [
            {
              "$ref": "#/$defs/AyanamsaEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Sidereal ayanamsa selection",
          "title": "Ayanamsa"
        },
        "calculation_time": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Legacy calculation time in seconds",
          "title": "Calculation Time"
        },
        "calculation_time_ms": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Processing time at the orchestrator layer in milliseconds",
          "title": "Calculation Time Ms"
        },
        "calculation_time_utc": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            }
          ],
          "description": "UTC timestamp when the calculation executed",
          "title": "Calculation Time Utc"
        },
        "coordinate_reference_frame": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Coordinate frame the positions are expressed in, always the TRUE ecliptic of date: geocentric_true_ecliptic_of_date (apparent place from the Earth's centre), topocentric_true_ecliptic_of_date (apparent place from the observer, with diurnal parallax and aberration; geometric, no refraction, observer height 0), heliocentric_true_ecliptic_of_date and barycentric_true_ecliptic_of_date (light-time-corrected astrometric place from the Sun's centre / the solar-system barycentre: no aberration, no gravitational deflection; target sampled at t minus light time, origin at t). The label names the frame that was computed; a response never claims one it did not use.",
          "title": "Coordinate Reference Frame"
        },
        "coordinate_system": {
          "anyOf": [
            {
              "$ref": "#/$defs/CoordinateSystemEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Coordinate system the positions were computed in: geocentric, topocentric, heliocentric or barycentric.",
          "title": "Coordinate System"
        },
        "delta_t_seconds": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Delta T (TT - UT1) applied during calculation, in seconds",
          "title": "Delta T Seconds"
        },
        "delta_t_source": {
          "anyOf": [
            {
              "$ref": "#/$defs/DeltaTSourceEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Source of Delta T values (computation engine, IERS, approximation)",
          "title": "Delta T Source"
        },
        "ephemeris_source": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Primary ephemeris source (e.g., SuperNOVAS / Calceph)",
          "title": "Ephemeris Source"
        },
        "ephemeris_version": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Version of the ephemeris data files",
          "title": "Ephemeris Version"
        },
        "fixed_star_catalog": {
          "anyOf": [
            {
              "$ref": "#/$defs/FixedStarCatalogEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Fixed star catalog or subset identifier",
          "title": "Fixed Star Catalog"
        },
        "house_system": {
          "anyOf": [
            {
              "$ref": "#/$defs/HouseSystemEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "House system actually used during calculation",
          "title": "House System"
        },
        "include_fixed_stars": {
          "anyOf": [
            {
              "type": "boolean"
            }
          ],
          "description": "Whether fixed stars were included",
          "title": "Include Fixed Stars"
        },
        "julian_day": {
          "anyOf": [
            {
              "format": "double",
              "type": "number"
            }
          ],
          "description": "Julian Day Number representing the calculation instant",
          "title": "Julian Day"
        },
        "lunar_nodes": {
          "additionalProperties": {
            "type": "object"
          },
          "description": "How each lunar node and apogee body in this response was computed, keyed by the body's name in the planets block (e.g. \"North Node (True)\"). Each entry carries `method` (`mean` or `true_osculating`) and `algorithm`; the true node also carries `frame` and `matches` (the Swiss Ephemeris equivalent), and a South Node carries `derived_from` and `offset`. Only bodies actually present in the response appear. Authoritative per body: when both nodes are returned, `node_source` alone cannot say which is which.",
          "title": "Lunar Nodes",
          "type": "object"
        },
        "missing_objects": {
          "anyOf": [
            {
              "additionalProperties": {
                "items": {
                  "type": "object"
                },
                "type": "array"
              },
              "type": "object"
            }
          ],
          "description": "Objects that could not be calculated along with reasons",
          "title": "Missing Objects"
        },
        "node_source": {
          "anyOf": [
            {
              "$ref": "#/$defs/NodeSourceEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Lunar node/apsides mode in effect. Echoes `configuration.node_source` when the request sent one (it also selects the Lilith variant). Otherwise names the nodes the response carries: `mean`, `true_osculating`, or `mean_and_true_osculating` for the default roster, which returns both North Nodes. Omitted when the response carries no lunar node. See `lunar_nodes` for the per-body method.",
          "title": "Node Source"
        },
        "object_set": {
          "anyOf": [
            {
              "$ref": "#/$defs/ObjectSetEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Named object set or preset powering the calculation",
          "title": "Object Set"
        },
        "orb_system_used": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Aspect orb system applied",
          "title": "Orb System Used"
        },
        "precision_level": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Legacy precision descriptor",
          "title": "Precision Level"
        },
        "precision_summary": {
          "$ref": "#/$defs/PrecisionSummary",
          "description": "Structured precision summary aligned with validation results"
        },
        "processing_time_ms": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "End-to-end processing time in milliseconds",
          "title": "Processing Time Ms"
        },
        "server_version": {
          "description": "Build identifier of the engine that produced this response. Moves on every deploy, so it is the signal for resolution-LOGIC changes — the class of change that can move a historical offset without touching overlay data (and therefore without moving tz_overlay_version). Poll both.",
          "title": "Server Version",
          "type": "string"
        },
        "sidereal_time": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Local sidereal time in hours",
          "title": "Sidereal Time"
        },
        "technique_id": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "High-level technique identifier (e.g., natal, synastry, composite, overlay)",
          "title": "Technique Id"
        },
        "technique_label": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Human-readable technique label",
          "title": "Technique Label"
        },
        "technique_method": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Method name within a technique (e.g., davidson, midpoint)",
          "title": "Technique Method"
        },
        "technique_version": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Technique implementation version (for future-proofing)",
          "title": "Technique Version"
        },
        "time_scale": {
          "anyOf": [
            {
              "$ref": "#/$defs/TimeScaleEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Time scale used for internal calculations (UTC, TT, TDB)",
          "title": "Time Scale"
        },
        "tz_overlay_hash": {
          "description": "Content hash of the historical-correction overlay dataset that produced this answer. Stamped only when an overlay row applied (tz_rule_source starts with 'overlay:').",
          "title": "Tz Overlay Hash",
          "type": "string"
        },
        "tz_overlay_version": {
          "description": "Monotonic version of the historical-correction overlay dataset that produced this answer. Stamped only when an overlay row applied. Tracks overlay DATA only — pair with server_version to also catch resolution-logic changes.",
          "title": "Tz Overlay Version",
          "type": "integer"
        },
        "tz_precision": {
          "description": "Sourcing grade of the overlay row that produced the offset: 'statutory' (operative text of a session law or statute verified), 'documented' (contemporary reporting), or 'inferred' (deduced from legal context; verify before relying on it near the row's edges). Stamped only when an overlay row applied.",
          "enum": [
            "statutory",
            "documented",
            "inferred"
          ],
          "title": "Tz Precision",
          "type": "string"
        },
        "tz_rule_citation": {
          "description": "Primary-source citation for the overlay row that produced the offset — statute reference, ICC/agency order number, or documented press/almanac source. Stamped only when an overlay row applied.",
          "title": "Tz Rule Citation",
          "type": "string"
        },
        "zodiac_type": {
          "anyOf": [
            {
              "$ref": "#/$defs/ZodiacTypeEnum"
            },
            {
              "type": "string"
            }
          ],
          "description": "Zodiac framework applied (tropical/sidereal)",
          "title": "Zodiac Type"
        }
      },
      "title": "CalculationMetadata",
      "type": "object"
    },
    "CoordinateSystemEnum": {
      "description": "Coordinate system used for calculations.",
      "enum": [
        "geocentric",
        "topocentric",
        "heliocentric",
        "barycentric"
      ],
      "title": "CoordinateSystemEnum",
      "type": "string"
    },
    "DeclinationAspect": {
      "additionalProperties": false,
      "description": "Declination-based aspect between two bodies.",
      "properties": {
        "applying": {
          "description": "Whether aspect is applying",
          "title": "Applying",
          "type": "boolean"
        },
        "body1": {
          "description": "First body name",
          "title": "Body1",
          "type": "string"
        },
        "body2": {
          "description": "Second body name",
          "title": "Body2",
          "type": "string"
        },
        "declination1": {
          "description": "First body declination",
          "title": "Declination1",
          "type": "number"
        },
        "declination2": {
          "description": "Second body declination",
          "title": "Declination2",
          "type": "number"
        },
        "orb": {
          "description": "Orb difference in degrees",
          "title": "Orb",
          "type": "number"
        },
        "type": {
          "description": "Aspect type",
          "pattern": "^(parallel|contraparallel)$",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "body1",
        "body2",
        "type",
        "declination1",
        "declination2",
        "orb",
        "applying"
      ],
      "title": "DeclinationAspect",
      "type": "object"
    },
    "DeltaTSourceEnum": {
      "description": "Source of ΔT values used in calculations.",
      "enum": [
        "nasa_jpl",
        "iers",
        "approximation_model"
      ],
      "title": "DeltaTSourceEnum",
      "type": "string"
    },
    "EnhancedAspectResponse": {
      "additionalProperties": false,
      "description": "Enhanced aspect payload exposed by the public API.",
      "properties": {
        "aspect_quality": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Quality assessment derived from dignities or contextual analysis",
          "title": "Aspect Quality"
        },
        "aspect_type": {
          "description": "Aspect type (e.g., Conjunction, Square)",
          "title": "Aspect Type",
          "type": "string"
        },
        "classification": {
          "description": "Aspect classification (major or minor)",
          "title": "Classification",
          "type": "string"
        },
        "dignity_interaction": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Summary of the essential dignity interaction between the planets",
          "title": "Dignity Interaction"
        },
        "exact_angle": {
          "description": "Exact angle associated with the aspect type",
          "title": "Exact Angle",
          "type": "number"
        },
        "involves_angle": {
          "default": false,
          "description": "True when one side of this aspect is a chart angle (Ascendant/Descendant/Midheaven/Imum Coeli) rather than a body. Angle aspects depend on birth location and local sidereal time, so they change under relocation while planet-planet aspects do not — consumers that relocate charts must recompute or relabel these.",
          "title": "Involves Angle",
          "type": "boolean"
        },
        "is_applying": {
          "anyOf": [
            {
              "type": "boolean"
            }
          ],
          "description": "True if the aspect is applying, False if separating, None when undetermined",
          "title": "Is Applying"
        },
        "mutual_reception": {
          "anyOf": [
            {
              "type": "boolean"
            }
          ],
          "description": "Whether the two planets are in mutual reception",
          "title": "Mutual Reception"
        },
        "orb": {
          "description": "Absolute distance from the exact angle in degrees",
          "title": "Orb",
          "type": "number"
        },
        "orb_allowance": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Maximum allowed orb for this aspect and planet pair in degrees",
          "title": "Orb Allowance"
        },
        "orb_percentage": {
          "description": "Percentage of the allowed orb that is used (0-100)",
          "title": "Orb Percentage",
          "type": "number"
        },
        "phase_angle": {
          "description": "Current angular separation between the bodies in degrees",
          "title": "Phase Angle",
          "type": "number"
        },
        "planet1": {
          "description": "First planet involved in the aspect",
          "title": "Planet1",
          "type": "string"
        },
        "planet2": {
          "description": "Second planet involved in the aspect",
          "title": "Planet2",
          "type": "string"
        },
        "speed_ratio": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Ratio of the slower planet's absolute speed to the faster one's (0-1)",
          "title": "Speed Ratio"
        },
        "strength": {
          "description": "Aspect strength scaled between 0.0 and 1.0",
          "title": "Strength",
          "type": "number"
        }
      },
      "required": [
        "planet1",
        "planet2",
        "aspect_type",
        "classification",
        "phase_angle",
        "exact_angle",
        "orb",
        "orb_percentage",
        "strength"
      ],
      "title": "EnhancedAspectResponse",
      "type": "object"
    },
    "EssentialDignityInfo": {
      "additionalProperties": true,
      "description": "Essential dignity information for a planet.",
      "properties": {
        "debilities_held": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "List of debilities present",
          "title": "Debilities Held"
        },
        "detriment": {
          "description": "Planet is in detriment",
          "title": "Detriment",
          "type": "boolean"
        },
        "dignities_held": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "List of dignities present",
          "title": "Dignities Held"
        },
        "dignity_score": {
          "description": "Aggregate essential dignity score",
          "title": "Dignity Score",
          "type": "number"
        },
        "domicile": {
          "description": "Planet holds domicile (rulership)",
          "title": "Domicile",
          "type": "boolean"
        },
        "effective_score": {
          "description": "Final dignity score after motion modifiers are applied.",
          "readOnly": true,
          "title": "Effective Score",
          "type": "number"
        },
        "exaltation": {
          "description": "Planet holds exaltation",
          "title": "Exaltation",
          "type": "boolean"
        },
        "exaltation_score": {
          "default": 0,
          "description": "Score contribution from exaltation",
          "title": "Exaltation Score",
          "type": "integer"
        },
        "face": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Face (decan) ruler holding dignity",
          "title": "Face"
        },
        "face_score": {
          "default": 0,
          "description": "Score contribution from decan (face) dignity",
          "title": "Face Score",
          "type": "integer"
        },
        "fall": {
          "description": "Planet is in fall",
          "title": "Fall",
          "type": "boolean"
        },
        "motion_modifier": {
          "default": 0,
          "description": "Score modifier applied due to motion state. Negative values weaken the raw dignity score.",
          "title": "Motion Modifier",
          "type": "number"
        },
        "motion_state": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Motion state used for dignity adjustments (direct, retrograde, stationary, unknown)",
          "title": "Motion State"
        },
        "planet": {
          "description": "Planet name",
          "title": "Planet",
          "type": "string"
        },
        "ruler": {
          "description": "Backward-compatible alias for domicile field.",
          "readOnly": true,
          "title": "Ruler",
          "type": "boolean"
        },
        "rulership_score": {
          "default": 0,
          "description": "Score contribution from domicile (rulership) dignity",
          "title": "Rulership Score",
          "type": "integer"
        },
        "sign": {
          "description": "Current sign",
          "title": "Sign",
          "type": "string"
        },
        "strength": {
          "description": "Dignity strength category",
          "title": "Strength",
          "type": "string"
        },
        "term": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Egyptian term ruler holding dignity",
          "title": "Term"
        },
        "term_score": {
          "default": 0,
          "description": "Score contribution from Egyptian terms",
          "title": "Term Score",
          "type": "integer"
        },
        "triplicity": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Triplicity mode where planet has dignity (day/night)",
          "title": "Triplicity"
        },
        "triplicity_score": {
          "default": 0,
          "description": "Score contribution from triplicity rulers",
          "title": "Triplicity Score",
          "type": "integer"
        },
        "warnings": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          ],
          "description": "Non-fatal warnings encountered while deriving dignity metadata.",
          "title": "Warnings"
        }
      },
      "required": [
        "planet",
        "sign",
        "domicile",
        "exaltation",
        "detriment",
        "fall",
        "dignity_score",
        "strength",
        "ruler",
        "effective_score"
      ],
      "title": "EssentialDignityInfo",
      "type": "object"
    },
    "FixedStarCatalogEnum": {
      "description": "Fixed star catalog snapshots.",
      "enum": [
        "bright_mag3",
        "bright_mag5",
        "royal_stars",
        "parans_key"
      ],
      "title": "FixedStarCatalogEnum",
      "type": "string"
    },
    "FixedStarConjunctionResponse": {
      "additionalProperties": false,
      "description": "Fixed star conjunction result.",
      "properties": {
        "exact": {
          "description": "Whether orb is below exact threshold",
          "title": "Exact",
          "type": "boolean"
        },
        "interpretation_hint": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Quick interpretation keyword",
          "title": "Interpretation Hint"
        },
        "orb": {
          "description": "Orb in degrees",
          "title": "Orb",
          "type": "number"
        },
        "planet": {
          "description": "Planet name",
          "title": "Planet",
          "type": "string"
        },
        "planet_longitude": {
          "description": "Planet longitude in degrees",
          "title": "Planet Longitude",
          "type": "number"
        },
        "star": {
          "description": "Fixed star name",
          "title": "Star",
          "type": "string"
        },
        "star_longitude": {
          "description": "Star longitude in degrees",
          "title": "Star Longitude",
          "type": "number"
        }
      },
      "required": [
        "star",
        "planet",
        "orb",
        "exact",
        "star_longitude",
        "planet_longitude"
      ],
      "title": "FixedStarConjunctionResponse",
      "type": "object"
    },
    "FixedStarPositionResponse": {
      "additionalProperties": false,
      "description": "Formatted fixed star position payload.",
      "properties": {
        "constellation": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Constellation",
          "title": "Constellation"
        },
        "distance_light_years": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Distance in light years",
          "title": "Distance Light Years"
        },
        "julian_day": {
          "anyOf": [
            {
              "format": "double",
              "type": "number"
            }
          ],
          "description": "Julian Day of calculation",
          "title": "Julian Day"
        },
        "latitude": {
          "description": "Latitude in degrees",
          "title": "Latitude",
          "type": "number"
        },
        "longitude": {
          "description": "Current longitude in degrees",
          "title": "Longitude",
          "type": "number"
        },
        "magnitude": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Apparent magnitude",
          "title": "Magnitude"
        },
        "name": {
          "description": "Fixed star name",
          "title": "Name",
          "type": "string"
        },
        "sign_longitude": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Longitude within sign",
          "title": "Sign Longitude"
        },
        "sign_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Zodiac sign",
          "title": "Sign Name"
        },
        "sign_symbol": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Zodiac sign symbol",
          "title": "Sign Symbol"
        },
        "spectral_class": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Spectral classification",
          "title": "Spectral Class"
        },
        "traditional_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Traditional name",
          "title": "Traditional Name"
        }
      },
      "required": [
        "name",
        "longitude",
        "latitude"
      ],
      "title": "FixedStarPositionResponse",
      "type": "object"
    },
    "FixedStarsMetadata": {
      "additionalProperties": true,
      "description": "Metadata describing fixed star calculation.",
      "properties": {
        "available_catalog": {
          "description": "Whether built-in star catalog was available",
          "title": "Available Catalog",
          "type": "boolean"
        },
        "calculation_duration_ms": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Computation time in milliseconds",
          "title": "Calculation Duration Ms"
        },
        "calculation_time": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "ISO8601 timestamp of calculation",
          "title": "Calculation Time"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Optional error description if calculation degraded",
          "title": "Error"
        },
        "magnitude_limit": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Magnitude limit applied",
          "title": "Magnitude Limit"
        },
        "missing_stars": {
          "description": "Stars requested but unavailable",
          "items": {
            "type": "string"
          },
          "title": "Missing Stars",
          "type": "array"
        },
        "orb_used": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Orb used for conjunction detection",
          "title": "Orb Used"
        },
        "requested_star_count": {
          "description": "Number of stars requested",
          "title": "Requested Star Count",
          "type": "integer"
        },
        "selected_stars_count": {
          "description": "Count of Foundation 24 stars returned",
          "title": "Selected Stars Count",
          "type": "integer"
        },
        "total_stars_calculated": {
          "description": "Number of stars calculated",
          "title": "Total Stars Calculated",
          "type": "integer"
        }
      },
      "required": [
        "requested_star_count",
        "total_stars_calculated",
        "selected_stars_count",
        "available_catalog"
      ],
      "title": "FixedStarsMetadata",
      "type": "object"
    },
    "FixedStarsResponse": {
      "additionalProperties": false,
      "description": "Container for fixed star positions and conjunctions.",
      "properties": {
        "conjunctions": {
          "description": "Star-planet conjunctions",
          "items": {
            "$ref": "#/$defs/FixedStarConjunctionResponse"
          },
          "title": "Conjunctions",
          "type": "array"
        },
        "metadata": {
          "allOf": [
            {
              "$ref": "#/$defs/FixedStarsMetadata"
            }
          ],
          "description": "Calculation metadata"
        },
        "positions": {
          "description": "Calculated star positions",
          "items": {
            "$ref": "#/$defs/FixedStarPositionResponse"
          },
          "title": "Positions",
          "type": "array"
        }
      },
      "required": [
        "positions",
        "conjunctions",
        "metadata"
      ],
      "title": "FixedStarsResponse",
      "type": "object"
    },
    "GauquelinSectorRow": {
      "properties": {
        "above_horizon": {
          "type": "boolean"
        },
        "circumpolar": {
          "description": "True when the body neither rises nor sets within 1.3 days: no sector.",
          "type": "boolean"
        },
        "id": {
          "description": "Stable body id.",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "plus_zone": {
          "description": "True in sectors 1-3 (after rising) and 10-12 (after upper culmination): Gauquelin's key sectors.",
          "type": "boolean"
        },
        "rise": {
          "description": "The rise bracketing the birth (before it when the body is up, after it when down), in the birthplace offset.",
          "format": "date-time",
          "type": [
            "string",
            "null"
          ]
        },
        "sector": {
          "description": "1 ≤ sector < 37: sector 1 begins at rising, 19 at setting, numbered with the daily motion.",
          "format": "double",
          "type": "number"
        },
        "sector_number": {
          "description": "1..36.",
          "type": "integer"
        },
        "set": {
          "format": "date-time",
          "type": [
            "string",
            "null"
          ]
        },
        "zone": {
          "description": "after_rise, after_culmination, or null.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "id",
        "name",
        "circumpolar"
      ],
      "type": "object"
    },
    "GauquelinSectors": {
      "description": "Gauquelin sectors at birth (#1170).",
      "properties": {
        "bodies": {
          "items": {
            "$ref": "#/$defs/GauquelinSectorRow"
          },
          "type": "array"
        },
        "limb": {
          "type": "boolean"
        },
        "method": {
          "description": "rise_set: shares of the body's own diurnal and nocturnal semi-arc in time.",
          "type": "string"
        },
        "refraction": {
          "type": "boolean"
        },
        "timezone": {
          "description": "IANA zone the rise and set times are written in.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "HouseSystemEnum": {
      "description": "Supported house systems.",
      "enum": [
        "P",
        "K",
        "O",
        "R",
        "C",
        "E",
        "W"
      ],
      "title": "HouseSystemEnum",
      "type": "string"
    },
    "HousesResponse": {
      "additionalProperties": true,
      "description": "House system data in response.",
      "properties": {
        "cusps": {
          "description": "House cusp longitudes in degrees",
          "items": {
            "type": "number"
          },
          "title": "Cusps",
          "type": "array"
        },
        "system": {
          "description": "House system code",
          "title": "System",
          "type": "string"
        }
      },
      "required": [
        "system",
        "cusps"
      ],
      "title": "HousesResponse",
      "type": "object"
    },
    "NodeSourceEnum": {
      "description": "Node/apsides calculation modes (SE §2.2).",
      "enum": [
        "true_osculating",
        "mean",
        "mean_apsides"
      ],
      "title": "NodeSourceEnum",
      "type": "string"
    },
    "ObjectSetEnum": {
      "description": "Standardized celestial object bundles.",
      "enum": [
        "traditional_7",
        "modern_10",
        "modern_plus_chiron",
        "asteroids_major",
        "full",
        "custom"
      ],
      "title": "ObjectSetEnum",
      "type": "string"
    },
    "OmittedBody": {
      "additionalProperties": false,
      "description": "A body the request asked for (or the preset includes) that the engine did NOT compute, and why. The chart or map is otherwise complete: omission is reported, never silently absorbed and never replaced by an approximate position.",
      "properties": {
        "detail": {
          "description": "Human-readable explanation.",
          "title": "Detail",
          "type": "string"
        },
        "id": {
          "description": "Canonical body id (see GET /catalogs/bodies).",
          "title": "Id",
          "type": "string"
        },
        "name": {
          "description": "Body name.",
          "title": "Name",
          "type": "string"
        },
        "reason": {
          "description": "Why it was omitted. `unsupported_in_frame`: the body has no position in the requested configuration.coordinate_system (the lunar nodes and apsides are defined from the Moon's geocentric orbit, so a heliocentric or barycentric chart cannot place them; the Sun is the origin of a heliocentric one). `outside_kernel_window`: the instant is outside the span of this body's own JPL kernel (valid_from..valid_to). Only bodies with a per-body kernel (the centaurs, trans-Neptunian objects and extended asteroids) have such a window; the planets, nodes and the sb441 main-belt asteroids cover the full 1550-2650 range.",
          "title": "Reason",
          "type": "string"
        },
        "valid_from": {
          "description": "First date the body is computed (YYYY-MM-DD).",
          "title": "Valid From",
          "type": "string"
        },
        "valid_to": {
          "description": "Last date the body is computed (YYYY-MM-DD).",
          "title": "Valid To",
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "reason"
      ],
      "title": "OmittedBody",
      "type": "object"
    },
    "PlanetResponse": {
      "additionalProperties": true,
      "description": "Planet position data in response.",
      "properties": {
        "accidental_dignities": {
          "$ref": "#/$defs/AccidentalDignityInfo",
          "description": "Accidental dignities (tags-only; currently derived from house placement when available)"
        },
        "declination": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Declination in degrees",
          "title": "Declination"
        },
        "distance": {
          "description": "Distance from Earth",
          "title": "Distance",
          "type": "number"
        },
        "element": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Element (Fire, Earth, Air, Water)",
          "title": "Element"
        },
        "essential_dignities": {
          "$ref": "#/$defs/EssentialDignityInfo",
          "description": "Essential dignity analysis (requires enhanced calculation)"
        },
        "house_number": {
          "anyOf": [
            {
              "type": "integer"
            }
          ],
          "description": "House number (1-12)",
          "title": "House Number"
        },
        "is_retrograde": {
          "default": false,
          "description": "Whether planet is in retrograde motion (longitude_speed < 0)",
          "title": "Is Retrograde",
          "type": "boolean"
        },
        "latitude": {
          "description": "Ecliptic latitude in degrees",
          "title": "Latitude",
          "type": "number"
        },
        "longitude": {
          "description": "Ecliptic longitude in degrees",
          "title": "Longitude",
          "type": "number"
        },
        "longitude_speed": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Longitude speed in degrees/day",
          "title": "Longitude Speed"
        },
        "modality": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Modality (Cardinal, Fixed, Mutable)",
          "title": "Modality"
        },
        "motion_type": {
          "default": "direct",
          "description": "Motion classification: direct, retrograde, stationary, or unknown",
          "title": "Motion Type",
          "type": "string"
        },
        "name": {
          "description": "Planet name",
          "title": "Name",
          "type": "string"
        },
        "on_cusp": {
          "default": false,
          "description": "True when longitude is within cusp tolerance and planet is treated as entering the next house",
          "title": "On Cusp",
          "type": "boolean"
        },
        "out_of_bounds": {
          "default": false,
          "description": "Planet exceeds solar declination bounds",
          "title": "Out Of Bounds",
          "type": "boolean"
        },
        "right_ascension": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Geocentric right ascension in degrees",
          "title": "Right Ascension"
        },
        "sign_longitude": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Longitude within sign",
          "title": "Sign Longitude"
        },
        "sign_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Zodiac sign name",
          "title": "Sign Name"
        },
        "sign_symbol": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Zodiac sign symbol",
          "title": "Sign Symbol"
        },
        "topocentric_declination": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Topocentric declination in degrees (when applicable)",
          "title": "Topocentric Declination"
        },
        "topocentric_right_ascension": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Topocentric right ascension in degrees (when applicable)",
          "title": "Topocentric Right Ascension"
        }
      },
      "required": [
        "name",
        "longitude",
        "latitude",
        "distance"
      ],
      "title": "PlanetResponse",
      "type": "object"
    },
    "PrecisionSummary": {
      "additionalProperties": true,
      "description": "Structured precision report for calculation metadata.",
      "properties": {
        "max_position_error_arcseconds": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Maximum validated positional error in arcseconds",
          "title": "Max Position Error Arcseconds"
        },
        "max_timing_error_seconds": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "Maximum validated timing error in seconds",
          "title": "Max Timing Error Seconds"
        },
        "notes": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Additional human-readable context for the precision summary",
          "title": "Notes"
        },
        "reference_profile": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Reference dataset or validation profile used for the comparison",
          "title": "Reference Profile"
        }
      },
      "title": "PrecisionSummary",
      "type": "object"
    },
    "SectDeterminationResponse": {
      "additionalProperties": false,
      "description": "Sect determination analysis.",
      "properties": {
        "benefics_in_sect": {
          "description": "Benefics in proper sect",
          "items": {
            "type": "string"
          },
          "title": "Benefics In Sect",
          "type": "array"
        },
        "is_day_chart": {
          "description": "Is this a day chart",
          "title": "Is Day Chart",
          "type": "boolean"
        },
        "malefics_in_sect": {
          "description": "Malefics in proper sect",
          "items": {
            "type": "string"
          },
          "title": "Malefics In Sect",
          "type": "array"
        },
        "sect": {
          "description": "Chart sect (diurnal/nocturnal)",
          "title": "Sect",
          "type": "string"
        },
        "sect_conditions": {
          "description": "Detailed sect conditions",
          "title": "Sect Conditions",
          "type": "object"
        },
        "sect_light": {
          "description": "Sect light (Sun for day, Moon for night)",
          "title": "Sect Light",
          "type": "string"
        },
        "sun_above_horizon": {
          "description": "Is Sun above horizon",
          "title": "Sun Above Horizon",
          "type": "boolean"
        }
      },
      "required": [
        "is_day_chart",
        "sect",
        "sun_above_horizon",
        "sect_light",
        "benefics_in_sect",
        "malefics_in_sect",
        "sect_conditions"
      ],
      "title": "SectDeterminationResponse",
      "type": "object"
    },
    "SubjectResponse": {
      "additionalProperties": true,
      "description": "Normalized subject data in response.",
      "properties": {
        "altitude": {
          "description": "Altitude in meters",
          "title": "Altitude",
          "type": "number"
        },
        "datetime": {
          "description": "ISO format datetime",
          "title": "Datetime",
          "type": "string"
        },
        "julian_day": {
          "description": "Julian Day Number",
          "format": "double",
          "title": "Julian Day",
          "type": "number"
        },
        "latitude": {
          "description": "Latitude in decimal degrees",
          "title": "Latitude",
          "type": "number"
        },
        "longitude": {
          "description": "Longitude in decimal degrees",
          "title": "Longitude",
          "type": "number"
        },
        "name": {
          "description": "Subject name",
          "title": "Name",
          "type": "string"
        },
        "timezone_name": {
          "anyOf": [
            {
              "type": "string"
            }
          ],
          "description": "Timezone name if available",
          "title": "Timezone Name"
        },
        "utc_offset": {
          "anyOf": [
            {
              "type": "number"
            }
          ],
          "description": "UTC offset in hours",
          "title": "Utc Offset"
        }
      },
      "required": [
        "name",
        "datetime",
        "julian_day",
        "latitude",
        "longitude",
        "altitude"
      ],
      "title": "SubjectResponse",
      "type": "object"
    },
    "TimeScaleEnum": {
      "description": "Time scale used for reporting results.",
      "enum": [
        "UTC",
        "TT",
        "TDB"
      ],
      "title": "TimeScaleEnum",
      "type": "string"
    },
    "VisualResult": {
      "description": "Embedded diagram payload returned alongside chart data when include_visual=true.",
      "properties": {
        "content_type": {
          "description": "MIME type of the data payload.",
          "title": "Content Type",
          "type": "string"
        },
        "credits_charged": {
          "description": "Additional credits consumed to render the visual: 2, or 0 on a re-render that presented a valid render_token.",
          "title": "Credits Charged",
          "type": "integer"
        },
        "data": {
          "description": "Raw SVG string (format=svg) or standard base64-encoded PNG bytes (format=png, no data: URI prefix).",
          "title": "Data",
          "type": "string"
        },
        "format": {
          "description": "Output format: \"svg\" or \"png\".",
          "title": "Format",
          "type": "string"
        },
        "render_token": {
          "description": "Short-lived (15 min) token for re-rendering this same chart. Send it back in the X-OE-Render-Token header (or a top-level render_token body field) with a request for the same chart inputs — e.g. the same birth data in a different theme or layout — and that request is not charged again. Bound to your account and to the chart-defining inputs; any other request is charged normally.",
          "title": "Render Token",
          "type": "string"
        },
        "type": {
          "description": "Diagram kind: \"wheel\" or \"bodygraph\".",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type",
        "format",
        "content_type",
        "credits_charged",
        "data"
      ],
      "title": "VisualResult",
      "type": "object"
    },
    "ZodiacTypeEnum": {
      "description": "Supported zodiac frameworks.",
      "enum": [
        "tropical",
        "sidereal"
      ],
      "title": "ZodiacTypeEnum",
      "type": "string"
    }
  }
}