{
  "openapi": "3.1.0",
  "info": {
    "title": "Occult API",
    "version": "1.0.0",
    "summary": "Vedic astrology as a REST API.",
    "description": "309 endpoints computing panchang, kundli and divisional\ncharts, dashas, yogas, muhurat timings, ashtakavarga, planetary\nstrength, numerology and horoscope matching from NASA JPL ephemeris\ndata.\n\nEvery response uses the same envelope, every successful call costs one\ncredit whatever it returns, and failed requests are never charged.\nCredits are prepaid and do not expire; there is no subscription.\n\nInteractive reference: https://occultapi.com/docs\nTry a call with no account: https://occultapi.com/playground",
    "contact": {
      "name": "Occult API",
      "url": "https://occultapi.com"
    },
    "termsOfService": "https://occultapi.com/terms"
  },
  "servers": [
    {
      "url": "https://api.occultapi.com",
      "description": "Production"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "tags": [
    {
      "name": "AI & chat",
      "description": "1 endpoint."
    },
    {
      "name": "PDF reports",
      "description": "2 endpoints."
    },
    {
      "name": "Panchang",
      "description": "19 endpoints."
    },
    {
      "name": "Muhurta & timings",
      "description": "15 endpoints."
    },
    {
      "name": "Sunrise & moonrise",
      "description": "2 endpoints."
    },
    {
      "name": "Lunar",
      "description": "3 endpoints."
    },
    {
      "name": "Calendars",
      "description": "13 endpoints."
    },
    {
      "name": "Festivals & vrats",
      "description": "3 endpoints."
    },
    {
      "name": "Birth chart & houses",
      "description": "11 endpoints."
    },
    {
      "name": "Divisional charts",
      "description": "23 endpoints."
    },
    {
      "name": "Jaimini",
      "description": "5 endpoints."
    },
    {
      "name": "KP (Krishnamurti Paddhati)",
      "description": "2 endpoints."
    },
    {
      "name": "Chakras",
      "description": "1 endpoint."
    },
    {
      "name": "Planets & positions",
      "description": "11 endpoints."
    },
    {
      "name": "Strength (bala)",
      "description": "5 endpoints."
    },
    {
      "name": "Ashtakavarga",
      "description": "5 endpoints."
    },
    {
      "name": "Dashas — nakshatra (planet)",
      "description": "12 endpoints."
    },
    {
      "name": "Dashas — rashi (Jaimini)",
      "description": "20 endpoints."
    },
    {
      "name": "Dasha tools",
      "description": "6 endpoints."
    },
    {
      "name": "Yogas & doshas",
      "description": "4 endpoints."
    },
    {
      "name": "Lal Kitab",
      "description": "5 endpoints."
    },
    {
      "name": "Matching & compatibility",
      "description": "6 endpoints."
    },
    {
      "name": "Transits & annual charts",
      "description": "9 endpoints."
    },
    {
      "name": "Tajika & varshaphala",
      "description": "11 endpoints."
    },
    {
      "name": "Scans & transitions",
      "description": "8 endpoints."
    },
    {
      "name": "Predictions & readings",
      "description": "9 endpoints."
    },
    {
      "name": "Prashna",
      "description": "5 endpoints."
    },
    {
      "name": "Avatar chakra",
      "description": "1 endpoint."
    },
    {
      "name": "Tarot",
      "description": "4 endpoints."
    },
    {
      "name": "Pancha Pakshi",
      "description": "2 endpoints."
    },
    {
      "name": "Returns",
      "description": "5 endpoints."
    },
    {
      "name": "Eclipses",
      "description": "8 endpoints."
    },
    {
      "name": "Mundane astrology",
      "description": "10 endpoints."
    },
    {
      "name": "Fixed stars",
      "description": "4 endpoints."
    },
    {
      "name": "Traditional & Hellenistic",
      "description": "5 endpoints."
    },
    {
      "name": "Western astrology",
      "description": "12 endpoints."
    },
    {
      "name": "Numerology",
      "description": "15 endpoints."
    },
    {
      "name": "Chinese astrology",
      "description": "4 endpoints."
    },
    {
      "name": "Astrocartography",
      "description": "4 endpoints."
    },
    {
      "name": "Human Design",
      "description": "3 endpoints."
    },
    {
      "name": "Celebrity data",
      "description": "2 endpoints."
    },
    {
      "name": "Natural hazards",
      "description": "5 endpoints."
    },
    {
      "name": "Utilities",
      "description": "3 endpoints."
    },
    {
      "name": "Astrology",
      "description": "2 endpoints."
    },
    {
      "name": "prashnavali",
      "description": "4 endpoints."
    }
  ],
  "paths": {
    "/api/astro/abhijit-muhurat/": {
      "post": {
        "operationId": "astro_abhijit_muhurat",
        "summary": "Abhijit muhurat",
        "description": "Abhijit muhurta as a single {start, end} window.\n\nThe eighth of the fifteen day muhurtas, straddling the midpoint of the daylight, and held auspicious for beginning almost anything. Because it is a proportional division of the actual daylight it moves with the place and the season, and is not simply local noon.\n\nFor the other favourable windows in the same call, use /api/astro/auspicious-timings/ - the same credit.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "start": "2026-08-31T12:01:51.866669+05:30",
                    "end": "2026-08-31T12:52:12.133336+05:30"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/activities_day_of_week/": {
      "post": {
        "operationId": "astro_activities_day_of_week",
        "summary": "Weekday activities",
        "description": "Each day of the week is ruled by a planet, and Vedic tradition assigns every weekday a set of undertakings it favours — particular metals, materials, trades and kinds of work. This endpoint returns that guidance as written English prose, one paragraph per weekday.\n\nIt is a static lookup, not a calculation: no date, place or chart is involved, so the answer for Sunday is the same whichever Sunday you mean. Use it to caption a day in a calendar or panchanga view without having to write the copy yourself.\n\nStart with `get_all_weeks` to see the seven accepted names, then pass one of them as `week` alongside `get_week_activities`. Your input is lower-cased before the lookup, so casing does not matter. An unrecognised weekday comes back as an explanatory string with HTTP 200 rather than as an error.\n\nAvailable `keys` (2), all covered by the same single credit: get_all_weeks, get_week_activities.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_week_activities": "This day is particularly favorable for activities involving gold, copper, horses, natural materials like dried wood and bark, woolen items, hill-related activities, healing practices, white silk work, trading activities, artistic endeavors, pure and noble activities, courageous undertakings, and fire-related work. It supports activities requiring leadership, authority, and purification."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_week_activities",
                        "get_all_weeks"
                      ]
                    }
                  },
                  "week": {
                    "type": "string",
                    "description": "Lowercase in the data and the engine does an exact `week not in self.info` check, but lowercases first, so any casing works. Required for key 'get_week_activities'.",
                    "enum": [
                      "sunday",
                      "monday",
                      "tuesday",
                      "wednesday",
                      "thursday",
                      "friday",
                      "saturday"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_week_activities"
                ],
                "week": "sunday"
              }
            }
          }
        }
      }
    },
    "/api/astro/akshavedamsa/": {
      "post": {
        "operationId": "astro_akshavedamsa",
        "summary": "Akshavedamsa (D45)",
        "description": "The akshavedamsa, the forty-fifth divisional chart: each sign divided into forty-five parts of 40' each.\n\nRead for paternal legacy, conduct and character.\n\nAT 40' PER DIVISION the same birth-time caution applies as for D40.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/amrit-kaal/": {
      "post": {
        "operationId": "astro_amrit_kaal",
        "summary": "Amrit kaal",
        "description": "Amrit kaal: the day's most favourable windows.\n\nReturned as a LIST under `windows`, not a single window, because a day can hold two. An empty list is a valid answer - some days have none.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "windows": [
                      {
                        "start": "2026-08-31T06:09:30+05:30",
                        "end": "2026-08-31T07:43:53+05:30"
                      },
                      {
                        "start": "2026-08-31T17:10:11+05:30",
                        "end": "2026-08-31T18:44:34+05:30"
                      },
                      {
                        "start": "2026-09-01T03:18:35.500000+05:30",
                        "end": "2026-09-01T04:44:15.750000+05:30"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/argala/": {
      "post": {
        "operationId": "astro_argala",
        "summary": "Argala and virodhargala",
        "description": "Argala: the Jaimini doctrine of intervention between houses.\n\nPlanets in the 2nd, 4th, 5th and 11th from a house intervene in it. Planets in the 12th, 10th, 3rd and 9th obstruct that intervention — the virodhargala. Both tables are returned, one row per house counted from the ascendant, every column labelled with the house it represents and every cell resolved to planet names.\n\nThe two tables are given separately rather than zipped together, and `blocked_by` states which virodhargala house blocks which argala house. That matters: the engine stores the two house lists in mismatched order, so pairing them by column position would say the 5th is blocked by the 9th when classically it is blocked by the 3rd.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Jaimini"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "jaimini",
                    "argala_houses": [
                      2,
                      4,
                      5,
                      11
                    ],
                    "virodhargala_houses": [
                      12,
                      10,
                      9,
                      3
                    ],
                    "blocked_by": {
                      "2": 12,
                      "4": 10,
                      "5": 3,
                      "11": 9
                    },
                    "argala": [
                      {
                        "from_house": 1,
                        "houses": {
                          "2": [],
                          "4": [
                            "Mars"
                          ],
                          "5": [
                            "Venus"
                          ],
                          "11": []
                        }
                      },
                      {
                        "from_house": 2,
                        "houses": {
                          "2": [
                            "Saturn",
                            "Rahu"
                          ],
                          "4": [
                            "Venus"
                          ],
                          "5": [
                            "Sun",
                            "Mercury"
                          ],
                          "11": []
                        }
                      },
                      {
                        "from_house": 3,
                        "houses": {
                          "2": [
                            "Mars"
                          ],
                          "4": [
                            "Sun",
                            "Mercury"
                          ],
                          "5": [],
                          "11": [
                            "Moon"
                          ]
                        }
                      },
                      {
                        "from_house": 4,
                        "houses": {
                          "2": [
                            "Venus"
                          ],
                          "4": [],
                          "5": [
                            "Jupiter"
                          ],
                          "11": []
                        }
                      },
                      {
                        "from_house": 5,
                        "houses": {
                          "2": [
                            "Sun",
                            "Mercury"
                          ],
                          "4": [
                            "Jupiter"
                          ],
                          "5": [
                            "Ketu"
                          ],
                          "11": [
                            "Saturn",
                            "Rahu"
                          ]
                        }
                      },
                      {
                        "from_house": 6,
                        "houses": {
                          "2": [],
                          "4": [
                            "Ketu"
                          ],
                          "5": [],
                          "11": [
                            "Mars"
                          ]
                        }
                      },
                      {
                        "from_house": 7,
                        "houses": {
                          "2": [
                            "Jupiter"
                          ],
                          "4": [],
                          "5": [],
                          "11": [
                            "Venus"
                          ]
                        }
                      },
                      {
                        "from_house": 8,
                        "houses": {
                          "2": [
                            "Ketu"
                          ],
                          "4": [],
                          "5": [],
                          "11": [
                            "Sun",
                            "Mercury"
                          ]
                        }
                      },
                      {
                        "from_house": 9,
                        "houses": {
                          "2": [],
                          "4": [],
                          "5": [
                            "Moon"
                          ],
                          "11": []
                        }
                      },
                      {
                        "from_house": 10,
                        "houses": {
                          "2": [],
                          "4": [
                            "Moon"
                          ],
                          "5": [],
                          "11": [
                            "Jupiter"
                          ]
                        }
                      },
                      {
                        "from_house": 11,
                        "houses": {
                          "2": [],
                          "4": [],
                          "5": [
                            "Saturn",
                            "Rahu"
                          ],
                          "11": [
                            "Ketu"
                          ]
                        }
                      },
                      {
                        "from_house": 12,
                        "houses": {
                          "2": [
                            "Moon"
                          ],
                          "4": [
                            "Saturn",
                            "Rahu"
                          ],
                          "5": [
                            "Mars"
                          ],
                          "11": []
                        }
                      }
                    ],
                    "virodhargala": [
                      {
                        "from_house": 1,
                        "houses": {
                          "3": [
                            "Saturn",
                            "Rahu"
                          ],
                          "9": [
                            "Ketu"
                          ],
                          "10": [],
                          "12": []
                        }
                      },
                      {
                        "from_house": 2,
                        "houses": {
                          "3": [
                            "Mars"
                          ],
                          "9": [],
                          "10": [],
                          "12": [
                            "Moon"
                          ]
                        }
                      },
                      {
                        "from_house": 3,
                        "houses": {
                          "3": [
                            "Venus"
                          ],
                          "9": [],
                          "10": [],
                          "12": []
                        }
                      },
                      {
                        "from_house": 4,
                        "houses": {
                          "3": [
                            "Sun",
                            "Mercury"
                          ],
                          "9": [],
                          "10": [
                            "Moon"
                          ],
                          "12": [
                            "Saturn",
                            "Rahu"
                          ]
                        }
                      },
                      {
                        "from_house": 5,
                        "houses": {
                          "3": [],
                          "9": [
                            "Moon"
                          ],
                          "10": [],
                          "12": [
                            "Mars"
                          ]
                        }
                      },
                      {
                        "from_house": 6,
                        "houses": {
                          "3": [
                            "Jupiter"
                          ],
                          "9": [],
                          "10": [
                            "Saturn",
                            "Rahu"
                          ],
                          "12": [
                            "Venus"
                          ]
                        }
                      },
                      {
                        "from_house": 7,
                        "houses": {
                          "3": [
                            "Ketu"
                          ],
                          "9": [
                            "Saturn",
                            "Rahu"
                          ],
                          "10": [
                            "Mars"
                          ],
                          "12": [
                            "Sun",
                            "Mercury"
                          ]
                        }
                      },
                      {
                        "from_house": 8,
                        "houses": {
                          "3": [],
                          "9": [
                            "Mars"
                          ],
                          "10": [
                            "Venus"
                          ],
                          "12": []
                        }
                      },
                      {
                        "from_house": 9,
                        "houses": {
                          "3": [],
                          "9": [
                            "Venus"
                          ],
                          "10": [
                            "Sun",
                            "Mercury"
                          ],
                          "12": [
                            "Jupiter"
                          ]
                        }
                      },
                      {
                        "from_house": 10,
                        "houses": {
                          "3": [],
                          "9": [
                            "Sun",
                            "Mercury"
                          ],
                          "10": [],
                          "12": [
                            "Ketu"
                          ]
                        }
                      },
                      {
                        "from_house": 11,
                        "houses": {
                          "3": [
                            "Moon"
                          ],
                          "9": [],
                          "10": [
                            "Jupiter"
                          ],
                          "12": []
                        }
                      },
                      {
                        "from_house": 12,
                        "houses": {
                          "3": [],
                          "9": [
                            "Jupiter"
                          ],
                          "10": [
                            "Ketu"
                          ],
                          "12": []
                        }
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Sun",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true"
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtakoota/": {
      "post": {
        "operationId": "astro_ashtakoota",
        "summary": "Ashtakoota matching",
        "description": "Ashtakoota is the eight-part North Indian scheme for matching a bride and groom from their birth stars alone. Eight qualities are each scored — Varna out of 1, Vasya out of 2, Tara out of 3, Yoni out of 4, Graha Maitri out of 5, Gana out of 6, Bhakoot out of 7 and Nadi out of 8 — for a maximum of 36 points. South Indian practice ('porutham') asks much the same questions but answers most of them yes or no, and adds four further tests: Mahendra, Vedha, Rajju and Sthree Dheerga.\n\nYou supply only four numbers: the bride's and groom's nakshatra (1–27, Ashwini to Revati) and the pada each falls in (1–4). No birth time or place is needed — if you have those instead, use /api/astro/horoscope-match/, which derives the star itself and returns a fuller report. `compatibility_score` is the key to start with: it runs every test and returns them with the total.\n\nTwo things to know. The `method` field is accepted but never reaches the calculation, so the North Indian scoring is always used; to get the South Indian yes/no form of a test, request its explicit `_south` key. And the North-form scored kootas each return a two-element list of [score, maximum], not a bare number.\n\nAvailable `keys` (25), all covered by the same single credit: compatibility_score, dina_porutham, dina_porutham_south, gana_porutham, gana_porutham_south, mahendra_porutham, mahendra_porutham_south, naadi_porutham, naadi_porutham_south, raasi_adhipathi_porutham, raasi_adhipathi_porutham_south, raasi_from_nakshatra_pada, raasi_porutham, raasi_porutham_south, rajju_porutham, rajju_porutham_south, sthree_dheerga_porutham, sthree_dheerga_porutham_south, varna_porutham, vasiya_porutham, vasiya_porutham_south, vedha_porutham, vedha_porutham_south, yoni_porutham, yoni_porutham_south.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "raasi_from_nakshatra_pada": 1
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "boy_nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "boy_paadham_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_paadham_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings. The `_south` variants return the South-Indian boolean form of the same porutham.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "raasi_from_nakshatra_pada",
                        "varna_porutham",
                        "vasiya_porutham",
                        "vasiya_porutham_south",
                        "dina_porutham",
                        "dina_porutham_south",
                        "gana_porutham",
                        "gana_porutham_south",
                        "yoni_porutham",
                        "yoni_porutham_south",
                        "raasi_adhipathi_porutham",
                        "raasi_adhipathi_porutham_south",
                        "raasi_porutham",
                        "raasi_porutham_south",
                        "naadi_porutham",
                        "naadi_porutham_south",
                        "mahendra_porutham",
                        "mahendra_porutham_south",
                        "vedha_porutham",
                        "vedha_porutham_south",
                        "rajju_porutham",
                        "rajju_porutham_south",
                        "sthree_dheerga_porutham",
                        "sthree_dheerga_porutham_south",
                        "compatibility_score"
                      ]
                    }
                  },
                  "method": {
                    "type": "string",
                    "description": "IMPORTANT: `method` is declared required by but never forwards it to the engine, so the Ashtakoota default \"North\" is always used no matter what is sent. Engine semantics if it were forwarded: case-insensitive substring test for 'south', so 'South'/'south'/'South Indian' select the South method and anything else means North.",
                    "enum": [
                      "North",
                      "South"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "paadha_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "use_astroyogi_method": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "boy_nakshatra_number",
                  "boy_paadham_number",
                  "girl_nakshatra_number",
                  "girl_paadham_number",
                  "keys",
                  "method",
                  "nakshatra_number",
                  "paadha_number",
                  "use_astroyogi_method"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "raasi_from_nakshatra_pada"
                ],
                "boy_nakshatra_number": 5,
                "boy_paadham_number": 3,
                "girl_nakshatra_number": 12,
                "girl_paadham_number": 2,
                "method": "North",
                "nakshatra_number": 0,
                "paadha_number": 0,
                "use_astroyogi_method": true
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtakvarga/": {
      "post": {
        "operationId": "astro_ashtakvarga",
        "summary": "Ashtakavarga",
        "description": "Ashtakavarga scores every sign of a chart out of eight. Seven planets and an eighth contributor each vote on all twelve signs; a sign that collects many points supports the matters it governs, and one that collects few does not. It is the standard Vedic way to rank which houses and which transits are worth acting on, without interpreting the chart yourself.\n\nEvery key here returns numbers, not prose. A typical use is `samudhaya_ashtaka_varga` for a quick strength ranking of the twelve signs, then `binna_ashtaka_varga` for the planet you care about — for example, Jupiter's score in the sign it is currently transiting.\n\nNote on the eighth row: the sign-indexed tables label it `Rahu`, while the house-indexed ones (`trikona_sodhana_house`, `ekadhipatya_sodhana_house`) label the same row `Ascendant`. Classically this contributor is the ascendant. Key off position rather than name if you read both.\n\nTables are built from the divisional chart named in `chart_name`, normally RashiChart. Two request fields change the arithmetic: `apply_ekadhipatya_reductions` and `use_eight_ashtakavargas_in_sav`. Classical sources disagree on both, so they are yours to set.\n\nAvailable `keys` (8), all covered by the same single credit: binna_ashtaka_varga, ekadhipatya_sodhana_house, ekadhipatya_sodhana_rashia_ashtaka_varga, pindas, prastara_ashtaka_varga, samudhaya_ashtaka_varga, trikona_sodhana_house, trikona_sodhana_rashi.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Ashtakavarga"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "samudhaya_ashtaka_varga": {
                      "Raasi 1": 28,
                      "Raasi 2": 36,
                      "Raasi 3": 40,
                      "Raasi 4": 25,
                      "Raasi 5": 24,
                      "Raasi 6": 23,
                      "Raasi 7": 26,
                      "Raasi 8": 25,
                      "Raasi 9": 28,
                      "Raasi 10": 34,
                      "Raasi 11": 25,
                      "Raasi 12": 23
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "description": "There is no explicit list in this view (unlike /api/astro/chart/, which is why this is 'likely' not 'certain'. Case-sensitive; an unknown name yields \"Item '<x>' is not supported\". In practice Ashtakvarga is intended to be run on 'RashiChart'.",
                    "enum": [
                      "BhavaChart",
                      "RashiChart",
                      "HoraChart",
                      "JagannathHoraChart",
                      "ParivrittidwayaHoraChart",
                      "ParivrittitrayaDrekkanaChart",
                      "DrekkanaChart",
                      "SomnathDrekkanaChart",
                      "JagannathDrekkanaChart",
                      "ChaturthamsaChart",
                      "PanchamsaChart",
                      "ShashthamsaChart",
                      "SaptamsaChart",
                      "AshtamsaChart",
                      "NavamsaChart",
                      "DasamsaChart",
                      "RudramsaChart",
                      "DwadasamsaChart",
                      "ShodasamsaChart",
                      "VimsamsaChart",
                      "ChaturvimsamsaChart",
                      "NakshatramsaChart",
                      "TrimsamsaChart",
                      "KhavedamsaChart",
                      "AkshavedamsaChart",
                      "ShashtyamsaChart",
                      "NavnavamsaChart",
                      "AstottaramsaChart",
                      "DwadasdwadasamsaChart",
                      "NavnavamsaChartNew",
                      "AstottaramsaChartNew",
                      "DwadasdwadasamsaChartNew"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint, not an enum. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "binna_ashtaka_varga",
                        "samudhaya_ashtaka_varga",
                        "prastara_ashtaka_varga",
                        "trikona_sodhana_rashi",
                        "trikona_sodhana_house",
                        "ekadhipatya_sodhana_rashia_ashtaka_varga",
                        "ekadhipatya_sodhana_house",
                        "pindas"
                      ]
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "apply_ekadhipatya_reductions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "use_eight_ashtakavargas_in_sav": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "date_time",
                  "keys",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "samudhaya_ashtaka_varga"
                ],
                "latitude": 26.1046,
                "longitude": 74.319,
                "timezone_as_float": 5.5,
                "chart_name": "RashiChart",
                "date_time": "2026-09-01T06:00:00+05:30"
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtakvarga/prastara/": {
      "post": {
        "operationId": "astro_ashtakvarga_prastara",
        "summary": "Prastara ashtakavarga",
        "description": "The full ashtakavarga grid the other tables are summed from.\n\nEight planets, each with a row per contributor — the seven grahas plus Rahu and Ketu — giving a bindu or nothing for each of the twelve signs. Bhinnashtakavarga is the column-sum of one of these grids and sarvashtakavarga is the sum of all of them, so this is the working behind both: what you need to show WHY a sign scores as it does rather than only that it does.\n\nEach row comes back three ways — keyed by sign name, as the raw twelve in order for anyone plotting a chart, and with its own total. The engine returns only the bare twelve, and nothing in that array says which end is Aries.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Ashtakavarga"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"chart\": \"RashiChart\", \"signs\": [\"Aries\", \"Taurus\", \"Gemini\", \"Cancer\", \"Leo\", \"Virgo\", \"Libra\", \"Scorpio\", \"Sagittarius\", \"Capricorn\", \"Aquarius\", \"Pisces\"], \"prastara\": {\"Sun\": {\"Sun\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1], \"total\": 8}, \"Moon\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 0, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1], \"total\": 4}, \"Mars\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 0}, \"points\": [1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0], \"total\": 8}, \"Mercury\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 1, \"Cancer\": 1, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 0, \"Pisces\": 0}, \"points\": [1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0], \"total\": 7}, \"Jupiter\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 1, \"Sagittarius\": 1, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1], \"total\": 4}, \"Venus\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 1, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 0, \"Pisces\": 0}, \"points\": [0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0], \"total\": 3}, \"Saturn\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 1, \"Cancer\": 1, \"Leo\": 1, \"Virgo\": 1, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1], \"total\": 8}, \"Rahu\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 1, \"Cancer\": 1, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 1, \"Sagittarius\": 1, \"Capricorn\": 0, \"Aquarius\": 1, \"Pisces\": 0}, \"points\": [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0], \"total\": 6}, \"Ketu\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 0}, \"points\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"total\": 0}}, \"Moon\": {\"Sun\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 1, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 0}, \"points\": [1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0], \"total\": 6}, \"Moon\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1], \"total\": 7}, \"Mars\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 1, \"Cancer\": 0, \"Leo\": 1, \"Virgo\": 1, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 0}, \"points\": [0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0], \"total\": 6}, \"Mercury\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 1, \"Cancer\": 0, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 1, \"Capricorn\": 0, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1], \"total\": 8}, \"Jupiter\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 0}, \"points\": [1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0], \"total\": 7}, \"Venus\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 1, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1], \"total\": 7}, \"Saturn\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sag"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "apply_ekadhipatya_reductions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "chart_name": {
                    "type": "string",
                    "default": "RashiChart",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "use_eight_ashtakavargas_in_sav": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "chart_name": "RashiChart"
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtakvarga/sodhana/": {
      "post": {
        "operationId": "astro_ashtakvarga_sodhana",
        "summary": "Ashtakavarga sodhana and pindas",
        "description": "The two sodhana reductions, and the pindas they feed.\n\nSodhana is the pruning classical texts apply before a sarvashtakavarga total means anything. Trikona sodhana cancels points across each trine, keeping the smallest of the three and subtracting it from all of them; ekadhipatya sodhana then handles the signs that share a lord, zeroing the weaker of the pair. Both are returned reckoned by sign and by house, because which applies depends on whether you read the chart from the lagna or from the sign.\n\nThe pindas are the single numbers a planet's strength gets quoted as. The engine returns them as three bare arrays of seven floats with nothing saying which planet is which; here they are keyed by planet, and sodhya is returned alongside raasi and graha so you can check that it is their sum rather than take it on trust.\n\nNote there is no Rahu or Ketu pinda — classical pinda reckoning covers the seven grahas only, which is why these arrays are seven long where the prastara tables are eight.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Ashtakavarga"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"chart\": \"RashiChart\", \"signs\": [\"Aries\", \"Taurus\", \"Gemini\", \"Cancer\", \"Leo\", \"Virgo\", \"Libra\", \"Scorpio\", \"Sagittarius\", \"Capricorn\", \"Aquarius\", \"Pisces\"], \"trikona_sodhana\": {\"by_rashi\": {\"Sun\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 3, \"Gemini\": 0, \"Cancer\": 3, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 3, \"Capricorn\": 4, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 3, 0, 3, 0, 0, 1, 0, 3, 4, 0, 1], \"total\": 15}, \"Moon\": {\"by_sign\": {\"Aries\": 2, \"Taurus\": 4, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 2, \"Scorpio\": 1, \"Sagittarius\": 0, \"Capricorn\": 2, \"Aquarius\": 4, \"Pisces\": 0}, \"points\": [2, 4, 0, 0, 1, 0, 2, 1, 0, 2, 4, 0], \"total\": 16}, \"Mars\": {\"by_sign\": {\"Aries\": 2, \"Taurus\": 2, \"Gemini\": 2, \"Cancer\": 2, \"Leo\": 0, \"Virgo\": 1, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 4, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 0}, \"points\": [2, 2, 2, 2, 0, 1, 1, 1, 4, 0, 0, 0], \"total\": 15}, \"Mercury\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 2, \"Gemini\": 1, \"Cancer\": 2, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 4, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 2, 1, 2, 1, 0, 1, 0, 4, 0, 0, 1], \"total\": 12}, \"Jupiter\": {\"by_sign\": {\"Aries\": 3, \"Taurus\": 2, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 1, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 0, \"Capricorn\": 1, \"Aquarius\": 2, \"Pisces\": 0}, \"points\": [3, 2, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0], \"total\": 11}, \"Venus\": {\"by_sign\": {\"Aries\": 3, \"Taurus\": 2, \"Gemini\": 0, \"Cancer\": 2, \"Leo\": 0, \"Virgo\": 2, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 0, \"Aquarius\": 1, \"Pisces\": 2}, \"points\": [3, 2, 0, 2, 0, 2, 0, 0, 1, 0, 1, 2], \"total\": 13}, \"Saturn\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 3, \"Gemini\": 2, \"Cancer\": 2, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 0, \"Sagittarius\": 1, \"Capricorn\": 1, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [1, 3, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1], \"total\": 12}, \"Rahu\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\": 2, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 0, \"Capricorn\": 0, \"Aquarius\": 1, \"Pisces\": 1}, \"points\": [1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 1], \"total\": 7}}, \"by_house\": {\"Sun\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 3, \"Leo\": 4, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 3, \"Capricorn\": 0, \"Aquarius\": 3, \"Pisces\": 0}, \"points\": [0, 1, 0, 3, 4, 0, 1, 0, 3, 0, 3, 0], \"total\": 15}, \"Moon\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 2, \"Gemini\": 1, \"Cancer\": 0, \"Leo\": 2, \"Virgo\": 4, \"Libra\": 0, \"Scorpio\": 2, \"Sagittarius\": 4, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 2, 1, 0, 2, 4, 0, 2, 4, 0, 0, 1], \"total\": 16}, \"Mars\": {\"by_sign\": {\"Aries\": 1, \"Taurus\": 1, \"Gemini\": 1, \"Cancer\": 4, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 0, \"Scorpio\": 2, \"Sagittarius\": 2, \"Capricorn\": 2, \"Aquarius\": 2, \"Pisces\": 0}, \"points\": [1, 1, 1, 4, 0, 0, 0, 2, 2, 2, 2, 0], \"total\": 15}, \"Mercury\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 4, \"Leo\": 0, \"Virgo\": 0, \"Libra\": 1, \"Scorpio\": 0, \"Sagittarius\": 2, \"Capricorn\": 1, \"Aquarius\": 2, \"Pisces\": 1}, \"points\": [0, 1, 0, 4, 0, 0, 1, 0, 2, 1, 2, 1], \"total\": 12}, \"Jupiter\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 1, \"Gemini\": 1, \"Cancer\": 0, \"Leo\": 1, \"Virgo\": 2, \"Libra\": 0, \"Scorpio\": 3, \"Sagittarius\": 2, \"Capricorn\": 0, \"Aquarius\": 0, \"Pisces\": 1}, \"points\": [0, 1, 1, 0, 1, 2, 0, 3, 2, 0, 0, 1], \"total\": 11}, \"Venus\": {\"by_sign\": {\"Aries\": 2, \"Taurus\": 0, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 0, \"Virgo\": 1, \"Libra\": 2, \"Scorpio\": 3, \"Sagittarius\": 2, \"Capricorn\": 0, \"Aquarius\": 2, \"Pisces\": 0}, \"points\": [2, 0, 0, 1, 0, 1, 2, 3, 2, 0, 2, 0], \"total\": 13}, \"Saturn\": {\"by_sign\": {\"Aries\": 0, \"Taurus\": 0, \"Gemini\": 0, \"Cancer\": 1, \"Leo\": 1, \"Virgo\": 1, \"Libra\": 1, \"Scorpio\": 1, \"Sagittarius\": 3, \"Capricorn\": 2, \"Aquarius\": 2, \"Pisces\": 0}, \"points\": [0, 0, 0, 1, 1, 1, 1, 1, 3, 2, 2, 0], \"total\": 12}, \"Ascendant\": {\"by_sign\": {\"Aries\": 2, \"Taurus\": 1, \"Gemini\": 0, \"Cancer\": 0, \"Leo\": 0, \"Virgo\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "apply_ekadhipatya_reductions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "chart_name": {
                    "type": "string",
                    "default": "RashiChart",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "use_eight_ashtakavargas_in_sav": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "chart_name": "RashiChart"
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtamsa/": {
      "post": {
        "operationId": "astro_ashtamsa",
        "summary": "Ashtamsa (D8)",
        "description": "The ashtamsa, the eighth divisional chart: each sign divided into eight parts of 3°45' each.\n\nRead for longevity, sudden events and inheritance - the affairs of the eighth house, examined on their own. Outside the shodasavarga.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/assamese_calendar/": {
      "post": {
        "operationId": "astro_assamese_calendar",
        "summary": "Assamese calendar",
        "description": "The Assamese year for a given Gregorian year: the Bihus, the Sankrantis, the eclipses and the pan-Indian festivals as Assam observes them, each resolved to the civil date on which it is actually kept at the place you give.\n\nThe Assamese calendar is solar, counted in the Bhaskarabda era and beginning with Bohag at the Sun's entry into Aries. The solar events (the Sankrantis, Bohag, Magh and Kati Bihu, Uruka) and the year's eclipses are computed fresh for your coordinates; the lunar festivals largely share their tithis with the Bengali set and are resolved to the right day using the time of day each observance requires — which is why Kali Puja and Dipabali, one and the same Amavasya, need not land together.\n\nSend `year` with `latitude`, `longitude` and `timezone_as_float`; the place matters because sunrise decides which civil day a tithi is kept on. The response is `{year, events}` where events is a list of `{name, date}` in date order, `date` being a plain YYYY-MM-DD local civil date.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "events": [
                      {
                        "name": "Makara Sankranti",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Uruka",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Magh Bihu",
                        "date": "2026-01-15"
                      },
                      {
                        "name": "Saraswati Puja",
                        "date": "2026-01-23"
                      },
                      {
                        "name": "Me-Dam-Me-Phi",
                        "date": "2026-01-31"
                      },
                      {
                        "name": "Kumbha Sankranti",
                        "date": "2026-02-13"
                      },
                      {
                        "name": "Maha Shivaratri",
                        "date": "2026-02-15"
                      },
                      {
                        "name": "Surya Grahan *Valayakara",
                        "date": "2026-02-17"
                      },
                      {
                        "name": "Ali-Aye-Ligang",
                        "date": "2026-02-18"
                      },
                      {
                        "name": "Chandra Grahan *Purna",
                        "date": "2026-03-03"
                      },
                      {
                        "name": "Dol Purnima",
                        "date": "2026-03-03"
                      },
                      {
                        "name": "Meena Sankranti",
                        "date": "2026-03-15"
                      },
                      {
                        "name": "Rama Navami",
                        "date": "2026-03-26"
                      },
                      {
                        "name": "Mesha Sankranti",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Solar New Year",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Bohag Bihu",
                        "date": "2026-04-15"
                      },
                      {
                        "name": "Pohela Boishakha",
                        "date": "2026-04-15"
                      },
                      {
                        "name": "Akshaya Tritiya",
                        "date": "2026-04-19"
                      },
                      {
                        "name": "Buddha Purnima",
                        "date": "2026-05-01"
                      },
                      {
                        "name": "Rabindranath Tagore Jayanti",
                        "date": "2026-05-09"
                      },
                      {
                        "name": "Vrishabha Sankranti",
                        "date": "2026-05-15"
                      },
                      {
                        "name": "Ganga Puja",
                        "date": "2026-05-25"
                      },
                      {
                        "name": "Mithuna Sankranti",
                        "date": "2026-06-15"
                      },
                      {
                        "name": "Jamai Shashti",
                        "date": "2026-06-20"
                      },
                      {
                        "name": "Ambubachi Mela",
                        "date": "2026-06-22"
                      },
                      {
                        "name": "Ambubachi Mela Ends",
                        "date": "2026-06-25"
                      },
                      {
                        "name": "Karka Sankranti",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Ratha Jatra",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Guru Purnima",
                        "date": "2026-07-29"
                      },
                      {
                        "name": "Surya Grahan *Purna",
                        "date": "2026-08-12"
                      },
                      {
                        "name": "Simha Sankranti",
                        "date": "2026-08-17"
                      },
                      {
                        "name": "Chandra Grahan *Anshika",
                        "date": "2026-08-28"
                      },
                      {
                        "name": "Rakhi Bandhan",
                        "date": "2026-08-28"
                      },
                      {
                        "name": "Nag Panchami",
                        "date": "2026-09-01"
                      },
                      {
                        "name": "Krishna Janmashtami",
                        "date": "2026-09-04"
                      },
                      {
                        "name": "Ganesh Chaturthi",
                        "date": "2026-09-14"
                      },
                      {
                        "name": "Kanya Sankranti",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Vishwakarma Puja",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Mahalaya",
                        "date": "2026-10-10"
                      },
                      {
                        "name": "Kalparambha",
                        "date": "2026-10-16"
                      },
                      {
                        "name": "Akal Bodhon",
                        "date": "2026-10-16"
                      },
                      {
                        "name": "Tula Sankranti",
                        "date": "2026-10-17"
                      },
                      {
                        "name": "Durga Saptami",
                        "date": "2026-10-17"
                      },
                      {
                        "name": "Kati Bihu",
                        "date": "2026-10-18"
                      },
                      {
                        "name": "Durga Ashtami",
                        "date": "2026-10-19"
                      },
                      {
                        "name": "Maha Navami",
                        "date": "2026-10-20"
                      },
                      {
                        "name": "Vijayadashami",
                        "date": "2026-10-21"
                      },
                      {
                        "name": "Lakshmi Puja",
                        "date": "2026-10-25"
                      },
                      {
                        "name": "Dhanteras",
                        "date": "2026-11-06"
                      },
                      {
                        "name": "Dipabali",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Kali Puja",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Bhai Phonta",
                        "date": "2026-11-11"
                      },
                      {
                        "name": "Chhath Puja",
                        "date": "2026-11-15"
                      },
                      {
                        "name": "Vrishchika Sankranti",
                        "date": "2026-11-16"
                      },
                      {
                        "name": "Jagaddhatri Puja",
                        "date": "2026-11-18"
                      },
                      {
                        "name": "Dhanu Sankranti",
                        "date": "2026-12-16"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/astottaramsa/": {
      "post": {
        "operationId": "astro_astottaramsa",
        "summary": "Astottaramsa (D108)",
        "description": "The astottaramsa, the hundred-and-eighth division, compounded from the navamsa.\n\nAs with D81 the engine carries a straight-division reading too, reachable through /api/astro/chart/ with `chart_name: \"AstottaramsaChart\"`, and the two disagree.\n\nAT ROUGHLY 17' PER DIVISION the birth-time caution is stronger again.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/astrocartography/lines/": {
      "post": {
        "operationId": "astro_astrocartography_lines",
        "summary": "Astrocartography lines",
        "description": "Every astrocartography line for a birth moment, as coordinates ready to plot on a map.\n\nRelocation astrology asks a geographic question rather than a chart one: not where a planet was in the sky, but which places on Earth had it rising, setting, culminating or at the nadir at the moment of birth. Those four curves per planet, drawn on a world map, are the ACG map.\n\nFor each of twelve bodies you get four lines. The MC and IC lines are meridians, so each is a single longitude. The AC and DC lines are curves, returned as a list of latitude/longitude points you can feed straight into a polyline — every five degrees of latitude by default, adjustable with latitude_step.\n\nCurves stop where the body becomes circumpolar, and that is real rather than missing data: above a certain latitude the body never crosses the horizon at all, so there is no rising line to draw there. The cut-off differs per planet because it depends on the declination.\n\nlatitude and longitude are optional on this endpoint alone. An ACG line is fixed by the birth MOMENT — the formulas use right ascension, declination and sidereal time and nothing else — so requiring a birthplace would imply it changes the answer when it does not. Use /api/astro/astrocartography/relocate/ when you want the lines near a particular place.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Astrocartography"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"julian_day_ut\": 2461284.52083333, \"greenwich_sidereal_time_deg\": 347.695999, \"latitude_step_deg\": 5.0, \"lines\": [{\"object\": \"sun\", \"right_ascension_deg\": 160.236053, \"declination_deg\": 8.340118, \"zenith_latitude_deg\": 8.340118, \"asc\": {\"kind\": \"curve\", \"line_type\": \"AC\", \"points\": [{\"latitude_deg\": 80.0, \"longitude_deg\": 26.29657}, {\"latitude_deg\": 75.0, \"longitude_deg\": 49.370647}, {\"latitude_deg\": 70.0, \"longitude_deg\": 58.788063}, {\"latitude_deg\": 65.0, \"longitude_deg\": 64.21646}, {\"latitude_deg\": 60.0, \"longitude_deg\": 67.830598}, {\"latitude_deg\": 55.0, \"longitude_deg\": 70.454876}, {\"latitude_deg\": 50.0, \"longitude_deg\": 72.478252}, {\"latitude_deg\": 45.0, \"longitude_deg\": 74.110147}, {\"latitude_deg\": 40.0, \"longitude_deg\": 75.474118}, {\"latitude_deg\": 35.0, \"longitude_deg\": 76.648265}, {\"latitude_deg\": 30.0, \"longitude_deg\": 77.684777}, {\"latitude_deg\": 25.0, \"longitude_deg\": 78.620234}, {\"latitude_deg\": 20.0, \"longitude_deg\": 79.481424}, {\"latitude_deg\": 15.0, \"longitude_deg\": 80.288829}, {\"latitude_deg\": 10.0, \"longitude_deg\": 81.058826}, {\"latitude_deg\": 5.0, \"longitude_deg\": 81.805171}, {\"latitude_deg\": 0.0, \"longitude_deg\": 82.540054}, {\"latitude_deg\": -5.0, \"longitude_deg\": 83.274938}, {\"latitude_deg\": -10.0, \"longitude_deg\": 84.021282}, {\"latitude_deg\": -15.0, \"longitude_deg\": 84.79128}, {\"latitude_deg\": -20.0, \"longitude_deg\": 85.598684}, {\"latitude_deg\": -25.0, \"longitude_deg\": 86.459874}, {\"latitude_deg\": -30.0, \"longitude_deg\": 87.395332}, {\"latitude_deg\": -35.0, \"longitude_deg\": 88.431844}, {\"latitude_deg\": -40.0, \"longitude_deg\": 89.60599}, {\"latitude_deg\": -45.0, \"longitude_deg\": 90.969961}, {\"latitude_deg\": -50.0, \"longitude_deg\": 92.601856}, {\"latitude_deg\": -55.0, \"longitude_deg\": 94.625233}, {\"latitude_deg\": -60.0, \"longitude_deg\": 97.24951}, {\"latitude_deg\": -65.0, \"longitude_deg\": 100.863648}, {\"latitude_deg\": -70.0, \"longitude_deg\": 106.292045}, {\"latitude_deg\": -75.0, \"longitude_deg\": 115.709461}, {\"latitude_deg\": -80.0, \"longitude_deg\": 138.783538}]}, \"dsc\": {\"kind\": \"curve\", \"line_type\": \"DC\", \"points\": [{\"latitude_deg\": 80.0, \"longitude_deg\": -41.216462}, {\"latitude_deg\": 75.0, \"longitude_deg\": -64.290539}, {\"latitude_deg\": 70.0, \"longitude_deg\": -73.707955}, {\"latitude_deg\": 65.0, \"longitude_deg\": -79.136352}, {\"latitude_deg\": 60.0, \"longitude_deg\": -82.75049}, {\"latitude_deg\": 55.0, \"longitude_deg\": -85.374767}, {\"latitude_deg\": 50.0, \"longitude_deg\": -87.398144}, {\"latitude_deg\": 45.0, \"longitude_deg\": -89.030039}, {\"latitude_deg\": 40.0, \"longitude_deg\": -90.39401}, {\"latitude_deg\": 35.0, \"longitude_deg\": -91.568156}, {\"latitude_deg\": 30.0, \"longitude_deg\": -92.604668}, {\"latitude_deg\": 25.0, \"longitude_deg\": -93.540126}, {\"latitude_deg\": 20.0, \"longitude_deg\": -94.401316}, {\"latitude_deg\": 15.0, \"longitude_deg\": -95.20872}, {\"latitude_deg\": 10.0, \"longitude_deg\": -95.978718}, {\"latitude_deg\": 5.0, \"longitude_deg\": -96.725062}, {\"latitude_deg\": 0.0, \"longitude_deg\": -97.459946}, {\"latitude_deg\": -5.0, \"longitude_deg\": -98.194829}, {\"latitude_deg\": -10.0, \"longitude_deg\": -98.941174}, {\"latitude_deg\": -15.0, \"longitude_deg\": -99.711171}, {\"latitude_deg\": -20.0, \"longitude_deg\": -100.518576}, {\"latitude_deg\": -25.0, \"longitude_deg\": -101.379766}, {\"latitude_deg\": -30.0, \"longitude_deg\": -102.315223}, {\"latitude_deg\": -35.0, \"longitude_deg\": -103.351735}, {\"latitude_deg\": -40.0, \"longitude_deg\": -104.525882}, {\"latitude_deg\": -45.0, \"longitude_deg\": -105.889853}, {\"latitude_deg\": -50.0, \"longitude_deg\": -107.521748}, {\"latitude_deg\": -55.0, \"longitude_deg\": -109.545124}, {\"latitude_deg\": -60.0, \"longitude_deg\": -112.169402}, {\"latitude_deg\": -65.0, \"longitude_deg\": -115.78354}, {\"latitude_deg\": -70.0, \"longitude_deg\": -121.211937}, {\"latitude_deg\": -75.0, \"longitude_deg\": -130.629353}, {\"latitude_deg\": -80.0, \"longitude_deg\": -153.70343}]}, \"mc\": {\"kind\": \"meridian\", \"line_type\": \"MC\", \"longitude_deg\": 172.540054}, \"ic\": {\"kind\": \"meridian\", \"line_type\": \"IC\", \"longitude_deg\": -7.459946}"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to all twelve. Narrow it to keep responses small.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "latitude_step": {
                    "type": "number",
                    "format": "double",
                    "description": "Degrees of latitude between points on the AC/DC curves.",
                    "minimum": 1,
                    "maximum": 15,
                    "default": 5,
                    "examples": [
                      1
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/astrocartography/local-space/": {
      "post": {
        "operationId": "astro_astrocartography_local_space",
        "summary": "Local space lines",
        "description": "The compass bearing from the birthplace to each planet, extended across the map.\n\nA different relocation technique from the ACG lines. Instead of asking where on Earth a planet was on an angle, local space asks which way that planet lay in the sky as seen FROM the birthplace, and draws that bearing outward as a great circle. Travelling along a planet's line is held to carry that planet's themes.\n\nAzimuth is measured from true north, increasing eastward, so it reads directly as a compass bearing; a sixteen-point compass name is included for display. Each body also comes with a list of points along its great circle at fixed arc distances, ready to draw.\n\nAltitude is returned rather than used to filter. A planet below the horizon still has a bearing, and whether to draw its line is a judgement some practitioners make differently, so the number and an above_horizon flag are given and the choice is left to you.\n\nUnlike the other three endpoints here, this one genuinely depends on the birthplace, so latitude and longitude are required.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Astrocartography"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"julian_day_ut\": 2461284.52083333, \"origin\": {\"latitude_deg\": 26.9124, \"longitude_deg\": 75.7873}, \"azimuth_note\": \"Measured from true north, increasing eastward.\", \"lines\": [{\"object\": \"sun\", \"azimuth_deg\": 79.506047, \"altitude_deg\": -2.182842, \"above_horizon\": false, \"compass\": \"E\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 28.635696, \"longitude_deg\": 92.642633}, {\"arc_deg\": 30, \"latitude_deg\": 28.241598, \"longitude_deg\": 109.709702}, {\"arc_deg\": 45, \"latitude_deg\": 25.778617, \"longitude_deg\": 126.331978}, {\"arc_deg\": 60, \"latitude_deg\": 21.528394, \"longitude_deg\": 142.05028}, {\"arc_deg\": 90, \"latitude_deg\": 9.346623, \"longitude_deg\": 170.57978}, {\"arc_deg\": 120, \"latitude_deg\": -4.914291, \"longitude_deg\": -162.937346}, {\"arc_deg\": 150, \"latitude_deg\": -18.106465, \"longitude_deg\": -135.360733}]}, {\"object\": \"moon\", \"azimuth_deg\": 259.881794, \"altitude_deg\": 49.433108, \"above_horizon\": true, \"compass\": \"W\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 23.369538, \"longitude_deg\": 59.672461}, {\"arc_deg\": 30, \"latitude_deg\": 18.279962, \"longitude_deg\": 44.563396}, {\"arc_deg\": 45, \"latitude_deg\": 12.080481, \"longitude_deg\": 30.399691}, {\"arc_deg\": 60, \"latitude_deg\": 5.200889, \"longitude_deg\": 16.90794}, {\"arc_deg\": 90, \"latitude_deg\": -9.0127, \"longitude_deg\": -9.594735}, {\"arc_deg\": 120, \"latitude_deg\": -21.221824, \"longitude_deg\": -38.066883}, {\"arc_deg\": 150, \"latitude_deg\": -28.054667, \"longitude_deg\": -70.311601}]}, {\"object\": \"mercury\", \"azimuth_deg\": 77.524293, \"altitude_deg\": -6.132684, \"above_horizon\": false, \"compass\": \"ENE\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 29.147598, \"longitude_deg\": 92.606258}, {\"arc_deg\": 30, \"latitude_deg\": 29.229043, \"longitude_deg\": 109.803169}, {\"arc_deg\": 45, \"latitude_deg\": 27.146426, \"longitude_deg\": 126.672049}, {\"arc_deg\": 60, \"latitude_deg\": 23.149791, \"longitude_deg\": 142.658552}, {\"arc_deg\": 90, \"latitude_deg\": 11.106307, \"longitude_deg\": 171.506052}, {\"arc_deg\": 120, \"latitude_deg\": -3.410619, \"longitude_deg\": -162.107843}, {\"arc_deg\": 150, \"latitude_deg\": -17.197843, \"longitude_deg\": -134.946017}]}, {\"object\": \"venus\", \"azimuth_deg\": 78.686729, \"altitude_deg\": -46.853905, \"above_horizon\": false, \"compass\": \"ENE\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 28.84746, \"longitude_deg\": 92.630006}, {\"arc_deg\": 30, \"latitude_deg\": 28.649546, \"longitude_deg\": 109.752217}, {\"arc_deg\": 45, \"latitude_deg\": 26.343304, \"longitude_deg\": 126.476122}, {\"arc_deg\": 60, \"latitude_deg\": 22.197824, \"longitude_deg\": 142.30372}, {\"arc_deg\": 90, \"latitude_deg\": 10.074447, \"longitude_deg\": 170.961491}, {\"arc_deg\": 120, \"latitude_deg\": -4.290999, \"longitude_deg\": -162.597179}, {\"arc_deg\": 150, \"latitude_deg\": -17.729485, \"longitude_deg\": -135.192234}]}, {\"object\": \"mars\", \"azimuth_deg\": 86.256253, \"altitude_deg\": 52.732313, \"above_horizon\": true, \"compass\": \"E\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 26.889673, \"longitude_deg\": 92.619871}, {\"arc_deg\": 30, \"latitude_deg\": 24.90396, \"longitude_deg\": 109.159973}, {\"arc_deg\": 45, \"latitude_deg\": 21.175501, \"longitude_deg\": 124.960635}, {\"arc_deg\": 60, \"latitude_deg\": 16.065514, \"longitude_deg\": 139.853331}, {\"arc_deg\": 90, \"latitude_deg\": 3.337811, \"longitude_deg\": 167.483743}, {\"arc_deg\": 120, \"latitude_deg\": -10.130536, \"longitude_deg\": -165.598417}, {\"arc_deg\": 150, \"latitude_deg\": -21.276906, \"longitude_deg\": -136.585722}]}, {\"object\": \"jupiter\", \"azimuth_deg\": 81.498124, \"altitude_deg\": 22.655866, \"above_horizon\": true, \"compass\": \"E\", \"line\": [{\"arc_deg\": 15, \"latitude_deg\": 28.120341, \"longitude_deg\": 92.659281}, {\"arc_deg\": 30, \"latitude_deg\": 27.251831, \"longitude_deg\": 109.583989}, {\"arc_deg\": 45, \"latitude_deg\": 24.41069, \"longitude_deg\": 125.961001}, {\"arc_deg\": 60, \"latitude_deg\": 19.906266, \"longitude_deg\": 141.422364}, {\"arc_deg\": 90, \"latitude_deg\": 7.575381, \"longitude_deg\": 169.65808}, {\"arc_deg\": 120, \"latitude_deg\": -6.438999, \"longitude_deg\": -163.748485}, {\"arc_deg\": 150, \"latitude_deg\": -19.030526, \"longitude_deg\": -135.752807}]"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/astrocartography/parans/": {
      "post": {
        "operationId": "astro_astrocartography_parans",
        "summary": "Paran crossings",
        "description": "Latitudes where two planetary lines cross.\n\nA paran is a latitude at which two bodies are on angles at the same moment — the point where two astrocartography lines intersect. Because the crossing is a LATITUDE, its influence is conventionally read right around the globe at that latitude rather than only at the single crossing point, which is why the response leads with latitude_deg.\n\nEach crossing names both bodies, both line types and the coordinates where they meet. Solved numerically to a ten-thousandth of a degree.\n\nPairs of meridian lines are excluded. MC and IC lines are true meridians, so they are parallel everywhere and never cross; any crossing reported for such a pair would be an artefact of the solver rather than a fact about the sky.\n\nDefaults to the ten classical planets. Adding the node and Chiron roughly doubles an already large pairwise result for two bodies most paran maps do not draw, so ask for them explicitly with the bodies field if you want them.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Astrocartography"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"julian_day_ut\": 2461284.52083333, \"bodies\": [\"sun\", \"moon\", \"mercury\", \"venus\", \"mars\", \"jupiter\", \"saturn\", \"uranus\", \"neptune\", \"pluto\"], \"count\": 180, \"parans\": [{\"object_a\": \"sun\", \"line_type_a\": \"MC\", \"object_b\": \"venus\", \"line_type_b\": \"AC\", \"latitude_deg\": 74.30536, \"longitude_deg\": 172.540054}, {\"object_a\": \"saturn\", \"line_type_a\": \"AC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 73.82927, \"longitude_deg\": -74.325752}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"mars\", \"line_type_b\": \"IC\", \"latitude_deg\": 73.827994, \"longitude_deg\": -63.074563}, {\"object_a\": \"venus\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"IC\", \"latitude_deg\": 73.429681, \"longitude_deg\": -103.916252}, {\"object_a\": \"moon\", \"line_type_a\": \"DC\", \"object_b\": \"mercury\", \"line_type_b\": \"MC\", \"latitude_deg\": 72.551108, \"longitude_deg\": 177.001921}, {\"object_a\": \"moon\", \"line_type_a\": \"AC\", \"object_b\": \"uranus\", \"line_type_b\": \"IC\", \"latitude_deg\": 71.562386, \"longitude_deg\": -103.916252}, {\"object_a\": \"sun\", \"line_type_a\": \"MC\", \"object_b\": \"moon\", \"line_type_b\": \"DC\", \"latitude_deg\": 71.460991, \"longitude_deg\": 172.540054}, {\"object_a\": \"sun\", \"line_type_a\": \"IC\", \"object_b\": \"jupiter\", \"line_type_b\": \"AC\", \"latitude_deg\": 71.274466, \"longitude_deg\": -7.459946}, {\"object_a\": \"sun\", \"line_type_a\": \"DC\", \"object_b\": \"saturn\", \"line_type_b\": \"AC\", \"latitude_deg\": 70.783142, \"longitude_deg\": -72.588886}, {\"object_a\": \"mercury\", \"line_type_a\": \"IC\", \"object_b\": \"jupiter\", \"line_type_b\": \"AC\", \"latitude_deg\": 70.598199, \"longitude_deg\": -2.998079}, {\"object_a\": \"mars\", \"line_type_a\": \"IC\", \"object_b\": \"jupiter\", \"line_type_b\": \"DC\", \"latitude_deg\": 69.985034, \"longitude_deg\": -63.074563}, {\"object_a\": \"sun\", \"line_type_a\": \"DC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 69.630357, \"longitude_deg\": -74.204321}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"saturn\", \"line_type_b\": \"AC\", \"latitude_deg\": 68.401814, \"longitude_deg\": -71.565185}, {\"object_a\": \"venus\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"AC\", \"latitude_deg\": 68.359811, \"longitude_deg\": -90.415345}, {\"object_a\": \"jupiter\", \"line_type_a\": \"DC\", \"object_b\": \"saturn\", \"line_type_b\": \"AC\", \"latitude_deg\": 67.964835, \"longitude_deg\": -71.400569}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"jupiter\", \"line_type_b\": \"DC\", \"latitude_deg\": 67.674926, \"longitude_deg\": -72.370875}, {\"object_a\": \"jupiter\", \"line_type_a\": \"DC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 67.107801, \"longitude_deg\": -74.152063}, {\"object_a\": \"sun\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.705487, \"longitude_deg\": -77.553232}, {\"object_a\": \"jupiter\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.433354, \"longitude_deg\": -76.095239}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"mars\", \"line_type_b\": \"DC\", \"latitude_deg\": 66.341843, \"longitude_deg\": -73.716745}, {\"object_a\": \"mars\", \"line_type_a\": \"DC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.312161, \"longitude_deg\": -74.137779}, {\"object_a\": \"mars\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.238766, \"longitude_deg\": -75.112727}, {\"object_a\": \"mars\", \"line_type_a\": \"DC\", \"object_b\": \"jupiter\", \"line_type_b\": \"DC\", \"latitude_deg\": 66.071485, \"longitude_deg\": -77.06956}, {\"object_a\": \"uranus\", \"line_type_a\": \"AC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.035413, \"longitude_deg\": -74.13302}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"uranus\", \"line_type_b\": \"AC\", \"latitude_deg\": 66.012577, \"longitude_deg\": -74.025788}, {\"object_a\": \"sun\", \"line_type_a\": \"DC\", \"object_b\": \"mars\", \"line_type_b\": \"DC\", \"latitude_deg\": 65.954554, \"longitude_deg\": -78.278186}, {\"object_a\": \"mercury\", \"line_type_a\": \"DC\", \"object_b\": \"neptune\", \"line_type_b\": \"AC\", \"latitude_deg\": 65."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to the ten classical planets.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/astrocartography/relocate/": {
      "post": {
        "operationId": "astro_astrocartography_relocate",
        "summary": "Lines near a place",
        "description": "Which planetary lines run near one particular place, and how close each one is.\n\nThis is the question a relocation feature actually asks — what is going on for me in Berlin? Answering it from the full line set means re-implementing the circumpolar test and the longitude comparison yourself, so this endpoint does it and returns only the lines within an orb you choose.\n\nEach hit carries the line's longitude at your latitude, a signed offset (positive means the place is east of the line), the absolute orb in degrees, and an approximate distance in kilometres. Results are sorted closest first.\n\nDistance is measured east-west along the parallel of latitude, which is the astrocartography convention and what makes the figure comparable to the familiar ‘within 700 miles of a line’ orb used by other tools. It is not the perpendicular great-circle distance to the curve; for a steeply slanted rising line at high latitude the two differ, so orb_degrees is the primary figure and the kilometre value is a convenience derived from it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Astrocartography"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "julian_day_ut": 2461284.52083333,
                    "place": {
                      "latitude_deg": 26.9124,
                      "longitude_deg": 75.7873
                    },
                    "orb_degrees": 5,
                    "distance_note": "Measured east-west along the parallel of latitude, the ACG convention. Not perpendicular distance to the curve.",
                    "count": 2,
                    "lines_in_orb": [
                      {
                        "object": "uranus",
                        "line_type": "MC",
                        "line_longitude_deg": 76.083748,
                        "longitude_offset_deg": -0.296448,
                        "orb_deg": 0.296448,
                        "approx_distance_km": 29.43
                      },
                      {
                        "object": "sun",
                        "line_type": "AC",
                        "line_longitude_deg": 78.272501,
                        "longitude_offset_deg": -2.485201,
                        "orb_deg": 2.485201,
                        "approx_distance_km": 246.69
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "orb_degrees": {
                    "type": "number",
                    "format": "double",
                    "description": "How far from a line still counts as being on it.",
                    "minimum": 0.1,
                    "maximum": 30,
                    "default": 5,
                    "examples": [
                      0.1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/attributes/": {
      "post": {
        "operationId": "astro_attributes",
        "summary": "Chart attributes",
        "description": "A grab-bag of twelve small chart quantities returned in one call — the sort of thing you would otherwise make a dozen requests for. It always computes all twelve, whatever you send.\n\nThe set covers the nakshatra and pada of a given ecliptic longitude, a nakshatra's number and ruling planet by name, the Hadda (Egyptian term) lord of a longitude within a sign, the Kakshya lord and Kakshya number, the zodiac sign of a longitude, which planets are combust at the given moment, the Moon's phase angle, the next occurrence of a chosen lunar phase, the four seasonal ingress moments of a year, and a divisional-chart position derived from a longitude.\n\nOnly `date_time` is required; everything else falls back to a default (longitude 0, name 'Ashwini', zodiac 'Aries', lord 'saturn', target_phase 0 for new moon, limitdays 30, the current year, chart_factor 1 for the Rashi chart), so a minimal call with just `date_time` and `longitude` already gives you combust planets, moon phase, nakshatra and sign. Two quirks: `lord` is matched case-sensitively against data that stores Mercury capitalised, so 'mercury' silently returns null where 'Mercury' returns a number; and the `when` and `nakshatras` request fields are accepted but never read.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "nakshatra_pada": [
                      "Aardra",
                      3
                    ],
                    "nakshatra_details": [
                      1,
                      "Ketu"
                    ],
                    "hadda_lord": null,
                    "kakshya_lord": "venus",
                    "kakshya_number": 1,
                    "zodiac_name": "Gemini",
                    "combust_planets": {
                      "Mars": false,
                      "Mercury": false,
                      "Venus": false,
                      "Jupiter": false,
                      "Saturn": false
                    },
                    "moon_phase": 250.14160858923307,
                    "search_moon_phase": "2024-12-01T06:22:06Z",
                    "seasons": {
                      "spring_equinox": "0001-03-20T21:39:01Z",
                      "summer_solstice": "0001-06-22T20:51:18Z",
                      "autumnal_equinox": "0001-09-23T07:34:54Z",
                      "winter_solstice": "0001-12-21T00:14:00Z"
                    },
                    "dasavarga_from_longitude": {
                      "constellation": 2,
                      "longitude": 16.125
                    },
                    "get_nakshatra_name": "Aardra"
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint, not an enum. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "chart_factor": {
                    "type": "integer",
                    "description": "Divisional chart factor for dasavarga_from_longitude (1=Rashi, 9=Navamsa, etc.).",
                    "default": 1,
                    "examples": [
                      0
                    ]
                  },
                  "limitdays": {
                    "type": "integer",
                    "description": "Search window in days for search_moon_phase.",
                    "default": 30,
                    "examples": [
                      0
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "lord": {
                    "type": "string",
                    "description": "Planetary lord used by get_kakshya_number. Case-SENSITIVE exact match. The data itself is inconsistent: seven entries are lowercase but Mercury is stored capitalised as 'Mercury', so 'mercury' silently returns null while 'Mercury' returns 6. A non-matching value returns null with no error. Default 'saturn'.",
                    "enum": [
                      "saturn",
                      "jupiter",
                      "mars",
                      "sun",
                      "venus",
                      "Mercury",
                      "moon",
                      "ascendant"
                    ],
                    "default": "saturn",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "default": "",
                    "examples": [
                      "string"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "description": "Nakshatra name used by get_nakshatra_details. Nakshatra name feeding the `nakshatra_details` result. Case-insensitive and whitespace-stripped. Both the modern spellings (Mrigashira, Ardra, Pushya, Ashlesha, Magha, Purva Phalguni, Swati, Vishakha, Anuradha, Purva Ashadha, Uttara Ashadha, Shravana, Dhanishta, Shatabhisha, Purva Bhadrapada, Uttara Bhadrapada) and the engine's older transliterations (Mrigasira, Aardra, Pushyami, Aasresha, Makha, Poorva Phalguni, Swaati, Visaakha, Anooraadha, Poorvaashaadha, Uttaraashaadha, Sravanam, Dhanishtha, Satabhishak, Poorvaabhaadra, Uttaraabhaadra) resolve. 'Abhijit' is accepted (28-nakshatra scheme). Default 'Ashwini'.",
                    "enum": [
                      "Aardra",
                      "Aasresha",
                      "Abhijit",
                      "Anooraadha",
                      "Anuradha",
                      "Ardra",
                      "Ashlesha",
                      "Ashwini",
                      "Bharani",
                      "Chitra",
                      "Dhanishta",
                      "Dhanishtha",
                      "Hasta",
                      "Jyeshtha",
                      "Krittika",
                      "Magha",
                      "Makha",
                      "Moola",
                      "Mrigashira",
                      "Mrigasira",
                      "Mula",
                      "Poorva Phalguni",
                      "Poorvaabhaadra",
                      "Poorvaashaadha",
                      "Punarvasu",
                      "Purva Ashadha",
                      "Purva Bhadrapada",
                      "Purva Phalguni",
                      "Pushya",
                      "Pushyami",
                      "Revati",
                      "Rohini",
                      "Satabhishak",
                      "Shatabhisha",
                      "Shravana",
                      "Sravanam",
                      "Swaati",
                      "Swati",
                      "Uttara Ashadha",
                      "Uttara Bhadrapada",
                      "Uttara Phalguni",
                      "Uttaraabhaadra",
                      "Uttaraashaadha",
                      "Visaakha",
                      "Vishakha"
                    ],
                    "default": "Ashwini",
                    "examples": [
                      "string"
                    ]
                  },
                  "target_phase": {
                    "type": "integer",
                    "description": "Moon phase to search for: 0=new, 1=first quarter, 2=full, 3=last quarter.",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "when": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "default": 2026,
                    "examples": [
                      2026
                    ]
                  },
                  "zodiac": {
                    "type": "string",
                    "description": "Zodiac sign used by get_hadda_lord.",
                    "enum": [
                      "Aries",
                      "Taurus",
                      "Gemini",
                      "Cancer",
                      "Leo",
                      "Virgo",
                      "Libra",
                      "Scorpio",
                      "Sagittarius",
                      "Capricorn",
                      "Aquarius",
                      "Pisces"
                    ],
                    "default": "Aries",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2024-11-21T07:45:44.368Z",
                "longitude": 76.125,
                "name": "Ashwini",
                "zodiac": "Aries",
                "lord": "saturn",
                "target_phase": 0,
                "limitdays": 30,
                "year": 1,
                "chart_factor": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/auspicious-timings/": {
      "post": {
        "operationId": "astro_auspicious_timings",
        "summary": "Auspicious timings",
        "description": "The favourable windows of the day: abhijit, brahma, godhuli, nishita, vijaya and amrit kalam.\n\nEvery one is {start, end}. Abhijit and vijaya both straddle the midpoint of the daylight and will usually be identical or near-identical; brahma falls before sunrise and nishita around the middle of the night, so both can land on the adjacent calendar date. Amrit kalam is a LIST because it can occur more than once in a day; the others are single windows.\n\nAll of them are proportional divisions of the day or night, so they depend on the place as much as the date.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "abhijit": {
                      "start": "2026-08-31T12:01:51.866669+05:30",
                      "end": "2026-08-31T12:52:12.133336+05:30"
                    },
                    "brahma": {
                      "start": "2026-08-31T04:38:07.066666+05:30",
                      "end": "2026-08-31T05:23:48.533333+05:30"
                    },
                    "godhuli": {
                      "start": "2026-08-31T18:31:58.933333+05:30",
                      "end": "2026-08-31T18:55:59.366667+05:30"
                    },
                    "nishita": {
                      "start": "2026-09-01T00:04:24.266667+05:30",
                      "end": "2026-09-01T00:50:05.733333+05:30"
                    },
                    "vijaya": {
                      "start": "2026-08-31T12:01:51.866667+05:30",
                      "end": "2026-08-31T12:52:12.133333+05:30"
                    },
                    "amrit_kalam": [
                      {
                        "start": "2026-08-31T06:09:30+05:30",
                        "end": "2026-08-31T07:43:53+05:30"
                      },
                      {
                        "start": "2026-08-31T17:10:11+05:30",
                        "end": "2026-08-31T18:44:34+05:30"
                      },
                      {
                        "start": "2026-09-01T03:18:35.500000+05:30",
                        "end": "2026-09-01T04:44:15.750000+05:30"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/ayanamsa_value/": {
      "get": {
        "operationId": "astro_ayanamsa_value",
        "summary": "Ayanamsa value",
        "description": "The ayanamsa is the gap between the tropical zodiac, which is tied to the equinox, and the sidereal zodiac used in Vedic astrology, which is tied to the stars. It grows by roughly fifty arc-seconds a year, so every sidereal calculation depends on which ayanamsa you adopt and for which date.\n\nThis endpoint returns that single number. It is a GET with query parameters: `ayanamsa`, a name such as LAHIRI, RAMAN, KRISHNAMURTI or TRUE_CITRA (47 standard ayanamsa definitions are accepted, case-insensitively), and `date`, an ISO date defaulting to today. Use it to label a chart with the ayanamsa it was cast on, or to see how far two definitions diverge for a given birth date.\n\nThe response gives the value both ways: `value_degrees` as a decimal to six places, and `degrees`, `minutes` and `seconds` plus a ready-made `formatted` string. The name and the resolved date are echoed back. An unknown name, and the pseudo-ayanamsa 'USER', return 400.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "parameters": [
          {
            "name": "ayanamsa",
            "in": "query",
            "required": false,
            "description": "Ayanamsa name (e.g. LAHIRI). Defaults to LAHIRI.",
            "schema": {
              "type": "string",
              "description": "Ayanamsa name (e.g. LAHIRI). Defaults to LAHIRI. GET query parameter. Case-insensitive .strip.upper at. Defaults to 'LAHIRI'. 'USER' is explicitly rejected by this endpoint even though it exists in the underlying swisseph dict. Unknown values return 400 {\"error\": \"Unknown ayanamsa...\"}.",
              "enum": [
                "FAGAN_BRADLEY",
                "LAHIRI",
                "DELUCE",
                "RAMAN",
                "USHASHASHI",
                "KRISHNAMURTI",
                "DJWHAL_KHUL",
                "YUKTESHWAR",
                "JN_BHASIN",
                "BABYL_KUGLER1",
                "BABYL_KUGLER2",
                "BABYL_KUGLER3",
                "BABYL_HUBER",
                "BABYL_ETPSC",
                "ALDEBARAN_15TAU",
                "HIPPARCHOS",
                "SASSANIAN",
                "GALCENT_0SAG",
                "J2000",
                "J1900",
                "B1950",
                "SURYASIDDHANTA",
                "SURYASIDDHANTA_MSUN",
                "ARYABHATA",
                "ARYABHATA_MSUN",
                "SS_REVATI",
                "SS_CITRA",
                "TRUE_CITRA",
                "TRUE_REVATI",
                "TRUE_PUSHYA",
                "GALCENT_COCHRANE",
                "GALCENT_RGILBRAND",
                "GALCENT_MULA_WILHELM",
                "ARYABHATA_522",
                "BABYL_BRITTON",
                "TRUE_MULA",
                "GALALIGN_MARDYKS",
                "TRUE_SHEORAN",
                "GALEQU_TRUE",
                "GALEQU_MULA",
                "GALEQU_IAU1958",
                "GALEQU_FIORENZA",
                "VALENS_MOON",
                "LAHIRI_1940",
                "LAHIRI_VP285",
                "KRISHNAMURTI_VP291",
                "LAHIRI_ICRC"
              ]
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "ISO date string (e.g. 1990-05-14). Defaults to today.",
            "schema": {
              "type": "string",
              "description": "ISO date string (e.g. 1990-05-14). Defaults to today. FORMAT constraint, not an enum. Anything Python's datetime.fromisoformat accepts: 'YYYY-MM-DD' or a full ISO 8601 datetime, e.g. '1990-05-14' / '1990-05-14T12:30:00'. Any timezone offset in the string is DISCARDED and replaced with UTC. Defaults to today (UTC). Invalid format returns 400."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "ayanamsa": "LAHIRI",
                  "date": "2026-09-07",
                  "value_degrees": 24.229844,
                  "degrees": 24,
                  "minutes": 13,
                  "seconds": 47,
                  "formatted": "24°13'47\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/bengali_calendar/": {
      "post": {
        "operationId": "astro_bengali_calendar",
        "summary": "Bengali calendar",
        "description": "The Bengali year for a given Gregorian year: Pohela Boishakh and the solar new year, the twelve Sankrantis, Durga Puja and the rest of the autumn sequence, Kali Puja, Bhai Phonta, Jagaddhatri Puja and the pan-Indian festivals as Bengal observes them.\n\nEverything is computed live for the coordinates you pass rather than read from a fixed table. The lunar festivals are found by tithi and then resolved to the civil day on which they are actually kept, using the time of day each observance requires — sunrise for some, midday for others, midnight for Maha Shivaratri — so the dates match what a Bengali panchang would print for that town.\n\nSend `year` with `latitude`, `longitude` and `timezone_as_float`. The response is `{year, events}`, where events is a list of `{name, date}` in date order and `date` is a plain YYYY-MM-DD local civil date. Compare with /api/astro/assamese_calendar/, which shares much of this festival set but adds the Bihus and the solar Assamese observances.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "events": [
                      {
                        "name": "Makara Sankranti",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Kumbha Sankranti",
                        "date": "2026-02-13"
                      },
                      {
                        "name": "Maha Shivaratri",
                        "date": "2026-02-15"
                      },
                      {
                        "name": "Meena Sankranti",
                        "date": "2026-03-15"
                      },
                      {
                        "name": "Rama Navami *Smarta",
                        "date": "2026-03-26"
                      },
                      {
                        "name": "Mesha Sankranti",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Solar New Year",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Pohela Boishakha",
                        "date": "2026-04-15"
                      },
                      {
                        "name": "Akshaya Tritiya",
                        "date": "2026-04-19"
                      },
                      {
                        "name": "Buddha Purnima",
                        "date": "2026-05-01"
                      },
                      {
                        "name": "Rabindranath Tagore Jayanti",
                        "date": "2026-05-09"
                      },
                      {
                        "name": "Vrishabha Sankranti",
                        "date": "2026-05-15"
                      },
                      {
                        "name": "Ganga Puja",
                        "date": "2026-05-25"
                      },
                      {
                        "name": "Mithuna Sankranti",
                        "date": "2026-06-15"
                      },
                      {
                        "name": "Karka Sankranti",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Ratha Jatra",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Guru Purnima",
                        "date": "2026-07-29"
                      },
                      {
                        "name": "Simha Sankranti",
                        "date": "2026-08-17"
                      },
                      {
                        "name": "Rakhi Bandhan",
                        "date": "2026-08-28"
                      },
                      {
                        "name": "Krishna Janmashtami",
                        "date": "2026-09-04"
                      },
                      {
                        "name": "Ganesh Chaturthi",
                        "date": "2026-09-14"
                      },
                      {
                        "name": "Kanya Sankranti",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Mahalaya",
                        "date": "2026-10-10"
                      },
                      {
                        "name": "Tula Sankranti",
                        "date": "2026-10-17"
                      },
                      {
                        "name": "Durga Ashtami",
                        "date": "2026-10-19"
                      },
                      {
                        "name": "Maha Navami",
                        "date": "2026-10-20"
                      },
                      {
                        "name": "Vijayadashami",
                        "date": "2026-10-21"
                      },
                      {
                        "name": "Lakshmi Puja",
                        "date": "2026-10-25"
                      },
                      {
                        "name": "Dhanteras",
                        "date": "2026-11-06"
                      },
                      {
                        "name": "Dipabali",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Kali Puja",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Bhai Phonta",
                        "date": "2026-11-11"
                      },
                      {
                        "name": "Vrishchika Sankranti",
                        "date": "2026-11-16"
                      },
                      {
                        "name": "Jagaddhatri Puja",
                        "date": "2026-11-18"
                      },
                      {
                        "name": "Dhanu Sankranti",
                        "date": "2026-12-16"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/bhava-cusps/": {
      "post": {
        "operationId": "astro_bhava_cusps",
        "summary": "Bhava cusps",
        "description": "The twelve house cusps under two systems, side by side.\n\n`equal_house` is the standard equal-house division in the sidereal zodiac; `sripati` is the Sripati method. Both come back as twelve entries in degree, sign, minute and second form with nakshatra and pada.\n\nWorth checking both before you commit to one: they agree on some charts and diverge on others, and a house placement that changes between them is exactly the kind of thing a reader will query.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "equal_house": [
                      {
                        "degree": 12,
                        "sign": "Le",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Makha",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Vi",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Hasta",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Li",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Swaati",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Sc",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Anooraadha",
                        "pada": 3
                      },
                      {
                        "degree": 12,
                        "sign": "Sg",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Moola",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Cp",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Sravanam",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Aq",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Satabhishak",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Pi",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 3
                      },
                      {
                        "degree": 12,
                        "sign": "Ar",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Ashwini",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Ta",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Rohini",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Ge",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Aardra",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Cn",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Pushyami",
                        "pada": 3
                      }
                    ],
                    "sripati": [
                      {
                        "degree": 12,
                        "sign": "Le",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Makha",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Vi",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Hasta",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Li",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Swaati",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Sc",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Anooraadha",
                        "pada": 3
                      },
                      {
                        "degree": 12,
                        "sign": "Sg",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Moola",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Cp",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Sravanam",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Aq",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Satabhishak",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Pi",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 3
                      },
                      {
                        "degree": 12,
                        "sign": "Ar",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Ashwini",
                        "pada": 4
                      },
                      {
                        "degree": 12,
                        "sign": "Ta",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Rohini",
                        "pada": 1
                      },
                      {
                        "degree": 12,
                        "sign": "Ge",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Aardra",
                        "pada": 2
                      },
                      {
                        "degree": 12,
                        "sign": "Cn",
                        "minutes": 11,
                        "seconds": 16,
                        "nakshatra": "Pushyami",
                        "pada": 3
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/bhinnashtakavarga/": {
      "post": {
        "operationId": "astro_bhinnashtakavarga",
        "summary": "Bhinnashtakavarga",
        "description": "Bhinnashtakavarga: one row per contributor, twelve numbers each, scored 0 to 8.\n\nRows are Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn and an eighth labelled `Rahu`; the twelve values run Aries to Pisces. Row `Sun` value 3 means the Sun's varga gives Aries three points. This is the table most readings start from.\n\n`pindas` comes with it: the three final weightings, seven numbers each, one per planet. Sodhya pinda is the single figure classical texts judge a planet's overall strength by.\n\nFor the twelve totals alone, /api/astro/sarvashtakavarga/ is the smaller call.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Ashtakavarga"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "bhinnashtakavarga": {
                      "Sun": [
                        4,
                        4,
                        6,
                        3,
                        2,
                        4,
                        3,
                        4,
                        4,
                        5,
                        4,
                        5
                      ],
                      "Moon": [
                        3,
                        6,
                        5,
                        4,
                        4,
                        1,
                        6,
                        3,
                        3,
                        6,
                        4,
                        4
                      ],
                      "Mars": [
                        3,
                        3,
                        7,
                        2,
                        2,
                        3,
                        4,
                        1,
                        5,
                        5,
                        2,
                        2
                      ],
                      "Mercury": [
                        5,
                        5,
                        6,
                        5,
                        2,
                        5,
                        3,
                        4,
                        6,
                        7,
                        3,
                        3
                      ],
                      "Jupiter": [
                        5,
                        7,
                        5,
                        4,
                        6,
                        5,
                        4,
                        3,
                        4,
                        5,
                        6,
                        2
                      ],
                      "Venus": [
                        6,
                        5,
                        6,
                        4,
                        3,
                        3,
                        4,
                        6,
                        5,
                        3,
                        3,
                        4
                      ],
                      "Saturn": [
                        2,
                        6,
                        5,
                        3,
                        5,
                        2,
                        2,
                        4,
                        1,
                        3,
                        3,
                        3
                      ],
                      "Rahu": [
                        3,
                        6,
                        6,
                        2,
                        4,
                        3,
                        4,
                        5,
                        3,
                        7,
                        1,
                        5
                      ]
                    },
                    "pindas": {
                      "raasi_pindas": [
                        80,
                        93,
                        96,
                        99,
                        85,
                        80,
                        111
                      ],
                      "graha_pindas": [
                        44,
                        33,
                        60,
                        59,
                        53,
                        39,
                        69
                      ],
                      "sodhya_pindas": [
                        124,
                        126,
                        156,
                        158,
                        138,
                        119,
                        180
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "apply_ekadhipatya_reductions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "chart_name": {
                    "type": "string",
                    "default": "RashiChart",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "use_eight_ashtakavargas_in_sav": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/birth-panchanga-effects/": {
      "post": {
        "operationId": "astro_birth_panchanga_effects",
        "summary": "Birth panchanga readings (your elements)",
        "description": "What each of your birth panchanga elements is held to signify.\n\nGive the tithi, karana, yoga, vaara, hora and paksha you were born under and get the traditional reading for each in one call, instead of six calls with six key names nobody would guess.\n\nThese are looked up by NAME, not computed from a chart: use /api/astro/panchang/ to find which tithi and karana a birth falls in, then pass the names here. /api/astro/panchanga-elements/ lists every spelling the lookup accepts.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "elements": [
                      {
                        "element": "tithi",
                        "is": "Lunar day",
                        "value": "pratipada",
                        "effect": "These individuals face critical early life periods but if they navigate these successfully, they develop remarkable strength and luminosity. They tend to be highly enterprising, righteous, and virtuous in their conduct."
                      },
                      {
                        "element": "karana",
                        "is": "Half of a lunar day",
                        "value": "bava",
                        "effect": "Individuals who may have strong desires but are charitable, wealthy, and happy. They often hold leadership positions and may work with children or in youthful endeavors, displaying courage."
                      },
                      {
                        "element": "yoga",
                        "is": "Sun-Moon combination",
                        "value": "vishkumbha",
                        "effect": "Though traditionally considered challenging for longevity, this yoga brings lovely appearance and fondness for family, home, and spouse. These individuals are typically wealthy, skillful in undertakings, and victorious over enemies. They maintain good physical appearance, enjoy independence, and are generally fortunate with family-oriented nature and leadership skills."
                      },
                      {
                        "element": "vaara",
                        "is": "Weekday",
                        "value": "sunday",
                        "effect": "Individuals born on Sunday typically possess a steady and determined nature with a fearless approach to life. They often have a naturally authoritative disposition and demonstrate skillfulness in their endeavors. These individuals tend to be honorable and maintain high standards of purity in their conduct. They may have a tendency toward bilious temperament and often exhibit leadership qualities with a noble bearing."
                      },
                      {
                        "element": "hora",
                        "is": "Planetary hour",
                        "value": "surya",
                        "effect": "Periods of dedicated effort and perseverance, with experiences that build character through challenges."
                      },
                      {
                        "element": "paksha",
                        "is": "Lunar fortnight",
                        "value": "shukla",
                        "effect": "Individuals born during the bright half of the lunar month are typically blessed with longevity and strong family connections. They often become protectors and supporters of many people, displaying charitable and friendly natures. These individuals tend to be honorable and may experience influence from their spouse. They are usually blessed with children and material wealth, following righteous paths and showing mercy to others."
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "hora": {
                    "type": "string",
                    "default": "surya",
                    "examples": [
                      "string"
                    ]
                  },
                  "karana": {
                    "type": "string",
                    "default": "bava",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "paksha": {
                    "type": "string",
                    "default": "shukla",
                    "examples": [
                      "string"
                    ]
                  },
                  "tithi": {
                    "type": "string",
                    "default": "pratipada",
                    "examples": [
                      "string"
                    ]
                  },
                  "vaara": {
                    "type": "string",
                    "default": "sunday",
                    "examples": [
                      "string"
                    ]
                  },
                  "yoga": {
                    "type": "string",
                    "default": "vishkumbha",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "tithi": "pratipada",
                "karana": "bava",
                "yoga": "vishkumbha",
                "vaara": "sunday",
                "hora": "surya",
                "paksha": "shukla"
              }
            }
          }
        }
      }
    },
    "/api/astro/brahma-muhurat/": {
      "post": {
        "operationId": "astro_brahma_muhurat",
        "summary": "Brahma muhurat",
        "description": "Brahma muhurta as a single {start, end} window.\n\nThe last two muhurtas of the night before sunrise - roughly ninety-six minutes ending at dawn - traditionally the time for study and practice. It is computed from the night's length, so it moves with latitude and season and falls on the CALENDAR DAY BEFORE the sunrise it precedes.\n\nFor the other favourable windows in the same call, use /api/astro/auspicious-timings/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "start": "2026-08-31T04:38:07.066666+05:30",
                    "end": "2026-08-31T05:23:48.533333+05:30"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/cazimi/": {
      "post": {
        "operationId": "astro_cazimi",
        "summary": "Cazimi, combustion and under the beams",
        "description": "The three solar conditions for every planet, at one moment.\n\nA planet close to the Sun is in one of three states, and they are not the same thing despite constantly being run together. CAZIMI is within about 17 arcminutes of the Sun's centre — \"in the heart\" — and is held to be the STRONGEST a planet can be. COMBUST is within roughly 8.5 degrees and is close to the worst: the significations burnt up. UNDER THE BEAMS is within roughly 15 degrees, weakened but not destroyed.\n\nThe distinction matters because cazimi and combust are half a degree apart and opposite in meaning, so cazimi is tested first — a planet inside both orbs is cazimi. An endpoint that only checked combustion would report the best placement in traditional astrology as the worst.\n\nAlso returned per planet: the exact elongation in degrees and arcminutes, which side of the Sun it sits on, and whether it is applying to the Sun or separating from it — derived from the two longitude speeds, and the difference between a planet going into combustion and one coming out.\n\nAll three orbs are request fields, because the sources disagree on them. Distinct from /api/astro/combustion/, which scans a whole year for the periods one planet is combust; this answers what the state is right now, for every planet, and covers cazimi and under-the-beams as well.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Traditional & Hellenistic"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "sun": {
                      "longitude": 166.834,
                      "longitude_speed": 0.971766
                    },
                    "orbs_used": {
                      "cazimi": 0.2833333333333333,
                      "combust": 8.5,
                      "under_the_beams": 15
                    },
                    "bodies": {
                      "MOON": {
                        "elongation_degrees": 21.277,
                        "elongation_arcminutes": 1276.62,
                        "side": "behind",
                        "condition": "none",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": false,
                        "applying": true,
                        "longitude": 145.557,
                        "longitude_speed": 14.085813
                      },
                      "MERCURY": {
                        "elongation_degrees": 11.155,
                        "elongation_arcminutes": 669.3,
                        "side": "ahead",
                        "condition": "under_the_beams",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": true,
                        "applying": false,
                        "longitude": 177.989,
                        "longitude_speed": 1.714265
                      },
                      "VENUS": {
                        "elongation_degrees": 42.61,
                        "elongation_arcminutes": 2556.6,
                        "side": "ahead",
                        "condition": "none",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": false,
                        "applying": true,
                        "longitude": 209.444,
                        "longitude_speed": 0.671018
                      },
                      "MARS": {
                        "elongation_degrees": 58.102,
                        "elongation_arcminutes": 3486.12,
                        "side": "behind",
                        "condition": "none",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": false,
                        "applying": false,
                        "longitude": 108.732,
                        "longitude_speed": 0.62136
                      },
                      "JUPITER": {
                        "elongation_degrees": 31.375,
                        "elongation_arcminutes": 1882.5,
                        "side": "behind",
                        "condition": "none",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": false,
                        "applying": false,
                        "longitude": 135.459,
                        "longitude_speed": 0.203527
                      },
                      "SATURN": {
                        "elongation_degrees": 153.673,
                        "elongation_arcminutes": 9220.38,
                        "side": "behind",
                        "condition": "none",
                        "cazimi": false,
                        "combust": false,
                        "under_the_beams": false,
                        "applying": false,
                        "longitude": 13.161,
                        "longitude_speed": -0.065826
                      }
                    },
                    "notes": {
                      "order": "Cazimi is tested first: its orb lies inside the combust orb, and a planet inside both is cazimi, which the tradition reads as the strongest placement rather than the weakest."
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "altitude": {
                    "type": "number",
                    "format": "double",
                    "description": "OBSERVER elevation in metres, not a body's altitude.",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "cazimi_orb": {
                    "type": "number",
                    "format": "double",
                    "description": "Degrees. Default 0.2833, i.e. 17 arcminutes.",
                    "minimum": 0,
                    "maximum": 5,
                    "default": 0.2833333333333333,
                    "examples": [
                      0
                    ]
                  },
                  "combust_orb": {
                    "type": "number",
                    "format": "double",
                    "description": "Degrees. Default 8.5.",
                    "minimum": 0,
                    "maximum": 30,
                    "default": 8.5,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet_names": {
                    "type": "array",
                    "description": "Bodies to test. The Sun and the nodes are ignored if sent.",
                    "default": [
                      "MOON",
                      "MERCURY",
                      "VENUS",
                      "MARS",
                      "JUPITER",
                      "SATURN"
                    ],
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "time_zone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset. Either this or timezone_as_float; they mirror.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "under_beams_orb": {
                    "type": "number",
                    "format": "double",
                    "description": "Degrees. Default 15.0.",
                    "minimum": 0,
                    "maximum": 45,
                    "default": 15,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-09T12:00:00+00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/celestial/": {
      "post": {
        "operationId": "astro_celestial",
        "summary": "Celestial positions",
        "description": "Raw ephemeris for one or more bodies: where a planet is, how fast it is moving, when it rises and sets, whether it is retrograde. This is the astronomy layer beneath the rest of the API, exposed directly, and it reaches well past the nine Vedic grahas — the outer planets, Chiron and the asteroids, the Uranian fictitious points and several planetary moons are all addressable.\n\nThe keys divide into two kinds. The `set_*` keys are switches: they change how positions or rise and set times are computed — geocentric, topocentric or heliocentric, apparent or true, with or without nutation, sidereal or tropical, Hindu rising or disc-centre rising — and each returns null. The `get_*` keys, along with `rise_time`, `set_time`, `is_retrograde` and `is_stationary`, return values. Because keys are executed in the order you list them, a switch only affects the value keys that come after it in the array.\n\n`planet_names` takes a list of upper-case names and the response is keyed by them, so a call for MARS comes back as `{\"data\": {\"MARS\": {\"get_longitude\": 123.45}}}`. An unrecognised name does not fail the request: that entry comes back as `{\"error\": \"Unknown planet '<name>'\"}`. Note the nodes are called MEAN_NODE and TRUE_NODE here, not the 'northtruenode' spelling /api/astro/chart/ uses.\n\nAvailable `keys` (31), all covered by the same single credit: get_altitude, get_apsis, get_azimuth, get_declination, get_distance, get_ecliptic_speeds, get_equatorial_speeds, get_illumination, get_latitude, get_longitude, get_right_ascension, is_retrograde, is_stationary, rise_time, set_astrometric_j_positions, set_astrometric_positions, set_barycentric_positions, set_default_positions, set_default_rising, set_disc_bottom_no_refraction, set_disc_bottom_refraction, set_disc_center_no_refraction, set_disc_center_refraction, set_heliocentric_positions, set_hindu_rising, set_jpl_horizons_positions, set_mean_equinox_positions, set_sidereal_positions, set_time, set_topocentric_positions, set_true_positions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "SUN": {
                      "set_default_positions": null,
                      "set_hindu_rising": null
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "altitude": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint, not an enum. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings. The `set_*` keys mutate calculation flags on the Celestial object; the `get_*` / `rise_time` / `set_time` / `is_*` keys return values.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "set_default_rising",
                        "set_hindu_rising",
                        "set_disc_center_refraction",
                        "set_disc_bottom_refraction",
                        "set_disc_center_no_refraction",
                        "set_disc_bottom_no_refraction",
                        "set_default_positions",
                        "set_true_positions",
                        "set_topocentric_positions",
                        "set_heliocentric_positions",
                        "set_barycentric_positions",
                        "set_astrometric_positions",
                        "set_astrometric_j_positions",
                        "set_mean_equinox_positions",
                        "set_sidereal_positions",
                        "set_jpl_horizons_positions",
                        "rise_time",
                        "set_time",
                        "get_longitude",
                        "get_latitude",
                        "get_distance",
                        "get_ecliptic_speeds",
                        "is_retrograde",
                        "get_right_ascension",
                        "get_declination",
                        "get_equatorial_speeds",
                        "get_azimuth",
                        "get_altitude",
                        "get_illumination",
                        "get_apsis",
                        "is_stationary"
                      ]
                    }
                  },
                  "planet_names": {
                    "type": "array",
                    "description": "Array of strings, min length 1. Note the nodes are named 'MEAN_NODE'/'TRUE_NODE' here, not the 'northtruenode' style used in chart output. An unrecognised name does not fail the request: that entry comes back as {\"error\": \"Unknown planet '<X>'\"}.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "SUN",
                        "MOON",
                        "MERCURY",
                        "VENUS",
                        "MARS",
                        "JUPITER",
                        "SATURN",
                        "URANUS",
                        "NEPTUNE",
                        "PLUTO",
                        "MEAN_NODE",
                        "TRUE_NODE",
                        "CHIRON",
                        "PHOLUS",
                        "CERES",
                        "PALLAS",
                        "JUNO",
                        "VESTA",
                        "CUPIDO",
                        "HADES",
                        "ZEUS",
                        "KRONOS",
                        "APOLLON",
                        "ADMETOS",
                        "VULKANUS",
                        "POSEIDON",
                        "SELENA",
                        "PHOBOS",
                        "DEIMOS",
                        "IO",
                        "EUROPA",
                        "GANYMEDE",
                        "CALLISTO",
                        "TITAN",
                        "TRITON",
                        "CHARON"
                      ]
                    }
                  },
                  "time_zone": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "altitude",
                  "date_time",
                  "keys",
                  "planet_names",
                  "time_zone"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2024-11-20T08:40:08.658Z",
                "keys": [
                  "set_default_positions",
                  "set_hindu_rising"
                ],
                "latitude": 26.9124,
                "longitude": 75.7873,
                "time_zone": 5.5,
                "altitude": 0,
                "planet_names": [
                  "SUN"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/chakra/": {
      "post": {
        "operationId": "astro_chakra",
        "summary": "Prashnavali",
        "description": "Four traditional question-and-answer prashnavali, returned as data so you can build the drawing mechanism yourself. There is no astronomy here — nothing is calculated from a date or a place. These are fixed devotional texts.\n\n`ram_shalaka` is the Ram Shalaka Prashnavali: 225 entries drawn from the Ramcharitmanas, each with the Devanagari `letter` that indexes it in the traditional grid, the `chaupai` itself, a `source` note saying where in the epic it appears, and an English `answer`. `hanuman_prashnavali` is 49 numbered entries of `{answer, description}`. `mavji_maharaj` is 64 entries keyed by a three-digit number from 111 to 444 (each digit 1 to 4, as though three four-sided draws), each carrying the number and its reading in both Hindi and English. `sai_prashnavali` is 720 numbered answers.\n\nPass the ones you want in `keys`. Three of them return the entire dataset in one go, which is the usual way to use them — fetch once, cache, then index locally. `sai_prashnavali` is the exception: it requires `number` and returns only that single entry, and a number outside 1–720 returns 400.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Avatar chakra"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"ram_shalaka\": [{\"letter\": \"सु\", \"chaupai\": \"सुनु सिय सत्य असीस हमारी। पूजहि मन कामना तुम्हारी॥\", \"source\": \"This chaupai is from Bal Kand, during the scene of Sita Ji’s Gauri Puja. Goddess Gauri blesses Sita Ji.\", \"answer\": \"The seeker’s question is auspicious, and the task will be accomplished successfully.\"}, {\"letter\": \"प्र\", \"chaupai\": \"प्रबिसि नगर कीजे सब काजा। हृदय राखि कोसलपुर राजा॥\", \"source\": \"This chaupai is from Sundar Kand, when Hanuman Ji enters Lanka.\", \"answer\": \"Begin your work while remembering the Lord, and success will follow.\"}, {\"letter\": \"उ\", \"chaupai\": \"उघरें अंत न होइ निबाहू। कालनेमि जिमि रावन राहू॥\", \"source\": \"This chaupai appears at the beginning of Bal Kand, in the context of Satsang (holy company).\", \"answer\": \"This task is not beneficial. There is doubt about its success.\"}, {\"letter\": \"बि\", \"chaupai\": \"बिधि बस सुजन कुसंगत परहीं। फनि मनि सम निज गुन अनुसरहीं॥\", \"source\": \"This chaupai is from the beginning of Bal Kand, describing the effects of good and bad company.\", \"answer\": \"Avoid the company of wicked individuals. There is uncertainty in task completion.\"}, {\"letter\": \"हो\", \"chaupai\": \"होइहै सोई जो राम रचि राखा। को करि तरक बढ़ावहिं साखा॥\", \"source\": \"This chaupai is from Ayodhya Kand, spoken by Bharat Ji.\", \"answer\": \"Everything will happen as per God’s will, so do not worry.\"}, {\"letter\": \"मु\", \"chaupai\": \"मुद मंगलमय संत समाजू। जिमि जग जंगम तीरथ राजू॥\", \"source\": \"This chaupai is from Bal Kand, describing the presence of saints as a holy pilgrimage.\", \"answer\": \"The question is excellent. The task will be accomplished successfully.\"}, {\"letter\": \"ग\", \"chaupai\": \"गरल सुधा रिपु करय मिताई। गोपद सिंधु अनल सितलाई॥\", \"source\": \"This chaupai is from Sundar Kand, when Hanuman Ji enters Lanka.\", \"answer\": \"This is a very auspicious question. The task will be successful.\"}, {\"letter\": \"ब\", \"chaupai\": \"बरुन कुबेर सुरेस समीरा। रन सनमुख धरि काह न धीरा॥\", \"source\": \"This chaupai is from Lanka Kand, during Mandodari’s lament after Ravan’s death.\", \"answer\": \"There is uncertainty in task completion.\"}, {\"letter\": \"सु\", \"chaupai\": \"सुफल मनोरथ होहुँ तुम्हारे। रामु लखनु सुनि भए सुखारे॥\", \"source\": \"This chaupai is from Bal Kand, when Vishwamitra Ji blesses after receiving flowers from Pushp Vatika.\", \"answer\": \"The question is highly auspicious. The task will be accomplished successfully.\"}, {\"letter\": \"नु\", \"chaupai\": \"सुनु सिय सत्य असीस हमारी। पूजहि मन कामना तुम्हारी॥\", \"source\": \"This chaupai is from Bal Kand, during the scene of Sita Ji’s Gauri Puja. Goddess Gauri blesses Sita Ji.\", \"answer\": \"The seeker’s question is auspicious, and the task will be accomplished successfully.\"}, {\"letter\": \"बि\", \"chaupai\": \"प्रबिसि नगर कीजे सब काजा। हृदय राखि कोसलपुर राजा॥\", \"source\": \"This chaupai is from Sundar Kand, when Hanuman Ji enters Lanka.\", \"answer\": \"Begin your work while remembering the Lord, and success will follow.\"}, {\"letter\": \"घ\", \"chaupai\": \"उघरें अंत न होइ निबाहू। कालनेमि जिमि रावन राहू॥\", \"source\": \"This chaupai appears at the beginning of Bal Kand, in the context of Satsang (holy company).\", \"answer\": \"This task is not beneficial. There is doubt about its success.\"}, {\"letter\": \"धि\", \"chaupai\": \"बिधि बस सुजन कुसंगत परहीं। फनि मनि सम निज गुन अनुसरहीं॥\", \"source\": \"This chaupai is from the beginning of Bal Kand, describing the effects of good and bad company.\", \"answer\": \"Avoid the company of wicked individuals. There is uncertainty in task completion.\"}, {\"letter\": \"इ\", \"chaupai\": \"होइहै सोई जो राम रचि राखा। को करि तरक बढ़ावहिं साखा॥\", \"source\": \"This chaupai is from Ayodhya Kand, spoken by Bharat Ji.\", \"answer\": \"Everything will happen as per God’s will, so do not worry.\"}, {\"letter\": \"द\", \"chaupai\": \"मुद मंगलमय संत समाजू। जिमि जग जंगम तीरथ राजू॥\", \"source\": \"This chaupai is from Bal Kand, describing the presence of saints as a holy pilgrimage.\", \"answer\": \"The question is excellent. The task will be accomplished successfully.\"}, {\"letter\": \"र\", \"chaupai\": \"गरल सुधा रिपु करय मिताई। गोपद सिंध"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. 'sai_prashnavali' additionally requires `number` and returns only that entry; the others return the whole dataset.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "ram_shalaka",
                        "hanuman_prashnavali",
                        "sai_prashnavali",
                        "mavji_maharaj"
                      ]
                    }
                  },
                  "number": {
                    "type": "integer",
                    "description": "Entry number to fetch. Required when 'sai_prashnavali' is in keys. Ignored for other chakras.",
                    "minimum": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "ram_shalaka"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/chandrabala/": {
      "post": {
        "operationId": "astro_chandrabala",
        "summary": "Chandrabala",
        "description": "Chandra bala: which signs are well placed relative to the Moon's current sign.\n\nA list of zodiac names. The counterpart to tarabala - that one works from the birth nakshatra, this from the birth or rising sign.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "chandrabala": [
                      "Aries",
                      "Gemini",
                      "Cancer",
                      "Libra",
                      "Scorpio",
                      "Aquarius"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/chara-karakas/": {
      "post": {
        "operationId": "astro_chara_karakas",
        "summary": "Chara karakas (Jaimini)",
        "description": "The eight Jaimini chara karakas, as planet names rather than raw indices.\n\nThe karakas rank the planets by how far through their sign they stand, highest first, with Rahu counted backwards because it moves backwards. Whichever planet comes top is the Atmakaraka, the significator of the self, and the whole of Jaimini's method rests on it.\n\nThe underlying endpoint returns a bare array like [4, 5, 2, 0, 1, 6, 3, 7]. This returns which planet holds which karaka and what each karaka signifies.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Jaimini"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "jaimini",
                    "scheme": "eight_karaka",
                    "karakas": [
                      {
                        "karaka": "atma_karaka",
                        "signifies": "Self",
                        "planet": "Jupiter",
                        "planet_index": 4
                      },
                      {
                        "karaka": "amatya_karaka",
                        "signifies": "Career and counsel",
                        "planet": "Moon",
                        "planet_index": 1
                      },
                      {
                        "karaka": "bhratri_karaka",
                        "signifies": "Siblings",
                        "planet": "Venus",
                        "planet_index": 5
                      },
                      {
                        "karaka": "maitri_karaka",
                        "signifies": "Friends",
                        "planet": "Saturn",
                        "planet_index": 6
                      },
                      {
                        "karaka": "pitri_karaka",
                        "signifies": "Father",
                        "planet": "Sun",
                        "planet_index": 0
                      },
                      {
                        "karaka": "putra_karaka",
                        "signifies": "Children",
                        "planet": "Mercury",
                        "planet_index": 3
                      },
                      {
                        "karaka": "jnaati_karaka",
                        "signifies": "Kin and obstacles",
                        "planet": "Mars",
                        "planet_index": 2
                      },
                      {
                        "karaka": "dara_karaka",
                        "signifies": "Spouse",
                        "planet": "Rahu",
                        "planet_index": 7
                      }
                    ],
                    "atma_karaka": "Jupiter"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Sun",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true"
              }
            }
          }
        }
      }
    },
    "/api/astro/chart/": {
      "post": {
        "operationId": "astro_chart",
        "summary": "Birth chart",
        "description": "The core chart endpoint: planetary positions, house divisions and the ascendant for a moment and a place. Ask for the Rashi chart (D-1) for an ordinary birth chart, or any of thirty-odd divisional charts — Navamsa, Dasamsa, Dwadasamsa, Shashtyamsa and the rest — by name, and pass an array of names to get several back in one call, keyed by chart name.\n\nEach chart returns three blocks. `celestial` is keyed by body name (sun, moon, … northtruenode) and gives longitude, latitude, nakshatra and pada, kakshya, sign name and house number for each. `houses` is keyed 1 to 12 with the `start`, `cusp` and `end` of every house. `ascendant` gives the rising degree and its sign. `notation` controls units throughout: 'degree' for decimal degrees, 'astrological' for sign plus degrees, minutes and seconds.\n\nThe optional fields are where the precision lives. `ayanamsa` picks the sidereal definition, and `apply_correction` with `correction_deg`, `correction_min`, `correction_sec` and `correction_direction` shifts it by hand. `rahu` chooses true nodes, mean nodes or both. `extended_bodies` adds asteroids, Uranian fictitious bodies or planetary moons, silently dropping any whose ephemeris files are absent. `ascendant_pos` decides whether the ascendant is read at the house cusp, start or end — note that any value other than 'start' or 'end', including a typo, falls back to the cusp without complaint. The date field is spelt `datetime` on this endpoint, not `date_time`.\n\nOPT-IN SVG RENDERING. Set render to 'svg' and the response gains two more fields, alongside the four above rather than in place of them: `layout` is the geometry — every house or sign cell's polygon points, label position, and which bodies occupy it — for drawing your own diagram in React, Canvas, Flutter or SwiftUI. `svg` is ready-to-drop markup built from that same geometry. chart_style picks North Indian (diamond, fixed houses, rotating signs) or South Indian (fixed sign grid, rotating houses); svg_size, theme, label_style, show_degrees and the four *_color fields control the rendering. Every field defaults to off, so a request that does not mention render is completely unaffected — the response is exactly what it has always been.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "NavamsaChart": {
                      "celestial": {
                        "sun": {
                          "longitude": 318.0675,
                          "latitude": 0,
                          "nakshatra": "Satabhishak",
                          "pada": 4,
                          "kakshya": "venus",
                          "zodiac_name": "Aquarius",
                          "house": 8
                        },
                        "moon": {
                          "longitude": 150.3425,
                          "latitude": -4.343,
                          "nakshatra": "Uttara Phalguni",
                          "pada": 2,
                          "kakshya": "saturn",
                          "zodiac_name": "Virgo",
                          "house": 3
                        },
                        "mercury": {
                          "longitude": 74.3125,
                          "latitude": -2.291,
                          "nakshatra": "Aardra",
                          "pada": 3,
                          "kakshya": "sun",
                          "zodiac_name": "Gemini",
                          "house": 12
                        },
                        "venus": {
                          "longitude": 159.8475,
                          "latitude": -0.081,
                          "nakshatra": "Uttara Phalguni",
                          "pada": 4,
                          "kakshya": "mars",
                          "zodiac_name": "Virgo",
                          "house": 3
                        },
                        "mars": {
                          "longitude": 139.1825,
                          "latitude": -1.01,
                          "nakshatra": "Poorva Phalguni",
                          "pada": 2,
                          "kakshya": "Mercury",
                          "zodiac_name": "Leo",
                          "house": 2
                        },
                        "jupiter": {
                          "longitude": 19.82499999999999,
                          "latitude": 0.377,
                          "nakshatra": "Bharani",
                          "pada": 2,
                          "kakshya": "Mercury",
                          "zodiac_name": "Aries",
                          "house": 10
                        },
                        "saturn": {
                          "longitude": 201.275,
                          "latitude": -2.136,
                          "nakshatra": "Visaakha",
                          "pada": 1,
                          "kakshya": "Mercury",
                          "zodiac_name": "Libra",
                          "house": 4
                        },
                        "uranus": {
                          "longitude": 314.28,
                          "latitude": -0.169,
                          "nakshatra": "Satabhishak",
                          "pada": 3,
                          "kakshya": "sun",
                          "zodiac_name": "Aquarius",
                          "house": 8
                        },
                        "neptune": {
                          "longitude": 164.6175,
                          "latitude": -1.31,
                          "nakshatra": "Hasta",
                          "pada": 2,
                          "kakshya": "sun",
                          "zodiac_name": "Virgo",
                          "house": 3
                        },
                        "pluto": {
                          "longitude": 10.007499999999991,
                          "latitude": -3.973,
                          "nakshatra": "Ashwini",
                          "pada": 4,
                          "kakshya": "mars",
                          "zodiac_name": "Aries",
                          "house": 10
                        },
                        "northtruenode": {
                          "longitude": 304.65,
                          "latitude": 0,
                          "nakshatra": "Dhanishtha",
                          "pada": 4,
                          "kakshya": "jupiter",
                          "zodiac_name": "Aquarius",
                          "house": 8
                        },
                        "southtruenode": {
                          "longitude": 124.65,
                          "latitude": 0,
                          "nakshatra": "Makha",
                          "pada": 2,
                          "kakshya": "jupiter",
                          "zodiac_name": "Leo",
                          "house": 2
                        }
                      },
                      "houses": {
                        "1": {
                          "start": 118.24667529991994,
                          "cusp": 133.24667529991996,
                          "end": 148.24667529991996
                        },
                        "2": {
                          "start": 148.24667529991996,
                          "cusp": 163.24667529991996,
                          "end": 178.24667529991996
                        },
                        "3": {
                          "start": 178.24667529991996,
                          "cusp": 193.24667529991996,
                          "end": 208.24667529991996
                        },
                        "4": {
                          "start": 208.24667529991996,
                          "cusp": 223.24667529991993,
                          "end": 238.24667529991993
                        },
                        "5": {
                          "start": 238.24667529991993,
                          "cusp": 253.24667529991993,
                          "end": 268.2466752999199
                        },
                        "6": {
                          "start": 268.2466752999199,
                          "cusp": 283.2466752999199,
                          "end": 298.2466752999199
                        },
                        "7": {
                          "start": 298.2466752999199,
                          "cusp": 313.2466752999199,
                          "end": 328.2466752999199
                        },
                        "8": {
                          "start": 328.2466752999199,
                          "cusp": 343.2466752999199,
                          "end": 358.2466752999199
                        },
                        "9": {
                          "start": 358.2466752999199,
                          "cusp": 13.246675299919922,
                          "end": 28.24667529991992
                        },
                        "10": {
                          "start": 28.24667529991992,
                          "cusp": 43.24667529991992,
                          "end": 58.24667529991993
                        },
                        "11": {
                          "start": 58.24667529991993,
                          "cusp": 73.24667529991993,
                          "end": 88.24667529991993
                        },
                        "12": {
                          "start": 88.24667529991993,
                          "cusp": 103.24667529991991,
                          "end": 118.24667529991994
                        }
                      },
                      "ascendant": {
                        "longitude": 133.24667529991996,
                        "zodiac_name": "Cancer",
                        "nakshatra": "Makha",
                        "pada": 4
                      },
                      "ayanamsa_used": {
                        "name": "LAHIRI",
                        "corrected": false,
                        "value_degrees": 24.224068,
                        "formatted": "24°13'27\""
                      }
                    }
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ascendant_pos": {
                    "type": "string",
                    "description": "'start' uses the house start and 'end' the house end; ANY other value - including 'cusp' itself and any typo - falls through the else branch and uses the house cusp. So 'cusp' is the effective default and misspellings fail silently instead of erroring. Case-sensitive.",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Case-INSENSITIVE - name.upper is used for the lookup. Unlike /api/astro/ayanamsa_value/, 'USER' is NOT rejected here. An unknown value returns 400 \"Undefined ayanamsa: <name>\". Note that apply_correction=true overrides the choice and switches the internal mode to USER.",
                    "enum": [
                      "FAGAN_BRADLEY",
                      "LAHIRI",
                      "DELUCE",
                      "RAMAN",
                      "USHASHASHI",
                      "KRISHNAMURTI",
                      "DJWHAL_KHUL",
                      "YUKTESHWAR",
                      "JN_BHASIN",
                      "BABYL_KUGLER1",
                      "BABYL_KUGLER2",
                      "BABYL_KUGLER3",
                      "BABYL_HUBER",
                      "BABYL_ETPSC",
                      "ALDEBARAN_15TAU",
                      "HIPPARCHOS",
                      "SASSANIAN",
                      "GALCENT_0SAG",
                      "J2000",
                      "J1900",
                      "B1950",
                      "SURYASIDDHANTA",
                      "SURYASIDDHANTA_MSUN",
                      "ARYABHATA",
                      "ARYABHATA_MSUN",
                      "SS_REVATI",
                      "SS_CITRA",
                      "TRUE_CITRA",
                      "TRUE_REVATI",
                      "TRUE_PUSHYA",
                      "GALCENT_COCHRANE",
                      "GALCENT_RGILBRAND",
                      "GALCENT_MULA_WILHELM",
                      "ARYABHATA_522",
                      "BABYL_BRITTON",
                      "TRUE_MULA",
                      "GALALIGN_MARDYKS",
                      "TRUE_SHEORAN",
                      "GALEQU_TRUE",
                      "GALEQU_MULA",
                      "GALEQU_IAU1958",
                      "GALEQU_FIORENZA",
                      "VALENS_MOON",
                      "LAHIRI_1940",
                      "LAHIRI_VP285",
                      "KRISHNAMURTI_VP291",
                      "LAHIRI_ICRC",
                      "USER"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_name": {
                    "type": "string",
                    "description": "Case-sensitive, and spelt exactly as listed. Pass a single name, or an array to get several charts in one call - the response is then keyed by chart name. An unknown name returns 400.",
                    "enum": [
                      "BhavaChart",
                      "RashiChart",
                      "HoraChart",
                      "JagannathHoraChart",
                      "ParivrittidwayaHoraChart",
                      "ParivrittitrayaDrekkanaChart",
                      "DrekkanaChart",
                      "SomnathDrekkanaChart",
                      "JagannathDrekkanaChart",
                      "ChaturthamsaChart",
                      "PanchamsaChart",
                      "ShashthamsaChart",
                      "SaptamsaChart",
                      "AshtamsaChart",
                      "NavamsaChart",
                      "DasamsaChart",
                      "RudramsaChart",
                      "DwadasamsaChart",
                      "ShodasamsaChart",
                      "VimsamsaChart",
                      "ChaturvimsamsaChart",
                      "NakshatramsaChart",
                      "TrimsamsaChart",
                      "KhavedamsaChart",
                      "AkshavedamsaChart",
                      "ShashtyamsaChart",
                      "NavnavamsaChart",
                      "AstottaramsaChart",
                      "DwadasdwadasamsaChart",
                      "NavnavamsaChartNew",
                      "AstottaramsaChartNew",
                      "DwadasdwadasamsaChartNew"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name. FORMAT constraint, not an enum. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed). Note this endpoint names the field `datetime`, not `date_time`.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. 'astrological' returns sign/degree/minute/second components; 'degree' returns raw decimal degrees. Anything else returns 400 \"Invalid notation: <x>\".",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "description": "Default 'add'. Only meaningful when apply_correction=true and at least one of correction_deg/min/sec is non-zero.",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'. Array of strings, default []. 'asteroids' adds chiron, pholus, ceres, pallas, juno, vesta; 'fictitious_bodies' adds cupido, hades, zeus, kronos, apollon, admetos, vulkanus, poseidon, selena; 'planetary_moons' adds phobos, deimos, io, europa, ganymede, callisto, titan, triton, charon. Bodies whose ephemeris files are missing are silently dropped from the response.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "asteroids",
                        "planetary_moons",
                        "fictitious_bodies"
                      ]
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both. Default 'true'. 'true' returns only the true nodes, 'mean' only the mean nodes, 'both' returns all four.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "description": "Case-SENSITIVE capitalised. Default 'Mean'. Selects true vs mean planetary positions (swisseph TRUEPOS).",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "ascendant_pos",
                  "ayanamsa",
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude",
                  "notation"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "NavamsaChart",
                "datetime": "2026-04-09T15:35:00+05:30",
                "longitude": 75.76861133842026,
                "latitude": 26.849874414615,
                "notation": "degree",
                "ayanamsa": "lahiri",
                "ascendant_pos": "cusp",
                "rahu": "true",
                "true_mean": "Mean",
                "refraction": false,
                "apply_correction": false,
                "correction_direction": "add",
                "correction_deg": 0,
                "correction_min": 0,
                "correction_sec": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/chart_analysis/": {
      "post": {
        "operationId": "astro_chart_analysis",
        "summary": "Chart analysis",
        "description": "Fourteen structural readings of a birth chart in a single call, plus one comparison between a natal chart and a transit chart. This is the interpretive layer above /api/astro/chart/: it does not give you positions, it gives you what those positions amount to.\n\nThe response always carries the same fields. `house_from_reference_chart` counts the house that `target_celestial` in the transit chart falls in when measured from `ref_celestial` in the natal chart. `kendras` groups the natal bodies by angular house. `argala` and `virodhargala` give the intervening and obstructing planets for each body, keyed by the 2nd, 4th, 5th and 11th and by the 12th, 10th, 9th and 3rd respectively. `bhava_arudhas` and `ghara_arudhas` are the projected images of the houses and the planets. `temporary_relationships` and `compound_relationships` are the chart-specific friendships. `karakas` are the chara karakas, `nakshatra_count` the star distance from the reference body, and `exaltation`, `debilitation`, `mooltrikona`, `own_rashi` and `pachakadi_relations` the dignity checks.\n\nBoth charts are always Rashi charts: `chart_name_natal` and `chart_name_transit` are free-form labels and do not select a divisional chart despite their names. `mode` chooses eight chara karakas or seven, and `rahu` picks true or mean nodes for the karaka block only. Setting `ref_celestial` to 'ascendant' is allowed and returns null for the two relationship fields, which are planet-to-planet by definition.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"house_from_reference_chart\": {\"house_from_ref\": 9, \"zodiac_sign_in_ref\": \"Cn\"}, \"kendras\": [[\"venus\", \"jupiter\", \"pluto\"], [\"sun\", \"moon\", \"mercury\", \"mars\", \"uranus\", \"northtruenode\", \"northmeannode\", \"southtruenode\", \"southmeannode\"], [\"saturn\", \"neptune\"]], \"argala\": {\"sun\": {\"2\": null, \"4\": [\"northtruenode\", \"northmeannode\"], \"5\": [\"saturn\", \"neptune\"], \"11\": null}, \"moon\": {\"2\": null, \"4\": [\"northtruenode\", \"northmeannode\"], \"5\": [\"saturn\", \"neptune\"], \"11\": null}, \"mercury\": {\"2\": null, \"4\": [\"northtruenode\", \"northmeannode\"], \"5\": [\"saturn\", \"neptune\"], \"11\": null}, \"venus\": {\"2\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"4\": [\"pluto\"], \"5\": [\"northtruenode\", \"northmeannode\"], \"11\": [\"southtruenode\", \"southmeannode\"]}, \"mars\": {\"2\": null, \"4\": [\"northtruenode\", \"northmeannode\"], \"5\": [\"saturn\", \"neptune\"], \"11\": null}, \"jupiter\": {\"2\": [\"southtruenode\", \"southmeannode\"], \"4\": [\"venus\"], \"5\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"11\": [\"uranus\"]}, \"saturn\": {\"2\": null, \"4\": null, \"5\": [\"jupiter\"], \"11\": [\"pluto\"]}, \"uranus\": {\"2\": null, \"4\": [\"southtruenode\", \"southmeannode\"], \"5\": null, \"11\": [\"saturn\", \"neptune\"]}, \"neptune\": {\"2\": null, \"4\": null, \"5\": [\"jupiter\"], \"11\": [\"pluto\"]}, \"pluto\": {\"2\": [\"northtruenode\", \"northmeannode\"], \"4\": null, \"5\": [\"uranus\"], \"11\": [\"sun\", \"moon\", \"mercury\", \"mars\"]}, \"northtruenode\": {\"2\": [\"saturn\", \"neptune\"], \"4\": [\"uranus\"], \"5\": null, \"11\": null}, \"northmeannode\": {\"2\": [\"saturn\", \"neptune\"], \"4\": [\"uranus\"], \"5\": null, \"11\": null}, \"southtruenode\": {\"2\": null, \"4\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"5\": null, \"11\": null}, \"southmeannode\": {\"2\": null, \"4\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"5\": null, \"11\": null}}, \"virodhargala\": {\"sun\": {\"3\": [\"pluto\"], \"9\": [\"jupiter\"], \"10\": [\"southtruenode\", \"southmeannode\"], \"12\": [\"venus\"]}, \"moon\": {\"3\": [\"pluto\"], \"9\": [\"jupiter\"], \"10\": [\"southtruenode\", \"southmeannode\"], \"12\": [\"venus\"]}, \"mercury\": {\"3\": [\"pluto\"], \"9\": [\"jupiter\"], \"10\": [\"southtruenode\", \"southmeannode\"], \"12\": [\"venus\"]}, \"venus\": {\"3\": null, \"9\": null, \"10\": [\"jupiter\"], \"12\": null}, \"mars\": {\"3\": [\"pluto\"], \"9\": [\"jupiter\"], \"10\": [\"southtruenode\", \"southmeannode\"], \"12\": [\"venus\"]}, \"jupiter\": {\"3\": null, \"9\": [\"saturn\", \"neptune\"], \"10\": null, \"12\": null}, \"saturn\": {\"3\": [\"uranus\"], \"9\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"10\": null, \"12\": [\"northtruenode\", \"northmeannode\"]}, \"uranus\": {\"3\": [\"jupiter\"], \"9\": [\"pluto\"], \"10\": [\"northtruenode\", \"northmeannode\"], \"12\": null}, \"neptune\": {\"3\": [\"uranus\"], \"9\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"10\": null, \"12\": [\"northtruenode\", \"northmeannode\"]}, \"pluto\": {\"3\": [\"saturn\", \"neptune\"], \"9\": null, \"10\": [\"venus\"], \"12\": null}, \"northtruenode\": {\"3\": null, \"9\": [\"venus\"], \"10\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"12\": [\"pluto\"]}, \"northmeannode\": {\"3\": null, \"9\": [\"venus\"], \"10\": [\"sun\", \"moon\", \"mercury\", \"mars\"], \"12\": [\"pluto\"]}, \"southtruenode\": {\"3\": [\"venus\"], \"9\": null, \"10\": [\"uranus\"], \"12\": [\"jupiter\"]}, \"southmeannode\": {\"3\": [\"venus\"], \"9\": null, \"10\": [\"uranus\"], \"12\": [\"jupiter\"]}}, \"bhava_arudhas\": {\"A1\": \"Taurus\", \"A2\": \"Aries\", \"A3\": \"Scorpio\", \"A4\": \"Gemini\", \"A5\": \"Pisces\", \"A6\": \"Aries\", \"A7\": \"Pisces\", \"A8\": \"Scorpio\", \"A9\": \"Capricorn\", \"A10\": \"Cancer\", \"A11\": \"Leo\", \"A12\": \"Aquarius\"}, \"ghara_arudhas\": {\"A1\": \"Leo\", \"A2\": \"Leo\", \"A3\": \"Leo\", \"A4\": \"Cancer\", \"A5\": \"Leo\", \"A6\": \"Pisces\", \"A7\": \"Scorpio\", \"A8\": \"Pisces\", \"A9\": \"Scorpio\", \"A10\": \"Taurus\", \"A11\": \"Aries\", \"A12\": \"Aries\"}, \"temporary_relationships\": {\"friends\": [\"venus\", \"pluto\", \"northtruenode\", \"northmeannode\", \"southtruenode\", \"southmeannode\"], \"enemies\": [\"sun\", \"moon\", \"mars\", \"jupiter\", \"saturn\", \"uranus\", \"neptune\"]}, \"compound_relationships\": \"Satru\", \"karakas\": {\"ak\": {\"venus\": {\"degree\": 23, \"sign\": \"Li\", \"minutes\": 42, \"seconds\": 43}}, \"amk\": {\"mars\": {\"degree\": 17, \"sign\": \"Sc\", \"minutes\": 52, \"seconds\": 44}}, \"bk\": {\"moon\": {\"degree\": 15, \"sign\": \"Sc\", \"minutes\": 20, \"seconds\": 27}}, \"mk\": {\"northtruenode\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name_natal": {
                    "type": "string",
                    "description": "FREE-FORM label, NOT a chart-type selector. Despite the name, this endpoint always builds a RashiChart; the string is stored as a display label and never validated. Any non-empty string works.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_name_transit": {
                    "type": "string",
                    "description": "FREE-FORM label, NOT a chart-type selector. Same as chart_name_natal.",
                    "examples": [
                      "string"
                    ]
                  },
                  "date_time_natal": {
                    "type": "string",
                    "format": "date-time",
                    "description": "FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "date_time_transit": {
                    "type": "string",
                    "format": "date-time",
                    "description": "FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude_natal": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "latitude_transit": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "longitude_natal": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "longitude_transit": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "mode": {
                    "type": "integer",
                    "description": "Integer, not a string, but constrained: 8 = eight chara karakas (includes Pitri Karaka and Rahu), 7 = seven karakas (Rahu excluded). Only 7 and 8 are meaningful.",
                    "enum": [
                      7,
                      8
                    ],
                    "examples": [
                      0
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. Only 'true' is tested explicitly; any other value (including 'mean' takes the else branch and behaves as 'mean'. Affects the `karakas` block only.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "ref_celestial": {
                    "type": "string",
                    "description": "Case-sensitive, all lowercase. 'ascendant' works for the house_from_reference_chart and nakshatra_count parts; when ref_celestial='ascendant' the temporary_relationships and compound_relationships fields come back null by design. An unrecognised name returns 400 (KeyError).",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "northtruenode",
                      "northmeannode",
                      "southtruenode",
                      "southmeannode",
                      "ascendant"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "target_celestial": {
                    "type": "string",
                    "description": "Same value set as ref_celestial.",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "northtruenode",
                      "northmeannode",
                      "southtruenode",
                      "southmeannode",
                      "ascendant"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "bhava_arudha_exceptions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "graha_arudha_exceptions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "chart_name_natal",
                  "chart_name_transit",
                  "date_time_natal",
                  "date_time_transit",
                  "latitude_natal",
                  "latitude_transit",
                  "longitude_natal",
                  "longitude_transit",
                  "mode",
                  "rahu",
                  "ref_celestial",
                  "target_celestial"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time_natal": "2025-11-21T05:45:23.715Z",
                "date_time_transit": "2024-11-21T05:45:23.715Z",
                "longitude_natal": 77.5946,
                "latitude_natal": 12.9716,
                "longitude_transit": 26.1046,
                "latitude_transit": 26.9124,
                "chart_name_natal": "RashiChart",
                "chart_name_transit": "RashiChart",
                "ref_celestial": "mercury",
                "target_celestial": "mars",
                "rahu": "true",
                "mode": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/chat/": {
      "post": {
        "operationId": "astro_chat",
        "summary": "Astrology chat",
        "description": "Ask a question about a birth chart and get an answer in plain language, grounded in the classical texts.\n\nEvery answer comes back with the passages it drew on — each with its source and a relevance score — so the reasoning can be checked rather than taken on trust. Pass a second person in `compare_with` for compatibility questions.\n\nThis endpoint is STATELESS. Nothing is stored between calls, and no account is involved: the birth details come from your request, so you can ask on behalf of any of your own users. To continue a conversation, keep the transcript in your application and pass it back in `history` — up to twenty earlier turns.\n\nIt costs 25 credits per call rather than the usual 1, because each answer runs a language model over the computed chart. A failed or empty answer costs nothing, as with every other endpoint here.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "AI & chat"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"answer\": \"Asha, your ascendant or rising sign is Leo, which is ruled by the Sun. \\n\\nWith the Sun as the ruler of your ascendant (Leo), it highlights qualities such as leadership, confidence, and a desire to be in the spotlight. This influence often urges you to pursue a career where you can shine or be in a position of authority. Roles that allow you to take charge, make decisions, and impact others positively are likely appealing to you. \\n\\nGiven the Sun's influence on your career house (the 10th house), roles in management, administration, public relations, or any profession that allows you to showcase your talents and earn recognition might be particularly fulfilling for you.\", \"question\": \"Which planet rules my ascendant, and what does it say about my career?\", \"sources\": [{\"source\": \"Planets in Signs and Houses.txt\", \"snippet\": \"Pluto in the Ninth House: Can't stand religious hypocrisy, can you? Can anybody? Well, nobody\\r\\nLIKES...\", \"score\": 0.021327968686819077}, {\"source\": \"54418030-PRASHNA-by-Gayatri-D-Vasudev.txt\", \"snippet\": \"Ascendant or the Ascendant lord, or if the Ascen-\\r\\ndant and 11th lords are favourably disposed,\\r\\npre...\", \"score\": 0.018708257004618645}, {\"source\": \"Graha_Yuddha.txt\", \"snippet\": \"the Ascendant lord is\\r\\ninvolved. Mars as loser brings exceptional results. Graha Yuddha is not consi...\", \"score\": 0.01666666753590107}, {\"source\": \"kalyana-varma-saravali.txt\", \"snippet\": \"the 10th from the Moon, or\\r\\nfrom the Ascendant; whichever is stronger will prevail. The earnings (li...\", \"score\": 0.01666666753590107}, {\"source\": \"Book. Key to Learn - K.P. cuspal system - S.P. Khullar.txt\", \"snippet\": \"but the Blind Test results ignited\\r\\nmy interest sufficient for me to get fully involved in the syste...\", \"score\": 0.016393441706895828}, {\"source\": \"Planets and Children KN Rao.txt\", \"snippet\": \"that old Brahmin I have talked of, with a sense of gratitude,1\\r\\n\\\"No child in this world is born unle...\", \"score\": 0.016129031777381897}, {\"source\": \"Applications of Cuspal Interlinks Part 1 Baskaran.txt\", \"snippet\": \"of natal\\r\\nnature of the Asc leads the stage. But, in the\\r\\nperiods of Dasas and Bhukthies, that are\\r\\n...\", \"score\": 0.016129031777381897}, {\"source\": \"Kalamsa and Cuspal Interlinks _Khullar.txt\", \"snippet\": \"in Anuradha Nakshatra ruled by Saturn, it makes\\r\\nthe native cautious, calculative and pragmatic.\\r\\nEd...\", \"score\": 0.01612432301044464}, {\"source\": \"Kalamsa and Cuspal Interlinks _Khullar.txt\", \"snippet\": \"Ascendant is simultaneously linked to cusps 5 & 9 through its Star\\r\\nlord, it indicates a very poor p...\", \"score\": 0.01587301678955555}, {\"source\": \"Prashna Deepika English.txt\", \"snippet\": \"11. Defective speech and Stammering ?\\r\\n12. Can I learn music ?\\r\\n13. Am I to Commit Suicide ?\\r\\n14. Wh...\", \"score\": 0.01587301678955555}, {\"source\": \"Book. Key to Learn - K.P. cuspal system - S.P. Khullar.txt\", \"snippet\": \"effort that must have gone in preparing these lessons and the way\\r\\nthey have been presented by Mr. K...\", \"score\": 0.015625}, {\"source\": \"Kalyana Varmas Saravali.txt\", \"snippet\": \"be the aspecting planet with reference to the Ascendant one will be interested in\\r\\nreligious observa...\", \"score\": 0.015625}, {\"source\": \"Practical Horary Astrology Gayathri Vasudev.txt\", \"snippet\": \"or the house to which the question refers.\\r\\n\\r\\nSuppose the question is 'Will I succeed in a\\r\\nparticul...\", \"score\": 0.01547067891806364}, {\"source\": \"Kalamsa and Cuspal Interlinks _Khullar.txt\", \"snippet\": \"The\\r\\npotential of the Ascendant fixes the ultimate limit to which a\\r\\nperson can rise in any walk ofl...\", \"score\": 0.015384615398943424}, {\"source\": \"Predicting through Karakamsha and Jaimini_s Mandook Dasha.txt\", \"snippet\": \"was almost no hope of\\r\\nmy surviving.\\r\\n7. My schooling started, after coaching at home, at the age of...\", \"score\": 0.015384615398943424}, {\"source\": \"Kalamsa and Cuspal Interlinks _Khullar.txt\", \"snippet\": \"is symbolic of drive,\\r\\ndetenll"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth": {
                    "type": "object",
                    "description": "Whose chart the question is about.",
                    "examples": [
                      "string"
                    ]
                  },
                  "question": {
                    "type": "string",
                    "description": "What to ask about the chart.",
                    "examples": [
                      "string"
                    ]
                  },
                  "compare_with": {
                    "type": "object",
                    "description": "A second person, for compatibility questions. Optional.",
                    "examples": [
                      "string"
                    ]
                  },
                  "history": {
                    "type": "array",
                    "description": "Earlier turns, oldest first, at most 20. This endpoint stores nothing between calls, so pass back whatever context the answer should take account of.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "birth",
                  "question"
                ],
                "additionalProperties": true
              },
              "example": {
                "question": "Which planet rules my ascendant, and what does it say about my career?",
                "birth": {
                  "date_time": "1990-08-15T10:30:00+05:30",
                  "latitude": 26.9124,
                  "longitude": 75.7873,
                  "place": "Jaipur, India",
                  "name": "Asha",
                  "gender": "female"
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/chaturthamsa/": {
      "post": {
        "operationId": "astro_chaturthamsa",
        "summary": "Chaturthamsa (D4)",
        "description": "The chaturthamsa, the fourth divisional chart, also called turyamsa: each sign divided into four parts of 7°30' each.\n\nRead for property, land, the home and fixed assets - what is owned rather than what is earned.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/chaturvimsamsa/": {
      "post": {
        "operationId": "astro_chaturvimsamsa",
        "summary": "Chaturvimsamsa (D24)",
        "description": "The chaturvimsamsa, the twenty-fourth divisional chart, also called siddhamsa: each sign divided into twenty-four parts of 1°15' each.\n\nRead for education and learning - not the qualifications obtained but what is actually mastered.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/chinese/bazi/": {
      "post": {
        "operationId": "astro_chinese_bazi",
        "summary": "BaZi chart with ten gods",
        "description": "The full BaZi reading: hidden stems, ten gods and the element balance.\n\nEverything the four pillars carry, plus the interpretive layer that makes them readable.\n\nHIDDEN STEMS: each branch conceals one to three further stems, and a reading counts them. A chart that looks short of fire on its visible stems can be full of it once the branches are opened.\n\nTEN GODS: every stem is named by its relationship to the day master rather than on its own terms — Direct Officer, Seven Killings, Eating God and so on. This is the entire interpretive vocabulary of the system, which is why the day master has to be identified first.\n\nELEMENT BALANCE: counted over visible and hidden stems together, and returned both ways so you can see the difference the branches make. A reading turns on which of the five elements is strong and which is missing.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Chinese astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Chinese Four Pillars (BaZi)",
                    "local_time": "1984-06-15T14:30:00+08:00",
                    "chinese_year": 1984,
                    "day_master": {
                      "index": 7,
                      "name": "Geng",
                      "pinyin": "geng",
                      "element": "metal",
                      "polarity": "yang",
                      "note": "The day stem. Every other stem in the chart is read as its relationship to this."
                    },
                    "pillars": [
                      {
                        "pillar": "year",
                        "stem": {
                          "index": 1,
                          "name": "Jia",
                          "pinyin": "jia",
                          "element": "wood",
                          "polarity": "yang",
                          "ten_god": "Indirect Wealth"
                        },
                        "branch": {
                          "index": 1,
                          "name": "Zi",
                          "animal": "Rat",
                          "element": "water",
                          "polarity": "yang",
                          "element_note": "The branch's own element; its hidden stems may differ."
                        },
                        "name": "Jia-Zi",
                        "animal": "Rat",
                        "hidden_stems": [
                          {
                            "index": 10,
                            "name": "Gui",
                            "pinyin": "gui",
                            "element": "water",
                            "polarity": "yin",
                            "ten_god": "Hurting Officer"
                          }
                        ]
                      },
                      {
                        "pillar": "month",
                        "stem": {
                          "index": 7,
                          "name": "Geng",
                          "pinyin": "geng",
                          "element": "metal",
                          "polarity": "yang",
                          "ten_god": "Friend"
                        },
                        "branch": {
                          "index": 7,
                          "name": "Wu",
                          "animal": "Horse",
                          "element": "fire",
                          "polarity": "yang",
                          "element_note": "The branch's own element; its hidden stems may differ."
                        },
                        "name": "Geng-Wu",
                        "animal": "Horse",
                        "hidden_stems": [
                          {
                            "index": 4,
                            "name": "Ding",
                            "pinyin": "ding",
                            "element": "fire",
                            "polarity": "yin",
                            "ten_god": "Direct Officer"
                          },
                          {
                            "index": 6,
                            "name": "Ji",
                            "pinyin": "ji",
                            "element": "earth",
                            "polarity": "yin",
                            "ten_god": "Direct Resource"
                          }
                        ]
                      },
                      {
                        "pillar": "day",
                        "stem": {
                          "index": 7,
                          "name": "Geng",
                          "pinyin": "geng",
                          "element": "metal",
                          "polarity": "yang",
                          "ten_god": "Day Master"
                        },
                        "branch": {
                          "index": 5,
                          "name": "Chen",
                          "animal": "Dragon",
                          "element": "earth",
                          "polarity": "yang",
                          "element_note": "The branch's own element; its hidden stems may differ."
                        },
                        "name": "Geng-Chen",
                        "animal": "Dragon",
                        "hidden_stems": [
                          {
                            "index": 5,
                            "name": "Wu",
                            "pinyin": "wu",
                            "element": "earth",
                            "polarity": "yang",
                            "ten_god": "Indirect Resource"
                          },
                          {
                            "index": 2,
                            "name": "Yi",
                            "pinyin": "yi",
                            "element": "wood",
                            "polarity": "yin",
                            "ten_god": "Direct Wealth"
                          },
                          {
                            "index": 10,
                            "name": "Gui",
                            "pinyin": "gui",
                            "element": "water",
                            "polarity": "yin",
                            "ten_god": "Hurting Officer"
                          }
                        ]
                      },
                      {
                        "pillar": "hour",
                        "stem": {
                          "index": 10,
                          "name": "Gui",
                          "pinyin": "gui",
                          "element": "water",
                          "polarity": "yin",
                          "ten_god": "Hurting Officer"
                        },
                        "branch": {
                          "index": 8,
                          "name": "Wei",
                          "animal": "Goat",
                          "element": "earth",
                          "polarity": "yin",
                          "element_note": "The branch's own element; its hidden stems may differ."
                        },
                        "name": "Gui-Wei",
                        "animal": "Goat",
                        "hidden_stems": [
                          {
                            "index": 6,
                            "name": "Ji",
                            "pinyin": "ji",
                            "element": "earth",
                            "polarity": "yin",
                            "ten_god": "Direct Resource"
                          },
                          {
                            "index": 4,
                            "name": "Ding",
                            "pinyin": "ding",
                            "element": "fire",
                            "polarity": "yin",
                            "ten_god": "Direct Officer"
                          },
                          {
                            "index": 2,
                            "name": "Yi",
                            "pinyin": "yi",
                            "element": "wood",
                            "polarity": "yin",
                            "ten_god": "Direct Wealth"
                          }
                        ]
                      }
                    ],
                    "element_balance": {
                      "visible_stems_only": {
                        "wood": 1,
                        "fire": 0,
                        "earth": 0,
                        "metal": 2,
                        "water": 1
                      },
                      "including_hidden_stems": {
                        "wood": 3,
                        "fire": 2,
                        "earth": 3,
                        "metal": 2,
                        "water": 3
                      },
                      "strongest": "wood",
                      "missing": []
                    },
                    "cycles": {
                      "produces": {
                        "wood": "fire",
                        "fire": "earth",
                        "earth": "metal",
                        "metal": "water",
                        "water": "wood"
                      },
                      "controls": {
                        "wood": "earth",
                        "earth": "water",
                        "water": "fire",
                        "fire": "metal",
                        "metal": "wood"
                      }
                    },
                    "note": "Element counts are given with and without the hidden stems, because a chart can look short of an element on its visible stems and be full of it in the branches."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "day_boundary": {
                    "type": "string",
                    "description": "When the day pillar changes. 'zi_hour' is 23:00, the traditional rule; 'midnight' is what most software uses. They disagree for births between 23:00 and 24:00.",
                    "enum": [
                      "zi_hour",
                      "midnight"
                    ],
                    "default": "zi_hour",
                    "examples": [
                      "zi_hour"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "true_solar_time": {
                    "type": "boolean",
                    "description": "Correct the hour by the longitude's offset from the timezone meridian. Traditional practice uses true local solar time and it can move the hour pillar by one place.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1984-06-15T14:30:00+08:00",
                "latitude": 39.9042,
                "longitude": 116.4074,
                "timezone_as_float": 8
              }
            }
          }
        }
      }
    },
    "/api/astro/chinese/four-pillars/": {
      "post": {
        "operationId": "astro_chinese_four_pillars",
        "summary": "Chinese Four Pillars (BaZi)",
        "description": "The four pillars of a birth: year, month, day and hour.\n\nEach pillar is a heavenly stem over an earthly branch, and the sixty combinations of the two make the sexagenary cycle. The day's stem is the DAY MASTER — the single most important element in the chart, since everything else is read as its relationship to that.\n\nThe Chinese year begins at LICHUN — the moment the Sun reaches 315 degrees of tropical longitude, around 4 February. Not 1 January, and not Chinese New Year, which is a lunar date drifting between 21 January and 20 February and governs the festival rather than the chart. Someone born on 20 January 2024 has 2023's pillar: a Water Rabbit, not a Wood Dragon. This is the single thing cheap implementations get wrong, and it misassigns the year for everyone born in January.\n\nMonth pillars are bounded the same way, by the twelve major solar terms, so a month boundary is an astronomical instant and can fall at any hour of any day rather than on the first of a calendar month.\n\nTwo conventions are exposed because practitioners genuinely differ and both change the answer. `day_boundary` decides whether the day turns at 23:00 (traditional) or midnight. `true_solar_time` corrects the clock for the birthplace's distance from its timezone meridian — about fourteen minutes for Beijing — which can move the hour pillar by one place.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Chinese astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Chinese Four Pillars (BaZi)",
                    "local_time": "1984-06-15T14:30:00+08:00",
                    "true_solar_correction_minutes": 0,
                    "chinese_year": 1984,
                    "year_begins_at_lichun": "1984-02-04T15:18:45+00:00",
                    "solar_month": {
                      "number": 5,
                      "term": "Mangzhong (grain in ear)",
                      "began_at": "1984-06-05T12:08:37+00:00",
                      "ends_at": "1984-07-06T22:29:07+00:00"
                    },
                    "day_master": {
                      "index": 7,
                      "name": "Geng",
                      "pinyin": "geng",
                      "element": "metal",
                      "polarity": "yang"
                    },
                    "pillars": [
                      {
                        "pillar": "year",
                        "stem": {
                          "index": 1,
                          "name": "Jia",
                          "pinyin": "jia",
                          "element": "wood",
                          "polarity": "yang"
                        },
                        "branch": {
                          "index": 1,
                          "name": "Zi",
                          "animal": "Rat",
                          "element": "water",
                          "polarity": "yang"
                        },
                        "name": "Jia-Zi",
                        "animal": "Rat",
                        "hidden_stems": [
                          {
                            "index": 10,
                            "name": "Gui",
                            "pinyin": "gui",
                            "element": "water",
                            "polarity": "yin"
                          }
                        ]
                      },
                      {
                        "pillar": "month",
                        "stem": {
                          "index": 7,
                          "name": "Geng",
                          "pinyin": "geng",
                          "element": "metal",
                          "polarity": "yang"
                        },
                        "branch": {
                          "index": 7,
                          "name": "Wu",
                          "animal": "Horse",
                          "element": "fire",
                          "polarity": "yang"
                        },
                        "name": "Geng-Wu",
                        "animal": "Horse",
                        "hidden_stems": [
                          {
                            "index": 4,
                            "name": "Ding",
                            "pinyin": "ding",
                            "element": "fire",
                            "polarity": "yin"
                          },
                          {
                            "index": 6,
                            "name": "Ji",
                            "pinyin": "ji",
                            "element": "earth",
                            "polarity": "yin"
                          }
                        ]
                      },
                      {
                        "pillar": "day",
                        "stem": {
                          "index": 7,
                          "name": "Geng",
                          "pinyin": "geng",
                          "element": "metal",
                          "polarity": "yang"
                        },
                        "branch": {
                          "index": 5,
                          "name": "Chen",
                          "animal": "Dragon",
                          "element": "earth",
                          "polarity": "yang"
                        },
                        "name": "Geng-Chen",
                        "animal": "Dragon",
                        "hidden_stems": [
                          {
                            "index": 5,
                            "name": "Wu",
                            "pinyin": "wu",
                            "element": "earth",
                            "polarity": "yang"
                          },
                          {
                            "index": 2,
                            "name": "Yi",
                            "pinyin": "yi",
                            "element": "wood",
                            "polarity": "yin"
                          },
                          {
                            "index": 10,
                            "name": "Gui",
                            "pinyin": "gui",
                            "element": "water",
                            "polarity": "yin"
                          }
                        ]
                      },
                      {
                        "pillar": "hour",
                        "stem": {
                          "index": 10,
                          "name": "Gui",
                          "pinyin": "gui",
                          "element": "water",
                          "polarity": "yin"
                        },
                        "branch": {
                          "index": 8,
                          "name": "Wei",
                          "animal": "Goat",
                          "element": "earth",
                          "polarity": "yin"
                        },
                        "name": "Gui-Wei",
                        "animal": "Goat",
                        "hidden_stems": [
                          {
                            "index": 6,
                            "name": "Ji",
                            "pinyin": "ji",
                            "element": "earth",
                            "polarity": "yin"
                          },
                          {
                            "index": 4,
                            "name": "Ding",
                            "pinyin": "ding",
                            "element": "fire",
                            "polarity": "yin"
                          },
                          {
                            "index": 2,
                            "name": "Yi",
                            "pinyin": "yi",
                            "element": "wood",
                            "polarity": "yin"
                          }
                        ]
                      }
                    ],
                    "note": "The year pillar turns at Lichun (Sun at 315 degrees, about 4 February), not on 1 January and not at Chinese New Year, which is a lunar date and governs the festival rather than the chart."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "day_boundary": {
                    "type": "string",
                    "description": "When the day pillar changes. 'zi_hour' is 23:00, the traditional rule; 'midnight' is what most software uses. They disagree for births between 23:00 and 24:00.",
                    "enum": [
                      "zi_hour",
                      "midnight"
                    ],
                    "default": "zi_hour",
                    "examples": [
                      "zi_hour"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "true_solar_time": {
                    "type": "boolean",
                    "description": "Correct the hour by the longitude's offset from the timezone meridian. Traditional practice uses true local solar time and it can move the hour pillar by one place.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1984-06-15T14:30:00+08:00",
                "latitude": 39.9042,
                "longitude": 116.4074,
                "timezone_as_float": 8
              }
            }
          }
        }
      }
    },
    "/api/astro/chinese/luck-pillars/": {
      "post": {
        "operationId": "astro_chinese_luck_pillars",
        "summary": "Chinese luck pillars (da yun)",
        "description": "The ten-year luck cycles, BaZi's timing technique.\n\nLife is divided into ten-year pillars stepping forward or backward through the sexagenary cycle from the month pillar. Two things decide how.\n\nDIRECTION: forward for a male born in a yang year or a female born in a yin year, backward otherwise. This is why `gender` is required — without it the cycles cannot be placed at all, and guessing would give a confident reading of the wrong half of someone's life.\n\nSTARTING AGE: the distance from the birth to the adjacent solar term — the next one going forward, the previous going backward — at the classical rate of three days to one year. So a birth two days after a term, running backward, begins its first pillar at about eight months old; one twenty-five days before the next, running forward, begins at about eight years.\n\nEach pillar carries the ages and dates it covers and its ten-god relation to the day master, which is how the period is actually read.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Chinese astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Chinese luck pillars (da yun)\", \"gender\": \"male\", \"year_polarity\": \"yang\", \"direction\": \"forward\", \"direction_rule\": \"Forward for a male in a yang year or a female in a yin year; backward otherwise.\", \"starting_age\": 7.222, \"days_to_boundary_term\": 21.666, \"boundary_term\": \"1984-07-06T22:29:07+00:00\", \"rate\": \"Three days of solar-term distance stands for one year.\", \"day_master\": {\"index\": 7, \"name\": \"Geng\", \"pinyin\": \"geng\", \"element\": \"metal\", \"polarity\": \"yang\"}, \"month_pillar\": \"Geng-Wu\", \"luck_pillars\": [{\"pillar\": \"luck\", \"stem\": {\"index\": 8, \"name\": \"Xin\", \"pinyin\": \"xin\", \"element\": \"metal\", \"polarity\": \"yin\"}, \"branch\": {\"index\": 8, \"name\": \"Wei\", \"animal\": \"Goat\", \"element\": \"earth\", \"polarity\": \"yin\"}, \"name\": \"Xin-Wei\", \"animal\": \"Goat\", \"hidden_stems\": [{\"index\": 6, \"name\": \"Ji\", \"pinyin\": \"ji\", \"element\": \"earth\", \"polarity\": \"yin\"}, {\"index\": 4, \"name\": \"Ding\", \"pinyin\": \"ding\", \"element\": \"fire\", \"polarity\": \"yin\"}, {\"index\": 2, \"name\": \"Yi\", \"pinyin\": \"yi\", \"element\": \"wood\", \"polarity\": \"yin\"}], \"sequence\": 1, \"from_age\": 7.22, \"to_age\": 17.22, \"ten_god\": \"Rob Wealth\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 9, \"name\": \"Ren\", \"pinyin\": \"ren\", \"element\": \"water\", \"polarity\": \"yang\"}, \"branch\": {\"index\": 9, \"name\": \"Shen\", \"animal\": \"Monkey\", \"element\": \"metal\", \"polarity\": \"yang\"}, \"name\": \"Ren-Shen\", \"animal\": \"Monkey\", \"hidden_stems\": [{\"index\": 7, \"name\": \"Geng\", \"pinyin\": \"geng\", \"element\": \"metal\", \"polarity\": \"yang\"}, {\"index\": 9, \"name\": \"Ren\", \"pinyin\": \"ren\", \"element\": \"water\", \"polarity\": \"yang\"}, {\"index\": 5, \"name\": \"Wu\", \"pinyin\": \"wu\", \"element\": \"earth\", \"polarity\": \"yang\"}], \"sequence\": 2, \"from_age\": 17.22, \"to_age\": 27.22, \"ten_god\": \"Eating God\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 10, \"name\": \"Gui\", \"pinyin\": \"gui\", \"element\": \"water\", \"polarity\": \"yin\"}, \"branch\": {\"index\": 10, \"name\": \"You\", \"animal\": \"Rooster\", \"element\": \"metal\", \"polarity\": \"yin\"}, \"name\": \"Gui-You\", \"animal\": \"Rooster\", \"hidden_stems\": [{\"index\": 8, \"name\": \"Xin\", \"pinyin\": \"xin\", \"element\": \"metal\", \"polarity\": \"yin\"}], \"sequence\": 3, \"from_age\": 27.22, \"to_age\": 37.22, \"ten_god\": \"Hurting Officer\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 1, \"name\": \"Jia\", \"pinyin\": \"jia\", \"element\": \"wood\", \"polarity\": \"yang\"}, \"branch\": {\"index\": 11, \"name\": \"Xu\", \"animal\": \"Dog\", \"element\": \"earth\", \"polarity\": \"yang\"}, \"name\": \"Jia-Xu\", \"animal\": \"Dog\", \"hidden_stems\": [{\"index\": 5, \"name\": \"Wu\", \"pinyin\": \"wu\", \"element\": \"earth\", \"polarity\": \"yang\"}, {\"index\": 8, \"name\": \"Xin\", \"pinyin\": \"xin\", \"element\": \"metal\", \"polarity\": \"yin\"}, {\"index\": 4, \"name\": \"Ding\", \"pinyin\": \"ding\", \"element\": \"fire\", \"polarity\": \"yin\"}], \"sequence\": 4, \"from_age\": 37.22, \"to_age\": 47.22, \"ten_god\": \"Indirect Wealth\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 2, \"name\": \"Yi\", \"pinyin\": \"yi\", \"element\": \"wood\", \"polarity\": \"yin\"}, \"branch\": {\"index\": 12, \"name\": \"Hai\", \"animal\": \"Pig\", \"element\": \"water\", \"polarity\": \"yin\"}, \"name\": \"Yi-Hai\", \"animal\": \"Pig\", \"hidden_stems\": [{\"index\": 9, \"name\": \"Ren\", \"pinyin\": \"ren\", \"element\": \"water\", \"polarity\": \"yang\"}, {\"index\": 1, \"name\": \"Jia\", \"pinyin\": \"jia\", \"element\": \"wood\", \"polarity\": \"yang\"}], \"sequence\": 5, \"from_age\": 47.22, \"to_age\": 57.22, \"ten_god\": \"Direct Wealth\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 3, \"name\": \"Bing\", \"pinyin\": \"bing\", \"element\": \"fire\", \"polarity\": \"yang\"}, \"branch\": {\"index\": 1, \"name\": \"Zi\", \"animal\": \"Rat\", \"element\": \"water\", \"polarity\": \"yang\"}, \"name\": \"Bing-Zi\", \"animal\": \"Rat\", \"hidden_stems\": [{\"index\": 10, \"name\": \"Gui\", \"pinyin\": \"gui\", \"element\": \"water\", \"polarity\": \"yin\"}], \"sequence\": 6, \"from_age\": 57.22, \"to_age\": 67.22, \"ten_god\": \"Seven Killings\"}, {\"pillar\": \"luck\", \"stem\": {\"index\": 4, \"name\": \"Ding\", \"pinyin\": \"ding\", \"element\": \"fire\", \"polarity\": \"yin\"}, \"branch\": {\"index\": 2, \"name\": \"Chou\", \"animal\": \"Ox\", \"element\": \"earth\", \"polarity\": \"yin\"}, \"name\": \"Ding-Chou\", \"animal\": \"Ox\", \"hidden_stems\": [{\"index\": 6, \"name\": \"Ji\", \"pin"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "gender": {
                    "type": "string",
                    "description": "Required: the direction of the luck cycles depends on it, together with the polarity of the year stem.",
                    "enum": [
                      "male",
                      "female"
                    ],
                    "examples": [
                      "male"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many ten-year pillars to return.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 8,
                    "examples": [
                      1
                    ]
                  },
                  "day_boundary": {
                    "type": "string",
                    "description": "When the day pillar changes. 'zi_hour' is 23:00, the traditional rule; 'midnight' is what most software uses. They disagree for births between 23:00 and 24:00.",
                    "enum": [
                      "zi_hour",
                      "midnight"
                    ],
                    "default": "zi_hour",
                    "examples": [
                      "zi_hour"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "true_solar_time": {
                    "type": "boolean",
                    "description": "Correct the hour by the longitude's offset from the timezone meridian. Traditional practice uses true local solar time and it can move the hour pillar by one place.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "gender"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1984-06-15T14:30:00+08:00",
                "latitude": 39.9042,
                "longitude": 116.4074,
                "timezone_as_float": 8,
                "gender": "male",
                "count": 8
              }
            }
          }
        }
      }
    },
    "/api/astro/chinese/zodiac/": {
      "post": {
        "operationId": "astro_chinese_zodiac",
        "summary": "Chinese zodiac sign",
        "description": "The animal, its element, and who it gets on with.\n\nThe animal comes from the year BRANCH and the element from the year STEM — which is what makes a Wood Dragon different from an Earth Dragon, and gives the cycle a sixty-year period rather than twelve.\n\nThe Chinese year begins at LICHUN — the moment the Sun reaches 315 degrees of tropical longitude, around 4 February. Not 1 January, and not Chinese New Year, which is a lunar date drifting between 21 January and 20 February and governs the festival rather than the chart. Someone born on 20 January 2024 has 2023's pillar: a Water Rabbit, not a Wood Dragon. This is the single thing cheap implementations get wrong, and it misassigns the year for everyone born in January.\n\nAlso returned: the two branches sharing the animal's trine, which the tradition reads as its natural allies, and the branch directly opposite, which is its clash. Plus the inner and secret animals from the month and hour branches — the year animal is the face others see, while those two are held to be nearer the person.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Chinese astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Chinese zodiac",
                    "chinese_year": 1984,
                    "year_begins_at_lichun": "1984-02-04T15:18:45+00:00",
                    "animal": "Rat",
                    "element": "wood",
                    "polarity": "yang",
                    "sign": "Wood Rat",
                    "year_pillar": "Jia-Zi",
                    "allies": [
                      "Dragon",
                      "Monkey"
                    ],
                    "clash": "Horse",
                    "inner_animal": {
                      "animal": "Horse",
                      "from": "month branch",
                      "meaning": "Traditionally read as the private self."
                    },
                    "secret_animal": {
                      "animal": "Goat",
                      "from": "hour branch",
                      "meaning": "Traditionally read as the innermost self."
                    },
                    "note": "The animal follows the year branch and the year turns at Lichun, about 4 February. A January birth carries the PREVIOUS year's animal."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "day_boundary": {
                    "type": "string",
                    "description": "When the day pillar changes. 'zi_hour' is 23:00, the traditional rule; 'midnight' is what most software uses. They disagree for births between 23:00 and 24:00.",
                    "enum": [
                      "zi_hour",
                      "midnight"
                    ],
                    "default": "zi_hour",
                    "examples": [
                      "zi_hour"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "true_solar_time": {
                    "type": "boolean",
                    "description": "Correct the hour by the longitude's offset from the timezone meridian. Traditional practice uses true local solar time and it can move the hour pillar by one place.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1984-06-15T14:30:00+08:00",
                "latitude": 39.9042,
                "longitude": 116.4074,
                "timezone_as_float": 8
              }
            }
          }
        }
      }
    },
    "/api/astro/choghadiya/": {
      "post": {
        "operationId": "astro_choghadiya",
        "summary": "Choghadiya",
        "description": "The choghadiya: the daylight and the night each divided into eight parts, each named for its quality, plus which one is running at the moment you asked.\n\nBoth reckonings are returned. `day` and `night` are the North Indian form with ISO timestamps. `gowri_day` and `gowri_night` are the Gowri Panchangam used in Tamil practice, which carries a Good/Bad status per period and twelve-hour clock strings. The two do not agree with each other, so pick the one your audience expects rather than treating either as the answer.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "current": "Kaal",
                    "day": [
                      {
                        "name": "Roga",
                        "start": "2026-08-31T06:09:30+05:30",
                        "end": "2026-08-31T07:43:53+05:30"
                      },
                      {
                        "name": "Udwega",
                        "start": "2026-08-31T07:43:53+05:30",
                        "end": "2026-08-31T09:18:16+05:30"
                      },
                      {
                        "name": "Chara",
                        "start": "2026-08-31T09:18:16+05:30",
                        "end": "2026-08-31T10:52:39+05:30"
                      },
                      {
                        "name": "Laabh",
                        "start": "2026-08-31T10:52:39+05:30",
                        "end": "2026-08-31T12:27:02+05:30"
                      },
                      {
                        "name": "Amrit",
                        "start": "2026-08-31T12:27:02+05:30",
                        "end": "2026-08-31T14:01:25+05:30"
                      },
                      {
                        "name": "Kaal",
                        "start": "2026-08-31T14:01:25+05:30",
                        "end": "2026-08-31T15:35:48+05:30"
                      },
                      {
                        "name": "Shubh",
                        "start": "2026-08-31T15:35:48+05:30",
                        "end": "2026-08-31T17:10:11+05:30"
                      },
                      {
                        "name": "Roga",
                        "start": "2026-08-31T17:10:11+05:30",
                        "end": "2026-08-31T18:44:34+05:30"
                      }
                    ],
                    "night": [
                      {
                        "name": "Kaal",
                        "start": "2026-08-31T18:44:34+05:30",
                        "end": "2026-08-31T20:10:14.250000+05:30"
                      },
                      {
                        "name": "Laabh",
                        "start": "2026-08-31T20:10:14.250000+05:30",
                        "end": "2026-08-31T21:35:54.500000+05:30"
                      },
                      {
                        "name": "Udwega",
                        "start": "2026-08-31T21:35:54.500000+05:30",
                        "end": "2026-08-31T23:01:34.750000+05:30"
                      },
                      {
                        "name": "Shubh",
                        "start": "2026-08-31T23:01:34.750000+05:30",
                        "end": "2026-09-01T00:27:15+05:30"
                      },
                      {
                        "name": "Amrit",
                        "start": "2026-09-01T00:27:15+05:30",
                        "end": "2026-09-01T01:52:55.250000+05:30"
                      },
                      {
                        "name": "Chara",
                        "start": "2026-09-01T01:52:55.250000+05:30",
                        "end": "2026-09-01T03:18:35.500000+05:30"
                      },
                      {
                        "name": "Roga",
                        "start": "2026-09-01T03:18:35.500000+05:30",
                        "end": "2026-09-01T04:44:15.750000+05:30"
                      },
                      {
                        "name": "Kaal",
                        "start": "2026-09-01T04:44:15.750000+05:30",
                        "end": "2026-09-01T06:09:56+05:30"
                      }
                    ],
                    "gowri_day": [
                      {
                        "name": "Rog",
                        "status": "Bad",
                        "start": "06:09:57 AM",
                        "end": "07:44:09 AM"
                      },
                      {
                        "name": "Udveg",
                        "status": "Bad",
                        "start": "07:44:09 AM",
                        "end": "09:18:21 AM"
                      },
                      {
                        "name": "Chara",
                        "status": "Good",
                        "start": "09:18:21 AM",
                        "end": "10:52:32 AM"
                      },
                      {
                        "name": "Laabha",
                        "status": "Good",
                        "start": "10:52:32 AM",
                        "end": "12:26:44 PM"
                      },
                      {
                        "name": "Amrit",
                        "status": "Good",
                        "start": "12:26:44 PM",
                        "end": "14:00:56 PM"
                      },
                      {
                        "name": "Kaala",
                        "status": "Bad",
                        "start": "14:00:56 PM",
                        "end": "15:35:08 PM"
                      },
                      {
                        "name": "Shubha",
                        "status": "Good",
                        "start": "15:35:08 PM",
                        "end": "17:09:19 PM"
                      },
                      {
                        "name": "Rog",
                        "status": "Bad",
                        "start": "17:09:19 PM",
                        "end": "18:43:31 PM"
                      }
                    ],
                    "gowri_night": [
                      {
                        "name": "Kaala",
                        "status": "Bad",
                        "start": "18:43:31 PM",
                        "end": "20:09:23 PM"
                      },
                      {
                        "name": "Laabha",
                        "status": "Good",
                        "start": "20:09:23 PM",
                        "end": "21:35:14 PM"
                      },
                      {
                        "name": "Udveg",
                        "status": "Bad",
                        "start": "21:35:14 PM",
                        "end": "23:01:06 PM"
                      },
                      {
                        "name": "Shubha",
                        "status": "Good",
                        "start": "23:01:06 PM",
                        "end": "00:26:57 AM"
                      },
                      {
                        "name": "Amrit",
                        "status": "Good",
                        "start": "00:26:57 AM",
                        "end": "01:52:49 AM"
                      },
                      {
                        "name": "Chara",
                        "status": "Good",
                        "start": "01:52:49 AM",
                        "end": "03:18:40 AM"
                      },
                      {
                        "name": "Rog",
                        "status": "Bad",
                        "start": "03:18:40 AM",
                        "end": "04:44:32 AM"
                      },
                      {
                        "name": "Kaala",
                        "status": "Bad",
                        "start": "04:44:32 AM",
                        "end": "06:10:23 AM"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/combination_yoga/": {
      "post": {
        "operationId": "astro_combination_yoga",
        "summary": "Combination yogas",
        "description": "The exact windows during a year when one of twenty-three auspicious or inauspicious day-combinations is in force. These yogas are formed by coincidence rather than by planetary position: a particular weekday falling together with a particular tithi, and for some of them a particular nakshatra as well. Tripushkara and Dwipushkara treble and double the result of whatever is begun in them; Sarvartha Siddhi and Amrit Siddhi are broadly auspicious; Vish, Hutashan, Mrityu and Dagdha are the opposite.\n\nEight of them — tripushkara, dwipushkara, sarvartha_siddhi, amrit_siddhi, siddha, naasha, sudha and halaahal — combine tithi, weekday and the Moon's nakshatra. The remaining fifteen, whose names begin 'vt_' or which are named for the weekday-and-tithi pairs (kulika, samvarta, karkacha, dagdha, vish, hutashan, sheela and so on), use weekday and tithi only.\n\nSend `year`, `yoga` and the place. The response is `{year, yoga, rows}` where rows is a list of `{start, end}` ISO timestamps. The windows are continuous intervals cut at every weekday boundary, the way a panchang prints them, rather than whole days — which is the difference between this endpoint and the sunrise-only day-level view in /api/astro/panchanga_yogas/, where short occurrences can be missed.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Yogas & doshas"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "yoga": "tripushkara",
                    "rows": [
                      {
                        "start": "2026-01-04T07:00:27+00:00",
                        "end": "2026-01-04T09:41:29+00:00"
                      },
                      {
                        "start": "2026-02-24T01:29:36+00:00",
                        "end": "2026-02-24T01:32:39+00:00"
                      },
                      {
                        "start": "2026-02-28T01:25:49+00:00",
                        "end": "2026-02-28T04:05:11+00:00"
                      },
                      {
                        "start": "2026-04-14T10:36:08+00:00",
                        "end": "2026-04-14T18:42:51+00:00"
                      },
                      {
                        "start": "2026-04-19T01:40:08+00:00",
                        "end": "2026-04-19T05:19:46+00:00"
                      },
                      {
                        "start": "2026-04-28T00:25:06+00:00",
                        "end": "2026-04-28T13:22:23+00:00"
                      },
                      {
                        "start": "2026-05-02T19:20:26+00:00",
                        "end": "2026-05-03T00:21:07+00:00"
                      },
                      {
                        "start": "2026-05-03T00:21:07+00:00",
                        "end": "2026-05-03T01:40:06+00:00"
                      },
                      {
                        "start": "2026-06-16T10:42:32+00:00",
                        "end": "2026-06-16T19:22:54+00:00"
                      },
                      {
                        "start": "2026-06-21T04:01:36+00:00",
                        "end": "2026-06-21T09:51:10+00:00"
                      },
                      {
                        "start": "2026-07-11T00:14:40+00:00",
                        "end": "2026-07-11T05:33:48+00:00"
                      },
                      {
                        "start": "2026-08-25T00:36:50+00:00",
                        "end": "2026-08-25T00:51:22+00:00"
                      },
                      {
                        "start": "2026-08-29T04:27:25+00:00",
                        "end": "2026-08-29T22:12:28+00:00"
                      },
                      {
                        "start": "2026-09-12T02:16:52+00:00",
                        "end": "2026-09-12T07:25:29+00:00"
                      },
                      {
                        "start": "2026-10-27T10:09:27+00:00",
                        "end": "2026-10-27T22:37:23+00:00"
                      },
                      {
                        "start": "2026-10-31T11:27:49+00:00",
                        "end": "2026-11-01T00:09:53+00:00"
                      },
                      {
                        "start": "2026-12-29T10:13:19+00:00",
                        "end": "2026-12-30T01:49:19+00:00"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "yoga": {
                    "type": "string",
                    "enum": [
                      "tripushkara",
                      "dwipushkara",
                      "sarvartha_siddhi",
                      "amrit_siddhi",
                      "siddha",
                      "naasha",
                      "sudha",
                      "halaahal",
                      "vt_siddha",
                      "ratnakur",
                      "vt_amrit",
                      "vt_mrityu",
                      "kulika",
                      "samvarta",
                      "karkacha",
                      "dagdha",
                      "dagdha_vashishta",
                      "dagdha_brihaspati",
                      "vish",
                      "hutashan",
                      "vt_ashubh",
                      "sheela",
                      "varsha"
                    ],
                    "examples": [
                      "tripushkara"
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year",
                  "yoga"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026,
                "yoga": "tripushkara"
              }
            }
          }
        }
      }
    },
    "/api/astro/combustion/": {
      "post": {
        "operationId": "astro_combustion",
        "summary": "Combustion periods",
        "description": "When a planet is too close to the Sun to be seen it is said to be combust — asta, 'set' — and classical texts treat it as burnt up and unable to deliver its results. This endpoint returns every combustion period touching a given calendar year for one planet.\n\nThe test is a plain angular one. The planet is combust while its geocentric elongation from the Sun is under a per-planet orb: 17° for Mars, 14° for Mercury direct and 12° retrograde, 10° for Venus direct and 8° retrograde, 11° for Jupiter and 15° for Saturn. The year is scanned with a margin at each end, because a period can straddle the New Year, and each crossing is then refined by bisection.\n\nSend `planet` (mars, mercury, venus, jupiter or saturn) and `year`. The response is `{planet, year, periods, total_asta_days_in_year}`, where each period gives `start`, `end`, `duration_days` for the whole period and `days_in_year` for the part of it falling inside the year you asked about. Elongation does not depend on where you stand, so the timings are location-independent; `timezone_as_float` only decides how they are rendered.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planet": "mars",
                    "year": 2026,
                    "periods": [
                      {
                        "start": "2025-11-06T23:51:13.853078",
                        "end": "2026-03-26T14:07:06.209182",
                        "duration_days": 139.6,
                        "days_in_year": 84.6
                      }
                    ],
                    "total_asta_days_in_year": 84.6
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "planet": {
                    "type": "string",
                    "enum": [
                      "mars",
                      "mercury",
                      "venus",
                      "jupiter",
                      "saturn"
                    ],
                    "examples": [
                      "mars"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "planet",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "planet": "mars",
                "year": 2026,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/compatibility_match/": {
      "post": {
        "operationId": "astro_compatibility_match",
        "summary": "Partner star search",
        "description": "A reverse lookup over a precomputed table of all 11,664 bride-and-groom star-and-pada combinations. Rather than scoring one couple, it answers the other question: given one person's birth star and pada, which stars and padas make a good match? Fix the groom's star to get the brides who suit him, or the bride's to get the grooms.\n\nEach row that comes back is `[star, pada, [the koota scores], score, [the supplementary tests]]`. Set `method` to anything containing 'south' to search the South Indian table instead of the North Indian one.\n\nTwo behaviours will surprise you, so plan around them. `minimum_score` is compared against the Nadi column rather than the 36-point total, and Nadi is only ever 0 or 8; on top of that a `minimum_score` of 0 is treated as 'not supplied' and falls back to the default of 18 for North or 16 for South. The practical consequence is that the defaults return an empty list, and you need a value that is 8 or less and not 0 to get any rows at all. Likewise each of the four `advanced_checks` flags is read one column to the left of the test it names, so 'mahendra' filters on the total score and matches nothing, while 'vedha', 'rajju' and 'shree' filter on Mahendra, Vedha and Rajju respectively. To score a single couple instead, use /api/astro/ashtakoota/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "compatibility_matcher": []
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "boy_nakshatra": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "boy_paadham": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_nakshatra": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_paadham": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "method": {
                    "type": "string",
                    "description": "Case-INSENSITIVE and matched by SUBSTRING: any value containing 'south' selects the South-Indian dataset (all_nak_pad_boy_girl_south.csv) with a default minimum_score of 16; anything else selects the North dataset with a default minimum_score of 18. Forwarded at.",
                    "enum": [
                      "North",
                      "South"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "minimum_score": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "advanced_checks": {
                    "type": "object",
                    "description": "OBJECT whose KEYS are constrained (the values are booleans). Keys are matched case-insensitively (check.lower); any key outside this set is silently ignored.",
                    "enum": [
                      "mahendra",
                      "vedha",
                      "rajju",
                      "shree"
                    ],
                    "default": {
                      "mahendra": true,
                      "vedha": false
                    },
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "boy_nakshatra",
                  "boy_paadham",
                  "girl_nakshatra",
                  "girl_paadham",
                  "method",
                  "minimum_score"
                ],
                "additionalProperties": true
              },
              "example": {
                "boy_nakshatra": 1,
                "boy_paadham": 1,
                "girl_nakshatra": 5,
                "girl_paadham": 2,
                "method": "South",
                "minimum_score": 0,
                "advanced_checks": {
                  "mahendra": true,
                  "vedha": true,
                  "rajju": true,
                  "shree": true
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/dasamsa/": {
      "post": {
        "operationId": "astro_dasamsa",
        "summary": "Dasamsa (D10)",
        "description": "The dasamsa, the tenth divisional chart: each sign divided into ten parts of 3° each.\n\nRead for career, profession, status and public standing. The usual companion to the navamsa when judging working life rather than personal life.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 263.80833333333334,
                        "latitude": 0,
                        "nakshatra": "Poorvaashaadha",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      },
                      {
                        "name": "moon",
                        "longitude": 14.77777777777778,
                        "latitude": 4.37,
                        "nakshatra": "Bharani",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "mars",
                        "longitude": 251.7472222222222,
                        "latitude": 0.535,
                        "nakshatra": "Moola",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      },
                      {
                        "name": "mercury",
                        "longitude": 305.0777777777778,
                        "latitude": 1.574,
                        "nakshatra": "Dhanishtha",
                        "pada": 4,
                        "kakshya": "jupiter",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "jupiter",
                        "longitude": 164.71944444444443,
                        "latitude": 0.529,
                        "nakshatra": "Hasta",
                        "pada": 2,
                        "kakshya": "sun",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "venus",
                        "longitude": 319.5583333333333,
                        "latitude": -3.391,
                        "nakshatra": "Satabhishak",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "saturn",
                        "longitude": 44.469444444444434,
                        "latitude": -2.651,
                        "nakshatra": "Rohini",
                        "pada": 2,
                        "kakshya": "sun",
                        "zodiac_name": "Taurus",
                        "house": 6
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 355.6583333333333,
                        "latitude": 0,
                        "nakshatra": "Revati",
                        "pada": 3,
                        "kakshya": "moon",
                        "zodiac_name": "Pisces",
                        "house": 4
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 175.65833333333333,
                        "latitude": 0,
                        "nakshatra": "Chitra",
                        "pada": 1,
                        "kakshya": "moon",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "uranus",
                        "longitude": 24.23888888888888,
                        "latitude": -0.154,
                        "nakshatra": "Bharani",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "neptune",
                        "longitude": 304.3277777777778,
                        "latitude": -1.412,
                        "nakshatra": "Dhanishtha",
                        "pada": 4,
                        "kakshya": "jupiter",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "pluto",
                        "longitude": 242.7888888888889,
                        "latitude": -4.3,
                        "nakshatra": "Moola",
                        "pada": 1,
                        "kakshya": "saturn",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      }
                    ],
                    "ascendant": {
                      "longitude": 241.8777777777778,
                      "zodiac_name": "Sagittarius",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/ashtottari/": {
      "post": {
        "operationId": "astro_dasha_ashtottari",
        "summary": "Ashtottari dasha",
        "description": "The 108-year cycle, across eight planets.\n\nSun 6, Moon 15, Mars 8, Mercury 17, Saturn 10, Jupiter 19, Rahu 12, Venus 21.\n\nA CONDITIONAL dasha: the classical texts apply it only when a particular condition holds in the chart. Check /api/astro/dasha_applicability/ for a given chart before relying on it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Ashtottari\", \"engine_id\": \"AshtottariDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"cycle_years\": 108, \"conditional\": true, \"periods\": [{\"lord\": \"venus\", \"start\": \"1978-12-07 01:57:14.058000+00:00\", \"end\": \"1999-12-07 07:57:14.058000+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"1978-12-07 01:57:14.058000+00:00\", \"end\": \"1983-01-06 11:17:14.058000+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1983-01-06 11:17:14.058000+00:00\", \"end\": \"1984-03-07 13:57:14.058000+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1984-03-07 13:57:14.058000+00:00\", \"end\": \"1987-02-05 20:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1987-02-05 20:37:14.058000+00:00\", \"end\": \"1988-08-27 00:10:34.058000+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1988-08-27 00:10:34.058000+00:00\", \"end\": \"1991-12-17 07:43:54.058000+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1991-12-17 07:43:54.058000+00:00\", \"end\": \"1993-11-26 12:10:34.058000+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1993-11-26 12:10:34.058000+00:00\", \"end\": \"1997-08-06 20:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1997-08-06 20:37:14.058000+00:00\", \"end\": \"1999-12-07 01:57:14.058000+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"1999-12-07 07:57:14.058000+00:00\", \"end\": \"2005-12-06 19:57:14.058000+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"1999-12-07 07:57:14.058000+00:00\", \"end\": \"2000-04-07 01:17:14.058000+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2000-04-07 01:17:14.058000+00:00\", \"end\": \"2001-02-05 08:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2001-02-05 08:37:14.058000+00:00\", \"end\": \"2001-07-17 15:43:54.058000+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2001-07-17 15:43:54.058000+00:00\", \"end\": \"2002-06-27 12:50:34.058000+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2002-06-27 12:50:34.058000+00:00\", \"end\": \"2003-01-16 09:43:54.058000+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2003-01-16 09:43:54.058000+00:00\", \"end\": \"2004-02-05 20:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2004-02-05 20:37:14.058000+00:00\", \"end\": \"2004-10-06 07:17:14.058000+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2004-10-06 07:17:14.058000+00:00\", \"end\": \"2005-12-06 07:57:14.058000+00:00\", \"children\": []}]}, {\"lord\": \"moon\", \"start\": \"2005-12-06 19:57:14.058000+00:00\", \"end\": \"2020-12-06 13:57:14.058000+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2005-12-06 19:57:14.058000+00:00\", \"end\": \"2008-01-06 15:57:14.058000+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2008-01-06 15:57:14.058000+00:00\", \"end\": \"2009-02-15 10:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2009-02-15 10:37:14.058000+00:00\", \"end\": \"2011-06-27 17:17:14.058000+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2011-06-27 17:17:14.058000+00:00\", \"end\": \"2012-11-15 22:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2012-11-15 22:37:14.058000+00:00\", \"end\": \"2015-07-07 15:57:14.058000+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2015-07-07 15:57:14.058000+00:00\", \"end\": \"2017-03-07 07:57:14.058000+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2017-03-07 07:57:14.058000+00:00\", \"end\": \"2020-02-05 11:57:14.058000+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2020-02-05 11:57:14.058000+00:00\", \"end\": \"2020-12-05 19:57:14.058000+00:00\", \"children\": []}]}, {\"lord\": \"mars\", \"start\": \"2020-12-06 13:57:14.058000+00:00\", \"end\": \"2028-12-06 13:57:14.058000+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"2020-12-06 13:57:14.058000+00:00\", \"end\": \"2021-07-11 00:37:14.058000+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2021-07-11 00:37:14.058000+00:00\", \"end\": \"2022-10-13 23:17:14.058000+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2022-10-13 23:17:14.058000+00:00\", \"end\": \"2023-07-11 12:37:14.058000+00"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/brahma/": {
      "post": {
        "operationId": "astro_dasha_brahma",
        "summary": "Brahma dasha",
        "description": "The Jaimini sign dasha seeded from the Brahma karaka.\n\nNamed for the Jaimini karaka scheme it takes its seed from.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Brahma\", \"engine_id\": \"BrahmaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2037-08-31 18:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-03-20 12:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-11-19 20:11:32.307692+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-11-19 20:11:32.307692+00:00\", \"end\": \"2027-02-14 22:02:18.461538+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-02-14 22:02:18.461538+00:00\", \"end\": \"2027-04-21 05:25:23.076923+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-04-21 05:25:23.076923+00:00\", \"end\": \"2027-05-05 17:43:50.769231+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-05-05 17:43:50.769231+00:00\", \"end\": \"2027-06-25 12:48:27.692308+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-06-25 12:48:27.692308+00:00\", \"end\": \"2027-07-24 13:25:23.076923+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-07-24 13:25:23.076923+00:00\", \"end\": \"2027-08-29 20:11:32.307692+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-08-29 20:11:32.307692+00:00\", \"end\": \"2027-10-12 09:06:55.384615+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-10-12 09:06:55.384615+00:00\", \"end\": \"2027-11-03 03:34:36.923077+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-11-03 03:34:36.923077+00:00\", \"end\": \"2027-12-31 04:48:27.692308+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-12-31 04:48:27.692308+00:00\", \"end\": \"2028-01-07 10:57:41.538462+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-01-07 10:57:41.538462+00:00\", \"end\": \"2028-03-20 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-03-20 12:30:00+00:00\", \"end\": \"2029-11-28 12:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-03-20 12:30:00+00:00\", \"end\": \"2028-06-23 14:20:46.153846+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-06-23 14:20:46.153846+00:00\", \"end\": \"2028-09-02 21:43:50.769231+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-09-02 21:43:50.769231+00:00\", \"end\": \"2028-09-18 18:02:18.461539+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-09-18 18:02:18.461539+00:00\", \"end\": \"2028-11-13 05:06:55.384616+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-11-13 05:06:55.384616+00:00\", \"end\": \"2028-12-14 21:43:50.769231+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-12-14 21:43:50.769231+00:00\", \"end\": \"2029-01-23 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2029-01-23 12:30:00+00:00\", \"end\": \"2029-03-12 01:25:23.076923+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2029-03-12 01:25:23.076923+00:00\", \"end\": \"2029-04-04 19:53:04.615385+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2029-04-04 19:53:04.615385+00:00\", \"end\": \"2029-06-07 05:06:55.384616+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2029-06-07 05:06:55.384616+00:00\", \"end\": \"2029-06-15 03:16:09.230770+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2029-06-15 03:16:09.230770+00:00\", \"end\": \"2029-09-02 08:48:27.692308+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2029-09-02 08:48:27.692308+00:00\", \"end\": \"2029-11-28 12:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2029-11-28 12:30:00+00:00\", \"end\": \"2031-03-07 00:30:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2029-11-28 12:30:00+00:00\", \"end\": \"2030-01-20 22:39:13.846154+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2030-01-20 22:39:13.846154+00:00\", \"end\": \"2030-02-01 19:34:36.923077+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2030-02-01 19:34:36.923077+00:00\", \"end\": \"2030-03-15 08:48:27.692308+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2030-03-15 08:48:27.692308+00:00"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/budhi-gati/": {
      "post": {
        "operationId": "astro_dasha_budhi_gati",
        "summary": "Budhi Gati dasha",
        "description": "The 112-year conditional cycle.\n\nShares its 112-year span with Dwadashottari but distributes it differently between the lords, so the two give different answers for the same chart.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Budhi Gati\", \"engine_id\": \"BudhiGatiDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 112, \"conditional\": true, \"periods\": [{\"lord\": \"sun\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2032-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-12-14 08:30:00+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-06 05:18:00+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"2026-09-06 05:18:00+00:00\", \"end\": \"2026-09-12 06:54:00+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2026-09-12 06:54:00+00:00\", \"end\": \"2026-09-29 14:54:00+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-09-29 14:54:00+00:00\", \"end\": \"2026-10-04 19:42:00+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-10-04 19:42:00+00:00\", \"end\": \"2026-10-10 21:18:00+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2026-10-10 21:18:00+00:00\", \"end\": \"2026-10-26 11:42:00+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2026-10-26 11:42:00+00:00\", \"end\": \"2026-11-04 03:42:00+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-11-04 03:42:00+00:00\", \"end\": \"2026-11-18 00:30:00+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2026-11-18 00:30:00+00:00\", \"end\": \"2026-12-04 11:42:00+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-12-04 11:42:00+00:00\", \"end\": \"2026-12-14 08:30:00+00:00\", \"children\": []}]}, {\"lord\": \"ketu\", \"start\": \"2026-12-14 08:30:00+00:00\", \"end\": \"2027-04-15 01:50:00+00:00\", \"children\": [{\"lord\": \"ketu\", \"start\": \"2026-12-14 08:30:00+00:00\", \"end\": \"2026-12-21 09:54:00+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2026-12-21 09:54:00+00:00\", \"end\": \"2027-01-10 13:54:00+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-01-10 13:54:00+00:00\", \"end\": \"2027-01-16 15:06:00+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-01-16 15:06:00+00:00\", \"end\": \"2027-01-23 16:30:00+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2027-01-23 16:30:00+00:00\", \"end\": \"2027-02-10 20:06:00+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-02-10 20:06:00+00:00\", \"end\": \"2027-02-20 22:06:00+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-02-20 22:06:00+00:00\", \"end\": \"2027-03-09 01:18:00+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-03-09 01:18:00+00:00\", \"end\": \"2027-03-28 05:06:00+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2027-03-28 05:06:00+00:00\", \"end\": \"2027-04-14 08:30:00+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-04-14 08:30:00+00:00\", \"end\": \"2027-04-15 01:50:00+00:00\", \"children\": []}]}, {\"lord\": \"venus\", \"start\": \"2027-04-15 01:50:00+00:00\", \"end\": \"2028-03-27 20:30:00+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2027-04-15 01:50:00+00:00\", \"end\": \"2027-06-11 21:50:00+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-06-11 21:50:00+00:00\", \"end\": \"2027-06-29 06:14:00+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-06-29 06:14:00+00:00\", \"end\": \"2027-07-19 12:02:00+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2027-07-19 12:02:00+00:00\", \"end\": \"2027-09-09 13:14:00+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-09-09 13:14:00+00:00\", \"end\": \"2027-10-08 11:14:00+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-10-08 11:14:00+00:00\", \"end\": \"2027-11-23 17:38:00+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-11-23 17:38:00+00:00\", \"end\": \"2028-01-17 16:14:00+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2028-01-17 16:14:00+00:00\", \"end\": \"2028-03-06 20:02:00+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-03-06 20:02:00+00:00\", \"end\": \"2028-03-24 04:26:00+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"2028-03-24 04:26:00+00:00\", \"end\": \"2028-03-27 20:30:00+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"2028-03-27 20:30:00+00:00\", \"end\": \"2028-07-10 04:30"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/chakra/": {
      "post": {
        "operationId": "astro_dasha_chakra",
        "summary": "Chakra dasha",
        "description": "The Jaimini sign dasha that runs the wheel from its seed.\n\nProgresses the twelve signs as a wheel.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Chakra\", \"engine_id\": \"ChakraRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2036-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-07-02 08:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-26 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-09-26 08:30:00+00:00\", \"end\": \"2026-10-21 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-10-21 16:30:00+00:00\", \"end\": \"2026-11-16 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2026-11-16 00:30:00+00:00\", \"end\": \"2026-12-11 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2026-12-11 08:30:00+00:00\", \"end\": \"2027-01-05 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-01-05 16:30:00+00:00\", \"end\": \"2027-01-31 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-01-31 00:30:00+00:00\", \"end\": \"2027-02-25 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-02-25 08:30:00+00:00\", \"end\": \"2027-03-22 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-03-22 16:30:00+00:00\", \"end\": \"2027-04-17 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-04-17 00:30:00+00:00\", \"end\": \"2027-05-12 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-05-12 08:30:00+00:00\", \"end\": \"2027-06-06 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-06-06 16:30:00+00:00\", \"end\": \"2027-07-02 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2027-07-02 08:30:00+00:00\", \"end\": \"2028-05-01 16:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2027-07-02 08:30:00+00:00\", \"end\": \"2027-07-27 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-07-27 16:30:00+00:00\", \"end\": \"2027-08-22 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-08-22 00:30:00+00:00\", \"end\": \"2027-09-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-09-16 08:30:00+00:00\", \"end\": \"2027-10-11 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-10-11 16:30:00+00:00\", \"end\": \"2027-11-06 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-11-06 00:30:00+00:00\", \"end\": \"2027-12-01 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-12-01 08:30:00+00:00\", \"end\": \"2027-12-26 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-26 16:30:00+00:00\", \"end\": \"2028-01-21 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-21 00:30:00+00:00\", \"end\": \"2028-02-15 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-02-15 08:30:00+00:00\", \"end\": \"2028-03-11 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-03-11 16:30:00+00:00\", \"end\": \"2028-04-06 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-04-06 00:30:00+00:00\", \"end\": \"2028-05-01 08:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-05-01 16:30:00+00:00\", \"end\": \"2029-03-02 00:30:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-05-01 16:30:00+00:00\", \"end\": \"2028-05-27 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-05-27 00:30:00+00:00\", \"end\": \"2028-06-21 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-06-21 08:30:00+00:00\", \"end\": \"2028-07-16 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-07-16 16:30:00+00:00\", \"end\": \"2028-08-11 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-08-11 00:30:00+00:00\", \"end\": \"2028-09-05 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-09-05 08:30:00+00:00\", \"end\": \"2028-09-30 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-09-30 16:30:00+00:00\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/chara/": {
      "post": {
        "operationId": "astro_dasha_chara",
        "summary": "Chara dasha",
        "description": "The principal Jaimini rashi dasha.\n\nWhere the nakshatra dashas run on planets, the rashi dashas run on SIGNS: every `lord` in this response is a sign name, not a graha. Chara is the one Jaimini astrology is normally read with. Period lengths vary by sign, derived from where each sign's lord sits relative to it, so unlike Vimshottari the twelve periods are not all the same length.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Chara\", \"engine_id\": \"CharaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1992-06-28 06:33:30.389610+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"1992-06-28 06:33:30.389610+00:00\", \"end\": \"1992-08-24 04:41:17.922078+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1992-08-24 04:41:17.922078+00:00\", \"end\": \"1994-03-16 09:59:13.246753+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1994-03-16 09:59:13.246753+00:00\", \"end\": \"1994-09-03 04:22:35.844156+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"1994-09-03 04:22:35.844156+00:00\", \"end\": \"1996-01-28 11:32:43.636364+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"1996-01-28 11:32:43.636364+00:00\", \"end\": \"1996-11-08 02:11:41.298702+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"1996-11-08 02:11:41.298702+00:00\", \"end\": \"1997-10-15 14:58:26.493507+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"1997-10-15 14:58:26.493507+00:00\", \"end\": \"1998-11-18 01:52:59.220780+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"1998-11-18 01:52:59.220780+00:00\", \"end\": \"1999-07-03 18:24:09.350650+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"1999-07-03 18:24:09.350650+00:00\", \"end\": \"2000-10-01 03:26:29.610390+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2000-10-01 03:26:29.610390+00:00\", \"end\": \"2000-11-27 01:34:17.142858+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2000-11-27 01:34:17.142858+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Pisces\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2013-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Pisces\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2004-03-11 01:34:17.142857+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2004-03-11 01:34:17.142857+00:00\", \"end\": \"2005-11-27 02:11:41.298701+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2005-11-27 02:11:41.298701+00:00\", \"end\": \"2006-01-18 06:14:48.311688+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2006-01-18 06:14:48.311688+00:00\", \"end\": \"2007-06-23 22:45:58.441558+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2007-06-23 22:45:58.441558+00:00\", \"end\": \"2007-11-27 10:55:19.480519+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2007-11-27 10:55:19.480519+00:00\", \"end\": \"2009-03-10 23:23:22.597402+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2009-03-10 23:23:22.597402+00:00\", \"end\": \"2009-11-26 19:38:57.662337+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2009-11-26 19:38:57.662337+00:00\", \"end\": \"2010-10-05 19:57:39.740259+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2010-10-05 19:57:39.740259+00:00\", \"end\": \"2011-10-06 00:19:28.831168+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2011-10-06 00:19:28.831168+00:00\", \"end\": \"2012-05-01 16:31:56.883116+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2012-05-01 16:31:56.883116+00:00\", \"end\": \"2013-06-23 00:56:52.987012+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2013-06-23 00:56:52.987012+00:00\", \"end\": \"2013-08-14 04:59:59.999999+00:00\", \"children\": []}]}, {\"lord\": \"Aquarius\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2014-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aquarius\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2013-08-19 16:45:58.441558+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2013-08-19 16:45:58.441558+00:00\", \"end\": \"2013-10-10 20:11:41.298701+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2013-10-10 20:11:41.298701+00:00\", \"end\": \"2013-12-06 17:23:22.597402+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2013-12-06 17:23:22.597402+00:00\", \"end\": \"2013-12-11 11:09:21.038960+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2013-1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/chaturaseeti-sama/": {
      "post": {
        "operationId": "astro_dasha_chaturaseeti_sama",
        "summary": "Chaturaseeti Sama dasha",
        "description": "The 84-year conditional cycle, with equal periods.\n\n\"Sama\" means equal: unlike Vimshottari, where each graha holds a different span, every period here runs the same length. That makes it behave quite differently as a timeline — there is no long Venus stretch or short Sun stretch to anchor a reading against.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Chaturaseeti Sama\", \"engine_id\": \"ChaturaseetiSamaDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 84, \"conditional\": true, \"periods\": [{\"lord\": \"saturn\", \"start\": \"2025-05-03 03:56:15.534939+00:00\", \"end\": \"2037-05-03 03:56:15.534939+00:00\", \"children\": [{\"lord\": \"saturn\", \"start\": \"2025-05-03 03:56:15.534939+00:00\", \"end\": \"2027-01-19 07:21:58.392082+00:00\", \"children\": [{\"lord\": \"saturn\", \"start\": \"2025-05-03 03:56:15.534939+00:00\", \"end\": \"2025-07-31 14:13:24.106368+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2025-07-31 14:13:24.106368+00:00\", \"end\": \"2025-10-29 00:30:32.677797+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2025-10-29 00:30:32.677797+00:00\", \"end\": \"2026-01-26 10:47:41.249226+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-01-26 10:47:41.249226+00:00\", \"end\": \"2026-04-25 21:04:49.820655+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-04-25 21:04:49.820655+00:00\", \"end\": \"2026-07-24 07:21:58.392084+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-07-24 07:21:58.392084+00:00\", \"end\": \"2026-10-21 17:39:06.963513+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2026-10-21 17:39:06.963513+00:00\", \"end\": \"2027-01-19 03:56:15.534942+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"2027-01-19 07:21:58.392082+00:00\", \"end\": \"2028-10-06 10:47:41.249225+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2027-01-19 07:21:58.392082+00:00\", \"end\": \"2027-04-18 17:39:06.963511+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-04-18 17:39:06.963511+00:00\", \"end\": \"2027-07-17 03:56:15.534940+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-07-17 03:56:15.534940+00:00\", \"end\": \"2027-10-14 14:13:24.106369+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2027-10-14 14:13:24.106369+00:00\", \"end\": \"2028-01-12 00:30:32.677798+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2028-01-12 00:30:32.677798+00:00\", \"end\": \"2028-04-10 10:47:41.249227+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2028-04-10 10:47:41.249227+00:00\", \"end\": \"2028-07-08 21:04:49.820656+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-07-08 21:04:49.820656+00:00\", \"end\": \"2028-10-06 07:21:58.392085+00:00\", \"children\": []}]}, {\"lord\": \"moon\", \"start\": \"2028-10-06 10:47:41.249225+00:00\", \"end\": \"2030-06-24 14:13:24.106368+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2028-10-06 10:47:41.249225+00:00\", \"end\": \"2029-01-03 21:04:49.820654+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2029-01-03 21:04:49.820654+00:00\", \"end\": \"2029-04-03 07:21:58.392083+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2029-04-03 07:21:58.392083+00:00\", \"end\": \"2029-07-01 17:39:06.963512+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2029-07-01 17:39:06.963512+00:00\", \"end\": \"2029-09-29 03:56:15.534941+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2029-09-29 03:56:15.534941+00:00\", \"end\": \"2029-12-27 14:13:24.106370+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2029-12-27 14:13:24.106370+00:00\", \"end\": \"2030-03-27 00:30:32.677799+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2030-03-27 00:30:32.677799+00:00\", \"end\": \"2030-06-24 10:47:41.249228+00:00\", \"children\": []}]}, {\"lord\": \"mars\", \"start\": \"2030-06-24 14:13:24.106368+00:00\", \"end\": \"2032-03-11 17:39:06.963511+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"2030-06-24 14:13:24.106368+00:00\", \"end\": \"2030-09-22 00:30:32.677797+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2030-09-22 00:30:32.677797+00:00\", \"end\": \"2030-12-20 10:47:41.249226+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2030-12-20 10:47:41.249226+00:00\", \"end\": \"2031-03-19 21:04:49.820655+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2031-03-19 21:04:49.820655+00:00\", \"end\": \"2031-06-17 07:21:58.392084+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2031-06-17 07:21:58.392084+00:00\", \"en"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/current/": {
      "post": {
        "operationId": "astro_dasha_current",
        "summary": "Current dasha",
        "description": "Which dasha period is running right now, at every level.\n\nThe question people actually ask of a dasha. Returns the chain from mahadasha down — \"Jupiter / Ketu / Mercury\" — each level with its start, its end, how far through it you are as a percentage, and how many days remain.\n\nThe timeline endpoints cannot answer this without you fetching the whole tree, recursing it and comparing dates yourself. Defaults to Vimshottari and to now; pass `as_of` for any other moment and `system` for any of the thirty.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Vimshottari",
                    "engine_id": "VimshottariDasha",
                    "family": "nakshatra",
                    "lord_type": "planet",
                    "levels": 3,
                    "level_names": [
                      "mahadasha",
                      "antardasha",
                      "pratyantardasha"
                    ],
                    "cycle_years": 120,
                    "conditional": false,
                    "as_of": "2026-09-09T09:10:36.588036+00:00",
                    "running": true,
                    "chain": [
                      {
                        "level": "mahadasha",
                        "lord": "jupiter",
                        "start": "2018-12-03 16:34:05.606114+00:00",
                        "end": "2034-12-03 16:34:05.606114+00:00",
                        "elapsed_percent": 48.54,
                        "remaining_days": 3007.308
                      },
                      {
                        "level": "antardasha",
                        "lord": "ketu",
                        "start": "2025-11-09 02:10:05.606114+00:00",
                        "end": "2026-10-15 23:46:05.606114+00:00",
                        "elapsed_percent": 89.261,
                        "remaining_days": 36.608
                      },
                      {
                        "level": "pratyantardasha",
                        "lord": "mercury",
                        "start": "2026-08-27 22:10:05.606114+00:00",
                        "end": "2026-10-15 02:10:05.606114+00:00",
                        "elapsed_percent": 25.866,
                        "remaining_days": 35.708
                      }
                    ],
                    "summary": "Jupiter / Ketu / Mercury",
                    "note": null,
                    "boundary_note": null
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "as_of": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to report on. Defaults to now (UTC).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "description": "Which system to read. Defaults to Vimshottari.",
                    "default": "VimshottariDasha",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 3,
                "system": "Vimshottari"
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/drig/": {
      "post": {
        "operationId": "astro_dasha_drig",
        "summary": "Drig dasha",
        "description": "The Jaimini sign dasha built on aspect (drishti).\n\nWhere Chara reckons from sign lords, Drig is built on rashi drishti — the sign-to-sign aspects of Jaimini, which are not the planetary aspects of Parashari astrology.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Drig\", \"engine_id\": \"DrigRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-07-15 02:03:30.389610+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-12-16 11:05:50.649351+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-12-16 11:05:50.649351+00:00\", \"end\": \"2026-12-25 07:58:49.870130+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-12-25 07:58:49.870130+00:00\", \"end\": \"2027-03-24 00:48:42.077922+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-03-24 00:48:42.077922+00:00\", \"end\": \"2027-04-19 15:27:39.740260+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-04-19 15:27:39.740260+00:00\", \"end\": \"2027-07-08 11:24:32.727273+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-07-08 11:24:32.727273+00:00\", \"end\": \"2027-08-21 19:49:28.831169+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-08-21 19:49:28.831169+00:00\", \"end\": \"2027-10-14 01:07:24.155844+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-10-14 01:07:24.155844+00:00\", \"end\": \"2027-12-15 03:18:18.701299+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-15 03:18:18.701299+00:00\", \"end\": \"2028-01-19 14:50:15.584416+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-19 14:50:15.584416+00:00\", \"end\": \"2028-03-30 13:54:09.350650+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-03-30 13:54:09.350650+00:00\", \"end\": \"2028-04-08 10:47:08.571429+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-04-08 10:47:08.571429+00:00\", \"end\": \"2028-07-15 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-09-10 00:11:17.922078+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-07-15 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-07-15 19:30:46.753246+00:00\", \"end\": \"2028-07-23 02:03:30.389610+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-07-23 02:03:30.389610+00:00\", \"end\": \"2028-07-25 06:25:19.480519+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-07-25 06:25:19.480519+00:00\", \"end\": \"2028-07-31 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-07-31 19:30:46.753246+00:00\", \"end\": \"2028-08-04 10:47:08.571428+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-08-04 10:47:08.571428+00:00\", \"end\": \"2028-08-08 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-08-08 19:30:46.753246+00:00\", \"end\": \"2028-08-13 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-08-13 21:41:41.298701+00:00\", \"end\": \"2028-08-16 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-08-16 19:30:46.753246+00:00\", \"end\": \"2028-08-22 15:08:57.662337+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-08-22 15:08:57.662337+00:00\", \"end\": \"2028-08-23 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-08-23 08:36:14.025973+00:00\", \"end\": \"2028-08-31 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-08-31 08:36:14.025973+00:00\", \"end\": \"2028-09-09 02:03:30.389609+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2030-04-02 05:29:13.246753+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2028-11-22 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-11-22 21:41:41.298701+00:00\", \"end\": \"2028-12-15 01:44:48.311688+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-12-15 01:44:48.311688+00:00\", \"end\": \"2029-02-19 13:54:09.350649+00:00\", \"children\":"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/drill/": {
      "post": {
        "operationId": "astro_dasha_drill",
        "summary": "Dasha drill-down",
        "description": "One branch of a dasha tree, instead of the whole thing.\n\nlevels on the other dasha endpoints caps DEPTH, but still returns every period at that depth: levels=3 on Vimshottari is every pratyantardasha under every antardasha under every mahadasha, which is about 95 KB. A screen where someone taps one mahadasha to expand it needs a single branch of that.\n\nGive this endpoint the chain of lords to follow and it returns only what sits under the period you named. {\"lords\": [\"moon\", \"mars\"], \"levels\": 1} returns the pratyantardashas inside the Moon mahadasha's Mars antardasha — roughly 1.8 KB against the 95 KB of the tree that contains it.\n\nLord names are matched case-insensitively, and path in the response echoes the chain that was actually matched. Use a planet name for the nakshatra dashas and a sign name for the Jaimini rashi dashas; an unrecognised lord returns 400 listing what was available at that level.\n\nThis saves TRANSFER, not COMPUTATION. The engine still builds the tree to the depth you asked for and this discards the rest, so a drill is no faster to compute than the equivalent levels= call. What it saves is bandwidth, JSON parsing, and the memory a browser or phone spends holding a tree it is showing one branch of.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Vimshottari",
                    "engine_id": "VimshottariDasha",
                    "family": "nakshatra",
                    "lord_type": "planet",
                    "levels": 1,
                    "level_names": [
                      "mahadasha"
                    ],
                    "cycle_years": 120,
                    "conditional": false,
                    "path": [],
                    "depth": 0,
                    "child_level": "mahadasha",
                    "periods": [
                      {
                        "lord": "ketu",
                        "start": "2025-11-21 14:30:19.062048+00:00",
                        "end": "2032-11-21 08:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "venus",
                        "start": "2032-11-21 08:30:19.062048+00:00",
                        "end": "2052-11-21 08:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "sun",
                        "start": "2052-11-21 08:30:19.062048+00:00",
                        "end": "2058-11-21 20:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "moon",
                        "start": "2058-11-21 20:30:19.062048+00:00",
                        "end": "2068-11-21 08:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "mars",
                        "start": "2068-11-21 08:30:19.062048+00:00",
                        "end": "2075-11-22 02:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "rahu",
                        "start": "2075-11-22 02:30:19.062048+00:00",
                        "end": "2093-11-21 14:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "jupiter",
                        "start": "2093-11-21 14:30:19.062048+00:00",
                        "end": "2109-11-22 14:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "saturn",
                        "start": "2109-11-22 14:30:19.062048+00:00",
                        "end": "2128-11-22 08:30:19.062048+00:00",
                        "children": []
                      },
                      {
                        "lord": "mercury",
                        "start": "2128-11-22 08:30:19.062048+00:00",
                        "end": "2145-11-22 14:30:19.062048+00:00",
                        "children": []
                      }
                    ],
                    "metadata": {
                      "calculation_time_ms": 0,
                      "max_levels": 1,
                      "data_size_bytes": 1171,
                      "data_size_mb": 0,
                      "structure": "nested_hierarchical"
                    },
                    "boundary_note": "The last sub-period of each period ends 18 hours before its parent does. Sibling periods are contiguous and the first child starts with its parent, but the final 18 hours of every period have no sub-period covering them. This comes from the calculation engine and is reported rather than hidden."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How many levels BELOW the located period to return. 1 gives its immediate children.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "lords": {
                    "type": "array",
                    "description": "The chain of period lords to follow from the top, outermost first — e.g. [\"moon\", \"mars\"] means \"inside the Moon mahadasha, inside its Mars antardasha\". A planet name for nakshatra dashas, a sign name for rashi dashas. Empty returns the top level.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "description": "Dasha system. See /api/astro/dasha/systems/. Defaults to Vimshottari.",
                    "default": "VimshottariDasha",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/dwadashottari/": {
      "post": {
        "operationId": "astro_dasha_dwadashottari",
        "summary": "Dwadashottari dasha",
        "description": "The 112-year conditional cycle, run over eight planets.\n\nOne of the conditional nakshatra dashas of the classical literature. It shares its 112-year span with Budhi Gati but distributes the years differently between the lords.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Dwadashottari\", \"engine_id\": \"DwadashottariDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 112, \"conditional\": true, \"periods\": [{\"lord\": \"ketu\", \"start\": \"2025-06-12 15:39:04.240361+00:00\", \"end\": \"2036-06-12 09:39:04.240361+00:00\", \"children\": [{\"lord\": \"ketu\", \"start\": \"2025-06-12 15:39:04.240361+00:00\", \"end\": \"2026-07-12 04:17:38.526075+00:00\", \"children\": [{\"lord\": \"ketu\", \"start\": \"2025-06-12 15:39:04.240361+00:00\", \"end\": \"2025-07-21 08:21:55.668932+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2025-07-21 08:21:55.668932+00:00\", \"end\": \"2025-09-05 01:56:12.811789+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2025-09-05 01:56:12.811789+00:00\", \"end\": \"2025-10-27 20:21:55.668932+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2025-10-27 20:21:55.668932+00:00\", \"end\": \"2025-12-26 15:39:04.240361+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2025-12-26 15:39:04.240361+00:00\", \"end\": \"2026-03-03 11:47:38.526075+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2026-03-03 11:47:38.526075+00:00\", \"end\": \"2026-05-16 08:47:38.526075+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-05-16 08:47:38.526075+00:00\", \"end\": \"2026-06-09 23:47:38.526075+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-06-09 23:47:38.526075+00:00\", \"end\": \"2026-07-11 15:39:04.240361+00:00\", \"children\": []}]}, {\"lord\": \"mercury\", \"start\": \"2026-07-12 04:17:38.526075+00:00\", \"end\": \"2027-10-21 10:30:29.954646+00:00\", \"children\": [{\"lord\": \"mercury\", \"start\": \"2026-07-12 04:17:38.526075+00:00\", \"end\": \"2026-09-04 06:26:12.811789+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2026-09-04 06:26:12.811789+00:00\", \"end\": \"2026-11-05 16:17:38.526075+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-11-05 16:17:38.526075+00:00\", \"end\": \"2027-01-15 09:51:55.668932+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-01-15 09:51:55.668932+00:00\", \"end\": \"2027-04-04 11:09:04.240361+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-04-04 11:09:04.240361+00:00\", \"end\": \"2027-06-30 20:09:04.240361+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-06-30 20:09:04.240361+00:00\", \"end\": \"2027-07-29 23:09:04.240361+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-07-29 23:09:04.240361+00:00\", \"end\": \"2027-09-05 09:51:55.668932+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"2027-09-05 09:51:55.668932+00:00\", \"end\": \"2027-10-21 04:17:38.526075+00:00\", \"children\": []}]}, {\"lord\": \"rahu\", \"start\": \"2027-10-21 10:30:29.954646+00:00\", \"end\": \"2029-04-11 10:17:38.526075+00:00\", \"children\": [{\"lord\": \"rahu\", \"start\": \"2027-10-21 10:30:29.954646+00:00\", \"end\": \"2028-01-01 08:34:47.097503+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2028-01-01 08:34:47.097503+00:00\", \"end\": \"2028-03-22 20:47:38.526074+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-03-22 20:47:38.526074+00:00\", \"end\": \"2028-06-21 23:09:04.240360+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2028-06-21 23:09:04.240360+00:00\", \"end\": \"2028-09-30 15:39:04.240360+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-09-30 15:39:04.240360+00:00\", \"end\": \"2028-11-03 05:09:04.240360+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2028-11-03 05:09:04.240360+00:00\", \"end\": \"2028-12-16 08:47:38.526074+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"2028-12-16 08:47:38.526074+00:00\", \"end\": \"2029-02-07 02:34:47.097503+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2029-02-07 02:34:47.097503+00:00\", \"end\": \"2029-04-10 10:30:29.954646+00:00\", \"children\": []}]}, {\"lord\": \"mars\", \"start\": \"2029-04-11 10:17:38.526075+00:00\", \"end\": \"2030-12-12 03:39:04.240361+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"2029-04-11 10:17:38.526075+00:00\", \"end\": \"2029-07-12 20:47:38.526075+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2029-07-12 20:47:38.526075+00:00\", \"end\": \"2029-10-24 "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/dwisaptati/": {
      "post": {
        "operationId": "astro_dasha_dwisaptati",
        "summary": "Dwisaptati Sama dasha",
        "description": "The 72-year conditional cycle, with equal periods.\n\nAnother equal-period system. Its brevity relative to Vimshottari means a chart moves through lords quickly, which is part of why it is read where it applies.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Dwisaptati\", \"engine_id\": \"DwisaptatiDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 72, \"conditional\": true, \"periods\": [{\"lord\": \"moon\", \"start\": \"2025-09-01 15:04:41.651204+00:00\", \"end\": \"2034-09-01 21:04:41.651204+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2025-09-01 15:04:41.651204+00:00\", \"end\": \"2026-10-17 12:04:41.651204+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2025-09-01 15:04:41.651204+00:00\", \"end\": \"2025-10-22 21:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2025-10-22 21:04:41.651204+00:00\", \"end\": \"2025-12-13 03:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2025-12-13 03:04:41.651204+00:00\", \"end\": \"2026-02-02 09:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-02-02 09:04:41.651204+00:00\", \"end\": \"2026-03-25 15:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2026-03-25 15:04:41.651204+00:00\", \"end\": \"2026-05-15 21:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2026-05-15 21:04:41.651204+00:00\", \"end\": \"2026-07-06 03:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2026-07-06 03:04:41.651204+00:00\", \"end\": \"2026-08-26 09:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-08-26 09:04:41.651204+00:00\", \"end\": \"2026-10-16 15:04:41.651204+00:00\", \"children\": []}]}, {\"lord\": \"mars\", \"start\": \"2026-10-17 12:04:41.651204+00:00\", \"end\": \"2027-12-02 09:04:41.651204+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"2026-10-17 12:04:41.651204+00:00\", \"end\": \"2026-12-07 18:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-12-07 18:04:41.651204+00:00\", \"end\": \"2027-01-28 00:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-01-28 00:04:41.651204+00:00\", \"end\": \"2027-03-20 06:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2027-03-20 06:04:41.651204+00:00\", \"end\": \"2027-05-10 12:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-05-10 12:04:41.651204+00:00\", \"end\": \"2027-06-30 18:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2027-06-30 18:04:41.651204+00:00\", \"end\": \"2027-08-21 00:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-08-21 00:04:41.651204+00:00\", \"end\": \"2027-10-11 06:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-10-11 06:04:41.651204+00:00\", \"end\": \"2027-12-01 12:04:41.651204+00:00\", \"children\": []}]}, {\"lord\": \"mercury\", \"start\": \"2027-12-02 09:04:41.651204+00:00\", \"end\": \"2029-01-16 06:04:41.651204+00:00\", \"children\": [{\"lord\": \"mercury\", \"start\": \"2027-12-02 09:04:41.651204+00:00\", \"end\": \"2028-01-22 15:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2028-01-22 15:04:41.651204+00:00\", \"end\": \"2028-03-13 21:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2028-03-13 21:04:41.651204+00:00\", \"end\": \"2028-05-04 03:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-05-04 03:04:41.651204+00:00\", \"end\": \"2028-06-24 09:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2028-06-24 09:04:41.651204+00:00\", \"end\": \"2028-08-14 15:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-08-14 15:04:41.651204+00:00\", \"end\": \"2028-10-04 21:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2028-10-04 21:04:41.651204+00:00\", \"end\": \"2028-11-25 03:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2028-11-25 03:04:41.651204+00:00\", \"end\": \"2029-01-15 09:04:41.651204+00:00\", \"children\": []}]}, {\"lord\": \"jupiter\", \"start\": \"2029-01-16 06:04:41.651204+00:00\", \"end\": \"2030-03-03 03:04:41.651204+00:00\", \"children\": [{\"lord\": \"jupiter\", \"start\": \"2029-01-16 06:04:41.651204+00:00\", \"end\": \"2029-03-08 12:04:41.651204+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2029-03-08 12:04:41.651204+00:00\", \"end\": \"2029-04-28"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/kalachakra/": {
      "post": {
        "operationId": "astro_dasha_kalachakra",
        "summary": "Kalachakra dasha",
        "description": "The \"wheel of time\" dasha, seeded from the birth pada.\n\nUnusual among the rashi dashas in starting from the Moon's nakshatra PADA rather than from a house, which makes it more sensitive to birth-time accuracy than the others.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Kalachakra\", \"engine_id\": \"KalachakraRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1997-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1990-11-27 05:33:29.302326+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"1990-11-27 05:33:29.302326+00:00\", \"end\": \"1991-07-22 23:58:36.279070+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1991-07-22 23:58:36.279070+00:00\", \"end\": \"1991-12-03 17:50:13.953489+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1991-12-03 17:50:13.953489+00:00\", \"end\": \"1992-04-30 08:20:55.813954+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"1992-04-30 08:20:55.813954+00:00\", \"end\": \"1993-02-06 16:43:15.348838+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"1993-02-06 16:43:15.348838+00:00\", \"end\": \"1993-08-04 00:32:05.581396+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"1993-08-04 00:32:05.581396+00:00\", \"end\": \"1994-02-13 05:00:00.000001+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"1994-02-13 05:00:00.000001+00:00\", \"end\": \"1994-12-07 10:01:23.720931+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"1994-12-07 10:01:23.720931+00:00\", \"end\": \"1995-07-18 07:47:26.511629+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"1995-07-18 07:47:26.511629+00:00\", \"end\": \"1996-03-12 02:12:33.488373+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"1996-03-12 02:12:33.488373+00:00\", \"end\": \"1996-11-19 17:16:44.651164+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"1996-11-19 17:16:44.651164+00:00\", \"end\": \"1997-08-14 05:00:00.000001+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"1997-08-14 23:00:00+00:00\", \"end\": \"2013-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"1997-08-14 23:00:00+00:00\", \"end\": \"1999-02-09 14:04:11.162791+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1999-02-09 14:04:11.162791+00:00\", \"end\": \"1999-12-12 09:02:47.441861+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1999-12-12 09:02:47.441861+00:00\", \"end\": \"2000-11-16 03:27:54.418605+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2000-11-16 03:27:54.418605+00:00\", \"end\": \"2002-08-23 16:51:37.674419+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2002-08-23 16:51:37.674419+00:00\", \"end\": \"2003-10-05 10:09:46.046512+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2003-10-05 10:09:46.046512+00:00\", \"end\": \"2004-12-20 02:54:25.116279+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2004-12-20 02:54:25.116279+00:00\", \"end\": \"2006-10-30 15:44:39.069767+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2006-10-30 15:44:39.069767+00:00\", \"end\": \"2008-03-23 07:22:19.534883+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2008-03-23 07:22:19.534883+00:00\", \"end\": \"2009-09-17 22:26:30.697674+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2009-09-17 22:26:30.697674+00:00\", \"end\": \"2011-04-18 12:57:12.558139+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2011-04-18 12:57:12.558139+00:00\", \"end\": \"2012-12-20 02:54:25.116279+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2012-12-20 02:54:25.116279+00:00\", \"end\": \"2013-08-14 23:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2022-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2014-02-02 22:51:37.674419+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2014-02-02 22:51:37.674419+00:00\", \"end\": \"2014-08-13 01:22:19.534884+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2014-08-13 01:22:19.534884+00:00\", \"end\": \"2015-08-11 03:44:39.069768+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2015-08-11 03:44:39.069768+00:00\", \"end\": \"2016-03-27 11:33:29.302326+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2016"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/kendradhi/": {
      "post": {
        "operationId": "astro_dasha_kendradhi",
        "summary": "Kendradhi dasha",
        "description": "The Jaimini sign dasha ordered by kendra.\n\nSequences signs by their angular relationship to the seed — kendras first, then the rest — rather than in zodiacal order.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Kendradhi\", \"engine_id\": \"KendradhiRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-07-15 02:03:30.389610+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-12-16 11:05:50.649351+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-12-16 11:05:50.649351+00:00\", \"end\": \"2026-12-25 07:58:49.870130+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-12-25 07:58:49.870130+00:00\", \"end\": \"2027-03-24 00:48:42.077922+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-03-24 00:48:42.077922+00:00\", \"end\": \"2027-04-19 15:27:39.740260+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-04-19 15:27:39.740260+00:00\", \"end\": \"2027-07-08 11:24:32.727273+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-07-08 11:24:32.727273+00:00\", \"end\": \"2027-08-21 19:49:28.831169+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-08-21 19:49:28.831169+00:00\", \"end\": \"2027-10-14 01:07:24.155844+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-10-14 01:07:24.155844+00:00\", \"end\": \"2027-12-15 03:18:18.701299+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-15 03:18:18.701299+00:00\", \"end\": \"2028-01-19 14:50:15.584416+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-19 14:50:15.584416+00:00\", \"end\": \"2028-03-30 13:54:09.350650+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-03-30 13:54:09.350650+00:00\", \"end\": \"2028-04-08 10:47:08.571429+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-04-08 10:47:08.571429+00:00\", \"end\": \"2028-07-15 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-09-10 00:11:17.922078+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-07-15 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-07-15 19:30:46.753246+00:00\", \"end\": \"2028-07-23 02:03:30.389610+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-07-23 02:03:30.389610+00:00\", \"end\": \"2028-07-25 06:25:19.480519+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-07-25 06:25:19.480519+00:00\", \"end\": \"2028-07-31 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-07-31 19:30:46.753246+00:00\", \"end\": \"2028-08-04 10:47:08.571428+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-08-04 10:47:08.571428+00:00\", \"end\": \"2028-08-08 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-08-08 19:30:46.753246+00:00\", \"end\": \"2028-08-13 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-08-13 21:41:41.298701+00:00\", \"end\": \"2028-08-16 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-08-16 19:30:46.753246+00:00\", \"end\": \"2028-08-22 15:08:57.662337+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-08-22 15:08:57.662337+00:00\", \"end\": \"2028-08-23 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-08-23 08:36:14.025973+00:00\", \"end\": \"2028-08-31 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-08-31 08:36:14.025973+00:00\", \"end\": \"2028-09-09 02:03:30.389609+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2030-04-02 05:29:13.246753+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2028-11-22 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-11-22 21:41:41.298701+00:00\", \"end\": \"2028-12-15 01:44:48.311688+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-12-15 01:44:48.311688+00:00\", \"end\": \"2029-02-19 13:54:09.350649+00:00\", \""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/lagnamsaka/": {
      "post": {
        "operationId": "astro_dasha_lagnamsaka",
        "summary": "Lagnamsaka dasha",
        "description": "The Jaimini sign dasha seeded from the lagna amsa.\n\nTakes its seed from the navamsa position of the ascendant rather than from the rashi lagna, so it is sensitive to birth-time accuracy in the way the divisional charts are.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Lagnamsaka\", \"engine_id\": \"LagnamsakaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-04-13 23:41:27.640449+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-11-19 13:42:48.539326+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-11-19 13:42:48.539326+00:00\", \"end\": \"2027-01-31 11:49:33.033708+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-01-31 11:49:33.033708+00:00\", \"end\": \"2027-04-07 18:50:13.483146+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-04-07 18:50:13.483146+00:00\", \"end\": \"2027-04-27 16:08:25.617977+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-04-27 16:08:25.617977+00:00\", \"end\": \"2027-05-30 19:38:45.842696+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-05-30 19:38:45.842696+00:00\", \"end\": \"2027-07-02 23:09:06.067415+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-07-02 23:09:06.067415+00:00\", \"end\": \"2027-08-11 17:45:30.337078+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-08-11 17:45:30.337078+00:00\", \"end\": \"2027-09-13 21:15:50.561797+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-09-13 21:15:50.561797+00:00\", \"end\": \"2027-10-10 09:40:06.741572+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-10-10 09:40:06.741572+00:00\", \"end\": \"2027-12-02 10:28:39.101123+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-12-02 10:28:39.101123+00:00\", \"end\": \"2028-01-31 02:23:15.505617+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-01-31 02:23:15.505617+00:00\", \"end\": \"2028-04-13 00:29:59.999999+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-04-13 23:41:27.640449+00:00\", \"end\": \"2029-10-07 16:56:57.977528+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-04-13 23:41:27.640449+00:00\", \"end\": \"2028-06-19 20:27:18.202247+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-06-19 20:27:18.202247+00:00\", \"end\": \"2028-08-19 15:19:53.258427+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-08-19 15:19:53.258427+00:00\", \"end\": \"2028-09-06 20:59:39.775281+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-09-06 20:59:39.775281+00:00\", \"end\": \"2028-10-07 06:25:57.303371+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-10-07 06:25:57.303371+00:00\", \"end\": \"2028-11-06 15:52:14.831461+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-11-06 15:52:14.831461+00:00\", \"end\": \"2028-12-13 03:11:47.865169+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-12-13 03:11:47.865169+00:00\", \"end\": \"2029-01-12 12:38:05.393259+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2029-01-12 12:38:05.393259+00:00\", \"end\": \"2029-02-05 20:11:07.415731+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2029-02-05 20:11:07.415731+00:00\", \"end\": \"2029-03-26 11:17:11.460675+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2029-03-26 11:17:11.460675+00:00\", \"end\": \"2029-05-20 04:16:31.011237+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2029-05-20 04:16:31.011237+00:00\", \"end\": \"2029-07-26 01:02:21.573035+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2029-07-26 01:02:21.573035+00:00\", \"end\": \"2029-10-06 23:41:27.640451+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2029-10-07 16:56:57.977528+00:00\", \"end\": \"2031-02-12 04:16:31.011236+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2029-10-07 16:56:57.977528+00:00\", \"end\": \"2029-12-01 23:41:27.640449+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2029-12-01 23:41:27.640449+00:00\", \"end\": \"2029-12-18 13:42:48.539325+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2029-12-18 13:42:48.539325+00:00\", \"end\": \"2030-01-15 05:05:03.370786+"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/mandooka/": {
      "post": {
        "operationId": "astro_dasha_mandooka",
        "summary": "Mandooka dasha",
        "description": "The \"frog\" dasha, which leaps between signs.\n\nNamed for its progression: rather than stepping to the adjacent sign it jumps, in the manner the name describes.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Mandooka\", \"engine_id\": \"MandookaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-03-01 21:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-11-08 09:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-11-08 09:30:00+00:00\", \"end\": \"2026-11-19 19:00:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-11-19 19:00:00+00:00\", \"end\": \"2027-01-21 11:15:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-01-21 11:15:00+00:00\", \"end\": \"2027-02-13 06:15:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-02-13 06:15:00+00:00\", \"end\": \"2027-04-05 13:00:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-04-05 13:00:00+00:00\", \"end\": \"2027-05-09 17:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-05-09 17:30:00+00:00\", \"end\": \"2027-07-05 17:00:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-07-05 17:00:00+00:00\", \"end\": \"2027-09-12 02:00:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-09-12 02:00:00+00:00\", \"end\": \"2027-10-10 13:45:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-10-10 13:45:00+00:00\", \"end\": \"2027-12-06 13:15:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-12-06 13:15:00+00:00\", \"end\": \"2027-12-23 15:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-12-23 15:30:00+00:00\", \"end\": \"2028-03-01 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-03-01 21:30:00+00:00\", \"end\": \"2028-06-01 05:00:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-03-01 21:30:00+00:00\", \"end\": \"2028-03-03 19:00:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-03-03 19:00:00+00:00\", \"end\": \"2028-03-14 05:15:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-03-14 05:15:00+00:00\", \"end\": \"2028-03-18 00:15:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-03-18 00:15:00+00:00\", \"end\": \"2028-03-26 13:00:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-03-26 13:00:00+00:00\", \"end\": \"2028-04-01 05:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-04-01 05:30:00+00:00\", \"end\": \"2028-04-10 17:00:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-04-10 17:00:00+00:00\", \"end\": \"2028-04-22 02:00:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-04-22 02:00:00+00:00\", \"end\": \"2028-04-26 19:45:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-04-26 19:45:00+00:00\", \"end\": \"2028-05-06 07:15:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-05-06 07:15:00+00:00\", \"end\": \"2028-05-09 03:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-05-09 03:30:00+00:00\", \"end\": \"2028-05-20 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-05-20 12:30:00+00:00\", \"end\": \"2028-05-31 21:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-06-01 05:00:00+00:00\", \"end\": \"2029-10-16 10:15:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-06-01 05:00:00+00:00\", \"end\": \"2028-07-28 17:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-07-28 17:30:00+00:00\", \"end\": \"2028-08-18 15:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-08-18 15:30:00+00:00\", \"end\": \"2028-10-04 17:00:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-10-04 17:00:00+00:00\", \"end\": \"2028-11-05 02:00:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-11-05 02:00:00+00:00\", \"end\": \"2028-12-27 09:00:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-12-27 09:00:00+00:00\", \"end\": \"2029-02-28 03:00:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2029-02-28 03:00:00+00"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/nakshatra/": {
      "post": {
        "operationId": "astro_dasha_nakshatra",
        "summary": "Nakshatra dasha (any system)",
        "description": "Any of the eleven nakshatra dashas, by name.\n\nThe systems people ask for by name have their own endpoints; this covers the rest — Chaturaseeti Sama, Dwadashottari, Dwisaptati, Panchottari, Sataabdika, Shattrimsa Sama and Budhi Gati — without a route each. Accepts either the display name or the engine id.\n\nEvery one of these except Vimshottari and Yogini is conditional; see /api/astro/dasha_applicability/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Dwisaptati\", \"engine_id\": \"DwisaptatiDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"cycle_years\": 72, \"conditional\": true, \"periods\": [{\"lord\": \"jupiter\", \"start\": \"1984-08-04 13:36:41.045503+00:00\", \"end\": \"1993-08-04 19:36:41.045503+00:00\", \"children\": [{\"lord\": \"jupiter\", \"start\": \"1984-08-04 13:36:41.045503+00:00\", \"end\": \"1985-09-19 10:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1985-09-19 10:36:41.045503+00:00\", \"end\": \"1986-11-04 07:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1986-11-04 07:36:41.045503+00:00\", \"end\": \"1987-12-20 04:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1987-12-20 04:36:41.045503+00:00\", \"end\": \"1989-02-03 01:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1989-02-03 01:36:41.045503+00:00\", \"end\": \"1990-03-20 22:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1990-03-20 22:36:41.045503+00:00\", \"end\": \"1991-05-05 19:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1991-05-05 19:36:41.045503+00:00\", \"end\": \"1992-06-19 16:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1992-06-19 16:36:41.045503+00:00\", \"end\": \"1993-08-04 13:36:41.045503+00:00\", \"children\": []}]}, {\"lord\": \"venus\", \"start\": \"1993-08-04 19:36:41.045503+00:00\", \"end\": \"2002-08-05 01:36:41.045503+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"1993-08-04 19:36:41.045503+00:00\", \"end\": \"1994-09-19 16:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1994-09-19 16:36:41.045503+00:00\", \"end\": \"1995-11-04 13:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1995-11-04 13:36:41.045503+00:00\", \"end\": \"1996-12-19 10:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1996-12-19 10:36:41.045503+00:00\", \"end\": \"1998-02-03 07:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1998-02-03 07:36:41.045503+00:00\", \"end\": \"1999-03-21 04:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1999-03-21 04:36:41.045503+00:00\", \"end\": \"2000-05-05 01:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2000-05-05 01:36:41.045503+00:00\", \"end\": \"2001-06-19 22:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2001-06-19 22:36:41.045503+00:00\", \"end\": \"2002-08-04 19:36:41.045503+00:00\", \"children\": []}]}, {\"lord\": \"saturn\", \"start\": \"2002-08-05 01:36:41.045503+00:00\", \"end\": \"2011-08-05 07:36:41.045503+00:00\", \"children\": [{\"lord\": \"saturn\", \"start\": \"2002-08-05 01:36:41.045503+00:00\", \"end\": \"2003-09-19 22:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2003-09-19 22:36:41.045503+00:00\", \"end\": \"2004-11-03 19:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2004-11-03 19:36:41.045503+00:00\", \"end\": \"2005-12-19 16:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2005-12-19 16:36:41.045503+00:00\", \"end\": \"2007-02-03 13:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2007-02-03 13:36:41.045503+00:00\", \"end\": \"2008-03-20 10:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2008-03-20 10:36:41.045503+00:00\", \"end\": \"2009-05-05 07:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2009-05-05 07:36:41.045503+00:00\", \"end\": \"2010-06-20 04:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2010-06-20 04:36:41.045503+00:00\", \"end\": \"2011-08-05 01:36:41.045503+00:00\", \"children\": []}]}, {\"lord\": \"rahu\", \"start\": \"2011-08-05 07:36:41.045503+00:00\", \"end\": \"2020-08-04 13:36:41.045503+00:00\", \"children\": [{\"lord\": \"rahu\", \"start\": \"2011-08-05 07:36:41.045503+00:00\", \"end\": \"2012-09-19 04:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2012-09-19 04:36:41.045503+00:00\", \"end\": \"2013-11-04 01:36:41.045503+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2013-11-04 01:36:41.045503+00:00\", \"end\": \"2014-12-19 22:36:41.045503+00:"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "system": {
                    "type": "string",
                    "description": "Dasha system. See /api/astro/dasha/systems/ for the list; both the display name and the engine id are accepted.",
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "system"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2,
                "system": "Dwisaptati"
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/narayana/": {
      "post": {
        "operationId": "astro_dasha_narayana",
        "summary": "Narayana dasha",
        "description": "The Jaimini rashi dasha read from the lagna.\n\nClosely related to Chara and usually read alongside it; the periods are signs, with lengths following the same Jaimini reckoning from a different seed.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Narayana\", \"engine_id\": \"NarayanaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1992-06-28 06:33:30.389610+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"1992-06-28 06:33:30.389610+00:00\", \"end\": \"1992-08-24 04:41:17.922078+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1992-08-24 04:41:17.922078+00:00\", \"end\": \"1994-03-16 09:59:13.246753+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1994-03-16 09:59:13.246753+00:00\", \"end\": \"1994-09-03 04:22:35.844156+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"1994-09-03 04:22:35.844156+00:00\", \"end\": \"1996-01-28 11:32:43.636364+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"1996-01-28 11:32:43.636364+00:00\", \"end\": \"1996-11-08 02:11:41.298702+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"1996-11-08 02:11:41.298702+00:00\", \"end\": \"1997-10-15 14:58:26.493507+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"1997-10-15 14:58:26.493507+00:00\", \"end\": \"1998-11-18 01:52:59.220780+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"1998-11-18 01:52:59.220780+00:00\", \"end\": \"1999-07-03 18:24:09.350650+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"1999-07-03 18:24:09.350650+00:00\", \"end\": \"2000-10-01 03:26:29.610390+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2000-10-01 03:26:29.610390+00:00\", \"end\": \"2000-11-27 01:34:17.142858+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2000-11-27 01:34:17.142858+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Pisces\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2013-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Pisces\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2004-03-11 01:34:17.142857+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2004-03-11 01:34:17.142857+00:00\", \"end\": \"2005-11-27 02:11:41.298701+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2005-11-27 02:11:41.298701+00:00\", \"end\": \"2006-01-18 06:14:48.311688+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2006-01-18 06:14:48.311688+00:00\", \"end\": \"2007-06-23 22:45:58.441558+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2007-06-23 22:45:58.441558+00:00\", \"end\": \"2007-11-27 10:55:19.480519+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2007-11-27 10:55:19.480519+00:00\", \"end\": \"2009-03-10 23:23:22.597402+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2009-03-10 23:23:22.597402+00:00\", \"end\": \"2009-11-26 19:38:57.662337+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2009-11-26 19:38:57.662337+00:00\", \"end\": \"2010-10-05 19:57:39.740259+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2010-10-05 19:57:39.740259+00:00\", \"end\": \"2011-10-06 00:19:28.831168+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2011-10-06 00:19:28.831168+00:00\", \"end\": \"2012-05-01 16:31:56.883116+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2012-05-01 16:31:56.883116+00:00\", \"end\": \"2013-06-23 00:56:52.987012+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2013-06-23 00:56:52.987012+00:00\", \"end\": \"2013-08-14 04:59:59.999999+00:00\", \"children\": []}]}, {\"lord\": \"Aquarius\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2014-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aquarius\", \"start\": \"2013-08-14 23:00:00+00:00\", \"end\": \"2013-08-19 16:45:58.441558+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2013-08-19 16:45:58.441558+00:00\", \"end\": \"2013-10-10 20:11:41.298701+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2013-10-10 20:11:41.298701+00:00\", \"end\": \"2013-12-06 17:23:22.597402+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2013-12-06 17:23:22.597402+00:00\", \"end\": \"2013-12-11 11:09:21.038960+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/navamsa/": {
      "post": {
        "operationId": "astro_dasha_navamsa",
        "summary": "Navamsa dasha",
        "description": "The Jaimini sign dasha read from the D9.\n\nSeeded from the navamsa chart rather than the rashi chart. Because D9 is the division most used for marriage and dharma, this is normally read alongside those questions.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Navamsa\", \"engine_id\": \"NavmasaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-04-07 10:06:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-11-17 21:18:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-11-17 21:18:00+00:00\", \"end\": \"2027-01-28 06:22:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-01-28 06:22:00+00:00\", \"end\": \"2027-04-03 03:42:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-04-03 03:42:00+00:00\", \"end\": \"2027-04-22 14:54:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-04-22 14:54:00+00:00\", \"end\": \"2027-05-25 01:34:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-05-25 01:34:00+00:00\", \"end\": \"2027-06-26 12:14:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-06-26 12:14:00+00:00\", \"end\": \"2027-08-04 10:38:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-08-04 10:38:00+00:00\", \"end\": \"2027-09-05 21:18:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-09-05 21:18:00+00:00\", \"end\": \"2027-10-01 20:14:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-10-01 20:14:00+00:00\", \"end\": \"2027-11-22 18:06:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-11-22 18:06:00+00:00\", \"end\": \"2028-01-26 15:26:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-01-26 15:26:00+00:00\", \"end\": \"2028-04-07 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-04-07 10:06:00+00:00\", \"end\": \"2029-09-25 02:54:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-04-07 10:06:00+00:00\", \"end\": \"2028-06-11 19:26:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-06-11 19:26:00+00:00\", \"end\": \"2028-08-10 06:06:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-08-10 06:06:00+00:00\", \"end\": \"2028-08-28 02:06:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-08-28 02:06:00+00:00\", \"end\": \"2028-09-26 19:26:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-09-26 19:26:00+00:00\", \"end\": \"2028-10-26 12:46:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-10-26 12:46:00+00:00\", \"end\": \"2028-12-01 04:46:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-12-01 04:46:00+00:00\", \"end\": \"2028-12-30 22:06:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-12-30 22:06:00+00:00\", \"end\": \"2029-01-23 16:46:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2029-01-23 16:46:00+00:00\", \"end\": \"2029-03-12 06:06:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2029-03-12 06:06:00+00:00\", \"end\": \"2029-05-10 16:46:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2029-05-10 16:46:00+00:00\", \"end\": \"2029-07-15 02:06:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2029-07-15 02:06:00+00:00\", \"end\": \"2029-09-24 10:06:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2029-09-25 02:54:00+00:00\", \"end\": \"2031-01-25 02:54:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2029-09-25 02:54:00+00:00\", \"end\": \"2029-11-18 05:34:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2029-11-18 05:34:00+00:00\", \"end\": \"2029-12-04 11:10:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2029-12-04 11:10:00+00:00\", \"end\": \"2029-12-31 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2029-12-31 12:30:00+00:00\", \"end\": \"2030-01-27 13:50:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2030-01-27 13:50:00+00:00\", \"end\": \"2030-03-01 01:02:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2030-03-01 01:02:00+00:00\", \"end\": \"2030-03-28 02:22:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2030-03-28 02:22:00+00:0"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/nirayana-shoola/": {
      "post": {
        "operationId": "astro_dasha_nirayana_shoola",
        "summary": "Nirayana Shoola dasha",
        "description": "The sidereal reckoning of the Shoola dasha.\n\nA variant of Shoola, distinguished by the nirayana reckoning at its seeding step. Like Shoola it is traditionally consulted on questions of longevity; compare the two for the same chart with /api/astro/dasha/shoola/.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Nirayana Shoola\", \"engine_id\": \"NirayanaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Taurus\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2034-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-05-02 12:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-21 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-09-21 06:30:00+00:00\", \"end\": \"2026-10-14 01:15:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2026-10-14 01:15:00+00:00\", \"end\": \"2026-10-31 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2026-10-31 18:30:00+00:00\", \"end\": \"2026-11-21 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2026-11-21 00:30:00+00:00\", \"end\": \"2026-12-13 19:15:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2026-12-13 19:15:00+00:00\", \"end\": \"2026-12-31 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2026-12-31 12:30:00+00:00\", \"end\": \"2027-01-20 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-01-20 18:30:00+00:00\", \"end\": \"2027-02-12 13:15:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-02-12 13:15:00+00:00\", \"end\": \"2027-03-02 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-03-02 06:30:00+00:00\", \"end\": \"2027-03-22 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-03-22 12:30:00+00:00\", \"end\": \"2027-04-14 07:15:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-04-14 07:15:00+00:00\", \"end\": \"2027-05-02 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2027-05-02 12:30:00+00:00\", \"end\": \"2028-01-31 11:00:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2027-05-02 12:30:00+00:00\", \"end\": \"2027-05-28 02:45:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-05-28 02:45:00+00:00\", \"end\": \"2027-06-17 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-06-17 00:30:00+00:00\", \"end\": \"2027-07-09 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-07-09 18:30:00+00:00\", \"end\": \"2027-08-04 08:45:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-08-04 08:45:00+00:00\", \"end\": \"2027-08-24 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-08-24 06:30:00+00:00\", \"end\": \"2027-09-16 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-09-16 00:30:00+00:00\", \"end\": \"2027-10-11 14:45:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-10-11 14:45:00+00:00\", \"end\": \"2027-10-31 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-10-31 12:30:00+00:00\", \"end\": \"2027-11-23 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-11-23 06:30:00+00:00\", \"end\": \"2027-12-18 20:45:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-12-18 20:45:00+00:00\", \"end\": \"2028-01-07 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2028-01-07 18:30:00+00:00\", \"end\": \"2028-01-30 12:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Cancer\", \"start\": \"2028-01-31 11:00:00+00:00\", \"end\": \"2028-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"Cancer\", \"start\": \"2028-01-31 11:00:00+00:00\", \"end\": \"2028-02-15 23:45:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-02-15 23:45:00+00:00\", \"end\": \"2028-03-04 17:45:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-03-04 17:45:00+00:00\", \"end\": \"2028-03-24 17:00:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-03-24 17:00:00+00:00\", \"end\": \"2028-04-09 05:45:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-04-09 05:45:00+00:00\", \"end\": \"2028-04-26 23:45:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-04-26 23:45:00+00:00\", \"end\": \"2028-05-16 23:00:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-05-16"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/panchottari/": {
      "post": {
        "operationId": "astro_dasha_panchottari",
        "summary": "Panchottari dasha",
        "description": "The 105-year conditional cycle.\n\nAmong the shorter conditional nakshatra dashas, which means its sub-periods resolve to human timescales faster than Vimshottari's do.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Panchottari\", \"engine_id\": \"PanchottariDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 105, \"conditional\": true, \"periods\": [{\"lord\": \"venus\", \"start\": \"2024-11-22 05:05:00.713252+00:00\", \"end\": \"2040-11-22 05:05:00.713252+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2024-11-22 05:05:00.713252+00:00\", \"end\": \"2027-05-01 17:25:34.998966+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2024-11-22 05:05:00.713252+00:00\", \"end\": \"2025-04-06 19:56:26.427538+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2025-04-06 19:56:26.427538+00:00\", \"end\": \"2025-08-28 22:13:34.998967+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2025-08-28 22:13:34.998967+00:00\", \"end\": \"2026-01-28 11:56:26.427538+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-01-28 11:56:26.427538+00:00\", \"end\": \"2026-05-10 05:05:00.713252+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-05-10 05:05:00.713252+00:00\", \"end\": \"2026-08-28 09:39:17.856109+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2026-08-28 09:39:17.856109+00:00\", \"end\": \"2026-12-25 01:39:17.856109+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-12-25 01:39:17.856109+00:00\", \"end\": \"2027-05-01 05:05:00.713252+00:00\", \"children\": []}]}, {\"lord\": \"moon\", \"start\": \"2027-05-01 17:25:34.998966+00:00\", \"end\": \"2029-12-02 21:32:26.427537+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2027-05-01 17:25:34.998966+00:00\", \"end\": \"2027-10-01 21:18:43.570395+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-10-01 21:18:43.570395+00:00\", \"end\": \"2028-03-12 01:25:34.998966+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-03-12 01:25:34.998966+00:00\", \"end\": \"2028-06-28 04:10:09.284680+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2028-06-28 04:10:09.284680+00:00\", \"end\": \"2028-10-23 07:08:26.427537+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-10-23 07:08:26.427537+00:00\", \"end\": \"2029-02-26 10:20:26.427537+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2029-02-26 10:20:26.427537+00:00\", \"end\": \"2029-07-11 13:46:09.284680+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2029-07-11 13:46:09.284680+00:00\", \"end\": \"2029-12-02 17:25:34.998966+00:00\", \"children\": []}]}, {\"lord\": \"jupiter\", \"start\": \"2029-12-02 21:32:26.427537+00:00\", \"end\": \"2032-08-30 17:25:34.998966+00:00\", \"children\": [{\"lord\": \"jupiter\", \"start\": \"2029-12-02 21:32:26.427537+00:00\", \"end\": \"2030-05-23 11:56:26.427537+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2030-05-23 11:56:26.427537+00:00\", \"end\": \"2030-09-14 21:32:26.427537+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2030-09-14 21:32:26.427537+00:00\", \"end\": \"2031-01-16 19:56:26.427537+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2031-01-16 19:56:26.427537+00:00\", \"end\": \"2031-05-30 07:08:26.427537+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2031-05-30 07:08:26.427537+00:00\", \"end\": \"2031-10-20 07:08:26.427537+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2031-10-20 07:08:26.427537+00:00\", \"end\": \"2032-03-20 19:56:26.427537+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2032-03-20 19:56:26.427537+00:00\", \"end\": \"2032-08-29 21:32:26.427537+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"2032-08-30 17:25:34.998966+00:00\", \"end\": \"2034-06-29 14:41:00.713252+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2032-08-30 17:25:34.998966+00:00\", \"end\": \"2032-11-14 22:54:43.570395+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2032-11-14 22:54:43.570395+00:00\", \"end\": \"2033-02-05 12:51:17.856109+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2033-02-05 12:51:17.856109+00:00\", \"end\": \"2033-05-05 11:15:17.856109+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2033-05-05 11:15:17.856109+00:00\", \"end\": \"2033-08-08 18:06:43.570395+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2033-08-08 18:06:43.570395+00:00\", \"end\": \"2033-11-"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/paryaaya/": {
      "post": {
        "operationId": "astro_dasha_paryaaya",
        "summary": "Paryaaya dasha",
        "description": "The Jaimini sign dasha of alternating order.\n\n\"Paryaaya\" marks its alternating progression through the signs.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Paryaaya\", \"engine_id\": \"ParyaayaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2032-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-03-19 04:51:49.090909+00:00\", \"children\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-19 02:40:54.545455+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2026-09-19 02:40:54.545455+00:00\", \"end\": \"2026-10-10 05:13:38.181819+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2026-10-10 05:13:38.181819+00:00\", \"end\": \"2026-11-03 08:08:10.909092+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2026-11-03 08:08:10.909092+00:00\", \"end\": \"2026-11-18 09:57:16.363637+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2026-11-18 09:57:16.363637+00:00\", \"end\": \"2026-12-18 13:35:27.272728+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2026-12-18 13:35:27.272728+00:00\", \"end\": \"2026-12-27 14:40:54.545455+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2026-12-27 14:40:54.545455+00:00\", \"end\": \"2026-12-27 14:40:54.545455+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2026-12-27 14:40:54.545455+00:00\", \"end\": \"2026-12-30 15:02:43.636364+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-12-30 15:02:43.636364+00:00\", \"end\": \"2027-01-05 15:46:21.818182+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-01-05 15:46:21.818182+00:00\", \"end\": \"2027-02-07 19:46:21.818182+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-02-07 19:46:21.818182+00:00\", \"end\": \"2027-02-19 21:13:38.181818+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-02-19 21:13:38.181818+00:00\", \"end\": \"2027-03-19 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Libra\", \"start\": \"2027-03-19 04:51:49.090909+00:00\", \"end\": \"2027-11-06 13:57:16.363636+00:00\", \"children\": [{\"lord\": \"Libra\", \"start\": \"2027-03-19 04:51:49.090909+00:00\", \"end\": \"2027-04-12 19:24:32.727273+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-04-12 19:24:32.727273+00:00\", \"end\": \"2027-05-10 22:19:05.454546+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-05-10 22:19:05.454546+00:00\", \"end\": \"2027-05-28 12:08:10.909091+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-05-28 12:08:10.909091+00:00\", \"end\": \"2027-07-02 15:46:21.818182+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-07-02 15:46:21.818182+00:00\", \"end\": \"2027-07-13 04:51:49.090909+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-07-13 04:51:49.090909+00:00\", \"end\": \"2027-07-13 04:51:49.090909+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-07-13 04:51:49.090909+00:00\", \"end\": \"2027-07-16 17:13:38.181818+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2027-07-16 17:13:38.181818+00:00\", \"end\": \"2027-07-23 17:57:16.363636+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-07-23 17:57:16.363636+00:00\", \"end\": \"2027-08-31 09:57:16.363636+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-08-31 09:57:16.363636+00:00\", \"end\": \"2027-09-14 11:24:32.727272+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-09-14 11:24:32.727272+00:00\", \"end\": \"2027-10-16 02:40:54.545454+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-10-16 02:40:54.545454+00:00\", \"end\": \"2027-11-06 04:51:49.090909+00:00\", \"children\": []}]}, {\"lord\": \"Scorpio\", \"start\": \"2027-11-06 13:57:16.363636+00:00\", \"end\": \"2028-07-29 03:46:21.818181+00:00\", \"children\": [{\"lord\": \"Scorpio\", \"start\": \"2027-11-06 13:57:16.363636+00:00\", \"end\": \"2027-12-08 16:51:49.090909+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-08 16:51:49.090909+00:00\", \"end\": \"2027-12-28 18:40:54.545454+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-12-28 18:40:54.545454+00:00\", \"end\": \"2028-02-06 22:19:05.454545"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/rashi/": {
      "post": {
        "operationId": "astro_dasha_rashi",
        "summary": "Rashi dasha (any system)",
        "description": "Any of the nineteen rashi dashas, by name.\n\nChara, Narayana, Kalachakra and Sudasa have their own endpoints; this reaches the other fifteen — Brahma, Chakra, Drig, Kendradhi, Lagnamsaka, Mandooka, Navamsa, Nirayana Shoola, Paryaaya, Sandhya, Shoola, Sthira, Tara Lagna, Trikona and Yogardha.\n\nAll of them run on signs, so `lord` is a sign name throughout.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Drig\", \"engine_id\": \"DrigRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1992-06-28 06:33:30.389610+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"1992-06-28 06:33:30.389610+00:00\", \"end\": \"1992-08-24 04:41:17.922078+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1992-08-24 04:41:17.922078+00:00\", \"end\": \"1994-03-16 09:59:13.246753+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1994-03-16 09:59:13.246753+00:00\", \"end\": \"1994-09-03 04:22:35.844156+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"1994-09-03 04:22:35.844156+00:00\", \"end\": \"1996-01-28 11:32:43.636364+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"1996-01-28 11:32:43.636364+00:00\", \"end\": \"1996-11-08 02:11:41.298702+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"1996-11-08 02:11:41.298702+00:00\", \"end\": \"1997-10-15 14:58:26.493507+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"1997-10-15 14:58:26.493507+00:00\", \"end\": \"1998-11-18 01:52:59.220780+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"1998-11-18 01:52:59.220780+00:00\", \"end\": \"1999-07-03 18:24:09.350650+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"1999-07-03 18:24:09.350650+00:00\", \"end\": \"2000-10-01 03:26:29.610390+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2000-10-01 03:26:29.610390+00:00\", \"end\": \"2000-11-27 01:34:17.142858+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2000-11-27 01:34:17.142858+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2003-08-15 11:00:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2002-08-19 22:45:58.441558+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2002-08-19 22:45:58.441558+00:00\", \"end\": \"2002-10-06 08:25:42.857142+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2002-10-06 08:25:42.857142+00:00\", \"end\": \"2002-10-20 13:43:38.181817+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2002-10-20 13:43:38.181817+00:00\", \"end\": \"2002-12-02 05:37:24.155843+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2002-12-02 05:37:24.155843+00:00\", \"end\": \"2002-12-25 22:27:16.363635+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2002-12-25 22:27:16.363635+00:00\", \"end\": \"2003-01-23 09:03:07.012986+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2003-01-23 09:03:07.012986+00:00\", \"end\": \"2003-02-25 13:24:56.103895+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2003-02-25 13:24:56.103895+00:00\", \"end\": \"2003-03-16 12:28:49.870129+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2003-03-16 12:28:49.870129+00:00\", \"end\": \"2003-04-23 10:36:37.402597+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2003-04-23 10:36:37.402597+00:00\", \"end\": \"2003-04-28 04:22:35.844155+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2003-04-28 04:22:35.844155+00:00\", \"end\": \"2003-06-19 07:48:18.701298+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2003-06-19 07:48:18.701298+00:00\", \"end\": \"2003-08-15 04:59:59.999999+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2003-08-15 11:00:00+00:00\", \"end\": \"2013-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2003-08-15 11:00:00+00:00\", \"end\": \"2004-12-01 17:51:25.714286+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2004-12-01 17:51:25.714286+00:00\", \"end\": \"2005-04-23 00:42:51.428572+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2005-04-23 00:42:51.428572+00:00\", \"end\": \"2006-06-23 21:17:08.571429+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2006-06-23 21:17:08.571429+00:00\", \"end\": \"2007-02-16 00:42:51.428572+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2007-02-16 00:42"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "system": {
                    "type": "string",
                    "description": "Dasha system. See /api/astro/dasha/systems/ for the list; both the display name and the engine id are accepted.",
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "system"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2,
                "system": "Drig"
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/sandhya/": {
      "post": {
        "operationId": "astro_dasha_sandhya",
        "summary": "Sandhya dasha",
        "description": "The Jaimini sign dasha of the junctures.\n\nReckoned around sandhi, the junctions between signs, which is where the name comes from.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Sandhya\", \"engine_id\": \"SandhyaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2036-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-07-02 08:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-26 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-09-26 08:30:00+00:00\", \"end\": \"2026-10-21 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-10-21 16:30:00+00:00\", \"end\": \"2026-11-16 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2026-11-16 00:30:00+00:00\", \"end\": \"2026-12-11 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2026-12-11 08:30:00+00:00\", \"end\": \"2027-01-05 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-01-05 16:30:00+00:00\", \"end\": \"2027-01-31 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-01-31 00:30:00+00:00\", \"end\": \"2027-02-25 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-02-25 08:30:00+00:00\", \"end\": \"2027-03-22 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-03-22 16:30:00+00:00\", \"end\": \"2027-04-17 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-04-17 00:30:00+00:00\", \"end\": \"2027-05-12 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-05-12 08:30:00+00:00\", \"end\": \"2027-06-06 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-06-06 16:30:00+00:00\", \"end\": \"2027-07-02 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2027-07-02 08:30:00+00:00\", \"end\": \"2028-05-01 16:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2027-07-02 08:30:00+00:00\", \"end\": \"2027-07-27 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-07-27 16:30:00+00:00\", \"end\": \"2027-08-22 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-08-22 00:30:00+00:00\", \"end\": \"2027-09-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-09-16 08:30:00+00:00\", \"end\": \"2027-10-11 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-10-11 16:30:00+00:00\", \"end\": \"2027-11-06 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-11-06 00:30:00+00:00\", \"end\": \"2027-12-01 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-12-01 08:30:00+00:00\", \"end\": \"2027-12-26 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-26 16:30:00+00:00\", \"end\": \"2028-01-21 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-21 00:30:00+00:00\", \"end\": \"2028-02-15 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-02-15 08:30:00+00:00\", \"end\": \"2028-03-11 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-03-11 16:30:00+00:00\", \"end\": \"2028-04-06 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-04-06 00:30:00+00:00\", \"end\": \"2028-05-01 08:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-05-01 16:30:00+00:00\", \"end\": \"2029-03-02 00:30:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-05-01 16:30:00+00:00\", \"end\": \"2028-05-27 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-05-27 00:30:00+00:00\", \"end\": \"2028-06-21 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-06-21 08:30:00+00:00\", \"end\": \"2028-07-16 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-07-16 16:30:00+00:00\", \"end\": \"2028-08-11 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-08-11 00:30:00+00:00\", \"end\": \"2028-09-05 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-09-05 08:30:00+00:00\", \"end\": \"2028-09-30 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-09-30 16:30:00+00:0"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/sataabdika/": {
      "post": {
        "operationId": "astro_dasha_sataabdika",
        "summary": "Sataabdika dasha",
        "description": "The 100-year conditional cycle.\n\nA round hundred-year span, which makes the arithmetic unusually legible when you are reading periods off against a person's age.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Sataabdika\", \"engine_id\": \"SataabdikaDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 100, \"conditional\": true, \"periods\": [{\"lord\": \"moon\", \"start\": \"2026-02-10 13:55:56.472891+00:00\", \"end\": \"2031-02-10 19:55:56.472891+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2026-02-10 13:55:56.472891+00:00\", \"end\": \"2026-05-12 21:07:56.472891+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2026-02-10 13:55:56.472891+00:00\", \"end\": \"2026-02-15 03:07:56.472891+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2026-02-15 03:07:56.472891+00:00\", \"end\": \"2026-02-24 05:31:56.472891+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-02-24 05:31:56.472891+00:00\", \"end\": \"2026-03-05 07:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-03-05 07:55:56.472891+00:00\", \"end\": \"2026-03-23 12:43:56.472891+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-03-23 12:43:56.472891+00:00\", \"end\": \"2026-04-10 17:31:56.472891+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2026-04-10 17:31:56.472891+00:00\", \"end\": \"2026-05-08 00:43:56.472891+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-05-08 00:43:56.472891+00:00\", \"end\": \"2026-05-12 13:55:56.472891+00:00\", \"children\": []}]}, {\"lord\": \"venus\", \"start\": \"2026-05-12 21:07:56.472891+00:00\", \"end\": \"2026-11-11 11:31:56.472891+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2026-05-12 21:07:56.472891+00:00\", \"end\": \"2026-05-31 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-05-31 01:55:56.472891+00:00\", \"end\": \"2026-06-18 06:43:56.472891+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-06-18 06:43:56.472891+00:00\", \"end\": \"2026-07-24 16:19:56.472891+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-07-24 16:19:56.472891+00:00\", \"end\": \"2026-08-30 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2026-08-30 01:55:56.472891+00:00\", \"end\": \"2026-10-23 16:19:56.472891+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-10-23 16:19:56.472891+00:00\", \"end\": \"2026-11-01 18:43:56.472891+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2026-11-01 18:43:56.472891+00:00\", \"end\": \"2026-11-10 21:07:56.472891+00:00\", \"children\": []}]}, {\"lord\": \"mercury\", \"start\": \"2026-11-11 11:31:56.472891+00:00\", \"end\": \"2027-05-13 01:55:56.472891+00:00\", \"children\": [{\"lord\": \"mercury\", \"start\": \"2026-11-11 11:31:56.472891+00:00\", \"end\": \"2026-11-29 16:19:56.472891+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-11-29 16:19:56.472891+00:00\", \"end\": \"2027-01-05 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-01-05 01:55:56.472891+00:00\", \"end\": \"2027-02-10 11:31:56.472891+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-02-10 11:31:56.472891+00:00\", \"end\": \"2027-04-06 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-04-06 01:55:56.472891+00:00\", \"end\": \"2027-04-15 04:19:56.472891+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-04-15 04:19:56.472891+00:00\", \"end\": \"2027-04-24 06:43:56.472891+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2027-04-24 06:43:56.472891+00:00\", \"end\": \"2027-05-12 11:31:56.472891+00:00\", \"children\": []}]}, {\"lord\": \"jupiter\", \"start\": \"2027-05-13 01:55:56.472891+00:00\", \"end\": \"2028-05-12 06:43:56.472891+00:00\", \"children\": [{\"lord\": \"jupiter\", \"start\": \"2027-05-13 01:55:56.472891+00:00\", \"end\": \"2027-07-25 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-07-25 01:55:56.472891+00:00\", \"end\": \"2027-10-06 01:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-10-06 01:55:56.472891+00:00\", \"end\": \"2028-01-23 13:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-01-23 13:55:56.472891+00:00\", \"end\": \"2028-02-10 19:55:56.472891+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2028-02-10 19:55:56.472891+00:00\", \"end\": \"2028-02-"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/shattrimsa-sama/": {
      "post": {
        "operationId": "astro_dasha_shattrimsa_sama",
        "summary": "Shattrimsa Sama dasha",
        "description": "The 36-year conditional cycle, with equal periods.\n\nThe shortest nakshatra dasha offered here. A full cycle completes within a normal lifetime, so unlike the 120-year systems a chart can run through the entire wheel and begin again.\n\nThis is a CONDITIONAL dasha: the classical texts apply it only when a particular configuration holds in the chart, so it is not a reading that is admissible for everyone. Call /api/astro/dasha_applicability/ to test which conditional dashas a given chart actually admits before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Shattrimsa Sama\", \"engine_id\": \"ShattrimsaSamaDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 36, \"conditional\": true, \"periods\": [{\"lord\": \"venus\", \"start\": \"2025-11-21 14:30:19.062048+00:00\", \"end\": \"2032-11-21 08:30:19.062048+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2025-11-21 14:30:19.062048+00:00\", \"end\": \"2027-04-02 14:30:19.062048+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"2025-11-21 14:30:19.062048+00:00\", \"end\": \"2026-02-26 05:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2026-02-26 05:50:19.062048+00:00\", \"end\": \"2026-06-16 16:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2026-06-16 16:30:19.062048+00:00\", \"end\": \"2026-06-30 11:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2026-06-30 11:50:19.062048+00:00\", \"end\": \"2026-07-28 02:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2026-07-28 02:30:19.062048+00:00\", \"end\": \"2026-09-07 12:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2026-09-07 12:30:19.062048+00:00\", \"end\": \"2026-11-01 17:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2026-11-01 17:50:19.062048+00:00\", \"end\": \"2027-01-09 18:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2027-01-09 18:30:19.062048+00:00\", \"end\": \"2027-04-02 14:30:19.062048+00:00\", \"children\": []}]}, {\"lord\": \"rahu\", \"start\": \"2027-04-02 14:30:19.062048+00:00\", \"end\": \"2028-10-21 14:30:19.062048+00:00\", \"children\": [{\"lord\": \"rahu\", \"start\": \"2027-04-02 14:30:19.062048+00:00\", \"end\": \"2027-08-06 19:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2027-08-06 19:50:19.062048+00:00\", \"end\": \"2027-08-22 14:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2027-08-22 14:30:19.062048+00:00\", \"end\": \"2027-09-23 03:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2027-09-23 03:50:19.062048+00:00\", \"end\": \"2027-11-09 11:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2027-11-09 11:50:19.062048+00:00\", \"end\": \"2028-01-11 14:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2028-01-11 14:30:19.062048+00:00\", \"end\": \"2028-03-30 11:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-03-30 11:50:19.062048+00:00\", \"end\": \"2028-07-03 03:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2028-07-03 03:50:19.062048+00:00\", \"end\": \"2028-10-21 14:30:19.062048+00:00\", \"children\": []}]}, {\"lord\": \"moon\", \"start\": \"2028-10-21 14:30:19.062048+00:00\", \"end\": \"2028-12-31 14:30:19.062048+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2028-10-21 14:30:19.062048+00:00\", \"end\": \"2028-10-23 13:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2028-10-23 13:50:19.062048+00:00\", \"end\": \"2028-10-27 12:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2028-10-27 12:30:19.062048+00:00\", \"end\": \"2028-11-02 10:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2028-11-02 10:30:19.062048+00:00\", \"end\": \"2028-11-10 07:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2028-11-10 07:50:19.062048+00:00\", \"end\": \"2028-11-20 04:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2028-11-20 04:30:19.062048+00:00\", \"end\": \"2028-12-02 00:30:19.062048+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2028-12-02 00:30:19.062048+00:00\", \"end\": \"2028-12-15 19:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2028-12-15 19:50:19.062048+00:00\", \"end\": \"2028-12-31 14:30:19.062048+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"2028-12-31 14:30:19.062048+00:00\", \"end\": \"2029-05-22 14:30:19.062048+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2028-12-31 14:30:19.062048+00:00\", \"end\": \"2029-01-08 11:50:19.062048+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2029-01-08 11:50:19.062048+00:00\", \"end\": \"2029-01-"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/shodashottari/": {
      "post": {
        "operationId": "astro_dasha_shodashottari",
        "summary": "Shodashottari dasha",
        "description": "The 116-year conditional nakshatra cycle.\n\nAnother of the conditional dashas — check /api/astro/dasha_applicability/ before using it for a chart.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Shodashottari\", \"engine_id\": \"ShodashottariDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"cycle_years\": 116, \"conditional\": true, \"periods\": [{\"lord\": \"mars\", \"start\": \"1982-08-01 16:28:54.727337+00:00\", \"end\": \"1994-08-01 16:28:54.727337+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"1982-08-01 16:28:54.727337+00:00\", \"end\": \"1983-10-29 02:24:46.451475+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1983-10-29 02:24:46.451475+00:00\", \"end\": \"1985-03-03 07:10:17.485958+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1985-03-03 07:10:17.485958+00:00\", \"end\": \"1986-08-14 06:45:27.830786+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"1986-08-14 06:45:27.830786+00:00\", \"end\": \"1988-03-03 01:10:17.485958+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1988-03-03 01:10:17.485958+00:00\", \"end\": \"1989-10-28 14:24:46.451475+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1989-10-28 14:24:46.451475+00:00\", \"end\": \"1991-08-01 22:28:54.727337+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1991-08-01 22:28:54.727337+00:00\", \"end\": \"1993-06-12 01:22:42.313544+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1993-06-12 01:22:42.313544+00:00\", \"end\": \"1994-08-01 16:28:54.727337+00:00\", \"children\": []}]}, {\"lord\": \"jupiter\", \"start\": \"1994-08-01 16:28:54.727337+00:00\", \"end\": \"2007-08-01 22:28:54.727337+00:00\", \"children\": [{\"lord\": \"jupiter\", \"start\": \"1994-08-01 16:28:54.727337+00:00\", \"end\": \"1996-01-15 18:57:52.658371+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1996-01-15 18:57:52.658371+00:00\", \"end\": \"1997-08-10 19:47:31.968716+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"1997-08-10 19:47:31.968716+00:00\", \"end\": \"1999-04-16 18:57:52.658371+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1999-04-16 18:57:52.658371+00:00\", \"end\": \"2001-01-30 16:28:54.727337+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2001-01-30 16:28:54.727337+00:00\", \"end\": \"2002-12-27 12:20:38.175613+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2002-12-27 12:20:38.175613+00:00\", \"end\": \"2005-01-02 06:33:03.003199+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2005-01-02 06:33:03.003199+00:00\", \"end\": \"2006-03-28 12:20:38.175613+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2006-03-28 12:20:38.175613+00:00\", \"end\": \"2007-08-01 16:28:54.727337+00:00\", \"children\": []}]}, {\"lord\": \"saturn\", \"start\": \"2007-08-01 22:28:54.727337+00:00\", \"end\": \"2021-08-01 10:28:54.727337+00:00\", \"children\": [{\"lord\": \"saturn\", \"start\": \"2007-08-01 22:28:54.727337+00:00\", \"end\": \"2009-04-10 00:33:03.003199+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"2009-04-10 00:33:03.003199+00:00\", \"end\": \"2011-01-31 04:28:54.727337+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2011-01-31 04:28:54.727337+00:00\", \"end\": \"2013-01-05 10:16:29.899751+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2013-01-05 10:16:29.899751+00:00\", \"end\": \"2015-01-24 17:55:48.520441+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2015-01-24 17:55:48.520441+00:00\", \"end\": \"2017-03-28 03:26:50.589407+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2017-03-28 03:26:50.589407+00:00\", \"end\": \"2018-07-25 23:55:48.520441+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2018-07-25 23:55:48.520441+00:00\", \"end\": \"2020-01-05 22:16:29.899751+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2020-01-05 22:16:29.899751+00:00\", \"end\": \"2021-07-31 22:28:54.727337+00:00\", \"children\": []}]}, {\"lord\": \"ketu\", \"start\": \"2021-08-01 10:28:54.727337+00:00\", \"end\": \"2036-08-01 04:28:54.727337+00:00\", \"children\": [{\"lord\": \"ketu\", \"start\": \"2021-08-01 10:28:54.727337+00:00\", \"end\": \"2023-07-10 19:10:17.485958+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"2023-07-10 19:10:17.485958+00:00\", \"end\": \"2025-08-04 09:14:25.761820+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2025-08-04 09:14:25.761820+00:00\", \"end\": \"2027-10-16 04:41:19."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/shoola/": {
      "post": {
        "operationId": "astro_dasha_shoola",
        "summary": "Shoola dasha",
        "description": "The Jaimini sign dasha read for hazard and longevity.\n\nClassically one of the ayur (longevity) dashas, read where the question is about difficulty rather than gain. Pair it with /api/astro/dasha/nirayana-shoola/ to compare reckonings.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Shoola\", \"engine_id\": \"ShoolaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2035-09-01 06:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-06-01 22:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-23 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-09-23 18:30:00+00:00\", \"end\": \"2026-10-16 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-10-16 12:30:00+00:00\", \"end\": \"2026-11-08 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2026-11-08 06:30:00+00:00\", \"end\": \"2026-12-01 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2026-12-01 00:30:00+00:00\", \"end\": \"2026-12-23 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2026-12-23 18:30:00+00:00\", \"end\": \"2027-01-15 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-01-15 12:30:00+00:00\", \"end\": \"2027-02-07 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-02-07 06:30:00+00:00\", \"end\": \"2027-03-02 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-03-02 00:30:00+00:00\", \"end\": \"2027-03-24 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-03-24 18:30:00+00:00\", \"end\": \"2027-04-16 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-04-16 12:30:00+00:00\", \"end\": \"2027-05-09 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-05-09 06:30:00+00:00\", \"end\": \"2027-06-01 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2027-06-01 22:30:00+00:00\", \"end\": \"2028-03-01 20:30:00+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2027-06-01 22:30:00+00:00\", \"end\": \"2027-06-24 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-06-24 16:30:00+00:00\", \"end\": \"2027-07-17 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-07-17 10:30:00+00:00\", \"end\": \"2027-08-09 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-08-09 04:30:00+00:00\", \"end\": \"2027-08-31 22:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-08-31 22:30:00+00:00\", \"end\": \"2027-09-23 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-09-23 16:30:00+00:00\", \"end\": \"2027-10-16 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-10-16 10:30:00+00:00\", \"end\": \"2027-11-08 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-11-08 04:30:00+00:00\", \"end\": \"2027-11-30 22:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-11-30 22:30:00+00:00\", \"end\": \"2027-12-23 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-12-23 16:30:00+00:00\", \"end\": \"2028-01-15 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-01-15 10:30:00+00:00\", \"end\": \"2028-02-07 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-02-07 04:30:00+00:00\", \"end\": \"2028-02-29 22:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-03-01 20:30:00+00:00\", \"end\": \"2028-11-30 18:30:00+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-03-01 20:30:00+00:00\", \"end\": \"2028-03-24 14:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-03-24 14:30:00+00:00\", \"end\": \"2028-04-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-04-16 08:30:00+00:00\", \"end\": \"2028-05-09 02:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-05-09 02:30:00+00:00\", \"end\": \"2028-05-31 20:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-05-31 20:30:00+00:00\", \"end\": \"2028-06-23 14:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-06-23 14:30:00+00:00\", \"end\": \"2028-07-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-07-16 08:30:00+00:00\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/sthira/": {
      "post": {
        "operationId": "astro_dasha_sthira",
        "summary": "Sthira dasha",
        "description": "The fixed-period Jaimini sign dasha.\n\n\"Sthira\" means fixed: every sign holds the same span, so unlike Chara the period lengths do not vary from chart to chart. That makes it a stable backdrop to read the variable dashas against.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Sthira\", \"engine_id\": \"SthiraRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Leo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2034-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Leo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-05-02 12:30:00+00:00\", \"children\": [{\"lord\": \"Leo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-21 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2026-09-21 06:30:00+00:00\", \"end\": \"2026-10-14 01:15:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2026-10-14 01:15:00+00:00\", \"end\": \"2026-10-31 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2026-10-31 18:30:00+00:00\", \"end\": \"2026-11-21 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2026-11-21 00:30:00+00:00\", \"end\": \"2026-12-13 19:15:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2026-12-13 19:15:00+00:00\", \"end\": \"2026-12-31 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2026-12-31 12:30:00+00:00\", \"end\": \"2027-01-20 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-01-20 18:30:00+00:00\", \"end\": \"2027-02-12 13:15:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-02-12 13:15:00+00:00\", \"end\": \"2027-03-02 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2027-03-02 06:30:00+00:00\", \"end\": \"2027-03-22 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-03-22 12:30:00+00:00\", \"end\": \"2027-04-14 07:15:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-04-14 07:15:00+00:00\", \"end\": \"2027-05-02 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Virgo\", \"start\": \"2027-05-02 12:30:00+00:00\", \"end\": \"2028-01-31 11:00:00+00:00\", \"children\": [{\"lord\": \"Virgo\", \"start\": \"2027-05-02 12:30:00+00:00\", \"end\": \"2027-05-28 02:45:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-05-28 02:45:00+00:00\", \"end\": \"2027-06-17 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-06-17 00:30:00+00:00\", \"end\": \"2027-07-09 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-07-09 18:30:00+00:00\", \"end\": \"2027-08-04 08:45:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-08-04 08:45:00+00:00\", \"end\": \"2027-08-24 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-08-24 06:30:00+00:00\", \"end\": \"2027-09-16 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-09-16 00:30:00+00:00\", \"end\": \"2027-10-11 14:45:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-10-11 14:45:00+00:00\", \"end\": \"2027-10-31 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2027-10-31 12:30:00+00:00\", \"end\": \"2027-11-23 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-11-23 06:30:00+00:00\", \"end\": \"2027-12-18 20:45:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-12-18 20:45:00+00:00\", \"end\": \"2028-01-07 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-01-07 18:30:00+00:00\", \"end\": \"2028-01-30 12:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Libra\", \"start\": \"2028-01-31 11:00:00+00:00\", \"end\": \"2028-08-31 12:30:00+00:00\", \"children\": [{\"lord\": \"Libra\", \"start\": \"2028-01-31 11:00:00+00:00\", \"end\": \"2028-02-15 23:45:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-02-15 23:45:00+00:00\", \"end\": \"2028-03-04 17:45:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-03-04 17:45:00+00:00\", \"end\": \"2028-03-24 17:00:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-03-24 17:00:00+00:00\", \"end\": \"2028-04-09 05:45:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-04-09 05:45:00+00:00\", \"end\": \"2028-04-26 23:45:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-04-26 23:45:00+00:00\", \"end\": \"2028-05-16 23:00:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-05-16 23:00:00+00:0"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/sudasa/": {
      "post": {
        "operationId": "astro_dasha_sudasa",
        "summary": "Sudasa dasha",
        "description": "The Jaimini rashi dasha counted from Sri Lagna.\n\nTraditionally read for prosperity and material circumstance, being seeded from Sri Lagna rather than from the ascendant.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Sudasa\", \"engine_id\": \"SudasaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"1990-08-15 05:00:00+00:00\", \"end\": \"1992-06-28 06:33:30.389610+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"1992-06-28 06:33:30.389610+00:00\", \"end\": \"1992-08-24 04:41:17.922078+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"1992-08-24 04:41:17.922078+00:00\", \"end\": \"1994-03-16 09:59:13.246753+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"1994-03-16 09:59:13.246753+00:00\", \"end\": \"1994-09-03 04:22:35.844156+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"1994-09-03 04:22:35.844156+00:00\", \"end\": \"1996-01-28 11:32:43.636364+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"1996-01-28 11:32:43.636364+00:00\", \"end\": \"1996-11-08 02:11:41.298702+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"1996-11-08 02:11:41.298702+00:00\", \"end\": \"1997-10-15 14:58:26.493507+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"1997-10-15 14:58:26.493507+00:00\", \"end\": \"1998-11-18 01:52:59.220780+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"1998-11-18 01:52:59.220780+00:00\", \"end\": \"1999-07-03 18:24:09.350650+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"1999-07-03 18:24:09.350650+00:00\", \"end\": \"2000-10-01 03:26:29.610390+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2000-10-01 03:26:29.610390+00:00\", \"end\": \"2000-11-27 01:34:17.142858+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2000-11-27 01:34:17.142858+00:00\", \"end\": \"2002-08-15 05:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Cancer\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2005-08-14 23:00:00+00:00\", \"children\": [{\"lord\": \"Cancer\", \"start\": \"2002-08-15 05:00:00+00:00\", \"end\": \"2002-09-26 20:53:45.974026+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2002-09-26 20:53:45.974026+00:00\", \"end\": \"2003-02-01 20:35:03.896104+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2003-02-01 20:35:03.896104+00:00\", \"end\": \"2003-04-13 23:04:40.519481+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2003-04-13 23:04:40.519481+00:00\", \"end\": \"2003-07-08 06:52:12.467533+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2003-07-08 06:52:12.467533+00:00\", \"end\": \"2003-10-15 19:57:39.740260+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2003-10-15 19:57:39.740260+00:00\", \"end\": \"2003-12-11 17:09:21.038961+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2003-12-11 17:09:21.038961+00:00\", \"end\": \"2004-04-03 11:32:43.636364+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2004-04-03 11:32:43.636364+00:00\", \"end\": \"2004-04-17 16:50:38.961039+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2004-04-17 16:50:38.961039+00:00\", \"end\": \"2004-09-21 03:07:47.532468+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2004-09-21 03:07:47.532468+00:00\", \"end\": \"2005-03-10 18:42:51.428572+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2005-03-10 18:42:51.428572+00:00\", \"end\": \"2005-03-25 00:00:46.753247+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2005-03-25 00:00:46.753247+00:00\", \"end\": \"2005-08-14 05:00:00+00:00\", \"children\": []}]}, {\"lord\": \"Libra\", \"start\": \"2005-08-14 23:00:00+00:00\", \"end\": \"2011-08-15 11:00:00+00:00\", \"children\": [{\"lord\": \"Libra\", \"start\": \"2005-08-14 23:00:00+00:00\", \"end\": \"2006-02-01 16:27:16.363636+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2006-02-01 16:27:16.363636+00:00\", \"end\": \"2006-08-19 20:49:05.454545+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2006-08-19 20:49:05.454545+00:00\", \"end\": \"2006-12-11 16:27:16.363636+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2006-12-11 16:27:16.363636+00:00\", \"end\": \"2007-07-27 07:43:38.181818+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2007-"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/systems/": {
      "post": {
        "operationId": "astro_dasha_systems",
        "summary": "Dasha systems index",
        "description": "Every dasha system we compute, with its cycle length and the endpoint that serves it.\n\nThirty of them — eleven nakshatra dashas that run on planets, nineteen rashi dashas that run on signs. This endpoint exists because there is otherwise no way to discover them: they are values of a string field, so they appear in no route list and no search.\n\n`conditional` marks the nakshatra dashas the classical texts apply only when a particular condition holds in the chart. /api/astro/dasha_applicability/ tests those conditions for a given chart, so you can find out which readings are admissible before you show one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"family\": \"both\", \"count\": 30, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\", \"sookshmadasha\"], \"max_levels\": 4, \"nakshatra_dashas\": [{\"system\": \"Vimshottari\", \"engine_id\": \"VimshottariDasha\", \"cycle_years\": 120, \"conditional\": false, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/vimshottari/\"}, {\"system\": \"Ashtottari\", \"engine_id\": \"AshtottariDasha\", \"cycle_years\": 108, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/ashtottari/\"}, {\"system\": \"Shodashottari\", \"engine_id\": \"ShodashottariDasha\", \"cycle_years\": 116, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/shodashottari/\"}, {\"system\": \"Dwadashottari\", \"engine_id\": \"DwadashottariDasha\", \"cycle_years\": 112, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Panchottari\", \"engine_id\": \"PanchottariDasha\", \"cycle_years\": 105, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Sataabdika\", \"engine_id\": \"SataabdikaDasha\", \"cycle_years\": 100, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Chaturaseeti Sama\", \"engine_id\": \"ChaturaseetiSamaDasha\", \"cycle_years\": 84, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Dwisaptati\", \"engine_id\": \"DwisaptatiDasha\", \"cycle_years\": 72, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Shattrimsa Sama\", \"engine_id\": \"ShattrimsaSamaDasha\", \"cycle_years\": 36, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}, {\"system\": \"Yogini\", \"engine_id\": \"YoginiDasha\", \"cycle_years\": 36, \"conditional\": false, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/yogini/\"}, {\"system\": \"Budhi Gati\", \"engine_id\": \"BudhiGatiDasha\", \"cycle_years\": 112, \"conditional\": true, \"lord_type\": \"planet\", \"endpoint\": \"/api/astro/dasha/nakshatra/\"}], \"rashi_dashas\": [{\"system\": \"Chara\", \"engine_id\": \"CharaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/chara/\"}, {\"system\": \"Narayana\", \"engine_id\": \"NarayanaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/narayana/\"}, {\"system\": \"Kalachakra\", \"engine_id\": \"KalachakraRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/kalachakra/\"}, {\"system\": \"Sudasa\", \"engine_id\": \"SudasaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/sudasa/\"}, {\"system\": \"Drig\", \"engine_id\": \"DrigRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Nirayana Shoola\", \"engine_id\": \"NirayanaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Shoola\", \"engine_id\": \"ShoolaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Sthira\", \"engine_id\": \"SthiraRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Trikona\", \"engine_id\": \"TrikonaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Brahma\", \"engine_id\": \"BrahmaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Chakra\", \"engine_id\": \"ChakraRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Kendradhi\", \"engine_id\": \"KendradhiRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Lagnamsaka\", \"engine_id\": \"LagnamsakaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Mandooka\", \"engine_id\": \"MandookaRaasi\", \"conditional\": false, \"lord_type\": \"sign\", \"endpoint\": \"/api/astro/dasha/rashi/\"}, {\"system\": \"Navamsa\", \"engine_id\": \"NavmasaRaasi\", \"conditional\": false, \"lord_type"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "family": {
                    "type": "string",
                    "description": "Narrow the list to one family. Nakshatra dashas run on planets; rashi dashas run on signs.",
                    "enum": [
                      "both",
                      "nakshatra",
                      "rashi"
                    ],
                    "default": "both",
                    "examples": [
                      "both"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "family": "both"
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/tara-lagna/": {
      "post": {
        "operationId": "astro_dasha_tara_lagna",
        "summary": "Tara Lagna dasha",
        "description": "The Jaimini sign dasha seeded from the tara lagna.\n\nUses the tara (star) lagna as its seed rather than the rashi ascendant.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Tara Lagna\", \"engine_id\": \"TaraLagnaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2035-09-01 06:30:00+00:00\", \"children\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-06-01 22:30:00+00:00\", \"children\": [{\"lord\": \"Virgo\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-09-23 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2026-09-23 18:30:00+00:00\", \"end\": \"2026-10-16 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2026-10-16 12:30:00+00:00\", \"end\": \"2026-11-08 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2026-11-08 06:30:00+00:00\", \"end\": \"2026-12-01 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2026-12-01 00:30:00+00:00\", \"end\": \"2026-12-23 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2026-12-23 18:30:00+00:00\", \"end\": \"2027-01-15 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-01-15 12:30:00+00:00\", \"end\": \"2027-02-07 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-02-07 06:30:00+00:00\", \"end\": \"2027-03-02 00:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2027-03-02 00:30:00+00:00\", \"end\": \"2027-03-24 18:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-03-24 18:30:00+00:00\", \"end\": \"2027-04-16 12:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-04-16 12:30:00+00:00\", \"end\": \"2027-05-09 06:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-05-09 06:30:00+00:00\", \"end\": \"2027-06-01 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Libra\", \"start\": \"2027-06-01 22:30:00+00:00\", \"end\": \"2028-03-01 20:30:00+00:00\", \"children\": [{\"lord\": \"Libra\", \"start\": \"2027-06-01 22:30:00+00:00\", \"end\": \"2027-06-24 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-06-24 16:30:00+00:00\", \"end\": \"2027-07-17 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-07-17 10:30:00+00:00\", \"end\": \"2027-08-09 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-08-09 04:30:00+00:00\", \"end\": \"2027-08-31 22:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-08-31 22:30:00+00:00\", \"end\": \"2027-09-23 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-09-23 16:30:00+00:00\", \"end\": \"2027-10-16 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2027-10-16 10:30:00+00:00\", \"end\": \"2027-11-08 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2027-11-08 04:30:00+00:00\", \"end\": \"2027-11-30 22:30:00+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-11-30 22:30:00+00:00\", \"end\": \"2027-12-23 16:30:00+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-12-23 16:30:00+00:00\", \"end\": \"2028-01-15 10:30:00+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-01-15 10:30:00+00:00\", \"end\": \"2028-02-07 04:30:00+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-02-07 04:30:00+00:00\", \"end\": \"2028-02-29 22:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Scorpio\", \"start\": \"2028-03-01 20:30:00+00:00\", \"end\": \"2028-11-30 18:30:00+00:00\", \"children\": [{\"lord\": \"Scorpio\", \"start\": \"2028-03-01 20:30:00+00:00\", \"end\": \"2028-03-24 14:30:00+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-03-24 14:30:00+00:00\", \"end\": \"2028-04-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-04-16 08:30:00+00:00\", \"end\": \"2028-05-09 02:30:00+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-05-09 02:30:00+00:00\", \"end\": \"2028-05-31 20:30:00+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-05-31 20:30:00+00:00\", \"end\": \"2028-06-23 14:30:00+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-06-23 14:30:00+00:00\", \"end\": \"2028-07-16 08:30:00+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2028-07-16"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/trikona/": {
      "post": {
        "operationId": "astro_dasha_trikona",
        "summary": "Trikona dasha",
        "description": "The Jaimini sign dasha grouped by trines.\n\nMoves through the signs in trinal groups rather than in zodiacal sequence, which is what separates it from the other Jaimini dashas.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Trikona\", \"engine_id\": \"TrikonaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2038-09-01 00:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2028-07-15 02:03:30.389610+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-12-16 11:05:50.649351+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-12-16 11:05:50.649351+00:00\", \"end\": \"2026-12-25 07:58:49.870130+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-12-25 07:58:49.870130+00:00\", \"end\": \"2027-03-24 00:48:42.077922+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-03-24 00:48:42.077922+00:00\", \"end\": \"2027-04-19 15:27:39.740260+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-04-19 15:27:39.740260+00:00\", \"end\": \"2027-07-08 11:24:32.727273+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-07-08 11:24:32.727273+00:00\", \"end\": \"2027-08-21 19:49:28.831169+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-08-21 19:49:28.831169+00:00\", \"end\": \"2027-10-14 01:07:24.155844+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-10-14 01:07:24.155844+00:00\", \"end\": \"2027-12-15 03:18:18.701299+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-15 03:18:18.701299+00:00\", \"end\": \"2028-01-19 14:50:15.584416+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-19 14:50:15.584416+00:00\", \"end\": \"2028-03-30 13:54:09.350650+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-03-30 13:54:09.350650+00:00\", \"end\": \"2028-04-08 10:47:08.571429+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-04-08 10:47:08.571429+00:00\", \"end\": \"2028-07-15 00:30:00+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-09-10 00:11:17.922078+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2028-07-15 02:03:30.389610+00:00\", \"end\": \"2028-07-15 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2028-07-15 19:30:46.753246+00:00\", \"end\": \"2028-07-23 02:03:30.389610+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-07-23 02:03:30.389610+00:00\", \"end\": \"2028-07-25 06:25:19.480519+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-07-25 06:25:19.480519+00:00\", \"end\": \"2028-07-31 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2028-07-31 19:30:46.753246+00:00\", \"end\": \"2028-08-04 10:47:08.571428+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2028-08-04 10:47:08.571428+00:00\", \"end\": \"2028-08-08 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2028-08-08 19:30:46.753246+00:00\", \"end\": \"2028-08-13 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2028-08-13 21:41:41.298701+00:00\", \"end\": \"2028-08-16 19:30:46.753246+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-08-16 19:30:46.753246+00:00\", \"end\": \"2028-08-22 15:08:57.662337+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-08-22 15:08:57.662337+00:00\", \"end\": \"2028-08-23 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-08-23 08:36:14.025973+00:00\", \"end\": \"2028-08-31 08:36:14.025973+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-08-31 08:36:14.025973+00:00\", \"end\": \"2028-09-09 02:03:30.389609+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2030-04-02 05:29:13.246753+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-09-10 00:11:17.922078+00:00\", \"end\": \"2028-11-22 21:41:41.298701+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-11-22 21:41:41.298701+00:00\", \"end\": \"2028-12-15 01:44:48.311688+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-12-15 01:44:48.311688+00:00\", \"end\": \"2029-02-19 13:54:09.350649+00:00\", \"chil"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/vimshottari/": {
      "post": {
        "operationId": "astro_dasha_vimshottari",
        "summary": "Vimshottari dasha",
        "description": "The 120-year cycle that almost every Vedic reading is built on.\n\nVimshottari starts from the nakshatra the Moon occupied at birth, which fixes both which planet's mahadasha was running at birth and how much of it remained, then runs all nine grahas across 120 years in a fixed order and with fixed lengths: Ketu 7, Venus 20, Sun 6, Moon 10, Mars 7, Rahu 18, Jupiter 16, Saturn 19, Mercury 17.\n\nReturned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each period carrying its lord and its exact start and end. Unlike the other nakshatra dashas, Vimshottari is unconditional: it applies to every chart.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Vimshottari\", \"engine_id\": \"VimshottariDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"cycle_years\": 120, \"conditional\": false, \"periods\": [{\"lord\": \"moon\", \"start\": \"1983-12-03 22:34:05.606114+00:00\", \"end\": \"1993-12-03 10:34:05.606114+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"1983-12-03 22:34:05.606114+00:00\", \"end\": \"1984-10-03 06:34:05.606114+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"1983-12-03 22:34:05.606114+00:00\", \"end\": \"1983-12-29 06:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1983-12-29 06:34:05.606114+00:00\", \"end\": \"1984-01-16 00:10:05.606114+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1984-01-16 00:10:05.606114+00:00\", \"end\": \"1984-03-01 14:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1984-03-01 14:34:05.606114+00:00\", \"end\": \"1984-04-11 03:22:05.606114+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1984-04-11 03:22:05.606114+00:00\", \"end\": \"1984-05-29 06:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1984-05-29 06:34:05.606114+00:00\", \"end\": \"1984-07-11 08:10:05.606114+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"1984-07-11 08:10:05.606114+00:00\", \"end\": \"1984-07-29 01:46:05.606114+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1984-07-29 01:46:05.606114+00:00\", \"end\": \"1984-09-17 17:46:05.606114+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1984-09-17 17:46:05.606114+00:00\", \"end\": \"1984-10-02 22:34:05.606114+00:00\", \"children\": []}]}, {\"lord\": \"mars\", \"start\": \"1984-10-03 06:34:05.606114+00:00\", \"end\": \"1985-05-04 07:22:05.606114+00:00\", \"children\": [{\"lord\": \"mars\", \"start\": \"1984-10-03 06:34:05.606114+00:00\", \"end\": \"1984-10-15 16:46:05.606114+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1984-10-15 16:46:05.606114+00:00\", \"end\": \"1984-11-16 15:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1984-11-16 15:34:05.606114+00:00\", \"end\": \"1984-12-15 01:10:05.606114+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1984-12-15 01:10:05.606114+00:00\", \"end\": \"1985-01-17 18:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1985-01-17 18:34:05.606114+00:00\", \"end\": \"1985-02-16 22:46:05.606114+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"1985-02-16 22:46:05.606114+00:00\", \"end\": \"1985-03-01 08:58:05.606114+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1985-03-01 08:58:05.606114+00:00\", \"end\": \"1985-04-05 20:58:05.606114+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1985-04-05 20:58:05.606114+00:00\", \"end\": \"1985-04-16 12:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1985-04-16 12:34:05.606114+00:00\", \"end\": \"1985-05-04 06:34:05.606114+00:00\", \"children\": []}]}, {\"lord\": \"rahu\", \"start\": \"1985-05-04 07:22:05.606114+00:00\", \"end\": \"1986-11-03 02:34:05.606114+00:00\", \"children\": [{\"lord\": \"rahu\", \"start\": \"1985-05-04 07:22:05.606114+00:00\", \"end\": \"1985-07-25 08:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1985-07-25 08:34:05.606114+00:00\", \"end\": \"1985-10-06 06:58:05.606114+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1985-10-06 06:58:05.606114+00:00\", \"end\": \"1985-12-31 21:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1985-12-31 21:34:05.606114+00:00\", \"end\": \"1986-03-19 09:22:05.606114+00:00\", \"children\": []}, {\"lord\": \"ketu\", \"start\": \"1986-03-19 09:22:05.606114+00:00\", \"end\": \"1986-04-20 07:10:05.606114+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1986-04-20 07:10:05.606114+00:00\", \"end\": \"1986-07-20 11:10:05.606114+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1986-07-20 11:10:05.606114+00:00\", \"end\": \"1986-08-16 19:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1986-08-16 19:34:05.606114+00:00\", \"end\": \"1986-10-01 09:34:05.606114+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1986-10-01 09:34:05.606114+00:00\", \"end\": \"1986-11-02 07:"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 3
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/yogardha/": {
      "post": {
        "operationId": "astro_dasha_yogardha",
        "summary": "Yogardha dasha",
        "description": "The Jaimini sign dasha that averages two reckonings.\n\n\"Yogardha\" means half-sum: period lengths are the mean of two other systems' reckonings, which makes it a smoothed reading rather than an independent one.\n\nThis is a Jaimini RASHI dasha, so every lord in the response is a sign name, not a planet. Periods are returned as a nested timeline — mahadasha, then antardasha, then pratyantardasha — each carrying its lord and its exact start and end.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — rashi (Jaimini)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Yogardha\", \"engine_id\": \"YogardhaRaasi\", \"family\": \"rashi\", \"lord_type\": \"sign\", \"levels\": 3, \"level_names\": [\"mahadasha\", \"antardasha\", \"pratyantardasha\"], \"conditional\": false, \"periods\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2036-03-01 21:30:00+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2027-09-17 00:13:21.156069+00:00\", \"children\": [{\"lord\": \"Aries\", \"start\": \"2026-09-01 00:30:00+00:00\", \"end\": \"2026-10-12 18:07:06.589595+00:00\", \"children\": []}, {\"lord\": \"Taurus\", \"start\": \"2026-10-12 18:07:06.589595+00:00\", \"end\": \"2026-11-01 12:34:09.710982+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2026-11-01 12:34:09.710982+00:00\", \"end\": \"2026-12-13 06:11:16.300577+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2026-12-13 06:11:16.300577+00:00\", \"end\": \"2027-01-04 05:21:19.768785+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-01-04 05:21:19.768785+00:00\", \"end\": \"2027-02-10 13:32:25.664739+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-02-10 13:32:25.664739+00:00\", \"end\": \"2027-03-13 07:34:30.520230+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-03-13 07:34:30.520230+00:00\", \"end\": \"2027-04-10 20:53:35.028901+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-04-10 20:53:35.028901+00:00\", \"end\": \"2027-05-13 19:38:40.231213+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-05-13 19:38:40.231213+00:00\", \"end\": \"2027-06-11 08:57:44.739884+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2027-06-11 08:57:44.739884+00:00\", \"end\": \"2027-07-14 07:42:49.942196+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2027-07-14 07:42:49.942196+00:00\", \"end\": \"2027-08-03 02:09:53.063583+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2027-08-03 02:09:53.063583+00:00\", \"end\": \"2027-09-16 00:29:59.999999+00:00\", \"children\": []}]}, {\"lord\": \"Taurus\", \"start\": \"2027-09-17 00:13:21.156069+00:00\", \"end\": \"2028-03-15 11:27:34.335260+00:00\", \"children\": [{\"lord\": \"Taurus\", \"start\": \"2027-09-17 00:13:21.156069+00:00\", \"end\": \"2027-09-26 08:57:44.739884+00:00\", \"children\": []}, {\"lord\": \"Gemini\", \"start\": \"2027-09-26 08:57:44.739884+00:00\", \"end\": \"2027-10-16 03:24:47.861271+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2027-10-16 03:24:47.861271+00:00\", \"end\": \"2027-10-26 13:07:27.398843+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2027-10-26 13:07:27.398843+00:00\", \"end\": \"2027-11-13 05:37:58.612716+00:00\", \"children\": []}, {\"lord\": \"Virgo\", \"start\": \"2027-11-13 05:37:58.612716+00:00\", \"end\": \"2027-11-27 19:13:41.965317+00:00\", \"children\": []}, {\"lord\": \"Libra\", \"start\": \"2027-11-27 19:13:41.965317+00:00\", \"end\": \"2027-12-11 07:51:09.364161+00:00\", \"children\": []}, {\"lord\": \"Scorpio\", \"start\": \"2027-12-11 07:51:09.364161+00:00\", \"end\": \"2027-12-26 22:25:08.670519+00:00\", \"children\": []}, {\"lord\": \"Sagittarius\", \"start\": \"2027-12-26 22:25:08.670519+00:00\", \"end\": \"2028-01-09 11:02:36.069363+00:00\", \"children\": []}, {\"lord\": \"Capricorn\", \"start\": \"2028-01-09 11:02:36.069363+00:00\", \"end\": \"2028-01-25 01:36:35.375721+00:00\", \"children\": []}, {\"lord\": \"Aquarius\", \"start\": \"2028-01-25 01:36:35.375721+00:00\", \"end\": \"2028-02-03 10:20:58.959536+00:00\", \"children\": []}, {\"lord\": \"Pisces\", \"start\": \"2028-02-03 10:20:58.959536+00:00\", \"end\": \"2028-02-24 05:46:18.034681+00:00\", \"children\": []}, {\"lord\": \"Aries\", \"start\": \"2028-02-24 05:46:18.034681+00:00\", \"end\": \"2028-03-15 00:13:21.156068+00:00\", \"children\": []}]}, {\"lord\": \"Gemini\", \"start\": \"2028-03-15 11:27:34.335260+00:00\", \"end\": \"2029-03-31 11:10:55.491329+00:00\", \"children\": [{\"lord\": \"Gemini\", \"start\": \"2028-03-15 11:27:34.335260+00:00\", \"end\": \"2028-04-26 05:04:40.924855+00:00\", \"children\": []}, {\"lord\": \"Cancer\", \"start\": \"2028-04-26 05:04:40.924855+00:00\", \"end\": \"2028-05-18 04:14:44.393063+00:00\", \"children\": []}, {\"lord\": \"Leo\", \"start\": \"2028-05-18 04:14:44.393063+00:00\", \"end\": \"2028-06-24 12:25:50.289017+00:0"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "dasha_direction": "forward",
                "dasha_start": "current",
                "date_time": "2026-09-01 06:00:00",
                "node": "true",
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha/yogini/": {
      "post": {
        "operationId": "astro_dasha_yogini",
        "summary": "Yogini dasha",
        "description": "The 36-year cycle of the eight yoginis.\n\nShorter and faster-moving than Vimshottari, which is why it is the usual second opinion when a Vimshottari period does not obviously explain what a chart is doing. Eight periods running one to eight years — Mangala, Pingala, Dhanya, Bhramari, Bhadrika, Ulka, Siddha and Sankata — for 36 years in total. Like Vimshottari it is unconditional.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dashas — nakshatra (planet)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"Yogini\", \"engine_id\": \"YoginiDasha\", \"family\": \"nakshatra\", \"lord_type\": \"planet\", \"levels\": 2, \"level_names\": [\"mahadasha\", \"antardasha\"], \"cycle_years\": 36, \"conditional\": false, \"periods\": [{\"lord\": \"venus\", \"start\": \"1985-12-06 19:41:51.924280+00:00\", \"end\": \"1992-12-06 13:41:51.924280+00:00\", \"children\": [{\"lord\": \"venus\", \"start\": \"1985-12-06 19:41:51.924280+00:00\", \"end\": \"1987-04-17 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"1987-04-17 19:41:51.924280+00:00\", \"end\": \"1988-11-05 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1988-11-05 19:41:51.924280+00:00\", \"end\": \"1989-01-15 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1989-01-15 19:41:51.924280+00:00\", \"end\": \"1989-06-06 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1989-06-06 19:41:51.924280+00:00\", \"end\": \"1990-01-05 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1990-01-05 19:41:51.924280+00:00\", \"end\": \"1990-10-16 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1990-10-16 19:41:51.924280+00:00\", \"end\": \"1991-10-06 19:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1991-10-06 19:41:51.924280+00:00\", \"end\": \"1992-12-05 19:41:51.924280+00:00\", \"children\": []}]}, {\"lord\": \"rahu\", \"start\": \"1992-12-06 13:41:51.924280+00:00\", \"end\": \"2000-12-06 13:41:51.924280+00:00\", \"children\": [{\"lord\": \"rahu\", \"start\": \"1992-12-06 13:41:51.924280+00:00\", \"end\": \"1994-09-16 21:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"moon\", \"start\": \"1994-09-16 21:41:51.924280+00:00\", \"end\": \"1994-12-07 01:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"1994-12-07 01:41:51.924280+00:00\", \"end\": \"1995-05-18 09:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"1995-05-18 09:41:51.924280+00:00\", \"end\": \"1996-01-16 21:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"1996-01-16 21:41:51.924280+00:00\", \"end\": \"1996-12-06 13:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"1996-12-06 13:41:51.924280+00:00\", \"end\": \"1998-01-16 09:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"1998-01-16 09:41:51.924280+00:00\", \"end\": \"1999-05-18 09:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"1999-05-18 09:41:51.924280+00:00\", \"end\": \"2000-12-06 13:41:51.924280+00:00\", \"children\": []}]}, {\"lord\": \"moon\", \"start\": \"2000-12-06 13:41:51.924280+00:00\", \"end\": \"2001-12-06 19:41:51.924280+00:00\", \"children\": [{\"lord\": \"moon\", \"start\": \"2000-12-06 13:41:51.924280+00:00\", \"end\": \"2000-12-16 17:01:51.924280+00:00\", \"children\": []}, {\"lord\": \"sun\", \"start\": \"2000-12-16 17:01:51.924280+00:00\", \"end\": \"2001-01-05 23:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2001-01-05 23:41:51.924280+00:00\", \"end\": \"2001-02-05 09:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2001-02-05 09:41:51.924280+00:00\", \"end\": \"2001-03-17 23:01:51.924280+00:00\", \"children\": []}, {\"lord\": \"mercury\", \"start\": \"2001-03-17 23:01:51.924280+00:00\", \"end\": \"2001-05-07 15:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"saturn\", \"start\": \"2001-05-07 15:41:51.924280+00:00\", \"end\": \"2001-07-07 11:41:51.924280+00:00\", \"children\": []}, {\"lord\": \"venus\", \"start\": \"2001-07-07 11:41:51.924280+00:00\", \"end\": \"2001-09-16 11:01:51.924280+00:00\", \"children\": []}, {\"lord\": \"rahu\", \"start\": \"2001-09-16 11:01:51.924280+00:00\", \"end\": \"2001-12-06 13:41:51.924280+00:00\", \"children\": []}]}, {\"lord\": \"sun\", \"start\": \"2001-12-06 19:41:51.924280+00:00\", \"end\": \"2003-12-07 07:41:51.924280+00:00\", \"children\": [{\"lord\": \"sun\", \"start\": \"2001-12-06 19:41:51.924280+00:00\", \"end\": \"2002-01-16 09:01:51.924280+00:00\", \"children\": []}, {\"lord\": \"jupiter\", \"start\": \"2002-01-16 09:01:51.924280+00:00\", \"end\": \"2002-03-18 05:01:51.924280+00:00\", \"children\": []}, {\"lord\": \"mars\", \"start\": \"2002-03-18 05:01:51.924280+00:00\", \"end\": \"2002-06-07 07:41:51.924280+00:00\", \"chil"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "dasha_direction": {
                    "type": "string",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "default": "forward",
                    "examples": [
                      "forward"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Which cycle the timeline opens on.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "default": "current",
                    "examples": [
                      "current"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "description": "Year length the periods are measured in. 360 for the classical savana year, 365.25 for the Julian year.",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "default": 365.25,
                    "examples": [
                      360
                    ]
                  },
                  "levels": {
                    "type": "integer",
                    "description": "How deep to nest: 1 mahadasha only, 2 adds antardasha, 3 adds pratyantardasha. Capped at 4 because the response grows roughly tenfold per level.",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Lunar node model. Required by the rashi parent, which does not default it; defaulted here.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "levels": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/dasha_applicability/": {
      "post": {
        "operationId": "astro_dasha_applicability",
        "summary": "Dasha applicability",
        "description": "Vedic astrology has many planetary period systems, and most of the nakshatra-based ones beyond Vimshottari are conditional: the classical texts say to use Ashtottari only when a particular condition holds in the chart, Dwadashottari only when another does, and so on. Choosing wrongly means running the wrong timeline for someone's whole life.\n\nThis endpoint applies those conditions for you. It builds the Rashi, Navamsa and Dwadasamsa charts for the birth data and tests six conditional systems — Ashtottari, Chaturaseeti Sama, Dwadashottari, Dwisaptati, Panchottari and Sataabdika — each against the chart from which it is classically judged.\n\nSend the birth moment and place along with `year_option` (the length of year in days to use), `start_option` and `direction_option`, which are the same period settings the dasha endpoints take. Use the result to decide which dasha endpoint to call next.\n\nAvailable `keys` (1), all covered by the same single credit: applicability_check.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "applicability_check": []
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "direction_option": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. Anything else returns 400 \"Invalid direction: must be 'forward' or 'backward'\".",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "applicability_check"
                      ]
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "start_option": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. Anything else returns 400 \"Invalid start value: must be 'current', 'next', or 'previous'\". Max length 100 per.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year_option": {
                    "type": "number",
                    "format": "double",
                    "enum": [
                      365.256364,
                      365.24219,
                      365.25,
                      365,
                      360
                    ],
                    "minimum": 360,
                    "maximum": 365.256364,
                    "examples": [
                      360
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "direction_option",
                  "keys",
                  "latitude",
                  "longitude",
                  "start_option",
                  "timezone_as_float",
                  "year_option"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "applicability_check"
                ],
                "date_time": "2025-03-27T09:52:50.441Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year_option": 365.256364,
                "start_option": "current",
                "direction_option": "forward"
              }
            }
          }
        }
      }
    },
    "/api/astro/date_time/": {
      "post": {
        "operationId": "astro_date_time",
        "summary": "Time zone resolver",
        "description": "Turns a wall-clock birth time and a pair of coordinates into an unambiguous instant. Every other endpoint here wants either a timezone-aware timestamp or a numeric UTC offset, and getting that wrong is the commonest cause of a chart that is quietly an hour or a day out, so this is usually the first call you make.\n\nSend `date`, `time`, `latitude` and `longitude`. The coordinates are resolved to an IANA time zone, the naive date and time are read in that zone, and you get back `input_datetime`, the resolved `timezone` name, `localized_datetime` with its offset attached, and `utc_datetime`. Feed the localised value straight into `date_time` elsewhere.\n\nOne caveat: the request field is spelt `use_LMT` but the view reads a differently-spelt name, so local mean time is never actually applied and the IANA zone is always used — `use_lmt` in the response is always false. For births before standard time was adopted locally, work out the local mean time offset yourself (four minutes per degree of longitude) rather than relying on this flag.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Utilities"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "input_datetime": "1980-09-05 04:42:05",
                  "latitude": 23,
                  "longitude": 80,
                  "timezone": "Asia/Kolkata",
                  "use_lmt": false,
                  "localized_datetime": "1980-09-05T04:42:05.037000+05:30",
                  "utc_datetime": "1980-09-04T23:12:05.037000+00:00"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "FORMAT constraint, not an enum. DRF DateField with default input formats = ISO-8601 only: 'YYYY-MM-DD'.",
                    "examples": [
                      "2026-09-01"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "time": {
                    "type": "string",
                    "format": "time",
                    "description": "FORMAT constraint, not an enum. DRF TimeField with default input formats = ISO-8601 only: 'HH:MM', 'HH:MM:SS' or 'HH:MM:SS.ffffff'. The catalogue sample value \"string\" is misleading.",
                    "examples": [
                      "string"
                    ]
                  },
                  "use_LMT": {
                    "type": "boolean",
                    "enum": [
                      true,
                      false
                    ],
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date",
                  "latitude",
                  "longitude",
                  "time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date": "1980-09-05",
                "time": "04:42:05.037Z",
                "longitude": 80,
                "latitude": 23,
                "use_LMT": true
              }
            }
          }
        }
      }
    },
    "/api/astro/day-night-length/": {
      "post": {
        "operationId": "astro_day_night_length",
        "summary": "Day and night length",
        "description": "How long the day and the night are, and where their midpoints fall.\n\nDay length is sunrise to sunset, night length sunset to the next sunrise, with local midday and midnight as the halfway moments. The two lengths add to twenty-four hours.\n\nDurations come back both as the engine's HH:MM:SS form and as a number of seconds, because dividing \"13:35:43\" by 3600 gives NaN in JavaScript with no error anywhere — the trap these focused endpoints exist to close.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "day": {
                      "length": "48943.0",
                      "length_seconds": 48943,
                      "midday": "2026-06-02T12:24:48+05:30"
                    },
                    "night": {
                      "length": "37448.0",
                      "length_seconds": 37448,
                      "midnight": "2026-06-03T00:24:53+05:30"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-06-02T06:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/disha-shool/": {
      "post": {
        "operationId": "astro_disha_shool",
        "summary": "Disha shool",
        "description": "The direction not to set out towards today, with its Hindi name.\n\nA function of the weekday alone, so it does not depend on the place and is the same everywhere on a given day. Travel advice in the traditional sense; some practitioners observe a remedy rather than avoiding the direction outright.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "direction": "East",
                    "direction_hi": "पूर्व"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/dosha/": {
      "post": {
        "operationId": "astro_dosha",
        "summary": "Doshas",
        "description": "A dosha is a specific affliction in a birth chart — a named planetary configuration that classical texts treat as a liability, most often for marriage, health or the ancestral line. This endpoint tests for eight of them from the birth moment and place, and can return either the bare results or ready-to-display written explanations.\n\nThere are two ways to use it. The individual keys (`kala_sarpa`, `manglik`, `pitru_dosha` and the rest) return structured results you can act on in code. `get_dosha_details` returns the whole set as formatted HTML paragraphs keyed by the English dosha name, which is what you want if you are rendering a report; it covers Kala Sarpa, Manglik, Pitru, Guru Chandala, Kalathra, Ghata and Shrapit, but not Ganda Moola. `get_dosha_resources` gives you the underlying text corpus if you would rather assemble your own copy.\n\nAll the boolean and structured request fields are required by the serializer even for keys that ignore them. `manglik_reference_planet` is a planet index (0 Sun, 1 Moon, 2 Mars, 3 Mercury, 4 Jupiter, 5 Venus, 6 Saturn, 7 Rahu, 8 Ketu); the engine's own default of measuring from the ascendant cannot be selected through the API, because the field is typed as an integer. This endpoint calls the UTC offset field `timezone`, not `timezone_as_float`.\n\nAvailable `keys` (10), all covered by the same single credit: ganda_moola, get_dosha_details, get_dosha_resources, ghata, guru_chandala_dosha, kala_sarpa, kalathra, manglik, pitru_dosha, shrapit.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Yogas & doshas"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"get_dosha_resources\": {\"kala_sarpa\": [\"There is no Kala Sarpa Dosha in this horoscope.\", \"Ananta Kala Sarpa Dosha- Rahu in 1st House and Ketu in 7th House. In this Dosha, Rahu is placed in the 1st house and Ketu in the 7th house in the horoscope. All planets are placed between Rahu-Ketu from the 1st house to the 7th house. This alignment can make a person ill-tempered and bring health issues. There would be problems in marital relationships, and, if in business, there would be a lack of support from partners.\", \"Kulik Kala Sarpa Dosha- Rahu in 2nd House and Ketu in 8th House. This Dosha is formed when Rahu is in the 2nd house and Ketu is in the 8th house, and all planets are between them. The individual afflicted may be vile-tongued and lead a life without the support of relatives. Monetary problems might surface, and savings might not be possible. The afflicted native may undergo surgery or accidents. There may be a possibility of unnatural death.\", \"Vasuki Kala Sarpa Dosha- Rahu in 3rd House and Ketu in 9th House. This Dosha is formed in the horoscope when Rahu and Ketu are in the 3rd, and 9th houses, respectively, and the remaining planets are hemmed between them. The afflicted individual may be timid in disposition and unable to fight for self-esteem. Relationships with younger siblings might not be good. Tide will go against the individual who may be unable to overcome adversity. The native can lack interest in religion, and luck may not favor them.\", \"Shankapal Kala Sarpa Dosha- Rahu in 4th House and Ketu in 10th House. This Dosha is formed when all planets are between Rahu and Ketu, which are placed from the 4th house to the 10th house. This alignment causes the native to have a bad relationship with the mother. The individual might not have mental peace and face professional problems.\", \"Padma Kala Sarpa Dosha- Rahu in 5th House and Ketu in 11th House. The axis of Rahu-Ketu from the 5th house to the 11th house and all planets within this axis cause this Dosha. The afflicted individual can face an issue with childbirth and education. They may have problems earning and may get into conflict with elder siblings.\", \"Mahapadma Kala Sarpa Dosha- Rahu in 6th House and Ketu in 12th House. The alignment of all planets in the Rahu-Ketu axis of the 6th house to the 12th house causes this Dosha. The afflicted individual can be dominated by enemies and lose money and property. The native could waste money, be unpopular, and have conflicts with in-laws.\", \"Takshak Kala Sarpa Dosha- Rahu in 7th House and Ketu in 1st House. The placement of all planets in the axis of Rahu-Ketu from the 7th house to the 1st house cause this Dosha. The afflicted may not go through marriage. If married, then the marriage might not go well. This Dosha can create a rift between the couple, leading to separation.\", \"Karakotak Kala Sarpa Dosha- Rahu in 8th House and Ketu in 2nd House. The placement of Rahu in the 8th house and Ketu in the 2nd house and the remaining planets in between them can cause this Dosha. The afflicted native might be ill-tempered and befriend anti-social elements. The native might have enemies and not be granted paternal wealth.\", \"Shankachood Kala Sarpa Dosha- Rahu in 9th House and Ketu in 3rd House. When Rahu is placed in the 9th house, Ketu in the 3rd house and all planets are between Rahu and Ketu; this Dosha is created in the horoscope. An afflicted individual might struggle a lot in life, and luck may never favor them. The individual may develop a habit of lying constantly and could be short-tempered.\", \"Ghatak Kala Sarpa Dosha- Rahu in 10th House and Ketu in 4th House. This Dosha is formed when Rahu is placed in the 10th house, Ketu in the 4th house, and all the planets are between the 10th to 4th houses. The afflicted individual may face many hurdles in his profession and conflicts with superiors at work. The individual may lack focus and face criticism. Relationships with family members may be poor. There may be de"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "apply_exceptions": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "include_2nd_house": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "include_lagna_house": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings. 'manglik' requires manglik_reference_planet, include_lagna_house, include_2nd_house and apply_exceptions; 'ganda_moola' requires moon_star; 'get_dosha_details' requires date_time and geopos.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_dosha_resources",
                        "kala_sarpa",
                        "manglik",
                        "pitru_dosha",
                        "guru_chandala_dosha",
                        "kalathra",
                        "ganda_moola",
                        "ghata",
                        "shrapit",
                        "get_dosha_details"
                      ]
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "manglik_reference_planet": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "moon_star": {
                    "type": "string",
                    "description": "Semantically a nakshatra NUMBER 1-27 (the Ganda Moola nakshatras being 1 Ashwini, 9 Ashlesha, 10 Magha, 18 Jyeshtha, 19 Moola, 27 Revati). No working accepted-value list can be published until that type mismatch is fixed.",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "apply_exceptions",
                  "date_time",
                  "include_2nd_house",
                  "include_lagna_house",
                  "keys",
                  "latitude",
                  "longitude",
                  "manglik_reference_planet",
                  "moon_star",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_dosha_resources"
                ],
                "date_time": "2025-07-11T04:37:08.718Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 0,
                "manglik_reference_planet": 0,
                "include_lagna_house": true,
                "include_2nd_house": true,
                "apply_exceptions": true,
                "moon_star": "leo"
              }
            }
          }
        }
      }
    },
    "/api/astro/drekkana/": {
      "post": {
        "operationId": "astro_drekkana",
        "summary": "Drekkana (D3)",
        "description": "The drekkana, the third divisional chart: each sign divided into three parts of 10° each.\n\nRead for siblings, courage and self-driven effort. One of the oldest divisions in use and among the least sensitive to small birth-time errors, since each division spans a full ten degrees.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 253.1425,
                        "latitude": 0,
                        "nakshatra": "Poorva Phalguni",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      },
                      {
                        "name": "moon",
                        "longitude": 4.433333333333334,
                        "latitude": 4.37,
                        "nakshatra": "Ashwini",
                        "pada": 1,
                        "kakshya": "saturn",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "mars",
                        "longitude": 207.52416666666667,
                        "latitude": 0.535,
                        "nakshatra": "Aardra",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Libra",
                        "house": 11
                      },
                      {
                        "name": "mercury",
                        "longitude": 265.5233333333333,
                        "latitude": 1.574,
                        "nakshatra": "Poorva Phalguni",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      },
                      {
                        "name": "jupiter",
                        "longitude": 238.41583333333332,
                        "latitude": 0.529,
                        "nakshatra": "Aasresha",
                        "pada": 1,
                        "kakshya": "Mercury",
                        "zodiac_name": "Scorpio",
                        "house": 12
                      },
                      {
                        "name": "venus",
                        "longitude": 56.86749999999999,
                        "latitude": -3.391,
                        "nakshatra": "Chitra",
                        "pada": 2,
                        "kakshya": "ascendant",
                        "zodiac_name": "Taurus",
                        "house": 6
                      },
                      {
                        "name": "saturn",
                        "longitude": 118.34083333333334,
                        "latitude": -2.651,
                        "nakshatra": "Revati",
                        "pada": 1,
                        "kakshya": "Mercury",
                        "zodiac_name": "Cancer",
                        "house": 8
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 316.6975,
                        "latitude": 0,
                        "nakshatra": "Dhanishtha",
                        "pada": 4,
                        "kakshya": "jupiter",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 136.6975,
                        "latitude": 0,
                        "nakshatra": "Makha",
                        "pada": 2,
                        "kakshya": "jupiter",
                        "zodiac_name": "Leo",
                        "house": 9
                      },
                      {
                        "name": "uranus",
                        "longitude": 154.27166666666665,
                        "latitude": -0.154,
                        "nakshatra": "Rohini",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "neptune",
                        "longitude": 358.29833333333335,
                        "latitude": -1.412,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 2,
                        "kakshya": "mars",
                        "zodiac_name": "Pisces",
                        "house": 4
                      },
                      {
                        "name": "pluto",
                        "longitude": 297.83666666666664,
                        "latitude": -4.3,
                        "nakshatra": "Uttaraashaadha",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Capricorn",
                        "house": 2
                      }
                    ],
                    "ascendant": {
                      "longitude": 246.56333333333333,
                      "zodiac_name": "Sagittarius",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/durmuhurat/": {
      "post": {
        "operationId": "astro_durmuhurat",
        "summary": "Durmuhurat",
        "description": "Durmuhurta: the one or two short unfavourable windows of the day.\n\n`starts` is a list of the one or two start instants and `length_seconds` is how long each runs, as a NUMBER. The underlying calculation returns the two starts and one shared length in a single object and gives the length as the string \"2880.0\", which is the trap this endpoint removes.\n\nThe offsets from sunrise come from a fixed weekday table rather than a proportional division of the day.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "starts": [
                      "2026-08-31T08:23:54+05:30",
                      "2026-09-01T00:06:10+05:30"
                    ],
                    "length_seconds": 2880
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/dwadasamsa/": {
      "post": {
        "operationId": "astro_dwadasamsa",
        "summary": "Dwadasamsa (D12)",
        "description": "The dwadasamsa, the twelfth divisional chart: each sign divided into twelve parts of 2°30' each.\n\nRead for parents and ancestry, and sometimes for inherited circumstance more broadly.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 292.57,
                        "latitude": 0,
                        "nakshatra": "Sravanam",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Capricorn",
                        "house": 2
                      },
                      {
                        "name": "moon",
                        "longitude": 17.733333333333334,
                        "latitude": 4.37,
                        "nakshatra": "Bharani",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "mars",
                        "longitude": 290.0966666666667,
                        "latitude": 0.535,
                        "nakshatra": "Sravanam",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Capricorn",
                        "house": 2
                      },
                      {
                        "name": "mercury",
                        "longitude": 342.09333333333336,
                        "latitude": 1.574,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 3,
                        "kakshya": "sun",
                        "zodiac_name": "Pisces",
                        "house": 4
                      },
                      {
                        "name": "jupiter",
                        "longitude": 323.6633333333333,
                        "latitude": 0.529,
                        "nakshatra": "Poorvaabhaadra",
                        "pada": 2,
                        "kakshya": "moon",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "venus",
                        "longitude": 137.46999999999997,
                        "latitude": -3.391,
                        "nakshatra": "Poorva Phalguni",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Leo",
                        "house": 9
                      },
                      {
                        "name": "saturn",
                        "longitude": 203.36333333333337,
                        "latitude": -2.651,
                        "nakshatra": "Visaakha",
                        "pada": 2,
                        "kakshya": "moon",
                        "zodiac_name": "Libra",
                        "house": 11
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 6.789999999999992,
                        "latitude": 0,
                        "nakshatra": "Ashwini",
                        "pada": 3,
                        "kakshya": "jupiter",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 186.79,
                        "latitude": 0,
                        "nakshatra": "Swaati",
                        "pada": 1,
                        "kakshya": "jupiter",
                        "zodiac_name": "Libra",
                        "house": 11
                      },
                      {
                        "name": "uranus",
                        "longitude": 167.08666666666664,
                        "latitude": -0.154,
                        "nakshatra": "Hasta",
                        "pada": 3,
                        "kakshya": "venus",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "neptune",
                        "longitude": 83.19333333333333,
                        "latitude": -1.412,
                        "nakshatra": "Punarvasu",
                        "pada": 1,
                        "kakshya": "moon",
                        "zodiac_name": "Gemini",
                        "house": 7
                      },
                      {
                        "name": "pluto",
                        "longitude": 21.34666666666668,
                        "latitude": -4.3,
                        "nakshatra": "Bharani",
                        "pada": 3,
                        "kakshya": "Mercury",
                        "zodiac_name": "Aries",
                        "house": 5
                      }
                    ],
                    "ascendant": {
                      "longitude": 266.25333333333333,
                      "zodiac_name": "Sagittarius",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/dwadasdwadasamsa/": {
      "post": {
        "operationId": "astro_dwadasdwadasamsa",
        "summary": "Dwadasdwadasamsa (D144)",
        "description": "The dwadasdwadasamsa, the hundred-and-forty-fourth division - the dwadasamsa OF the dwadasamsa.\n\nThe finest division this engine computes. The straight-division reading is at /api/astro/chart/ with `chart_name: \"DwadasdwadasamsaChart\"`.\n\nAT 12'30\" PER DIVISION a single minute of birth-time error moves the Moon several divisions. It is here for completeness, not because we recommend predicting from it.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/": {
      "post": {
        "operationId": "astro_eclipse",
        "summary": "Eclipse",
        "description": "Serializer for Eclipse and its related calculations.\n\nAvailable `keys` (8), all covered by the same single credit: lunar_eclipse_attributes, lunar_eclipse_global, lunar_eclipse_local, lunar_eclipse_when, solar_eclipse_attributes, solar_eclipse_global, solar_eclipse_local, solar_eclipse_where.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "solar_eclipse_global": [
                      {
                        "type": "total",
                        "attr": "central"
                      },
                      [
                        "2026-08-12T23:15:57+05:30",
                        "2026-08-12T22:33:51+05:30",
                        "2026-08-12T21:04:30+05:30",
                        "2026-08-13T01:27:57+05:30",
                        "2026-08-12T22:28:05+05:30",
                        "2026-08-13T00:04:00+05:30",
                        "2026-08-12T22:30:06+05:30",
                        "2026-08-13T00:02:01+05:30",
                        0,
                        0
                      ]
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "solar_eclipse_global",
                        "solar_eclipse_local",
                        "solar_eclipse_attributes",
                        "solar_eclipse_where",
                        "lunar_eclipse_global",
                        "lunar_eclipse_local",
                        "lunar_eclipse_attributes",
                        "lunar_eclipse_when"
                      ]
                    }
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "attr": {
                    "type": "string",
                    "description": "Case-sensitive lowercase; note the hyphen in 'non-central'. Only meaningful for 'solar_eclipse_global'. Any other value (including null) falls through the else branch with no filter applied and no error. Ignored entirely by 'lunar_eclipse_global'.",
                    "enum": [
                      "central",
                      "non-central"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "type": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. REQUIRED for keys 'solar_eclipse_global' and 'lunar_eclipse_global'; omitting it while requesting those keys returns 400 \"Invalid eclipse type: None\". 'hybrid' maps to swisseph ECL_ANNULAR_TOTAL and 'any' to no type filter. NOTE: get_lunar_eclipse_global accepts `type` in its signature but ignores it, so for 'lunar_eclipse_global' the value only has to be one of these strings - it does not actually filter.",
                    "enum": [
                      "total",
                      "annular",
                      "partial",
                      "hybrid",
                      "any"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Case-insensitive (the engine calls.lower; also lowercases). Engine default is 'after'. 'after' searches forward from date_time, 'before' searches backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "elevation",
                  "keys",
                  "tz"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "solar_eclipse_global"
                ],
                "date_time": "2026-01-01T00:00:00+00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "tz": 5.5,
                "elevation": 0,
                "type": "total",
                "attr": "central",
                "when": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/attributes/": {
      "post": {
        "operationId": "astro_eclipse_attributes",
        "summary": "Eclipse attributes at a moment",
        "description": "How deep an eclipse is at one instant, seen from one place.\n\nA snapshot rather than a search: at this second, from these coordinates, what fraction of the disc is covered, how high the body stands above the horizon, what the magnitude is, and which Saros series the eclipse belongs to. Obscuration changes minute by minute through an eclipse, so stepping this endpoint across the event gives you the coverage curve — what a live tracker needs and what a list of contact times cannot give.\n\nDistinct from /api/astro/eclipse/local/, which searches for the next eclipse visible from a place and returns its contact times. This one measures a moment you already have: pass it a maximum from /local/ or /upcoming/ for the depth at the peak.\n\nSet kind to \"lunar\" for umbral and penumbral magnitude instead. There is no obscuration for a lunar eclipse — that is a solar concept, and the field is absent rather than zero.\n\nIf no eclipse is touching that place at that instant the response says so, rather than returning a page of zeros that reads like a real measurement.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "kind": "solar",
                    "in_progress": true,
                    "type": "partial",
                    "moment": "2026-08-12T17:46:00Z",
                    "place": {
                      "latitude": 64.1466,
                      "longitude": -21.9426,
                      "elevation": 0
                    },
                    "attributes": {
                      "solar_diameter_fraction_covered": 0.9694113526477836,
                      "lunar_to_solar_diameter_ratio": 1.0392513179040108,
                      "obscuration": 0.9698071068665648,
                      "core_shadow_diameter_km": -132.45757926321468,
                      "sun_azimuth": 72.06950998795764,
                      "sun_true_altitude": 24.78900312370976,
                      "sun_apparent_altitude": 24.824074556487865,
                      "moon_elongation": 0.026420359347729915,
                      "magnitude_nasa": 0.9694113526477836,
                      "saros_series": 126,
                      "saros_member": 48
                    },
                    "saros": {
                      "series": 126,
                      "member": 48
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "description": "Which body's eclipse to measure at this moment.",
                    "enum": [
                      "solar",
                      "lunar"
                    ],
                    "default": "solar",
                    "examples": [
                      "solar"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-08-12T17:46:00+00:00",
                "timezone_as_float": 0,
                "latitude": 64.1466,
                "longitude": -21.9426,
                "kind": "solar"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/local/": {
      "post": {
        "operationId": "astro_eclipse_local",
        "summary": "Local eclipse visibility",
        "description": "The next eclipse VISIBLE from one place, with its local circumstances.\n\nA global search answers when an eclipse happens; this answers whether it happens for you. The 2026-08-12 total solar eclipse is total over Spain and simply invisible from India, and this endpoint reflects that — asked from Jaipur it skips straight past it to the next one that is actually visible there.\n\nReturns the four contact times as seen from your coordinates, how much of the disc is covered (obscuration is area, magnitude is diameter — at 50% magnitude only about 39% of the disc is hidden), how high the body sits above the horizon, and the Saros series and member number, which is the identifier eclipse catalogues cross-reference on.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "place": {
                      "latitude": 40.4168,
                      "longitude": -3.7038,
                      "elevation": 0
                    },
                    "searched_from": "2026-08-01T00:00:00Z",
                    "direction": "after",
                    "solar": {
                      "visible": true,
                      "type": "partial",
                      "maximum": "2026-08-12T18:32:22Z",
                      "times": {
                        "maximum": "2026-08-12T18:32:22Z",
                        "first_contact": "2026-08-12T17:36:44Z",
                        "fourth_contact": "2026-08-12T19:24:29Z"
                      },
                      "attributes": {
                        "solar_diameter_fraction_covered": 0.9993884035708482,
                        "lunar_to_solar_diameter_ratio": 1.0336605969236166,
                        "obscuration": 0.9998599813549118,
                        "core_shadow_diameter_km": -106.09485636578704,
                        "sun_azimuth": 103.3259413871358,
                        "sun_true_altitude": 7.192441834680457,
                        "sun_apparent_altitude": 7.311576116079273,
                        "moon_elongation": 0.009177024527760248,
                        "magnitude_nasa": 0.9993884035708482,
                        "saros_series": 126,
                        "saros_member": 48
                      },
                      "saros": {
                        "series": 126,
                        "member": 48
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "both",
                      "solar",
                      "lunar"
                    ],
                    "default": "both",
                    "examples": [
                      "both"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-08-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "latitude": 40.4168,
                "longitude": -3.7038,
                "kind": "solar",
                "direction": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/next-lunar/": {
      "post": {
        "operationId": "astro_eclipse_next_lunar",
        "summary": "Next lunar eclipse",
        "description": "The next lunar eclipse, with the penumbral, partial and total phases named.\n\nWorth using rather than reading the raw array: swisseph's lunar timing array is NOT in the order a reader would guess. Element 1 is unused, elements 2 and 3 are the partial phase and 6 and 7 are the penumbral phase, so a naive left-to-right reading mislabels the whole timeline. These fields are named from the engine's verified index map.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "found": true,
                    "searched_from": "2026-01-01T00:00:00Z",
                    "direction": "after",
                    "eclipse": {
                      "kind": "lunar",
                      "type": "total",
                      "centrality": null,
                      "maximum": "2026-03-03T11:33:42Z",
                      "times": {
                        "maximum": "2026-03-03T11:33:42Z",
                        "partial_begin": "2026-03-03T09:50:06Z",
                        "partial_end": "2026-03-03T13:17:18Z",
                        "totality_begin": "2026-03-03T11:04:34Z",
                        "totality_end": "2026-03-03T12:02:51Z",
                        "penumbral_begin": "2026-03-03T08:44:25Z",
                        "penumbral_end": "2026-03-03T14:23:08Z"
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "direction": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/next-solar/": {
      "post": {
        "operationId": "astro_eclipse_next_solar",
        "summary": "Next solar eclipse",
        "description": "The next solar eclipse anywhere on Earth, with every contact time named.\n\nThe underlying engine returns ten datetimes in a positional array, where knowing that element 4 is the start of totality means reading source code. This returns them as named fields: begin, totality_begin, maximum, totality_end, end, and the centre-line times.\n\nFilter by eclipse_type (total, annular, partial, hybrid) and by centrality — whether the shadow's axis actually reaches the Earth's surface. Set direction to \"before\" to find the most recent one instead of the next.\n\nThis is a GLOBAL search: it answers when, not whether you can see it. Use /api/astro/eclipse/local/ for that.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "found": true,
                    "searched_from": "2026-01-01T00:00:00Z",
                    "direction": "after",
                    "eclipse": {
                      "kind": "solar",
                      "type": "total",
                      "centrality": "central",
                      "maximum": "2026-08-12T17:45:57Z",
                      "times": {
                        "maximum": "2026-08-12T17:45:57Z",
                        "local_apparent_noon": "2026-08-12T17:03:51Z",
                        "begin": "2026-08-12T15:34:30Z",
                        "end": "2026-08-12T19:57:57Z",
                        "totality_begin": "2026-08-12T16:58:05Z",
                        "totality_end": "2026-08-12T18:34:00Z",
                        "centre_line_begin": "2026-08-12T17:00:06Z",
                        "centre_line_end": "2026-08-12T18:32:01Z"
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "centrality": {
                    "type": "string",
                    "description": "Central means the Moon's shadow axis actually touches the Earth. Only meaningful when eclipse_type is not 'any'.",
                    "enum": [
                      "any",
                      "central",
                      "non-central"
                    ],
                    "default": "any",
                    "examples": [
                      "any"
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "eclipse_type": {
                    "type": "string",
                    "description": "Restrict the search to one kind of solar eclipse.",
                    "enum": [
                      "any",
                      "total",
                      "annular",
                      "partial",
                      "hybrid"
                    ],
                    "default": "any",
                    "examples": [
                      "any"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "eclipse_type": "total",
                "centrality": "any",
                "direction": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/range/": {
      "post": {
        "operationId": "astro_eclipse_range",
        "summary": "Eclipses in a date range",
        "description": "Every eclipse between two dates, with no gaps.\n\nFor multi-year eclipse calendars and timelines. The window is capped at twenty years, which is roughly 140 eclipses — past that a single response stops being something a client can hold comfortably. Both kinds are returned in true chronological order unless you filter by kind.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "from": "2026-01-01T00:00:00Z",
                    "to": "2027-12-31T23:59:59Z",
                    "kind": "both",
                    "count": 9,
                    "eclipses": [
                      {
                        "kind": "solar",
                        "type": "annular",
                        "centrality": "central",
                        "maximum": "2026-02-17T12:11:53Z",
                        "times": {
                          "maximum": "2026-02-17T12:11:53Z",
                          "local_apparent_noon": "2026-02-17T11:18:50Z",
                          "begin": "2026-02-17T09:56:47Z",
                          "end": "2026-02-17T14:27:40Z",
                          "totality_begin": "2026-02-17T11:43:04Z",
                          "totality_end": "2026-02-17T12:41:05Z",
                          "centre_line_begin": "2026-02-17T11:48:27Z",
                          "centre_line_end": "2026-02-17T12:35:44Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "total",
                        "centrality": null,
                        "maximum": "2026-03-03T11:33:42Z",
                        "times": {
                          "maximum": "2026-03-03T11:33:42Z",
                          "partial_begin": "2026-03-03T09:50:06Z",
                          "partial_end": "2026-03-03T13:17:18Z",
                          "totality_begin": "2026-03-03T11:04:34Z",
                          "totality_end": "2026-03-03T12:02:51Z",
                          "penumbral_begin": "2026-03-03T08:44:25Z",
                          "penumbral_end": "2026-03-03T14:23:08Z"
                        }
                      },
                      {
                        "kind": "solar",
                        "type": "total",
                        "centrality": "central",
                        "maximum": "2026-08-12T17:45:57Z",
                        "times": {
                          "maximum": "2026-08-12T17:45:57Z",
                          "local_apparent_noon": "2026-08-12T17:03:51Z",
                          "begin": "2026-08-12T15:34:30Z",
                          "end": "2026-08-12T19:57:57Z",
                          "totality_begin": "2026-08-12T16:58:05Z",
                          "totality_end": "2026-08-12T18:34:00Z",
                          "centre_line_begin": "2026-08-12T17:00:06Z",
                          "centre_line_end": "2026-08-12T18:32:01Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "partial",
                        "centrality": null,
                        "maximum": "2026-08-28T04:12:58Z",
                        "times": {
                          "maximum": "2026-08-28T04:12:58Z",
                          "partial_begin": "2026-08-28T02:33:53Z",
                          "partial_end": "2026-08-28T05:52:03Z",
                          "penumbral_begin": "2026-08-28T01:23:57Z",
                          "penumbral_end": "2026-08-28T07:01:50Z"
                        }
                      },
                      {
                        "kind": "solar",
                        "type": "annular",
                        "centrality": "central",
                        "maximum": "2027-02-06T15:59:40Z",
                        "times": {
                          "maximum": "2027-02-06T15:59:40Z",
                          "local_apparent_noon": "2027-02-06T15:44:31Z",
                          "begin": "2027-02-06T12:57:51Z",
                          "end": "2027-02-06T19:01:40Z",
                          "totality_begin": "2027-02-06T14:04:05Z",
                          "totality_end": "2027-02-06T17:55:27Z",
                          "centre_line_begin": "2027-02-06T14:07:14Z",
                          "centre_line_end": "2027-02-06T17:52:20Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "penumbral",
                        "centrality": null,
                        "maximum": "2027-02-20T23:12:51Z",
                        "times": {
                          "maximum": "2027-02-20T23:12:51Z",
                          "penumbral_begin": "2027-02-20T21:12:23Z",
                          "penumbral_end": "2027-02-21T01:13:22Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "penumbral",
                        "centrality": null,
                        "maximum": "2027-07-18T16:03:00Z",
                        "times": {
                          "maximum": "2027-07-18T16:03:00Z",
                          "penumbral_begin": "2027-07-18T15:57:14Z",
                          "penumbral_end": "2027-07-18T16:08:46Z"
                        }
                      },
                      {
                        "kind": "solar",
                        "type": "total",
                        "centrality": "central",
                        "maximum": "2027-08-02T10:06:39Z",
                        "times": {
                          "maximum": "2027-08-02T10:06:39Z",
                          "local_apparent_noon": "2027-08-02T10:01:00Z",
                          "begin": "2027-08-02T07:30:17Z",
                          "end": "2027-08-02T12:43:08Z",
                          "totality_begin": "2027-08-02T08:23:29Z",
                          "totality_end": "2027-08-02T11:49:56Z",
                          "centre_line_begin": "2027-08-02T08:25:07Z",
                          "centre_line_end": "2027-08-02T11:48:18Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "penumbral",
                        "centrality": null,
                        "maximum": "2027-08-17T07:13:51Z",
                        "times": {
                          "maximum": "2027-08-17T07:13:51Z",
                          "penumbral_begin": "2027-08-17T05:24:31Z",
                          "penumbral_end": "2027-08-17T09:03:11Z"
                        }
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "both",
                      "solar",
                      "lunar"
                    ],
                    "default": "both",
                    "examples": [
                      "both"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "end_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "end_date_time": "2027-12-31T23:59:59+00:00",
                "timezone_as_float": 0,
                "kind": "both"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/upcoming/": {
      "post": {
        "operationId": "astro_eclipse_upcoming",
        "summary": "Upcoming eclipses",
        "description": "The next several eclipses, solar and lunar merged into one chronological list.\n\nOne call and one credit instead of stepping the date forward yourself and paying for each single lookup, which is what building an eclipse calendar otherwise costs. Ask for up to 24, filter to solar or lunar only, or set direction to \"before\" to walk backwards through history.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "count": 6,
                    "kind": "both",
                    "searched_from": "2026-01-01T00:00:00Z",
                    "direction": "after",
                    "eclipses": [
                      {
                        "kind": "solar",
                        "type": "annular",
                        "centrality": "central",
                        "maximum": "2026-02-17T12:11:53Z",
                        "times": {
                          "maximum": "2026-02-17T12:11:53Z",
                          "local_apparent_noon": "2026-02-17T11:18:50Z",
                          "begin": "2026-02-17T09:56:47Z",
                          "end": "2026-02-17T14:27:40Z",
                          "totality_begin": "2026-02-17T11:43:04Z",
                          "totality_end": "2026-02-17T12:41:05Z",
                          "centre_line_begin": "2026-02-17T11:48:27Z",
                          "centre_line_end": "2026-02-17T12:35:44Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "total",
                        "centrality": null,
                        "maximum": "2026-03-03T11:33:42Z",
                        "times": {
                          "maximum": "2026-03-03T11:33:42Z",
                          "partial_begin": "2026-03-03T09:50:06Z",
                          "partial_end": "2026-03-03T13:17:18Z",
                          "totality_begin": "2026-03-03T11:04:34Z",
                          "totality_end": "2026-03-03T12:02:51Z",
                          "penumbral_begin": "2026-03-03T08:44:25Z",
                          "penumbral_end": "2026-03-03T14:23:08Z"
                        }
                      },
                      {
                        "kind": "solar",
                        "type": "total",
                        "centrality": "central",
                        "maximum": "2026-08-12T17:45:57Z",
                        "times": {
                          "maximum": "2026-08-12T17:45:57Z",
                          "local_apparent_noon": "2026-08-12T17:03:51Z",
                          "begin": "2026-08-12T15:34:30Z",
                          "end": "2026-08-12T19:57:57Z",
                          "totality_begin": "2026-08-12T16:58:05Z",
                          "totality_end": "2026-08-12T18:34:00Z",
                          "centre_line_begin": "2026-08-12T17:00:06Z",
                          "centre_line_end": "2026-08-12T18:32:01Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "partial",
                        "centrality": null,
                        "maximum": "2026-08-28T04:12:58Z",
                        "times": {
                          "maximum": "2026-08-28T04:12:58Z",
                          "partial_begin": "2026-08-28T02:33:53Z",
                          "partial_end": "2026-08-28T05:52:03Z",
                          "penumbral_begin": "2026-08-28T01:23:57Z",
                          "penumbral_end": "2026-08-28T07:01:50Z"
                        }
                      },
                      {
                        "kind": "solar",
                        "type": "annular",
                        "centrality": "central",
                        "maximum": "2027-02-06T15:59:40Z",
                        "times": {
                          "maximum": "2027-02-06T15:59:40Z",
                          "local_apparent_noon": "2027-02-06T15:44:31Z",
                          "begin": "2027-02-06T12:57:51Z",
                          "end": "2027-02-06T19:01:40Z",
                          "totality_begin": "2027-02-06T14:04:05Z",
                          "totality_end": "2027-02-06T17:55:27Z",
                          "centre_line_begin": "2027-02-06T14:07:14Z",
                          "centre_line_end": "2027-02-06T17:52:20Z"
                        }
                      },
                      {
                        "kind": "lunar",
                        "type": "penumbral",
                        "centrality": null,
                        "maximum": "2027-02-20T23:12:51Z",
                        "times": {
                          "maximum": "2027-02-20T23:12:51Z",
                          "penumbral_begin": "2027-02-20T21:12:23Z",
                          "penumbral_end": "2027-02-21T01:13:22Z"
                        }
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many eclipses to return, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 6,
                    "examples": [
                      1
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "both",
                      "solar",
                      "lunar"
                    ],
                    "default": "both",
                    "examples": [
                      "both"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "count": 6,
                "kind": "both",
                "direction": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/eclipse/visibility-path/": {
      "post": {
        "operationId": "astro_eclipse_visibility_path",
        "summary": "Eclipse visibility path",
        "description": "Where a solar eclipse is total, as a line of coordinates you can draw on a map.\n\nFinds the next solar eclipse from the moment you give, then samples the point where the Moon's shadow axis meets the Earth and returns ordered latitude/longitude pairs. For the 2026-08-12 total that track runs out of the Siberian Arctic, over the pole, down across Iceland and out into the Atlantic off Iberia — the path that decides whether a place sees a total eclipse or a partial one.\n\nThe window sampled is totality (or annularity), not the whole eclipse. Outside it the shadow axis misses the Earth altogether and there is no central line, so a purely partial eclipse returns an empty path with path_traced_over set to \"none\" rather than a line that does not exist. Points where the axis misses are dropped, so sample_count can be lower than the samples you asked for.\n\nAlso returns the point of greatest eclipse with its magnitude, obscuration and Saros series and member number — the identifier eclipse catalogues are indexed by.\n\nPath times are UTC and suffixed Z. A track crosses the globe, so the offset the rest of the eclipse endpoints use would be misleading on a point halfway round the world from you.\n\nUmbra and penumbra edge limits are not returned: swisseph populates only the central line for this calculation, and reporting the empty slots would mean publishing 0N 0E as a boundary.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Eclipses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "found": true,
                    "eclipse": {
                      "type": "total",
                      "centrality": "central",
                      "maximum": "2026-08-12T17:45:57Z",
                      "times": {
                        "maximum": "2026-08-12T17:45:57Z",
                        "local_apparent_noon": "2026-08-12T17:03:51Z",
                        "begin": "2026-08-12T15:34:30Z",
                        "end": "2026-08-12T19:57:57Z",
                        "totality_begin": "2026-08-12T16:58:05Z",
                        "totality_end": "2026-08-12T18:34:00Z",
                        "centre_line_begin": "2026-08-12T17:00:06Z",
                        "centre_line_end": "2026-08-12T18:32:01Z"
                      }
                    },
                    "path_traced_over": "totality",
                    "requested_samples": 24,
                    "sample_count": 25,
                    "path": [
                      {
                        "datetime_utc": "2026-08-12T16:58:05Z",
                        "latitude": 74.877805,
                        "longitude": 117.671955
                      },
                      {
                        "datetime_utc": "2026-08-12T17:02:04Z",
                        "latitude": 82.361743,
                        "longitude": 112.418144
                      },
                      {
                        "datetime_utc": "2026-08-12T17:06:04Z",
                        "latitude": 87.329632,
                        "longitude": 80.477549
                      },
                      {
                        "datetime_utc": "2026-08-12T17:10:04Z",
                        "latitude": 86.790315,
                        "longitude": -2.537547
                      },
                      {
                        "datetime_utc": "2026-08-12T17:14:04Z",
                        "latitude": 83.870696,
                        "longitude": -21.42455
                      },
                      {
                        "datetime_utc": "2026-08-12T17:18:03Z",
                        "latitude": 81.057681,
                        "longitude": -26.067301
                      },
                      {
                        "datetime_utc": "2026-08-12T17:22:03Z",
                        "latitude": 78.429119,
                        "longitude": -27.559629
                      },
                      {
                        "datetime_utc": "2026-08-12T17:26:03Z",
                        "latitude": 75.963829,
                        "longitude": -27.916291
                      },
                      {
                        "datetime_utc": "2026-08-12T17:30:03Z",
                        "latitude": 73.627499,
                        "longitude": -27.753208
                      },
                      {
                        "datetime_utc": "2026-08-12T17:34:03Z",
                        "latitude": 71.393131,
                        "longitude": -27.30956
                      },
                      {
                        "datetime_utc": "2026-08-12T17:38:02Z",
                        "latitude": 69.248567,
                        "longitude": -26.695107
                      },
                      {
                        "datetime_utc": "2026-08-12T17:42:02Z",
                        "latitude": 67.159166,
                        "longitude": -25.955597
                      },
                      {
                        "datetime_utc": "2026-08-12T17:46:02Z",
                        "latitude": 65.120178,
                        "longitude": -25.117197
                      },
                      {
                        "datetime_utc": "2026-08-12T17:50:02Z",
                        "latitude": 63.119601,
                        "longitude": -24.188769
                      },
                      {
                        "datetime_utc": "2026-08-12T17:54:02Z",
                        "latitude": 61.146536,
                        "longitude": -23.169557
                      },
                      {
                        "datetime_utc": "2026-08-12T17:58:01Z",
                        "latitude": 59.19864,
                        "longitude": -22.056292
                      },
                      {
                        "datetime_utc": "2026-08-12T18:02:01Z",
                        "latitude": 57.248921,
                        "longitude": -20.82451
                      },
                      {
                        "datetime_utc": "2026-08-12T18:06:01Z",
                        "latitude": 55.293732,
                        "longitude": -19.455163
                      },
                      {
                        "datetime_utc": "2026-08-12T18:10:01Z",
                        "latitude": 53.318925,
                        "longitude": -17.9132
                      },
                      {
                        "datetime_utc": "2026-08-12T18:14:01Z",
                        "latitude": 51.305904,
                        "longitude": -16.145189
                      },
                      {
                        "datetime_utc": "2026-08-12T18:18:00Z",
                        "latitude": 49.236237,
                        "longitude": -14.074018
                      },
                      {
                        "datetime_utc": "2026-08-12T18:22:00Z",
                        "latitude": 47.046663,
                        "longitude": -11.526755
                      },
                      {
                        "datetime_utc": "2026-08-12T18:26:00Z",
                        "latitude": 44.648895,
                        "longitude": -8.169827
                      },
                      {
                        "datetime_utc": "2026-08-12T18:30:00Z",
                        "latitude": 41.718798,
                        "longitude": -2.829804
                      },
                      {
                        "datetime_utc": "2026-08-12T18:34:00Z",
                        "latitude": 37.795826,
                        "longitude": 4.632462
                      }
                    ],
                    "greatest_eclipse": {
                      "datetime_utc": "2026-08-12T17:45:57Z",
                      "latitude": 65.162226,
                      "longitude": -25.135594,
                      "attributes": {
                        "solar_diameter_fraction_covered": 1.0177529811525174,
                        "lunar_to_solar_diameter_ratio": 1.0395246462080372,
                        "obscuration": 1.0806114900739452,
                        "core_shadow_diameter_km": -132.45861086856522,
                        "sun_azimuth": 68.50274145564674,
                        "sun_true_altitude": 25.738278484149753,
                        "sun_apparent_altitude": 25.771879784684916,
                        "moon_elongation": 0.0010572200151275264,
                        "magnitude_nasa": 1.0395246462080372,
                        "saros_series": 126,
                        "saros_member": 48
                      },
                      "saros": {
                        "series": 126,
                        "member": 48
                      }
                    },
                    "notes": {
                      "path": "Sampled evenly across totality. Times are UTC.",
                      "limits": "Umbra and penumbra limits are unavailable: swisseph returns only the central line for this calculation."
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "centrality": {
                    "type": "string",
                    "description": "Central means the Moon's shadow axis actually touches the Earth. Only meaningful when eclipse_type is not 'any'.",
                    "enum": [
                      "any",
                      "central",
                      "non-central"
                    ],
                    "default": "any",
                    "examples": [
                      "any"
                    ]
                  },
                  "direction": {
                    "type": "string",
                    "description": "Search forward from date_time, or backward.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "eclipse_type": {
                    "type": "string",
                    "description": "Restrict the search to one kind of solar eclipse.",
                    "enum": [
                      "any",
                      "total",
                      "annular",
                      "partial",
                      "hybrid"
                    ],
                    "default": "any",
                    "examples": [
                      "any"
                    ]
                  },
                  "elevation": {
                    "type": "number",
                    "format": "double",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "samples": {
                    "type": "integer",
                    "description": "How many points to trace along the path. More is smoother; at most 120.",
                    "minimum": 2,
                    "maximum": 120,
                    "default": 24,
                    "examples": [
                      2
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "eclipse_type": "total",
                "direction": "after",
                "samples": 24
              }
            }
          }
        }
      }
    },
    "/api/astro/effect_house_lord_different_house/": {
      "post": {
        "operationId": "astro_effect_house_lord_different_house",
        "summary": "House lord placements (all 144)",
        "description": "The lord of a house carries that house's affairs into whichever house it sits in, and the 144 possible pairings — twelve lords in twelve houses — are one of the oldest interpretive tables in Vedic astrology. The lord of the 2nd in the 11th says something about money that the lord of the 2nd in the 12th does not.\n\nThis endpoint is that table, looked up directly. It performs no calculation and takes no birth data: you tell it which lord and which house, and it returns the classical reading. Get the placements themselves from /api/astro/chart/ or /api/astro/chart_analysis/ and use this to caption them.\n\n`house` is the lord, named in the '-esha' form: lagnesha for the 1st lord through vyayesha for the 12th. `h2` is the house it occupies, named as a bare bhava: lagna, dhana, sahaja, sukha, mantra, ari, dara, randhra, bhagya, karma, labha, vyaya. Watch the sixth, which is 'shashthesha' as a lord but 'ari' as a house. Casing does not matter, and an unrecognised name returns HTTP 200 with an explanatory string.\n\nAvailable `keys` (1), all covered by the same single credit: get_effect_house_lord_different_house.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_effect_house_lord_different_house": [
                      "Blessed with physical happiness, intelligence, and valor",
                      "Mind may be fickle",
                      "Possibility of two marriages and extramarital involvements"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "h2": {
                    "type": "string",
                    "description": "The HOUSE that lord occupies (bare bhava name): lagna = 1st... vyaya = 12th. Note the 6th is 'ari' here (not 'shashtha'. An unknown value returns 200 with \"Invalid key: <x>\".",
                    "enum": [
                      "lagna",
                      "dhana",
                      "sahaja",
                      "sukha",
                      "mantra",
                      "ari",
                      "dara",
                      "randhra",
                      "bhagya",
                      "karma",
                      "labha",
                      "vyaya"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "house": {
                    "type": "string",
                    "description": "The HOUSE LORD (the '-esha' form): lagnesha = 1st lord... vyayesha = 12th lord. Lowercased by so casing does not matter. An unknown value returns HTTP 200 with the string \"Invalid key: <x>\" rather than an error status.",
                    "enum": [
                      "lagnesha",
                      "dhanesha",
                      "sahajesha",
                      "sukhesha",
                      "mantresha",
                      "shashthesha",
                      "daresha",
                      "randhresha",
                      "bhagyesha",
                      "karmesha",
                      "labhesha",
                      "vyayesha"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_effect_house_lord_different_house"
                      ]
                    }
                  }
                },
                "required": [
                  "h2",
                  "house",
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_effect_house_lord_different_house"
                ],
                "house": "lagnesha",
                "h2": "lagna"
              }
            }
          }
        }
      }
    },
    "/api/astro/festival/": {
      "post": {
        "operationId": "astro_festival",
        "summary": "Hindu festivals",
        "description": "Every Hindu festival of a calendar year computed from first principles for the place you give, together with the ekadashis and the Jain, Sikh and Christian observances the engine tracks. Unlike the regional calendar endpoints, which return a curated list per tradition, this is the full pan-Indian set with the exact tithi window attached to each entry.\n\nThe year is walked tithi by tithi rather than day by day, so a tithi shorter than twenty-four hours cannot slip through unseen and a long one cannot be counted twice. `moon_option` decides how lunar months are named: 'poornima' uses the purnimanta month directly, while anything else — including 'amavas' itself — takes the amanta month and converts it, which is what most North Indian panchangs print.\n\nSend `year`, `date_time` and the place. Because each entry carries the governing tithi's start and end rather than a single date, you decide which civil day to show it on; if you would rather have that decision made for you, use one of the regional calendar endpoints, which resolve each observance to its correct observed day.\n\nAvailable `keys` (1), all covered by the same single credit: calculate_festivals.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Festivals & vrats"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"calculate_festivals\": {\"festivals\": [{\"festival\": \"Guru Govind singh Jayanti\", \"start\": \"2025-01-05 14:46:25 UTC\", \"end\": \"2025-01-06 12:54:41 UTC\", \"month\": \"Pausha\"}, {\"festival\": \"Samkata 4\", \"start\": \"2025-01-16 22:37:19 UTC\", \"end\": \"2025-01-18 00:01:19 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Sakat Chauth\", \"start\": \"2025-01-16 22:37:19 UTC\", \"end\": \"2025-01-18 00:01:19 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Ardhodaya Yoga\", \"start\": \"2025-01-28 14:07:08 UTC\", \"end\": \"2025-01-29 12:36:33 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Mahodaya Yoga\", \"start\": \"2025-01-28 14:07:08 UTC\", \"end\": \"2025-01-29 12:36:33 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Mauni Ama\", \"start\": \"2025-01-28 14:07:08 UTC\", \"end\": \"2025-01-29 12:36:33 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Mauni Amavas\", \"start\": \"2025-01-28 14:07:08 UTC\", \"end\": \"2025-01-29 12:36:33 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Gauri 3\", \"start\": \"2025-01-31 08:30:11 UTC\", \"end\": \"2025-02-01 06:09:21 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Gauri Tritiya\", \"start\": \"2025-01-31 08:30:11 UTC\", \"end\": \"2025-02-01 06:09:21 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Varada(Til) 4\", \"start\": \"2025-02-01 06:09:21 UTC\", \"end\": \"2025-02-02 03:45:30 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Varada Chaturthi\", \"start\": \"2025-02-01 06:09:21 UTC\", \"end\": \"2025-02-02 03:45:30 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Vasanta 5\", \"start\": \"2025-02-02 03:45:30 UTC\", \"end\": \"2025-02-03 01:23:48 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Shree 5\", \"start\": \"2025-02-02 03:45:30 UTC\", \"end\": \"2025-02-03 01:23:48 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Vasant Panchami\", \"start\": \"2025-02-02 03:45:30 UTC\", \"end\": \"2025-02-03 01:23:48 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Aarogya (Ratha) 7\", \"start\": \"2025-02-03 23:08:15 UTC\", \"end\": \"2025-02-04 21:01:48 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Ratha Saptami\", \"start\": \"2025-02-03 23:08:15 UTC\", \"end\": \"2025-02-04 21:01:48 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Bhishma 8\", \"start\": \"2025-02-04 21:01:48 UTC\", \"end\": \"2025-02-05 19:06:38 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Bhishma Ashtami\", \"start\": \"2025-02-04 21:01:48 UTC\", \"end\": \"2025-02-05 19:06:38 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Bhishma 12\", \"start\": \"2025-02-08 14:47:05 UTC\", \"end\": \"2025-02-09 13:56:25 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Bhishma Dvadashi\", \"start\": \"2025-02-08 14:47:05 UTC\", \"end\": \"2025-02-09 13:56:25 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Guru Ravidas Jayanti\", \"start\": \"2025-02-11 13:26:37 UTC\", \"end\": \"2025-02-12 13:54:03 UTC\", \"month\": \"Magha\"}, {\"festival\": \"Maha Shivaratri\", \"start\": \"2025-02-26 05:39:30 UTC\", \"end\": \"2025-02-27 03:25:42 UTC\", \"month\": \"Phalguna\"}, {\"festival\": \"Holashtaka begins\", \"start\": \"2025-03-06 05:21:59 UTC\", \"end\": \"2025-03-07 03:49:44 UTC\", \"month\": \"Phalguna\"}, {\"festival\": \"Holika Dahana\", \"start\": \"2025-03-13 05:07:03 UTC\", \"end\": \"2025-03-14 06:55:19 UTC\", \"month\": \"Phalguna\"}, {\"festival\": \"Chhoti Holi\", \"start\": \"2025-03-13 05:07:03 UTC\", \"end\": \"2025-03-14 06:55:19 UTC\", \"month\": \"Phalguna\"}, {\"festival\": \"Dhoolivandana\", \"start\": \"2025-03-14 06:55:19 UTC\", \"end\": \"2025-03-15 09:04:19 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Vasantotsava\", \"start\": \"2025-03-14 06:55:19 UTC\", \"end\": \"2025-03-15 09:04:19 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Holi\", \"start\": \"2025-03-14 06:55:19 UTC\", \"end\": \"2025-03-15 09:04:19 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Shitala Pujan\", \"start\": \"2025-03-21 22:54:58 UTC\", \"end\": \"2025-03-22 23:54:32 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Sheetala Ashtami\", \"start\": \"2025-03-21 22:54:58 UTC\", \"end\": \"2025-03-22 23:54:32 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Basoda\", \"start\": \"2025-03-21 22:54:58 UTC\", \"end\": \"2025-03-22 23:54:32 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Vaaruni yoga\", \"start\": \"2025-03-26 20:13:53 UTC\", \"end\": \"2025-03-27 17:34:30 UTC\", \"month\": \"Chaitra\"}, {\"festival\": \"Maha Vaaruni Yoga\", \"start\": \"2025-03-26 20:13:53 UTC\", \"end\": \"2025-03-27 17:34:30 UTC\", \"month\": \"Chaitra\"}, {\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "calculate_festivals"
                      ]
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "moon_option": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. 'poornima' uses the purnimanta lunar month directly; ANY other value - including 'amavas' itself and any typo - takes the else branch (amanta month converted to purnimanta), so misspellings silently behave as 'amavas'. Forwarded at.",
                    "enum": [
                      "amavas",
                      "poornima"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "moon_option",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "calculate_festivals"
                ],
                "moon_option": "amavas",
                "year": 2025,
                "date_time": "2025-02-12T08:35:00.795Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/fixed-star/catalog/": {
      "post": {
        "operationId": "astro_fixed_star_catalog",
        "summary": "Fixed star catalogue",
        "description": "Search the fixed star catalogue by name, designation or brightness.\n\n1357 rows covering 532 distinct stars — the remainder are alias names, folded into the star they belong to. That matters here: Aldebaran is also Rohini and Sirius is also Lubdhaka, so the Vedic names are searchable, and a naive listing would return Sirius three times.\n\nThis is the index you need before asking for anything else, because star names are not guessable. It takes no date and returns no positions — a position needs a date, so use /positions/ for that.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Fixed stars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "distinct_stars": 532,
                    "matched": 1,
                    "returned": 1,
                    "stars": [
                      {
                        "star": "Aldebaran",
                        "designation": "alTau",
                        "magnitude": 0.86,
                        "aliases": [
                          "Rohini"
                        ]
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 500,
                    "default": 100,
                    "examples": [
                      1
                    ]
                  },
                  "max_magnitude": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "preset": {
                    "type": "string",
                    "enum": [
                      "major",
                      "behenian",
                      "brightest",
                      "all"
                    ],
                    "default": "all",
                    "examples": [
                      "major"
                    ]
                  },
                  "search": {
                    "type": "string",
                    "description": "Match a name or Bayer designation.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "search": "aldebaran",
                "preset": "all",
                "limit": 25
              }
            }
          }
        }
      }
    },
    "/api/astro/fixed-star/conjunctions/": {
      "post": {
        "operationId": "astro_fixed_star_conjunctions",
        "summary": "Stars on your chart",
        "description": "Which fixed stars sit on this chart's planets.\n\nThe question that actually gets asked, and the one a per-star lookup cannot answer — you would have to fetch every star yourself and compare them all. Give a birth moment and an orb and get back the contacts, closest first, each with the star's magnitude so you can weigh it.\n\nConjunction is by ecliptic LONGITUDE within the orb, which is how fixed star contacts are read. Ecliptic latitude is reported but deliberately not filtered on: many of the brightest stars lie far off the ecliptic — Algol is 22 degrees north, Sirius 39 degrees south — and excluding them would throw away most of the tradition.\n\nA degree of orb is already generous; the classical texts use much less.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Fixed stars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "julian_day_ut": 2448022.10069444,
                    "orb_degrees": 1.5,
                    "stars_considered": 41,
                    "count": 6,
                    "conjunctions": [
                      {
                        "body": "mars",
                        "body_longitude": 344.690843,
                        "star": "Achernar",
                        "designation": "alEri",
                        "magnitude": 0.46,
                        "star_longitude": 345.172536,
                        "star_latitude": -59.373354,
                        "orb": 0.481693,
                        "sign": "Pisces",
                        "sign_index": 12,
                        "degree_in_sign": 15.1725
                      },
                      {
                        "body": "mercury",
                        "body_longitude": 39.452338,
                        "star": "Achird",
                        "designation": "etCas",
                        "magnitude": 3.44,
                        "star_longitude": 40.1057,
                        "star_latitude": 47.009121,
                        "orb": 0.653362,
                        "sign": "Taurus",
                        "sign_index": 2,
                        "degree_in_sign": 10.1057
                      },
                      {
                        "body": "neptune",
                        "body_longitude": 284.419553,
                        "star": "Vega",
                        "designation": "alLyr",
                        "magnitude": 0.03,
                        "star_longitude": 285.190944,
                        "star_latitude": 61.729236,
                        "orb": 0.771391,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 15.1909
                      },
                      {
                        "body": "moon",
                        "body_longitude": 238.259725,
                        "star": "Rigil Kentaurus",
                        "designation": "alCen",
                        "magnitude": -0.1,
                        "star_longitude": 239.368967,
                        "star_latitude": -42.592043,
                        "orb": 1.109242,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 29.369
                      },
                      {
                        "body": "uranus",
                        "body_longitude": 279.296197,
                        "star": "Facies",
                        "designation": "M22",
                        "magnitude": 6.17,
                        "star_longitude": 278.186132,
                        "star_latitude": -0.726425,
                        "orb": 1.110065,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 8.1861
                      },
                      {
                        "body": "pluto",
                        "body_longitude": 226.304012,
                        "star": "Zubenelgenubi",
                        "designation": "al-2Lib",
                        "magnitude": 2.75,
                        "star_longitude": 224.956907,
                        "star_latitude": 0.334298,
                        "orb": 1.347105,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 14.9569
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "max_magnitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Keep stars at least this bright. Lower numbers are brighter.",
                    "examples": [
                      0
                    ]
                  },
                  "orb_degrees": {
                    "type": "number",
                    "format": "double",
                    "description": "How close counts as conjunct. A degree is already generous.",
                    "minimum": 0.05,
                    "maximum": 5,
                    "default": 1,
                    "examples": [
                      0.05
                    ]
                  },
                  "preset": {
                    "type": "string",
                    "description": "major (default), behenian, brightest, or all.",
                    "enum": [
                      "major",
                      "behenian",
                      "brightest",
                      "all"
                    ],
                    "default": "major",
                    "examples": [
                      "major"
                    ]
                  },
                  "stars": {
                    "type": "array",
                    "description": "Star names. Overrides `preset` when given.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "preset": "major",
                "orb_degrees": 1.5
              }
            }
          }
        }
      }
    },
    "/api/astro/fixed-star/parans/": {
      "post": {
        "operationId": "astro_fixed_star_parans",
        "summary": "Star and planet parans",
        "description": "Latitudes where a fixed star and a planet are on angles at the same moment.\n\nParans are how Bernadette Brady's school reads fixed stars, and they catch a contact a longitude conjunction misses entirely: a star can be nowhere near a planet in the zodiac and still rise at the exact moment that planet culminates. Because the answer is a LATITUDE, it applies right around the globe at that latitude rather than at one place.\n\nSolved with the same geometry as /api/astro/astrocartography/parans/, with the star standing in for one of the bodies. Pairs of meridian lines are excluded: MC and IC lines are true meridians and never cross.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Fixed stars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"julian_day_ut\": 2448022.10069444, \"stars_considered\": 3, \"count\": 30, \"parans\": [{\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"IC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": 64.923938}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"AC\", \"body\": \"sun\", \"body_line\": \"MC\", \"latitude_deg\": 62.975951}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"DC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": 62.127117}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"IC\", \"body\": \"sun\", \"body_line\": \"AC\", \"latitude_deg\": 61.589729}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"IC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": 56.671965}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"DC\", \"body\": \"sun\", \"body_line\": \"DC\", \"latitude_deg\": 55.724692}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"DC\", \"body\": \"mars\", \"body_line\": \"IC\", \"latitude_deg\": 54.239126}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"DC\", \"body\": \"moon\", \"body_line\": \"AC\", \"latitude_deg\": 53.107724}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"AC\", \"body\": \"sun\", \"body_line\": \"MC\", \"latitude_deg\": 50.110307}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"DC\", \"body\": \"moon\", \"body_line\": \"AC\", \"latitude_deg\": 46.105875}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"MC\", \"body\": \"mars\", \"body_line\": \"DC\", \"latitude_deg\": 45.266728}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"MC\", \"body\": \"sun\", \"body_line\": \"DC\", \"latitude_deg\": 38.661486}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"AC\", \"body\": \"moon\", \"body_line\": \"IC\", \"latitude_deg\": 30.223657}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"DC\", \"body\": \"mars\", \"body_line\": \"IC\", \"latitude_deg\": 24.393792}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"MC\", \"body\": \"moon\", \"body_line\": \"AC\", \"latitude_deg\": 15.27243}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"IC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": -15.27243}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"AC\", \"body\": \"mars\", \"body_line\": \"MC\", \"latitude_deg\": -24.393792}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"DC\", \"body\": \"moon\", \"body_line\": \"MC\", \"latitude_deg\": -30.223657}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"IC\", \"body\": \"sun\", \"body_line\": \"AC\", \"latitude_deg\": -38.661486}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"IC\", \"body\": \"mars\", \"body_line\": \"AC\", \"latitude_deg\": -45.266728}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"AC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": -46.105875}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"magnitude\": 1.4, \"star_line\": \"DC\", \"body\": \"sun\", \"body_line\": \"IC\", \"latitude_deg\": -50.110307}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"magnitude\": 0.86, \"star_line\": \"AC\", \"body\": \"moon\", \"body_line\": \"DC\", \"latitude_deg\": -53.107724}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"AC\", \"body\": \"mars\", \"body_line\": \"MC\", \"latitude_deg\": -54.239126}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"AC\", \"body\": \"sun\", \"body_line\": \"AC\", \"latitude_deg\": -55.724692}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"MC\", \"body\": \"moon\", \"body_line\": \"AC\", \"latitude_deg\": -56.671965}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"magnitude\": -1.46, \"star_line\": \"MC\", \"body\": \"sun\", \"body_line\": \"DC\", \"latitude_deg\": "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "max_magnitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Keep stars at least this bright. Lower numbers are brighter.",
                    "examples": [
                      0
                    ]
                  },
                  "preset": {
                    "type": "string",
                    "description": "major (default), behenian, brightest, or all.",
                    "enum": [
                      "major",
                      "behenian",
                      "brightest",
                      "all"
                    ],
                    "default": "major",
                    "examples": [
                      "major"
                    ]
                  },
                  "stars": {
                    "type": "array",
                    "description": "Star names. Overrides `preset` when given.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "stars": [
                  "Regulus",
                  "Sirius",
                  "Aldebaran"
                ],
                "bodies": [
                  "sun",
                  "moon",
                  "mars"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/fixed-star/positions/": {
      "post": {
        "operationId": "astro_fixed_star_positions",
        "summary": "Fixed star positions",
        "description": "Where named fixed stars sit at a given moment: tropical longitude with sign and degree, ecliptic latitude, and equatorial coordinates.\n\nFixed stars are not fixed. They precess about a degree every 72 years, so a position quoted without a date is meaningless — Regulus left Leo for Virgo in 2012 and now sits at 0 Virgo.\n\nChoose stars by name, or use a preset: `behenian` for the fifteen stars of medieval magic, `major` for the set astrologers actually work with, `brightest` for everything above magnitude 1.5, or `all`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Fixed stars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"julian_day_ut\": 2461041.5, \"count\": 15, \"stars\": [{\"star\": \"Algol\", \"designation\": \"bePer\", \"aliases\": [], \"magnitude\": 2.12, \"longitude\": 56.536133, \"latitude\": 22.433032, \"right_ascension_deg\": 47.472908, \"declination_deg\": 41.058602, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 26.5361}, {\"star\": \"Alcyone\", \"designation\": \"etTau\", \"aliases\": [\"Krttika\"], \"magnitude\": 2.87, \"longitude\": 60.361502, \"latitude\": 4.053961, \"right_ascension_deg\": 57.264611, \"declination_deg\": 24.186925, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 0.3615}, {\"star\": \"Aldebaran\", \"designation\": \"alTau\", \"aliases\": [\"Rohini\"], \"magnitude\": 0.86, \"longitude\": 70.159252, \"latitude\": -5.465739, \"right_ascension_deg\": 69.360424, \"declination_deg\": 16.562139, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 10.1593}, {\"star\": \"Capella\", \"designation\": \"alAur\", \"aliases\": [\"Brahmahridaya\"], \"magnitude\": 0.08, \"longitude\": 82.228827, \"latitude\": 22.865264, \"right_ascension_deg\": 79.662975, \"declination_deg\": 46.024947, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 22.2288}, {\"star\": \"Sirius\", \"designation\": \"alCMa\", \"aliases\": [\"Lubdhaka\"], \"magnitude\": -1.46, \"longitude\": 104.449025, \"latitude\": -39.611041, \"right_ascension_deg\": 101.580591, \"declination_deg\": -16.751976, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 14.449}, {\"star\": \"Procyon\", \"designation\": \"alCMi\", \"aliases\": [], \"magnitude\": 0.37, \"longitude\": 116.15164, \"latitude\": -16.024563, \"right_ascension_deg\": 115.172471, \"declination_deg\": 5.157534, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 26.1516}, {\"star\": \"Regulus\", \"designation\": \"alLeo\", \"aliases\": [\"Magha\"], \"magnitude\": 1.4, \"longitude\": 150.195942, \"latitude\": 0.465653, \"right_ascension_deg\": 152.443892, \"declination_deg\": 11.838288, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 0.1959}, {\"star\": \"Alkaid\", \"designation\": \"etUMa\", \"aliases\": [\"Benetnash\", \"Marichi\"], \"magnitude\": 1.86, \"longitude\": 177.303862, \"latitude\": 54.382669, \"right_ascension_deg\": 207.141406, \"declination_deg\": 49.178214, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 27.3039}, {\"star\": \"Algorab\", \"designation\": \"deCrv\", \"aliases\": [\"Hasta\"], \"magnitude\": 2.94, \"longitude\": 193.814427, \"latitude\": -12.197686, \"right_ascension_deg\": 187.804295, \"declination_deg\": -16.65954, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 13.8144}, {\"star\": \"Spica\", \"designation\": \"alVir\", \"aliases\": [\"Citra\"], \"magnitude\": 0.97, \"longitude\": 204.204413, \"latitude\": -2.056252, \"right_ascension_deg\": 201.641386, \"declination_deg\": -11.296925, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 24.2044}, {\"star\": \"Arcturus\", \"designation\": \"alBoo\", \"aliases\": [\"Svati\"], \"magnitude\": -0.05, \"longitude\": 204.596472, \"latitude\": 30.715328, \"right_ascension_deg\": 214.211389, \"declination_deg\": 19.044179, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 24.5965}, {\"star\": \"Alphecca\", \"designation\": \"alCrB\", \"aliases\": [\"Alphekka\", \"Gemma\"], \"magnitude\": 2.24, \"longitude\": 222.659925, \"latitude\": 44.317277, \"right_ascension_deg\": 233.944688, \"declination_deg\": 26.624185, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 12.6599}, {\"star\": \"Antares\", \"designation\": \"alSco\", \"aliases\": [\"Jyeshtha\"], \"magnitude\": 0.91, \"longitude\": 250.121879, \"latitude\": -4.573175, \"right_ascension_deg\": 247.747294, \"declination_deg\": -26.48875, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 10.1219}, {\"star\": \"Vega\", \"designation\": \"alLyr\", \"aliases\": [\"Abhijit\"], \"magnitude\": 0.03, \"longitude\": 285.670356, \"latitude\": 61.731946, \"right_ascension_deg\": 279.448124, \"declination_deg\": 38.806772, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 15.6704}, {\"star\": \"Deneb Algedi\", \"designation\": \"deCap\", \"aliases\": [], \"magnitude\": 2.83, \"longitude\": 323.904246, \"latitude\": -2.606273, \"right_ascension_deg\": 327.11596, \"declination_deg\": -16.010421, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 23.9042}]}"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "max_magnitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Keep stars at least this bright. Lower numbers are brighter.",
                    "examples": [
                      0
                    ]
                  },
                  "preset": {
                    "type": "string",
                    "description": "major (default), behenian, brightest, or all.",
                    "enum": [
                      "major",
                      "behenian",
                      "brightest",
                      "all"
                    ],
                    "default": "major",
                    "examples": [
                      "major"
                    ]
                  },
                  "stars": {
                    "type": "array",
                    "description": "Star names. Overrides `preset` when given.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "timezone_as_float": 0,
                "preset": "behenian"
              }
            }
          }
        }
      }
    },
    "/api/astro/general_prediction/": {
      "post": {
        "operationId": "astro_general_prediction",
        "summary": "General predictions",
        "description": "A written character-and-life reading assembled from a birth chart: the temperament of the moon sign, what each of the nine planets means in the house it occupies, and what each of the twelve house lords means in the house it has gone to. It is the narrative counterpart to /api/astro/chart_analysis/, which returns much the same structure as data.\n\nThe text is drawn from published sources — the moon sign section cites B. V. Raman's How to Judge a Horoscope for one reading and a second source for the other — so the same chart always produces the same prose. Send the birth moment, place and UTC offset; there are no other options.\n\nEverything comes back as HTML fragments with bold headings and line breaks, ready to drop into a page. Note that this endpoint calls the UTC offset field `timezone`, not `timezone_as_float`.\n\nAvailable `keys` (1), all covered by the same single credit: get_prediction_details.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"get_prediction_details\": {\"Janma rasi_1\": \"<html><b>General Predictions</b><br><b>Source: How to judge a horoscope - BV. Raman</b><br><b>Mental Tendencies</b><br>Those born in Sagittarius have an inclination for philosophy and occult studies. They can acquire great<br><b>Physical Tendencies</b><br>Persons born in this sign are generally inclined towards corpulence. They possess almond eyes and their hair is brown. They are usually good looking. Evenly set teeth, a happy smile, and fullness of the figure characterise the natives of Dhanus.<br><b>General Tendencies</b><br>They are of a phlegmatic temperament. They are too conventional and also businesslike. They are prompt and uphold conservative views. They are sympathetic and loving, and possess good foresight. At times they are restless and over-anxious. They are too callous and enthusiastic. They hate all external show. They are God-fearing, honest, humble and free from hypocrisy. They exercise strict control over their food and drinks and in regard to their relations with the opposite sex. They are prone to be misunderstood unintentionally by others. In late years they must be careful about their lungs as they are liable to suffer from rheumatic pains and the like.<br>\", \"Janma rasi_2\": \"<html><b>General Predictions</b><br><b>Source: ChinmayaAstrolger.com</b><br><b>Specific Characteristics</b><br> You will have a sober mind, good judgement and a quick intellect. But richness of intellect and lack of concern for method may lead you to profusion and disorder. You will have versatility and capacity of general work. You will have a few enemies - sort of jealous people - but will always remain a victor over the vanquished. You will have studies in the fields of arts, literature, law and philosophy. You will have restless activities of mind, together with the rich creative power. You will have much romance, fertile imagination and life in foreign / distant lands. These may conduce to high renown and give wealth and good fortune. You are likely to gain through an inheritance or a legacy. Your chief characteristics are philosophical and literary pursuits and in-depth researches of a scientific nature. You have a taste for lofty speculation and your strong passions are well-controlled. Your mind will be philosophical and the temperament sober. Although riches will be difficult to acquire in initial stages, riches are certain to you. You will have a few steadfast friends.<br><b>Mental Qualities</b><br>You will be inclined to philosophy and religion, eclectic. You will not have much of interest in the intricacies of analytical sciences. Rather than becoming a store-house of information, you will acquire the superior capacity to have a quick overview of varied circumstances. You will be just, frank, generous, magnanimous and even-tempered.<br><b>Physical Attributes</b><br> According to your Horoscope, you will have a tall, upright and well-proportioned figure. You will have an elongated face, rounded forehead with grey, brown or blue eyes - sparkling and expressive. You will have fair complexion and receding hairline balding about the temples. You will be of athletic building and will be fond of athletics and other expeditious activities.<br><b>General State of Health</b><br> Your zodiacal sign has governance over genito-urinary system, external generative organs, excretory system, cervix, coccyx and prostrate gland. These are your vulnerable areas. Elimination or disorder in connection with elimination will determine your remaining in desired state of health or suffering from disease. You should take special care and exercise fullest possible control over your intake of food and drink, and also over your arousal of strong passions - which may increase the level of toxins in the body. You should have plenty of sleep and should remain in a relaxed state of mind. You should take more of leeks, radishes, garlic, ginger and ginseng.Since the Ascendant has no affliction in your c"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_prediction_details"
                      ]
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_prediction_details"
                ],
                "date_time": "2025-07-09T10:26:45.109Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/geocode/": {
      "get": {
        "operationId": "astro_geocode",
        "summary": "Place lookup",
        "description": "Turns a place name into the coordinates and UTC offset the other endpoints need. Send a GET with an `address` query parameter such as 'Jaipur, India' and you get back `latitude`, `longitude`, the IANA `timezone_name`, the `timezone_offset` in hours as a decimal, the geocoder's own `address` string and the `source` that answered.\n\nThe offset already accounts for daylight saving where the provider reports it, so it is the current offset for that place, not necessarily the offset that applied on a historical birth date. For a birth chart, pass these coordinates into /api/astro/date_time/ with the actual date and let that endpoint resolve the offset for the right moment.\n\n`source` tells you which provider answered: 'google' when a Google Maps key is configured for the deployment, otherwise 'nominatim', the OpenStreetMap service used as a fallback. A place that cannot be found returns 404, and a missing `address` returns 400.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Utilities"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": true,
            "description": "The city/place name to search",
            "schema": {
              "type": "string",
              "description": "The city/place name to search A place name to look up. Free text - a city is usually enough; add the state or country to disambiguate.",
              "examples": [
                "Jaipur, Rajasthan, India"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "address": "Jaipur, Rajasthan, India",
                  "latitude": 26.9124336,
                  "longitude": 75.7872709,
                  "timezone_name": "Asia/Calcutta",
                  "timezone_offset": 5.5,
                  "source": "google"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/gujarati_calendar/": {
      "post": {
        "operationId": "astro_gujarati_calendar",
        "summary": "Gujarati calendar",
        "description": "The Gujarati year for a given Gregorian year, resolved to the civil dates on which each observance is kept at the place you give. The Gujarati calendar is amanta luni-solar on the Vikrama Samvat era, whose new year falls at Bestu Varsh the day after Diwali rather than in spring, so the shape of the year differs from the Bengali and Assamese ones.\n\nThe lunar observances are found by tithi and then resolved to the right day using the time of day each one requires, which matters more here than elsewhere: several Gujarati observances share a tithi but not a kaala, so Govardhan Puja and Bestu Varsh, or Kali Chaudas and Roop Chaudas, fall on the same tithi at different times of day.\n\nSend `year` with `latitude`, `longitude` and `timezone_as_float`. The response is `{year, events}` where events is a list of `{name, date}` in date order, `date` being a plain YYYY-MM-DD local civil date. The list is long: it runs to the monthly Sankashti Chaturthis, Ekadashis, Kalashtamis and Durgashtamis as well as the major festivals.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"events\": [{\"name\": \"Lambodara Sankashta\", \"date\": \"2026-01-06\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-01-10\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-01-10\"}, {\"name\": \"Shattila Ekadashi\", \"date\": \"2026-01-14\"}, {\"name\": \"Makara Sankranti\", \"date\": \"2026-01-14\"}, {\"name\": \"Uttarayana\", \"date\": \"2026-01-14\"}, {\"name\": \"Gauriganesha Chaturthi\", \"date\": \"2026-01-22\"}, {\"name\": \"Vasant Panchami\", \"date\": \"2026-01-23\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-01-26\"}, {\"name\": \"Jaya Ekadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Dwijapriya Sankashta\", \"date\": \"2026-02-05\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-02-09\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-02-09\"}, {\"name\": \"Vijaya Ekadashi\", \"date\": \"2026-02-13\"}, {\"name\": \"Maha Shivaratri\", \"date\": \"2026-02-15\"}, {\"name\": \"Surya Grahan *Valayakara\", \"date\": \"2026-02-17\"}, {\"name\": \"Dhundhiraja Chaturthi\", \"date\": \"2026-02-21\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-02-24\"}, {\"name\": \"Amalaki Ekadashi\", \"date\": \"2026-02-27\"}, {\"name\": \"Chandra Grahan *Purna\", \"date\": \"2026-03-03\"}, {\"name\": \"Holi\", \"date\": \"2026-03-03\"}, {\"name\": \"Holika Dahan\", \"date\": \"2026-03-03\"}, {\"name\": \"Dhuleti\", \"date\": \"2026-03-04\"}, {\"name\": \"Bhalachandra Sankashta\", \"date\": \"2026-03-06\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-03-11\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-03-11\"}, {\"name\": \"Papamochani Ekadashi\", \"date\": \"2026-03-15\"}, {\"name\": \"Gudi Padwa\", \"date\": \"2026-03-19\"}, {\"name\": \"Vasudeva Chaturthi\", \"date\": \"2026-03-22\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-03-26\"}, {\"name\": \"Rama Navami\", \"date\": \"2026-03-26\"}, {\"name\": \"Kamada Ekadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Hanuman Jayanti\", \"date\": \"2026-04-02\"}, {\"name\": \"Hanuman Janmotsava\", \"date\": \"2026-04-02\"}, {\"name\": \"Vikata Sankashta\", \"date\": \"2026-04-05\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-04-09\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-04-10\"}, {\"name\": \"Varuthini Ekadashi\", \"date\": \"2026-04-13\"}, {\"name\": \"Parashurama Jayanti\", \"date\": \"2026-04-19\"}, {\"name\": \"Akha Trij\", \"date\": \"2026-04-19\"}, {\"name\": \"Sankarshana Chaturthi\", \"date\": \"2026-04-20\"}, {\"name\": \"Ganga Saptami\", \"date\": \"2026-04-23\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-04-24\"}, {\"name\": \"Sita Navami\", \"date\": \"2026-04-25\"}, {\"name\": \"Mohini Ekadashi\", \"date\": \"2026-04-27\"}, {\"name\": \"Nrisinha Jayanti\", \"date\": \"2026-04-30\"}, {\"name\": \"Kurma Jayanti\", \"date\": \"2026-05-01\"}, {\"name\": \"Narada Jayanti\", \"date\": \"2026-05-02\"}, {\"name\": \"Ekadanta Sankashta\", \"date\": \"2026-05-05\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-05-09\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-05-09\"}, {\"name\": \"Apara Ekadashi\", \"date\": \"2026-05-13\"}, {\"name\": \"Shani Jayanti\", \"date\": \"2026-05-16\"}, {\"name\": \"Varada Chaturthi\", \"date\": \"2026-05-19\"}, {\"name\": \"Adhika Masik Durgashtami\", \"date\": \"2026-05-23\"}, {\"name\": \"Vibhuvana Sankashta\", \"date\": \"2026-06-03\"}, {\"name\": \"Adhika Kalashtami\", \"date\": \"2026-06-08\"}, {\"name\": \"Adhik Masik Krishna Janmashtami\", \"date\": \"2026-06-08\"}, {\"name\": \"Parama Ekadashi\", \"date\": \"2026-06-11\"}, {\"name\": \"Pradyumna Chaturthi\", \"date\": \"2026-06-18\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-06-22\"}, {\"name\": \"Nirjala Ekadashi\", \"date\": \"2026-06-25\"}, {\"name\": \"Krishnapingala Sankashta\", \"date\": \"2026-07-03\"}, {\"name\": \"Kalashtami\", \"date\": \"2026-07-07\"}, {\"name\": \"Masik Krishna Janmashtami\", \"date\": \"2026-07-07\"}, {\"name\": \"Yogini Ekadashi\", \"date\": \"2026-07-10\"}, {\"name\": \"Gauna Yogini Ekadashi\", \"date\": \"2026-07-11\"}, {\"name\": \"Vaishnava Yogini Ekadashi\", \"date\": \"2026-07-11\"}, {\"name\": \"Jagannath Rathyatra\", \"date\": \"2026-07-16\"}, {\"name\": \"Aniruddha Chaturthi\", \"date\": \"2026-07-17\"}, {\"name\": \"Masik Durgashtami\", \"date\": \"2026-07-21\"}, {\"name\": \"Devshayani Ekadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Gauri Vrat Begins\", \"date\": \"2026-07-25\"}, {\"name\": \"Jayaparvati Vrat Begins\", \"date\": \"2026-07-27\"}, {\"name\": \"Kokila Vrat\", \"date\": \"2026-07-28\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/gun-milan/": {
      "post": {
        "operationId": "astro_gun_milan",
        "summary": "Gun milan",
        "description": "Gun milan: the Ashtakoota compatibility score out of 36.\n\nThis endpoint takes NAKSHATRA AND PADA NUMBERS, not birth dates - `boy_nakshatra_number` and `boy_paadham_number` for one partner, `girl_nakshatra_number` and `girl_paadham_number` for the other. Nakshatras are numbered 1 to 27 from Ashwini and padas 1 to 4. If you have birth details rather than nakshatras, get them from /api/astro/nakshatra/ first.\n\n`method` defaults to the North Indian scoring. For the individual kootas behind the total, and the South Indian variants, use /api/astro/ashtakoota/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "score": [
                      0,
                      0,
                      6,
                      3,
                      1,
                      5,
                      0,
                      8,
                      23,
                      false,
                      true,
                      false,
                      true
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "boy_nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "boy_paadham_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "girl_paadham_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "nakshatra_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "paadha_number": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "method": {
                    "type": "string",
                    "default": "north",
                    "examples": [
                      "string"
                    ]
                  },
                  "use_astroyogi_method": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "boy_nakshatra_number",
                  "boy_paadham_number",
                  "girl_nakshatra_number",
                  "girl_paadham_number",
                  "nakshatra_number",
                  "paadha_number"
                ],
                "additionalProperties": true
              },
              "example": {
                "boy_nakshatra_number": 5,
                "boy_paadham_number": 2,
                "girl_nakshatra_number": 12,
                "girl_paadham_number": 3,
                "nakshatra_number": 5,
                "paadha_number": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/harsha-bala/": {
      "post": {
        "operationId": "astro_harsha_bala",
        "summary": "Harsha bala (Tajika)",
        "description": "Harsha bala: the Tajika five-fold strength, out of twenty.\n\nA Tajika measure rather than a Parashari one. Each planet is scored on five conditions — the right half of the chart, the right sign sex, its own hemisphere, its joy house, and benefic or malefic placement — five points each, so every score is a multiple of five.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "tajika",
                    "scale": "0-20",
                    "harsha_bala": {
                      "Sun": 5,
                      "Moon": 10,
                      "Mars": 5,
                      "Mercury": 5,
                      "Jupiter": 10,
                      "Venus": 10,
                      "Saturn": 10
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "description": "Ascendant house number. Defaults to 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/hora-chart/": {
      "post": {
        "operationId": "astro_hora_chart",
        "summary": "Hora chart (D2)",
        "description": "The hora, the second divisional chart: each sign divided in half.\n\nRead for wealth and resources. Each half falls under the Sun or the Moon, so this division sorts the chart into two groups rather than twelve.\n\nNot to be confused with /api/astro/hora/, which returns the twenty-four planetary hours of the day - a different calculation that shares the name.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 148.76166666666666,
                        "latitude": 0,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 1,
                        "kakshya": "ascendant",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "moon",
                        "longitude": 122.95555555555556,
                        "latitude": 4.37,
                        "nakshatra": "Makha",
                        "pada": 1,
                        "kakshya": "saturn",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "mars",
                        "longitude": 98.34944444444444,
                        "latitude": 0.535,
                        "nakshatra": "Pushyami",
                        "pada": 2,
                        "kakshya": "mars",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "mercury",
                        "longitude": 97.01555555555557,
                        "latitude": 1.574,
                        "nakshatra": "Pushyami",
                        "pada": 2,
                        "kakshya": "jupiter",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "jupiter",
                        "longitude": 128.9438888888889,
                        "latitude": 0.529,
                        "nakshatra": "Makha",
                        "pada": 3,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "venus",
                        "longitude": 147.91166666666666,
                        "latitude": -3.391,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 1,
                        "kakshya": "ascendant",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "saturn",
                        "longitude": 128.89388888888888,
                        "latitude": -2.651,
                        "nakshatra": "Makha",
                        "pada": 3,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 131.13166666666666,
                        "latitude": 0,
                        "nakshatra": "Makha",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 131.13166666666666,
                        "latitude": 0,
                        "nakshatra": "Makha",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "uranus",
                        "longitude": 112.84777777777778,
                        "latitude": -0.154,
                        "nakshatra": "Aasresha",
                        "pada": 2,
                        "kakshya": "moon",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "neptune",
                        "longitude": 108.86555555555556,
                        "latitude": -1.412,
                        "nakshatra": "Aasresha",
                        "pada": 1,
                        "kakshya": "Mercury",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "pluto",
                        "longitude": 108.55777777777776,
                        "latitude": -4.3,
                        "nakshatra": "Aasresha",
                        "pada": 1,
                        "kakshya": "venus",
                        "zodiac_name": "Cancer",
                        "house": 12
                      }
                    ],
                    "ascendant": {
                      "longitude": 144.37555555555556,
                      "zodiac_name": "Leo",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/hora/": {
      "post": {
        "operationId": "astro_hora",
        "summary": "Planetary hours (hora)",
        "description": "The twenty-four planetary hours - twelve dividing sunrise to sunset and twelve dividing sunset to the next sunrise - each with its ruling planet.\n\nReturned as `day` and `night`, twelve entries each, plus `current`. These are not clock hours: they are twelfths of the actual daylight and darkness, so their length changes with latitude and season, and only near an equinox are they close to sixty minutes.\n\nThe first hora of the day is ruled by the lord of the weekday, which is why the sequence starts differently each day.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "day": [
                      {
                        "planet": "Mars",
                        "start": "06:09:57 AM",
                        "end": "07:12:45 AM"
                      },
                      {
                        "planet": "Sun",
                        "start": "07:12:45 AM",
                        "end": "08:15:33 AM"
                      },
                      {
                        "planet": "Venus",
                        "start": "08:15:33 AM",
                        "end": "09:18:21 AM"
                      },
                      {
                        "planet": "Mercury",
                        "start": "09:18:21 AM",
                        "end": "10:21:08 AM"
                      },
                      {
                        "planet": "Moon",
                        "start": "10:21:08 AM",
                        "end": "11:23:56 AM"
                      },
                      {
                        "planet": "Saturn",
                        "start": "11:23:56 AM",
                        "end": "12:26:44 PM"
                      },
                      {
                        "planet": "Jupiter",
                        "start": "12:26:44 PM",
                        "end": "13:29:32 PM"
                      },
                      {
                        "planet": "Mars",
                        "start": "13:29:32 PM",
                        "end": "14:32:20 PM"
                      },
                      {
                        "planet": "Sun",
                        "start": "14:32:20 PM",
                        "end": "15:35:08 PM"
                      },
                      {
                        "planet": "Venus",
                        "start": "15:35:08 PM",
                        "end": "16:37:55 PM"
                      },
                      {
                        "planet": "Mercury",
                        "start": "16:37:55 PM",
                        "end": "17:40:43 PM"
                      },
                      {
                        "planet": "Moon",
                        "start": "17:40:43 PM",
                        "end": "18:43:31 PM"
                      }
                    ],
                    "night": [
                      {
                        "planet": "Saturn",
                        "start": "18:43:31 PM",
                        "end": "19:40:45 PM"
                      },
                      {
                        "planet": "Jupiter",
                        "start": "19:40:45 PM",
                        "end": "20:38:00 PM"
                      },
                      {
                        "planet": "Mars",
                        "start": "20:38:00 PM",
                        "end": "21:35:14 PM"
                      },
                      {
                        "planet": "Sun",
                        "start": "21:35:14 PM",
                        "end": "22:32:28 PM"
                      },
                      {
                        "planet": "Venus",
                        "start": "22:32:28 PM",
                        "end": "23:29:43 PM"
                      },
                      {
                        "planet": "Mercury",
                        "start": "23:29:43 PM",
                        "end": "00:26:57 AM"
                      },
                      {
                        "planet": "Moon",
                        "start": "00:26:57 AM",
                        "end": "01:24:11 AM"
                      },
                      {
                        "planet": "Saturn",
                        "start": "01:24:11 AM",
                        "end": "02:21:26 AM"
                      },
                      {
                        "planet": "Jupiter",
                        "start": "02:21:26 AM",
                        "end": "03:18:40 AM"
                      },
                      {
                        "planet": "Mars",
                        "start": "03:18:40 AM",
                        "end": "04:15:54 AM"
                      },
                      {
                        "planet": "Sun",
                        "start": "04:15:54 AM",
                        "end": "05:13:09 AM"
                      },
                      {
                        "planet": "Venus",
                        "start": "05:13:09 AM",
                        "end": "06:10:23 AM"
                      }
                    ],
                    "current": null
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/horoscope-match/": {
      "post": {
        "operationId": "astro_horoscope_match",
        "summary": "Marriage matching",
        "description": "Full Ashtakoota marriage matching from two birth records rather than two star numbers. Give the date, time and place of each partner and the endpoint derives the moon sign, nakshatra and pada itself, scores the eight kootas out of 36, checks for the two blocking doshas and returns a verdict.\n\nThe response has four parts. `boy` and `girl` summarise each chart: moon sign, nakshatra name and number, pada, moon longitude and ascendant sign. `gunas` is a list of eight objects, one per koota, each with its `key` and `label`, `max_points` and `obtained_points`, the `boy_value` and `girl_value` being compared (the varna, the yoni animal, the gana and so on), the `area_of_life` it governs and a plain-English `description` — enough to render a results table without writing any copy. Then come `total_score`, `max_score` of 36 and `minimum_recommended_score` of 18.\n\nFinally `doshas`, `verdict` and `verdict_reason`. A Nadi score of zero raises Nadi Dosha and a Bhakoot score of zero raises Bhakoot Dosha, and either makes the verdict 'Union is NOT Recommended' whatever the total; otherwise 28 or more is 'Union is Excellent', 18 or more is 'Union is Good', and below that is not recommended. Each partner object takes `date_time`, `latitude`, `longitude` and `timezone_as_float`, plus optional `name` and `city` labels that are echoed back untouched. Lahiri ayanamsa is always used; the `ayanamsa` field is accepted but has no effect.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "boy": {
                      "name": "",
                      "city": "",
                      "moon_sign": "Aries",
                      "nakshatra": "Ashwini",
                      "nakshatra_number": 1,
                      "paadha_number": 1,
                      "moon_longitude": 1.478,
                      "ascendant_sign": "Leo"
                    },
                    "girl": {
                      "name": "",
                      "city": "",
                      "moon_sign": "Aries",
                      "nakshatra": "Ashwini",
                      "nakshatra_number": 1,
                      "paadha_number": 1,
                      "moon_longitude": 1.478,
                      "ascendant_sign": "Leo"
                    },
                    "gunas": [
                      {
                        "key": "varna",
                        "label": "Varna",
                        "max_points": 1,
                        "obtained_points": 1,
                        "boy_value": "Brahmin",
                        "girl_value": "Brahmin",
                        "area_of_life": "Obedience",
                        "description": "Varna Kuta is assigned 1 point. It represents mutual love, comfort and obedience - the spiritual compatibility between the couple."
                      },
                      {
                        "key": "vashya",
                        "label": "Vashya",
                        "max_points": 2,
                        "obtained_points": 2,
                        "boy_value": "Chatushpada",
                        "girl_value": "Chatushpada",
                        "area_of_life": "Mutual Control",
                        "description": "Vashya Kuta is assigned 2 points. It represents mutual control or dominance, along with friendship and amenability between the couple."
                      },
                      {
                        "key": "tara",
                        "label": "Tara",
                        "max_points": 3,
                        "obtained_points": 3,
                        "boy_value": "Sampat",
                        "girl_value": "Sampat",
                        "area_of_life": "Luck",
                        "description": "Tara Kuta is assigned 3 points. It represents luck, auspiciousness and the transmission of mutual well-being between the couple."
                      },
                      {
                        "key": "yoni",
                        "label": "Yoni",
                        "max_points": 4,
                        "obtained_points": 4,
                        "boy_value": "Horse",
                        "girl_value": "Horse",
                        "area_of_life": "Sexual Aspects",
                        "description": "Yoni Kuta is assigned 4 points. It represents sexual aspects, including compatibility of intimate temperament."
                      },
                      {
                        "key": "maitri",
                        "label": "Maitri",
                        "max_points": 5,
                        "obtained_points": 5,
                        "boy_value": "Mars",
                        "girl_value": "Mars",
                        "area_of_life": "Affection",
                        "description": "Maitri (Graha Maitri) Kuta is assigned 5 points. It represents psychological disposition, mental qualities and affection between the couple."
                      },
                      {
                        "key": "gana",
                        "label": "Gana",
                        "max_points": 6,
                        "obtained_points": 6,
                        "boy_value": "Deva",
                        "girl_value": "Deva",
                        "area_of_life": "Nature",
                        "description": "Gana Kuta is assigned 6 points. It represents nature, temperament, longevity, wealth and love."
                      },
                      {
                        "key": "bhakoot",
                        "label": "Bhakoot",
                        "max_points": 7,
                        "obtained_points": 7,
                        "boy_value": "Mesha",
                        "girl_value": "Mesha",
                        "area_of_life": "Love",
                        "description": "Bhakoot (Rashi) Kuta is assigned 7 points. It represents children, wealth, comfort, good luck and growth of the family."
                      },
                      {
                        "key": "nadi",
                        "label": "Nadi",
                        "max_points": 8,
                        "obtained_points": 0,
                        "boy_value": "Aadi",
                        "girl_value": "Aadi",
                        "area_of_life": "Health",
                        "description": "Nadi Kuta is assigned 8 points, the most important of all. It represents temperament, health, and genetic compatibility for progeny."
                      }
                    ],
                    "total_score": 28,
                    "max_score": 36,
                    "minimum_recommended_score": 18,
                    "doshas": [
                      "Nadi Dosha"
                    ],
                    "verdict": "Union is NOT Recommended",
                    "verdict_reason": "due to Nadi Dosha"
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "boy": {
                    "type": "object",
                    "description": "OBJECT with fixed keys: name (string, optional, free-form label), date_time (required, ISO-8601), latitude (required, -89.9..89.9), longitude (required, -180..180), timezone_as_float (required, -12.0..14.0), city (string, optional, free-form label). `name` and `city` are not validated and do not affect the calculation.",
                    "examples": [
                      "string"
                    ]
                  },
                  "girl": {
                    "type": "object",
                    "description": "OBJECT - same shape and rules as `boy`.",
                    "examples": [
                      "string"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "boy",
                  "girl"
                ],
                "additionalProperties": true
              },
              "example": {
                "boy": {
                  "date_time": "2026-09-01T06:00:00+05:30",
                  "latitude": 26.9124,
                  "longitude": 75.7873,
                  "timezone_as_float": 5.5
                },
                "girl": {
                  "date_time": "2026-09-01T06:00:00+05:30",
                  "latitude": 26.9124,
                  "longitude": 75.7873,
                  "timezone_as_float": 5.5
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/house/": {
      "post": {
        "operationId": "astro_house",
        "summary": "House cusps",
        "description": "The twelve house divisions for a moment and a place, in whichever house system you name. Vedic practice usually takes whole signs as houses, but this endpoint exposes the full ephemeris range — Placidus, Koch, Campanus, Regiomontanus, Sripati, Porphyry, equal and whole-sign among two dozen — so you can cast the same chart in the system a given tradition expects. Positions are sidereal.\n\nThe distinction to get right is cusp against range. A cusp is the single degree the system assigns to a house; a range is the span the house actually occupies, computed here as the midpoints between neighbouring cusps, so a house runs from halfway back to the previous cusp to halfway on to the next. `house_cusps` gives the twelve cusps, `house_starts` and `house_ends` the two edges, `house_ranges` both edges together, and `houses` all three at once.\n\n`notation` controls the units throughout: 'degree' for raw decimal degrees along the ecliptic, 'astrological' for sign plus degrees, minutes and seconds. `method_name` is case-sensitive and several values contain spaces or punctuation, so copy them exactly. The system is already applied from `method_name` when the request is built, so `set_house_method` and `change_house_system` are only useful for switching part-way through a multi-key call.\n\nAvailable `keys` (7), all covered by the same single credit: change_house_system, house_cusps, house_ends, house_ranges, house_starts, houses, set_house_method.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "set_house_method": null
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings. 'set_house_method' and 'change_house_system' consume `method_name`; the other five consume `notation`.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "set_house_method",
                        "houses",
                        "house_ranges",
                        "house_starts",
                        "house_cusps",
                        "house_ends",
                        "change_house_system"
                      ]
                    }
                  },
                  "method_name": {
                    "type": "string",
                    "description": "Case-sensitive and lowercase. Several values contain spaces, slashes or punctuation - copy them exactly, e.g. 'equal (mc)', 'carter poli-equ.', 'horizon/azimut'.",
                    "enum": [
                      "equal",
                      "alcabitius",
                      "campanus",
                      "equal (mc)",
                      "carter poli-equ.",
                      "gauquelin sectors",
                      "horizon/azimut",
                      "sunshine",
                      "savard-a",
                      "koch",
                      "pullen sd",
                      "morinus",
                      "equal/1=aries",
                      "porphyry",
                      "placidus",
                      "pullen sr",
                      "regiomontanus",
                      "sripati",
                      "polich/page",
                      "krusinski-pisa-goelzer",
                      "equal/vehlow",
                      "equal/whole sign",
                      "axial rotation system/meridian houses",
                      "apc houses"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. 'degree' returns raw decimal degrees; 'astrological' returns sign + d/m/s. Anything else returns 400.",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "method_name",
                  "notation",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "set_house_method"
                ],
                "latitude": 26.9124,
                "longitude": 26.1046,
                "timezone_as_float": 5.5,
                "method_name": "equal",
                "notation": "astrological",
                "date_time": "2024-11-18"
              }
            }
          }
        }
      }
    },
    "/api/astro/house_hora/": {
      "post": {
        "operationId": "astro_house_hora",
        "summary": "House relationships",
        "description": "The relational structure of a birth chart: which signs aspect which, which planets aspect which, who is whose friend, and which planets the classical texts single out as significant for a chart's turning points. This is much of the machinery behind Jaimini and Parashari judgement, exposed one piece at a time.\n\nThere are three groups. The house-class keys (`trikonas`, `kendras`, `quadrants`, `dushthanas`, `chathusras`, `upachayas`) are pure geometry: twelve rows, one per sign, listing sign numbers 1 to 12, with no dependence on the chart. The aspect and relationship keys (`raasi_drishti_of_the_planet`, the three `aspected_*_of_the_planet` keys, the two `*_of_the_raasi` keys, `argala`, `associations_of_the_planet`, the three natural-friendship keys and `baadhakas_of_raasi`) describe how the chart's bodies stand to one another. The Jaimini keys (`chara_karakas`, `marakas`, `brahma`, `rudra`, `maheshwara`, `trishoola_rasis`, `order_of_planets_by_strength`) name the planets that matter for longevity and for the timing of major events.\n\nPlanets are returned as indices throughout: 0 Sun, 1 Moon, 2 Mars, 3 Mercury, 4 Jupiter, 5 Venus, 6 Saturn, 7 Rahu, 8 Ketu. Signs are zero-based (0 Aries to 11 Pisces) in the aspect and Jaimini keys but one-based (1 to 12) in the house-class keys, so check which you are reading. The `planet` request field is capitalised and case-sensitive — 'Sun', not 'sun' — and `raasi` is a zero-based integer with no bounds check, so a value outside 0–11 fails the request.\n\nAvailable `keys` (29), all covered by the same single credit: argala, aspected_houses_of_the_planet, aspected_houses_of_the_raasi, aspected_planets_of_the_planet, aspected_raasis_of_the_raasi, aspected_rasis_of_the_planet, associations_of_the_planet, baadhakas_of_raasi, brahma, chara_karakas, chathusras, dushthanas, kendras, maheshwara, maheshwara_from_planet_positions, marakas, marakas_from_planet_positions, natural_enemies_of_planets, natural_friends_of_planets, natural_neutral_of_planets, order_of_planets_by_strength, planets_aspecting_the_planet, quadrants, raasi_drishti_of_the_planet, rudra, rudra_based_on_planet_positions, trikonas, trishoola_rasis, upachayas.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "trikonas": [
                      [
                        1,
                        5,
                        9
                      ],
                      [
                        2,
                        6,
                        10
                      ],
                      [
                        3,
                        7,
                        11
                      ],
                      [
                        4,
                        8,
                        12
                      ],
                      [
                        5,
                        9,
                        1
                      ],
                      [
                        6,
                        10,
                        2
                      ],
                      [
                        7,
                        11,
                        3
                      ],
                      [
                        8,
                        12,
                        4
                      ],
                      [
                        9,
                        1,
                        5
                      ],
                      [
                        10,
                        2,
                        6
                      ],
                      [
                        11,
                        3,
                        7
                      ],
                      [
                        12,
                        4,
                        8
                      ]
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers. FORMAT constraint. DRF DateTimeField: ISO-8601 only (DRF default input formats), e.g. \"2026-09-01T06:00:00+05:30\", \"2026-09-01T06:00:00Z\" or \"2026-09-01 06:00:00\" (no timezone = UTC assumed).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings. The keys ending '_of_the_planet' plus 'associations_of_the_planet' require `planet`; the keys ending '_of_the_raasi' plus 'baadhakas_of_raasi' require `raasi`.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "trikonas",
                        "dushthanas",
                        "chathusras",
                        "quadrants",
                        "kendras",
                        "upachayas",
                        "chara_karakas",
                        "raasi_drishti_of_the_planet",
                        "aspected_planets_of_the_planet",
                        "aspected_rasis_of_the_planet",
                        "aspected_houses_of_the_planet",
                        "aspected_houses_of_the_raasi",
                        "aspected_raasis_of_the_raasi",
                        "argala",
                        "natural_friends_of_planets",
                        "natural_neutral_of_planets",
                        "natural_enemies_of_planets",
                        "marakas_from_planet_positions",
                        "marakas",
                        "rudra_based_on_planet_positions",
                        "brahma",
                        "rudra",
                        "trishoola_rasis",
                        "maheshwara_from_planet_positions",
                        "maheshwara",
                        "associations_of_the_planet",
                        "baadhakas_of_raasi",
                        "planets_aspecting_the_planet",
                        "order_of_planets_by_strength"
                      ]
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Case-sensitive lowercase. 'true' uses the true lunar nodes, 'mean' the mean nodes. Any other value produces a KeyError -> 400. Forwarded at.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "Case-SENSITIVE, capitalised - note this differs from the lowercase celestial names used by /api/astro/chart_analysis/.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "description": "Integer, not a string. Used as a 0-BASED sign index: 0 = Aries... 11 = Pisces. There is no bounds check, so out-of-range values raise IndexError -> 400 and negative values wrap silently.",
                    "enum": [
                      0,
                      1,
                      2,
                      3,
                      4,
                      5,
                      6,
                      7,
                      8,
                      9,
                      10,
                      11
                    ],
                    "examples": [
                      0
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "node",
                  "planet",
                  "raasi",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "trikonas"
                ],
                "raasi": 2,
                "planet": "Mars",
                "node": "mean",
                "date_time": "2025-02-12T09:35:49.036Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/house_information/": {
      "post": {
        "operationId": "astro_house_information",
        "summary": "House significations",
        "description": "Every house of a chart — the twelve bhavas — governs a bundle of life matters: the fourth home and mother, the seventh partnership, the tenth career. This endpoint returns the reference sheet for one of them: what it stands for, its element and quality, the themes it rules grouped under headings, and how to judge it from the house lord, the planets in it and its natural significators.\n\nIt is a lookup, not a calculation. You pass house_number from 1 to 12 and get the same text back every time — no birth date, time or place is involved. Use it to label a chart you have already computed elsewhere, or to fill an explanatory panel beside one.\n\nThe single key is get_house_info. A number outside 1-12 returns the string 'Invalid house number' with HTTP 200 rather than an error status.\n\nAvailable `keys` (1), all covered by the same single credit: get_house_info.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_house_info": {
                      "other names": "Sukha Bhava",
                      "element & quality": "Movable, Water",
                      "description": "The 4th house represents comfort, emotional happiness, and inner peace. It is deeply tied to one's home, mother, vehicles, land, and personal well-being. It is also connected to learning, cultural roots, and sacred knowledge. As the house of shelter, nurturing, and support, it governs the environments that provide safety and emotional grounding.",
                      "keywords & significations": {
                        "Comfort & Happiness": [
                          "emotional peace",
                          "joy",
                          "contentment",
                          "domestic bliss",
                          "the source of one's sense of well-being"
                        ],
                        "Mother & Maternal Side": [
                          "mother",
                          "maternal relatives",
                          "relationship with maternal lineage"
                        ],
                        "Home & Property": [
                          "house",
                          "real estate",
                          "property matters",
                          "living space",
                          "entering a new home",
                          "ancestral property",
                          "loss of residence"
                        ],
                        "Conveyance & Travel": [
                          "vehicles (rickshaws, boats, etc.)",
                          "means of transportation",
                          "local travel"
                        ],
                        "Land & Agriculture": [
                          "land",
                          "agriculture",
                          "fertile fields",
                          "gardens",
                          "ponds and wells (including construction)",
                          "land arising from islands or wet zones",
                          "grain from wetlands"
                        ],
                        "Learning & Intellect": [
                          "learning",
                          "sacred texts",
                          "wise counsel",
                          "pure intellect"
                        ],
                        "Physical Comforts": [
                          "perfumes",
                          "clothing",
                          "ornaments",
                          "oil baths",
                          "water and drinks",
                          "celestial foods"
                        ],
                        "Cultural & Spiritual Values": [
                          "castes",
                          "rites",
                          "religion-based education",
                          "victory in personal efforts",
                          "divine remedies"
                        ],
                        "Family & Relations": [
                          "relatives",
                          "well-wishers",
                          "father",
                          "wife",
                          "friends",
                          "children of siblings"
                        ],
                        "Security & Wealth": [
                          "securing of savings",
                          "stable financial base",
                          "result or conclusion of efforts"
                        ],
                        "Animals & Livelihood": [
                          "cattle (cows, buffaloes)",
                          "horses",
                          "elephants",
                          "domestic animals for livelihood"
                        ],
                        "Creative & Domestic Arts": [
                          "architecture",
                          "art",
                          "house-building skills",
                          "pavilions",
                          "layout and use of spaces"
                        ],
                        "Challenges": [
                          "false accusations",
                          "loss of home",
                          "tiring or exhausting work"
                        ],
                        "Unique Aspects": [
                          "trust",
                          "noble reputation",
                          "guidance in locating lost or hidden items",
                          "anthills"
                        ]
                      },
                      "astrological info": {
                        "4th Lord (4L)": "Plays a pivotal role in determining sources of emotional comfort and security. Its placement, dignity, and the Bhava it occupies are key",
                        "Planets in 4H": "Influence the nature of one's peace and comforts. When placed in their own, exalted, or friendly signs, they enhance well-being. If debilitated or afflicted by challenging combinations, the associated areas may become sources of discomfort",
                        "Karaka Planets": "Moon – for mother and emotional nourishment; Venus – for conveyances, comforts, and pleasures; Mars – for land and property",
                        "General Rule": "Strong, benefic influences on the 4th house and its lord lead to happiness, prosperity at home, and mental tranquility. Affliction or weakness indicates emotional disturbances or issues related to home and domestic life"
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "house_number": {
                    "type": "integer",
                    "enum": [
                      1,
                      2,
                      3,
                      4,
                      5,
                      6,
                      7,
                      8,
                      9,
                      10,
                      11,
                      12
                    ],
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists. NOTE the config file is named 'house_informations' (plural) while the route is /api/astro/house_information/.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_house_info"
                      ]
                    }
                  }
                },
                "required": [
                  "house_number",
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_house_info"
                ],
                "house_number": 4
              }
            }
          }
        }
      }
    },
    "/api/astro/house_lord_particular_house/": {
      "post": {
        "operationId": "astro_house_lord_particular_house",
        "summary": "House lord placement (one pair)",
        "description": "The lord of a house carries that house's matters wherever it goes, so the classics have a specific statement for each of the 144 combinations — twelve lords in twelve places. This endpoint returns the statement for one pair.\n\nName the house whose lord you mean in house, using this endpoint's Sanskrit bhava names — lagna, dhana, sahaja, sukha, putra, satru, yuvati, randhara, dharma, karma, labha, vyaya for the first through the twelfth — and give the house it is placed in as number, 1 to 12. Note that /api/astro/effect_house_lord_different_house/ covers the same ground with a different set of names and different text; the two are not interchangeable.\n\nNothing is computed from a chart, so no date, time or place is sent — work out the lord's placement yourself first. An unknown house name or an out-of-range number returns HTTP 200 carrying the string 'Invalid key: …' rather than an error status. The single key is get_house_lord.\n\nAvailable `keys` (1), all covered by the same single credit: get_house_lord.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_house_lord": [
                      "Blessed with paternal and maternal happiness",
                      "Gains many brothers, is charming, virtuous, and has a passionate nature"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "house": {
                    "type": "string",
                    "description": "The bhava whose LORD is being placed: lagna = 1st... vyaya = 12th. WARNING: this endpoint uses a DIFFERENT naming set from /api/astro/effect_house_lord_different_house/ - here the 5th/6th/7th/8th/9th are 'putra', 'satru', 'yuvati', 'randhara' (note the extra 'a': randhAra) and 'dharma'. Lowercased by. An unknown value returns 200 with \"Invalid key: <x>\".",
                    "enum": [
                      "lagna",
                      "dhana",
                      "sahaja",
                      "sukha",
                      "putra",
                      "satru",
                      "yuvati",
                      "randhara",
                      "dharma",
                      "karma",
                      "labha",
                      "vyaya"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Array of strings; only one key exists.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "get_house_lord"
                      ]
                    }
                  },
                  "number": {
                    "type": "integer",
                    "description": "Integer 1-12 - the house that lord is placed in. Out-of-range returns 200 with \"Invalid key: <n>\".",
                    "enum": [
                      1,
                      2,
                      3,
                      4,
                      5,
                      6,
                      7,
                      8,
                      9,
                      10,
                      11,
                      12
                    ],
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "house",
                  "keys",
                  "number"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_house_lord"
                ],
                "house": "lagna",
                "number": 4
              }
            }
          }
        }
      }
    },
    "/api/astro/human-design/chart/": {
      "post": {
        "operationId": "astro_human_design_chart",
        "summary": "Human Design bodygraph",
        "description": "The complete Human Design bodygraph, computed from the ephemeris.\n\nHuman Design reads planetary longitudes against a fixed 64-gate wheel derived from the I Ching, twice over. The personality layer is the moment of birth. The design layer is the moment roughly three months earlier when the Sun stood exactly 88 degrees back along the ecliptic — not 88 days: the Earth's orbit is eccentric, so the gap runs from about 86 to 92 days depending on the time of year, and this endpoint solves for the true moment.\n\nReturns thirteen activations for each layer (the ten planets plus Earth, and both lunar nodes), each with its gate, line, gate name and centre. From the union of those gates it reports every one of the 36 channels that is complete, naming which layer supplied each end; all nine centres flagged defined or open; and the type, strategy, inner authority, profile, definition and incarnation cross that follow.\n\nEvery value is a lookup or a graph traversal, so the same birth moment always returns the same chart. What it deliberately does not include is what any of it means — that is authored interpretation, not something an ephemeris can produce.\n\nlatitude and longitude are optional. A bodygraph uses no houses and no angles, so the birthplace never enters the calculation: two people born at the same instant anywhere on Earth have identical charts. Implementations that demand a birthplace imply otherwise.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Human Design"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"birth_datetime_utc\": \"2026-09-01T00:30:00.000Z\", \"design_datetime_utc\": \"2026-06-01T01:52:50.642Z\", \"design_solar_arc_degrees\": 88.0, \"days_between\": 91.942469, \"design\": [{\"body\": \"sun\", \"longitude\": 70.613407, \"gate\": 16, \"line\": 6, \"gate_name\": \"Skills\", \"centre\": \"throat\", \"percent_through_gate\": 86.4606}, {\"body\": \"earth\", \"longitude\": 250.613407, \"gate\": 9, \"line\": 6, \"gate_name\": \"Focus\", \"centre\": \"sacral\", \"percent_through_gate\": 86.4606}, {\"body\": \"north_node\", \"longitude\": 334.170857, \"gate\": 55, \"line\": 5, \"gate_name\": \"Spirit\", \"centre\": \"solar_plexus\", \"percent_through_gate\": 71.9264}, {\"body\": \"south_node\", \"longitude\": 154.170857, \"gate\": 59, \"line\": 5, \"gate_name\": \"Sexuality\", \"centre\": \"sacral\", \"percent_through_gate\": 71.9264}, {\"body\": \"moon\", \"longitude\": 258.409187, \"gate\": 26, \"line\": 2, \"gate_name\": \"The Egoist\", \"centre\": \"will\", \"percent_through_gate\": 25.0522}, {\"body\": \"mercury\", \"longitude\": 89.285947, \"gate\": 15, \"line\": 2, \"gate_name\": \"Extremes\", \"centre\": \"identity\", \"percent_through_gate\": 18.4168}, {\"body\": \"venus\", \"longitude\": 105.487784, \"gate\": 53, \"line\": 1, \"gate_name\": \"Beginnings\", \"centre\": \"root\", \"percent_through_gate\": 6.4495}, {\"body\": \"mars\", \"longitude\": 39.817815, \"gate\": 24, \"line\": 3, \"gate_name\": \"Rationalizing\", \"centre\": \"ajna\", \"percent_through_gate\": 38.9834}, {\"body\": \"jupiter\", \"longitude\": 114.082386, \"gate\": 62, \"line\": 4, \"gate_name\": \"Detail\", \"centre\": \"throat\", \"percent_through_gate\": 59.2424}, {\"body\": \"saturn\", \"longitude\": 12.251159, \"gate\": 21, \"line\": 3, \"gate_name\": \"The Hunter\", \"centre\": \"will\", \"percent_through_gate\": 48.9095}, {\"body\": \"uranus\", \"longitude\": 62.068489, \"gate\": 20, \"line\": 3, \"gate_name\": \"The Now\", \"centre\": \"throat\", \"percent_through_gate\": 34.5509}, {\"body\": \"neptune\", \"longitude\": 4.062081, \"gate\": 17, \"line\": 1, \"gate_name\": \"Opinions\", \"centre\": \"ajna\", \"percent_through_gate\": 3.3259}, {\"body\": \"pluto\", \"longitude\": 305.363473, \"gate\": 41, \"line\": 4, \"gate_name\": \"Contraction\", \"centre\": \"root\", \"percent_through_gate\": 59.7951}], \"personality\": [{\"body\": \"sun\", \"longitude\": 158.613407, \"gate\": 40, \"line\": 4, \"gate_name\": \"Aloneness\", \"centre\": \"will\", \"percent_through_gate\": 50.905}, {\"body\": \"earth\", \"longitude\": 338.613407, \"gate\": 37, \"line\": 4, \"gate_name\": \"Friendship\", \"centre\": \"solar_plexus\", \"percent_through_gate\": 50.905}, {\"body\": \"north_node\", \"longitude\": 329.30287, \"gate\": 30, \"line\": 6, \"gate_name\": \"Recognition of Feelings\", \"centre\": \"solar_plexus\", \"percent_through_gate\": 85.3843}, {\"body\": \"south_node\", \"longitude\": 149.30287, \"gate\": 29, \"line\": 6, \"gate_name\": \"Perseverance\", \"centre\": \"sacral\", \"percent_through_gate\": 85.3843}, {\"body\": \"moon\", \"longitude\": 25.710149, \"gate\": 42, \"line\": 6, \"gate_name\": \"Growth\", \"centre\": \"sacral\", \"percent_through_gate\": 88.1804}, {\"body\": \"mercury\", \"longitude\": 162.740574, \"gate\": 64, \"line\": 2, \"gate_name\": \"Confusion\", \"centre\": \"head\", \"percent_through_gate\": 24.2769}, {\"body\": \"venus\", \"longitude\": 203.188417, \"gate\": 32, \"line\": 3, \"gate_name\": \"Continuity\", \"centre\": \"spleen\", \"percent_through_gate\": 43.3496}, {\"body\": \"mars\", \"longitude\": 103.406817, \"gate\": 39, \"line\": 5, \"gate_name\": \"Provocation\", \"centre\": \"root\", \"percent_through_gate\": 69.4545}, {\"body\": \"jupiter\", \"longitude\": 133.704048, \"gate\": 7, \"line\": 1, \"gate_name\": \"The Role of the Self\", \"centre\": \"identity\", \"percent_through_gate\": 8.072}, {\"body\": \"saturn\", \"longitude\": 13.679498, \"gate\": 21, \"line\": 5, \"gate_name\": \"The Hunter\", \"centre\": \"will\", \"percent_through_gate\": 74.3022}, {\"body\": \"uranus\", \"longitude\": 65.655978, \"gate\": 20, \"line\": 6, \"gate_name\": \"The Now\", \"centre\": \"throat\", \"percent_through_gate\": 98.3285}, {\"body\": \"neptune\", \"longitude\": 3.665567, \"gate\": 25, \"line\": 6, \"gate_name\": \"The Spirit of the Self\", \"centre\": \"identity\", \"percent_through_gate\": 96.2767}, {\"body\": \"pluto\", \"longitude\": 303.511485, \"gate\": 41, \"line\": 2, \"gate_name\": \"Contraction\", \"centre\": \"ro"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/human-design/connection/": {
      "post": {
        "operationId": "astro_human_design_connection",
        "summary": "Connection chart",
        "description": "How two bodygraphs wire together.\n\nEvery channel in the combined chart falls into exactly one of four kinds, decided purely by who holds which gate. Electromagnetic: each person holds one end, so the channel exists only between them. Companionship: both hold both ends, and the meeting adds nothing. Dominance: one holds both ends and the other holds neither. Compromise: one holds both ends and the other holds one of them.\n\nAlso returns the centres the pair define together that neither defines alone — what actually changes when they are in the same room — along with the combined type and definition, and a short summary of each person's own chart.\n\nSend the second person as partner_date_time and partner_timezone_as_float. Birthplaces are not needed for either person, for the same reason as the other Human Design endpoints.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Human Design"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "person_a": {
                      "type": "Generator",
                      "strategy": "To respond",
                      "authority": "Emotional",
                      "profile": "4/6",
                      "definition": "Split Definition"
                    },
                    "person_b": {
                      "type": "Generator",
                      "strategy": "To respond",
                      "authority": "Emotional",
                      "profile": "4/6",
                      "definition": "Split Definition"
                    },
                    "connection": {
                      "electromagnetic": [],
                      "companionship": [
                        {
                          "channel": "17-62",
                          "name": "Acceptance",
                          "gates": [
                            17,
                            62
                          ]
                        },
                        {
                          "channel": "30-41",
                          "name": "Recognition",
                          "gates": [
                            30,
                            41
                          ]
                        },
                        {
                          "channel": "37-40",
                          "name": "Community",
                          "gates": [
                            37,
                            40
                          ]
                        },
                        {
                          "channel": "39-55",
                          "name": "Emoting",
                          "gates": [
                            39,
                            55
                          ]
                        },
                        {
                          "channel": "42-53",
                          "name": "Maturation",
                          "gates": [
                            42,
                            53
                          ]
                        }
                      ],
                      "dominance": [],
                      "compromise": []
                    },
                    "counts": {
                      "electromagnetic": 0,
                      "companionship": 5,
                      "dominance": 0,
                      "compromise": 0
                    },
                    "combined_defined_centres": [
                      "ajna",
                      "root",
                      "sacral",
                      "solar_plexus",
                      "throat",
                      "will"
                    ],
                    "centres_defined_only_together": [],
                    "combined_type": "Generator",
                    "combined_definition": "Split Definition"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "partner_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "partner_timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "partner_date_time",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "partner_date_time": "2026-09-01 06:00:00",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/human-design/properties/": {
      "post": {
        "operationId": "astro_human_design_properties",
        "summary": "Type, strategy and authority",
        "description": "The summary line of a bodygraph: type, strategy, inner authority, profile, definition, signature, not-self theme and incarnation cross, plus which centres and channels are defined.\n\nThe same computation as the full bodygraph with the three long arrays left out — the 26 activations, the per-channel detail and the per-gate detail. Those are most of the response by size and none of it by the time you are rendering ‘you are a Projector with Splenic authority’, which is the first thing almost every Human Design product shows.\n\nRoughly a tenth the size of /chart/ for the same credit. Use /chart/ when you are drawing the bodygraph itself and need the gate positions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Human Design"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "birth_datetime_utc": "2026-09-01T00:30:00.000Z",
                    "design_datetime_utc": "2026-06-01T01:52:50.642Z",
                    "design_solar_arc_degrees": 88,
                    "days_between": 91.942469,
                    "type": "Generator",
                    "strategy": "To respond",
                    "authority": "Emotional",
                    "profile": "4/6",
                    "definition": "Split Definition",
                    "signature": "Satisfaction",
                    "not_self_theme": "Frustration",
                    "incarnation_cross": {
                      "angle": "Right Angle",
                      "gates": {
                        "personality_sun": 40,
                        "personality_earth": 37,
                        "design_sun": 16,
                        "design_earth": 9
                      },
                      "notation": "(40/37 | 16/9)"
                    },
                    "gates": [
                      7,
                      9,
                      15,
                      16,
                      17,
                      20,
                      21,
                      24,
                      25,
                      26,
                      29,
                      30,
                      32,
                      37,
                      39,
                      40,
                      41,
                      42,
                      53,
                      55,
                      59,
                      62,
                      64
                    ],
                    "defined_centres": [
                      "ajna",
                      "throat",
                      "will",
                      "sacral",
                      "solar_plexus",
                      "root"
                    ],
                    "open_centres": [
                      "head",
                      "identity",
                      "spleen"
                    ],
                    "defined_channels": [
                      "17-62",
                      "30-41",
                      "37-40",
                      "39-55",
                      "42-53"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/inauspicious-timings/": {
      "post": {
        "operationId": "astro_inauspicious_timings",
        "summary": "Inauspicious timings",
        "description": "Every period of the day traditionally avoided, in one call: rahu kaal, yamaganda, gulika, durmuhurta, and disha shool, the direction not to travel towards.\n\nThe three kaalams come back as {start, end} like everywhere else. Durmuhurta is flattened: the parent returns two start instants and a single shared length under {first, second, interval}, which is not a shape you can render directly, so this returns a list of the one or two start times plus durmuhurta_length_seconds as a number - the parent gives that length as the string \"2880.0\".\n\nIf you only want rahu kaal, /api/astro/rahu-kaal/ is the smaller call.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "rahu_kaal": {
                      "start": "2026-08-31T15:35:48+05:30",
                      "end": "2026-08-31T17:10:11+05:30"
                    },
                    "yamaganda": {
                      "start": "2026-08-31T09:18:16+05:30",
                      "end": "2026-08-31T10:52:39+05:30"
                    },
                    "gulika": {
                      "start": "2026-08-31T12:27:02+05:30",
                      "end": "2026-08-31T14:01:25+05:30"
                    },
                    "durmuhurta": [
                      "2026-08-31T08:23:54+05:30",
                      "2026-09-01T00:06:10+05:30"
                    ],
                    "durmuhurta_length_seconds": 2880,
                    "disha_shool": "East"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/ishta-kashta-phala/": {
      "post": {
        "operationId": "astro_ishta_kashta_phala",
        "summary": "Ishta phala",
        "description": "Ishta phala: how much good each planet is placed to give, out of sixty virupas.\n\nDerived from a planet's exaltation and motional strength, it is what a strength screen means when it says a planet 'gives good results'. It comes from the same engine as Shadbala without being one of its six components, so /api/astro/shadbala/ does not carry it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Strength (bala)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "scale": "0-60 virupas",
                    "ishta_phala": {
                      "Sun": 30,
                      "Moon": 4,
                      "Mars": 60,
                      "Mercury": 22,
                      "Jupiter": 4,
                      "Venus": 4,
                      "Saturn": 60
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "description": "Ascendant house number. Defaults to 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/iskcon_calendar/": {
      "post": {
        "operationId": "astro_iskcon_calendar",
        "summary": "ISKCON calendar",
        "description": "The Vaishnava calendar kept by ISKCON: a full year of Ekadashis, the appearance and disappearance days of the acharyas, and the major festivals, dated by Gaudiya reckoning rather than the general Hindu one. Months carry the twelve names of Vishnu — Madhava, Govinda, Damodara and the rest — the two fortnights are Krishna and Gaura, and years are counted in the Gaurabda era.\n\nPass a year plus latitude, longitude and UTC offset, since the tithi prevailing at local sunrise decides which civil day an observance falls on. The response is {year, events}, and each event is {name, date, masa, paksa, tithi_number, is_adhika, gaurabda_year} — so you get both the Gregorian date and the Vaishnava coordinates that produced it, with is_adhika marking an event in a leap month.\n\nThe tithi and month arithmetic follows the GCAL specification used by ISKCON's own calendar software, which is deliberately not the sidereal-ephemeris method behind /api/astro/panchanga/; dates can therefore differ by a day from other endpoints here. A year returns several hundred events, so filter or page client-side.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"events\": [{\"name\": \"Shri Krishna Pushya Abhisheka\", \"date\": \"2026-01-03\", \"masa\": \"Narayana\", \"paksa\": \"Gaura\", \"tithi_number\": 15, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Ramachandra Kaviraja - Disappearance\", \"date\": \"2026-01-07\", \"masa\": \"Madhava\", \"paksa\": \"Krishna\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrila Gopala Bhatta Goswami - Appearance\", \"date\": \"2026-01-07\", \"masa\": \"Madhava\", \"paksa\": \"Krishna\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Jayadeva Goswami - Disappearance\", \"date\": \"2026-01-08\", \"masa\": \"Madhava\", \"paksa\": \"Krishna\", \"tithi_number\": 6, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Lochana Dasa Thakura - Disappearance\", \"date\": \"2026-01-09\", \"masa\": \"Madhava\", \"paksa\": \"Krishna\", \"tithi_number\": 7, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shat Tila Ekadashi\", \"date\": \"2026-01-14\", \"masa\": \"Madhava\", \"paksa\": \"Krishna\", \"tithi_number\": 11, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Sarasvati Puja\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Pundarika Vidyanidhi - Appearance\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Raghunandana Thakura - Appearance\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrila Raghunatha Dasa Goswami - Appearance\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrila Vishwanatha Chakravarti Thakura - Disappearance\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrimati Vishnupriya Devi - Appearance\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Vasanta Panchami\", \"date\": \"2026-01-23\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Advaita Acharya - Appearance\", \"date\": \"2026-01-25\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 7, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Bhishmashtami\", \"date\": \"2026-01-26\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 8, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Madhvacharya - Disappearance\", \"date\": \"2026-01-27\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 9, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Ramanujacharya - Disappearance\", \"date\": \"2026-01-28\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 10, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Bhaimi Ekadashi\", \"date\": \"2026-01-29\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 11, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Varaha Dwadashi\", \"date\": \"2026-01-30\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 12, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Nityananda Trayodashi\", \"date\": \"2026-01-31\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 13, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Krishna Madhura Utsava\", \"date\": \"2026-02-01\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 15, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrila Narottama Dasa Thakura - Appearance\", \"date\": \"2026-02-01\", \"masa\": \"Madhava\", \"paksa\": \"Gaura\", \"tithi_number\": 15, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shri Purushottama Dasa Thakura - Disappearance\", \"date\": \"2026-02-06\", \"masa\": \"Govinda\", \"paksa\": \"Krishna\", \"tithi_number\": 5, \"is_adhika\": false, \"gaurabda_year\": 539}, {\"name\": \"Shrila Bhaktisiddhanta Sarasvati Thakura - Appearance\", \"date\": \"2026-02-06\", \"masa\": \"Govinda\", \"paksa\": \"Krishna\", \"tithi_"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/kaala-bala-components/": {
      "post": {
        "operationId": "astro_kaala_bala_components",
        "summary": "Kaala bala components",
        "description": "The nine sub-balas that Kaala Bala — strength from time — is the sum of.\n\n/api/astro/shadbala/ publishes the total. This publishes what it is made of, which is what you need to say WHY a planet is temporally strong: the lunar fortnight, the planetary hour, the weekday, the month, the year, the third of day or night, declination, and any planetary war it is losing.\n\nThe weekday, month and year lords come with them, because a score of 15 for Mercury in abda bala means nothing until you know who holds the year.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Strength (bala)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "components": [
                      {
                        "bala": "nathonnath_bala",
                        "measures": "Day or night strength",
                        "by_planet": {
                          "Sun": 70,
                          "Moon": -10,
                          "Mars": -10,
                          "Mercury": 60,
                          "Jupiter": 70,
                          "Venus": 70,
                          "Saturn": -10
                        }
                      },
                      {
                        "bala": "paksha_bala",
                        "measures": "Lunar fortnight strength",
                        "by_planet": {
                          "Sun": -2.86,
                          "Moon": 125.72,
                          "Mars": -2.86,
                          "Mercury": 62.86,
                          "Jupiter": 62.86,
                          "Venus": 62.86,
                          "Saturn": -2.86
                        }
                      },
                      {
                        "bala": "tribhaga_bala",
                        "measures": "Strength by third of day or night",
                        "by_planet": {
                          "Sun": 60,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 0,
                          "Jupiter": 60,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "ayana_bala",
                        "measures": "Declination strength",
                        "by_planet": {
                          "Sun": 104.12,
                          "Moon": 0.52,
                          "Mars": 46.65,
                          "Mercury": 31.73,
                          "Jupiter": 21.97,
                          "Venus": 59.12,
                          "Saturn": 6.15
                        }
                      },
                      {
                        "bala": "hora_bala",
                        "measures": "Strength in the planetary hour",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 60,
                          "Mars": 0,
                          "Mercury": 0,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "vaara_bala",
                        "measures": "Strength on the weekday",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 45,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "masa_bala",
                        "measures": "Strength in the month",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 30,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "abda_bala",
                        "measures": "Strength in the year",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 15,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "yuddha_bala",
                        "measures": "Planetary war adjustment",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 0,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      }
                    ],
                    "lords": [
                      {
                        "lord_of": "Lord of the weekday",
                        "key": "vaaradhipathi",
                        "planet": "Jupiter",
                        "value": 45
                      },
                      {
                        "lord_of": "Lord of the month",
                        "key": "masadhipathi",
                        "planet": "Mars",
                        "value": 30
                      },
                      {
                        "lord_of": "Lord of the year",
                        "key": "abdadhipathi",
                        "planet": "Moon",
                        "value": 15
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "description": "Ascendant house number. Defaults to 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/kalsarp/": {
      "post": {
        "operationId": "astro_kalsarp",
        "summary": "Kala Sarpa yoga",
        "description": "Whether the chart forms Kala Sarpa — all seven grahas from the Sun to Saturn hemmed into one of the two semicircles the Rahu–Ketu axis cuts the zodiac into — and, when it does, which of the twelve named forms it is.\n\nMost charts are NOT Kala Sarpa: a single graha on the far side of the axis breaks it. So this does not return a bare yes or no. `between_rahu_and_ketu` and `between_ketu_and_rahu` list which grahas fell on which side, which is what lets you see why the answer came out the way it did — and it is the difference between a chart that misses by one graha and one that misses by four.\n\nThe twelve names (Anant, Kulik, Vasuki, Shankhpal, Padma, Mahapadma, Takshak, Karkotak, Shankhachud, Ghatak, Vishdhar, Sheshnag) are decided by the house Rahu occupies, and `name` is only filled in when the yoga is actually formed — never for a chart that merely came close.\n\nA graha sitting within one degree of either node belongs to neither side. Those are listed in `conjunct_a_node` and set `partial` rather than being pushed onto one side to force a verdict.\n\nPositions come from the same engine as /api/astro/planet-positions/, so the longitudes are identical by construction.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Yogas & doshas"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "yoga": "Kala Sarpa",
                    "formed": false,
                    "partial": false,
                    "name": null,
                    "rahu_house": 5,
                    "rahu_longitude": 283.503,
                    "ketu_longitude": 103.503,
                    "between_rahu_and_ketu": [
                      "moon",
                      "mars",
                      "jupiter",
                      "venus"
                    ],
                    "between_ketu_and_rahu": [
                      "sun",
                      "mercury",
                      "saturn"
                    ],
                    "conjunct_a_node": [],
                    "direction": null,
                    "note": "Formed when all seven grahas fall in one of the two semicircles the Rahu-Ketu axis makes. A graha within 1.0 degree of a node is listed under conjunct_a_node rather than assigned a side, and makes the yoga partial rather than formed."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/kannada_calendar/": {
      "post": {
        "operationId": "astro_kannada_calendar",
        "summary": "Kannada calendar",
        "description": "A year of festivals and observances as kept in Karnataka. The Kannada calendar is amanta luni-solar on the Shaka era — months run from one new moon to the next — and its festival set covers the Ekadashis, the twelve Sankrantis, eclipses, and the regional days: Yugadi, Gowri Habba, Kamanahabba, the Karaga festival, Sakat and Karwa Chauth.\n\nPass year with latitude, longitude and UTC offset. The place matters because several observances are fixed by the tithi at sunrise or by moonrise. The response is {year, events} with each event {name, date}, in date order, typically well over a hundred entries. Eclipse rows carry a type suffix, for example 'Surya Grahan *Valayakara'.\n\nThe year must be between 2006 and 2046.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"events\": [{\"name\": \"Sakat Chauth\", \"date\": \"2026-01-06\"}, {\"name\": \"Shattila Ekadashi\", \"date\": \"2026-01-14\"}, {\"name\": \"Makara Sankranti\", \"date\": \"2026-01-14\"}, {\"name\": \"Pongal\", \"date\": \"2026-01-14\"}, {\"name\": \"Mauni Amavas\", \"date\": \"2026-01-18\"}, {\"name\": \"Vasant Panchami\", \"date\": \"2026-01-23\"}, {\"name\": \"Ratha Saptami\", \"date\": \"2026-01-25\"}, {\"name\": \"Bhishma Ashtami\", \"date\": \"2026-01-26\"}, {\"name\": \"Jaya Ekadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Vijaya Ekadashi\", \"date\": \"2026-02-13\"}, {\"name\": \"Kumbha Sankranti\", \"date\": \"2026-02-13\"}, {\"name\": \"Maha Shivaratri\", \"date\": \"2026-02-15\"}, {\"name\": \"Surya Grahan *Valayakara\", \"date\": \"2026-02-17\"}, {\"name\": \"Amalaki Ekadashi\", \"date\": \"2026-02-27\"}, {\"name\": \"Chandra Grahan *Purna\", \"date\": \"2026-03-03\"}, {\"name\": \"Holi Hunnime\", \"date\": \"2026-03-03\"}, {\"name\": \"Kamanahabba\", \"date\": \"2026-03-03\"}, {\"name\": \"Holi\", \"date\": \"2026-03-04\"}, {\"name\": \"Sheetala Ashtami\", \"date\": \"2026-03-11\"}, {\"name\": \"Basoda\", \"date\": \"2026-03-11\"}, {\"name\": \"Papamochani Ekadashi\", \"date\": \"2026-03-15\"}, {\"name\": \"Meena Sankranti\", \"date\": \"2026-03-15\"}, {\"name\": \"Nutan Varsh Prarambha\", \"date\": \"2026-03-19\"}, {\"name\": \"Gudi Padwa\", \"date\": \"2026-03-19\"}, {\"name\": \"Chaitra Navratri\", \"date\": \"2026-03-19\"}, {\"name\": \"Yugadi\", \"date\": \"2026-03-19\"}, {\"name\": \"Gauri Puja\", \"date\": \"2026-03-21\"}, {\"name\": \"Soubhagya Gauri Vrat\", \"date\": \"2026-03-21\"}, {\"name\": \"Yamuna Chhath\", \"date\": \"2026-03-24\"}, {\"name\": \"Shri Rama Navami\", \"date\": \"2026-03-26\"}, {\"name\": \"Swaminarayan Jayanti\", \"date\": \"2026-03-27\"}, {\"name\": \"Kamada Ekadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Karaga Festival\", \"date\": \"2026-04-02\"}, {\"name\": \"Hanuman Jayanti\", \"date\": \"2026-04-02\"}, {\"name\": \"Hanuman Janmotsava\", \"date\": \"2026-04-02\"}, {\"name\": \"Varuthini Ekadashi\", \"date\": \"2026-04-13\"}, {\"name\": \"Mesha Sankranti\", \"date\": \"2026-04-14\"}, {\"name\": \"Solar New Year\", \"date\": \"2026-04-14\"}, {\"name\": \"Parashurama Jayanti\", \"date\": \"2026-04-19\"}, {\"name\": \"Akshaya Tritiya\", \"date\": \"2026-04-19\"}, {\"name\": \"Ganga Saptami\", \"date\": \"2026-04-23\"}, {\"name\": \"Sita Navami\", \"date\": \"2026-04-25\"}, {\"name\": \"Mohini Ekadashi\", \"date\": \"2026-04-27\"}, {\"name\": \"Narasimha Jayanti\", \"date\": \"2026-04-30\"}, {\"name\": \"Buddha Purnima\", \"date\": \"2026-05-01\"}, {\"name\": \"Narada Jayanti\", \"date\": \"2026-05-02\"}, {\"name\": \"Apara Ekadashi\", \"date\": \"2026-05-13\"}, {\"name\": \"Vrishabha Sankranti\", \"date\": \"2026-05-15\"}, {\"name\": \"Vat Savitri Vrat\", \"date\": \"2026-05-16\"}, {\"name\": \"Shani Jayanti\", \"date\": \"2026-05-16\"}, {\"name\": \"Ganga Dussehra\", \"date\": \"2026-05-25\"}, {\"name\": \"Parama Ekadashi\", \"date\": \"2026-06-11\"}, {\"name\": \"Mithuna Sankranti\", \"date\": \"2026-06-15\"}, {\"name\": \"Nirjala Ekadashi\", \"date\": \"2026-06-25\"}, {\"name\": \"Vat Purnima Vrat\", \"date\": \"2026-06-29\"}, {\"name\": \"Yogini Ekadashi\", \"date\": \"2026-07-10\"}, {\"name\": \"Gauna Yogini Ekadashi\", \"date\": \"2026-07-11\"}, {\"name\": \"Karka Sankranti\", \"date\": \"2026-07-16\"}, {\"name\": \"Jagannath Rathyatra\", \"date\": \"2026-07-16\"}, {\"name\": \"Devshayani Ekadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Guru Purnima\", \"date\": \"2026-07-29\"}, {\"name\": \"Kamika Ekadashi\", \"date\": \"2026-08-09\"}, {\"name\": \"Surya Grahan *Purna\", \"date\": \"2026-08-12\"}, {\"name\": \"Hariyali Teej\", \"date\": \"2026-08-15\"}, {\"name\": \"Simha Sankranti\", \"date\": \"2026-08-17\"}, {\"name\": \"Nagara Panchami\", \"date\": \"2026-08-17\"}, {\"name\": \"Shravana Putrada Ekadashi\", \"date\": \"2026-08-23\"}, {\"name\": \"Onam\", \"date\": \"2026-08-26\"}, {\"name\": \"Varalakshmi Vrat\", \"date\": \"2026-08-28\"}, {\"name\": \"Chandra Grahan *Anshika\", \"date\": \"2026-08-28\"}, {\"name\": \"Raksha Bandhan\", \"date\": \"2026-08-28\"}, {\"name\": \"Rakhi\", \"date\": \"2026-08-28\"}, {\"name\": \"Gayatri Jayanti\", \"date\": \"2026-08-28\"}, {\"name\": \"Kajari Teej\", \"date\": \"2026-08-31\"}, {\"name\": \"Krishna Janmashtami\", \"date\": \"2026-09-04\"}, {\"name\": \"Aja Ekadashi\", \"date\": \"2026-09-07\"}, {\"name\": \"Hartalika Teej\", \"date\": \"2026-09-14\"}, {\"name\": \"Gowri Habba\", \"date\": \"2026-09-14\"}, "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/karakamsa/": {
      "post": {
        "operationId": "astro_karakamsa",
        "summary": "Karakamsa (swamsa)",
        "description": "The sign the Atmakaraka occupies in the navamsa — the seat Jaimini readings of character and destiny are taken from, rather than the rashi lagna.\n\nTwo charts are needed to reach it: the rashi, to find which graha is Atmakaraka, and the navamsa, to see where that graha sits. Both are returned, along with the full eight-karaka ranking, so the answer can be checked rather than taken on trust.\n\nThe Atmakaraka is the graha standing furthest through its own sign. Rahu is measured backwards, because it moves backwards; Ketu takes no part in the scheme.\n\nNOTE: this ranks the karakas by degree WITHIN the sign, and will name a different Atmakaraka from /api/astro/chara-karakas/ for most charts. The two are computed differently and are not interchangeable — prefer this one for karakamsa work.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Jaimini"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "jaimini",
                    "atmakaraka": "sun",
                    "atmakaraka_rashi": "Cancer",
                    "atmakaraka_degree_in_sign": 28.395,
                    "karakamsa": "Pisces",
                    "karakamsa_house": 12,
                    "also_called": "swamsa",
                    "navamsa_longitude": 345.5525,
                    "karakas": [
                      {
                        "karaka": "atma_karaka",
                        "signifies": "Self",
                        "planet": "sun",
                        "degree_in_sign": 28.395
                      },
                      {
                        "karaka": "amatya_karaka",
                        "signifies": "Career and counsel",
                        "planet": "mars",
                        "degree_in_sign": 27.487
                      },
                      {
                        "karaka": "bhratri_karaka",
                        "signifies": "Siblings",
                        "planet": "saturn",
                        "degree_in_sign": 26.148
                      },
                      {
                        "karaka": "maitri_karaka",
                        "signifies": "Friends",
                        "planet": "mercury",
                        "degree_in_sign": 25.446
                      },
                      {
                        "karaka": "pitri_karaka",
                        "signifies": "Father",
                        "planet": "moon",
                        "degree_in_sign": 18.93
                      },
                      {
                        "karaka": "putra_karaka",
                        "signifies": "Children",
                        "planet": "rahu",
                        "degree_in_sign": 16.497
                      },
                      {
                        "karaka": "jnaati_karaka",
                        "signifies": "Kin and obstacles",
                        "planet": "venus",
                        "degree_in_sign": 7.843
                      },
                      {
                        "karaka": "dara_karaka",
                        "signifies": "Spouse",
                        "planet": "jupiter",
                        "degree_in_sign": 5.607
                      }
                    ],
                    "note": "The Atmakaraka is the graha with the highest degree WITHIN its sign; Rahu is measured in reverse and Ketu excluded. Karakamsa is that graha's NAVAMSA sign, not its rashi. This ranking is computed from degree within the sign and will differ from /api/astro/chara-karakas/."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/karana/": {
      "post": {
        "operationId": "astro_karana",
        "summary": "Karana",
        "description": "The karana in force - half a tithi - and every one touching the day.\n\nEleven karanas cycle through the month: seven moveable ones repeat eight times each, and four fixed ones occur once. Each covers six degrees of the moon-minus-sun elongation, so two karanas fall inside every tithi.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "current": "Balava",
                    "current_hi": "बालव",
                    "segments": [
                      {
                        "name": "Balava",
                        "start_time": "2026-08-31T14:50:16Z",
                        "end_time": "2026-09-01T02:12:57Z",
                        "name_hi": "बालव"
                      },
                      {
                        "name": "Kaulava",
                        "start_time": "2026-09-01T02:12:57Z",
                        "end_time": "2026-09-01T13:30:36Z",
                        "name_hi": "कौलव"
                      },
                      {
                        "name": "Taitula",
                        "start_time": "2026-09-01T13:30:36Z",
                        "end_time": "2026-09-02T00:43:35Z",
                        "name_hi": "तैतिल"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/karana_scan/": {
      "post": {
        "operationId": "astro_karana_scan",
        "summary": "Karana scan",
        "description": "A karana is half a tithi — six degrees of the Moon's separation from the Sun, roughly eleven to thirteen hours. There are eleven names: seven movable ones that each repeat eight times through a lunar month, and four fixed ones that occur once each. Vishti, usually called Bhadra, is the one that is avoided.\n\nThis endpoint finds every occurrence of one named karana across a whole calendar year, so you can build a 'when is the next Vishti' list without walking the year day by day. Pass karana_name exactly as spelt in the field's list (it is case-sensitive), year, and timezone_as_float; the offset defines where the local year begins and ends. No latitude or longitude is needed, because a karana is a purely lunar quantity.\n\nThe response is {year, karana_name, rows}, where rows is a chronological list of {start, end} timestamps in UTC. A fixed karana yields about twelve rows a year and a movable one closer to a hundred. For the karanas of a single day, use the karana_segments key on /api/astro/panchanga/ instead.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "karana_name": "Kimstughna",
                    "rows": [
                      {
                        "start": "2026-01-18T19:52:39+00:00",
                        "end": "2026-01-19T08:22:04+00:00"
                      },
                      {
                        "start": "2026-02-17T12:01:47+00:00",
                        "end": "2026-02-17T23:48:42+00:00"
                      },
                      {
                        "start": "2026-03-19T01:24:05+00:00",
                        "end": "2026-03-19T12:26:49+00:00"
                      },
                      {
                        "start": "2026-04-17T11:52:21+00:00",
                        "end": "2026-04-17T22:18:56+00:00"
                      },
                      {
                        "start": "2026-05-16T20:01:32+00:00",
                        "end": "2026-05-17T06:07:05+00:00"
                      },
                      {
                        "start": "2026-06-15T02:54:39+00:00",
                        "end": "2026-06-15T12:57:08+00:00"
                      },
                      {
                        "start": "2026-07-14T09:44:04+00:00",
                        "end": "2026-07-14T20:00:36+00:00"
                      },
                      {
                        "start": "2026-08-12T17:37:11+00:00",
                        "end": "2026-08-13T04:21:33+00:00"
                      },
                      {
                        "start": "2026-09-11T03:27:28+00:00",
                        "end": "2026-09-11T14:48:43+00:00"
                      },
                      {
                        "start": "2026-10-10T15:50:36+00:00",
                        "end": "2026-10-11T03:52:40+00:00"
                      },
                      {
                        "start": "2026-11-09T07:02:42+00:00",
                        "end": "2026-11-09T19:43:50+00:00"
                      },
                      {
                        "start": "2026-12-09T00:52:31+00:00",
                        "end": "2026-12-09T14:03:05+00:00"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "karana_name": {
                    "type": "string",
                    "enum": [
                      "Kimstughna",
                      "Bava",
                      "Balava",
                      "Kaulava",
                      "Taitula",
                      "Garaja",
                      "Vanija",
                      "Vishti",
                      "Shakuni",
                      "Chatushpada",
                      "Naga"
                    ],
                    "examples": [
                      "Kimstughna"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "karana_name",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "karana_name": "Kimstughna",
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/khavedamsa/": {
      "post": {
        "operationId": "astro_khavedamsa",
        "summary": "Khavedamsa (D40)",
        "description": "The khavedamsa, the fortieth divisional chart: each sign divided into forty parts of 45' each.\n\nRead for maternal legacy - the auspicious and inauspicious effects carried down the mother's line.\n\nAT 45' PER DIVISION this chart is sensitive to birth-time accuracy: roughly three minutes of clock error can move a fast-moving planet into the next division.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/kp-chart/": {
      "post": {
        "operationId": "astro_kp_chart",
        "summary": "KP chart (cusps, signs and planets)",
        "description": "A Krishnamurti Paddhati chart as named parts rather than one opaque blob.\n\nKP is its own tradition with a large following, and until now the whole chart came back only if you already knew five key names to ask for. This returns the ascendant, the twelve house cusps with their start, middle and end, the sign on each cusp, every planet's longitude, and which house each planet falls in.\n\nKP uses Placidus cusps on a sidereal zodiac, which is why its house placements differ from /api/astro/chart/ for the same birth. That is the system working as intended, not a disagreement between the two endpoints.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "KP (Krishnamurti Paddhati)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "krishnamurti_paddhati",
                    "ascendant": 216.7733892763535,
                    "houses": [
                      {
                        "house": 1,
                        "sign": "Sc",
                        "start": 216.7733892763535,
                        "middle": 231.85829168898027,
                        "end": 246.94319410160705
                      },
                      {
                        "house": 2,
                        "sign": "Sg",
                        "start": 246.94319410160705,
                        "middle": 263.38929149306404,
                        "end": 279.835388884521
                      },
                      {
                        "house": 3,
                        "sign": "Cp",
                        "start": 279.835388884521,
                        "middle": 296.8815490763593,
                        "end": 313.92770926819765
                      },
                      {
                        "house": 4,
                        "sign": "Aq",
                        "start": 313.92770926819765,
                        "middle": 329.81303441531793,
                        "end": 345.69835956243827
                      },
                      {
                        "house": 5,
                        "sign": "Pi",
                        "start": 345.69835956243827,
                        "middle": 179.37096263847687,
                        "end": 13.043565714515491
                      },
                      {
                        "house": 6,
                        "sign": "Ar",
                        "start": 13.043565714515491,
                        "middle": 24.90847749543448,
                        "end": 36.77338927635347
                      },
                      {
                        "house": 7,
                        "sign": "Ta",
                        "start": 36.77338927635347,
                        "middle": 51.858291688980245,
                        "end": 66.94319410160702
                      },
                      {
                        "house": 8,
                        "sign": "Ge",
                        "start": 66.94319410160702,
                        "middle": 83.38929149306404,
                        "end": 99.83538888452104
                      },
                      {
                        "house": 9,
                        "sign": "Cn",
                        "start": 99.83538888452104,
                        "middle": 116.88154907635936,
                        "end": 133.92770926819765
                      },
                      {
                        "house": 10,
                        "sign": "Le",
                        "start": 133.92770926819765,
                        "middle": 149.813034415318,
                        "end": 165.6983595624383
                      },
                      {
                        "house": 11,
                        "sign": "Vi",
                        "start": 165.6983595624383,
                        "middle": 179.3709626384769,
                        "end": 193.04356571451547
                      },
                      {
                        "house": 12,
                        "sign": "Li",
                        "start": 193.04356571451547,
                        "middle": 204.90847749543448,
                        "end": 216.7733892763535
                      }
                    ],
                    "planet_longitudes": {
                      "sun": 25.059,
                      "moon": 213.651,
                      "mercury": 14.844,
                      "venus": 342.642,
                      "mars": 320.082,
                      "jupiter": 74.022,
                      "saturn": 270.704,
                      "uranus": 254.688,
                      "neptune": 259.811,
                      "pluto": 201.695,
                      "northtruenode": 286.265,
                      "northmeannode": 286.99,
                      "southtruenode": 106.265,
                      "southmeannode": 106.99
                    },
                    "planet_houses": {
                      "sun": 6,
                      "moon": 12,
                      "mercury": 6,
                      "venus": 4,
                      "mars": 4,
                      "jupiter": 8,
                      "saturn": 2,
                      "uranus": 2,
                      "neptune": 2,
                      "pluto": 12,
                      "northtruenode": 3,
                      "northmeannode": 3,
                      "southtruenode": 9,
                      "southmeannode": 9
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "new_start": {
                    "type": "integer",
                    "description": "Cusp adjustment start, passed straight through to the engine.",
                    "default": 50,
                    "examples": [
                      0
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "default": "degree",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "notation": "degree",
                "new_start": 50
              }
            }
          }
        }
      }
    },
    "/api/astro/krishnamurti/": {
      "post": {
        "operationId": "astro_krishnamurti",
        "summary": "KP parts (pick with keys)",
        "description": "Krishnamurti Paddhati is the South Indian school that reads a chart from house cusps rather than whole signs. This endpoint builds a KP framework: Placidus cusps, each house running from its own cusp to the next house's cusp, and every body assigned to whichever of those spans its longitude falls in.\n\nUse ascendant, houses, house_rashis, planet_houses and planet_longs to read the chart. Two of them, ascendant and planet_longs, need the notation field: send 'astrological' for sign-and-degree objects, or 'degree' for raw decimal degrees.\n\nadjust_houses is different in kind. It is a mutator: it moves the whole framework so the first house begins at the longitude you give in new_start, keeps each house's original width, and recomputes the house signs and planet placements. It returns null itself, and because keys are executed in the order you list them, it has to appear first in the keys array for the other keys in the same call to reflect the shift. This is how a KP practitioner rectifies a birth time by nudging the ascendant.\n\nAvailable `keys` (6), all covered by the same single credit: adjust_houses, ascendant, house_rashis, houses, planet_houses, planet_longs.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "KP (Krishnamurti Paddhati)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "adjust_houses": null
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "new_start": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "description": "Required by the 'ascendant', 'houses' and 'planet_longs' keys. 'astrological' converts longitudes to sign+degree form; any other value (conventionally 'degree', the engine default) returns raw decimal degrees. No exception is raised for other values.",
                    "enum": [
                      "degree",
                      "astrological"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "new_start",
                  "notation",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "adjust_houses"
                ],
                "latitude": 26.1046,
                "longitude": 74.319,
                "timezone_as_float": 5.5,
                "new_start": 50,
                "notation": "degree",
                "date_time": "2026-09-01T06:00:00+05:30"
              }
            }
          }
        }
      }
    },
    "/api/astro/lagna/": {
      "post": {
        "operationId": "astro_lagna",
        "summary": "Special lagnas",
        "description": "The special ascendants: the five fast-moving lagnas and Sree Lagna.\n\nBhava, Hora, Ghatika and the rest advance faster than the rising sign and are all measured from sunrise, so they depend on the exact time far more than the ascendant does. Sree Lagna, the prosperity point, is the ascendant advanced by the fraction of its nakshatra the Moon has covered.\n\nEach is returned in degree, sign, minute and second form with its nakshatra and pada.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "lagnas": {
                      "Bhava Lagna": {
                        "degree": 11,
                        "sign": "Le",
                        "minutes": 2,
                        "seconds": 45,
                        "nakshatra": "Makha",
                        "pada": 4
                      },
                      "Hora Lagna": {
                        "degree": 8,
                        "sign": "Le",
                        "minutes": 40,
                        "seconds": 15,
                        "nakshatra": "Makha",
                        "pada": 3
                      },
                      "Ghati Lagna": {
                        "degree": 1,
                        "sign": "Le",
                        "minutes": 32,
                        "seconds": 45,
                        "nakshatra": "Makha",
                        "pada": 1
                      },
                      "Indu Lagna": {
                        "degree": 1,
                        "sign": "Cn",
                        "minutes": 28,
                        "seconds": 40,
                        "nakshatra": "Punarvasu",
                        "pada": 4
                      },
                      "Bhrigu Lagna": {
                        "degree": 3,
                        "sign": "Pi",
                        "minutes": 16,
                        "seconds": 27,
                        "nakshatra": "Poorvaabhaadra",
                        "pada": 4
                      }
                    },
                    "sree_lagna": {
                      "degree": 22,
                      "sign": "Vi",
                      "minutes": 5,
                      "seconds": 37,
                      "nakshatra": "Hasta",
                      "pada": 4
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/lal-kitab/chart/": {
      "post": {
        "operationId": "astro_lal_kitab_chart",
        "summary": "Lal Kitab chart",
        "description": "The Lal Kitab kundli: the nine grahas placed in the fixed houses, with each one's pakka ghar.\n\nLal Kitab fixes the houses to the signs: house 1 is ALWAYS Aries, house 2 always Taurus, through to house 12 always Pisces — for every chart, whoever the native is. A planet's house is therefore its sign number, and the ascendant does not move the houses the way it does in Parashari astrology.\n\nThis means these endpoints will disagree with /api/astro/chart/ and /api/astro/planet-positions/ for almost everyone. That is the system, not an error: they are two different traditions answering two different questions.\n\nEvery planet comes back with its pakka ghar — the permanent house Lal Kitab assigns it, which is not the same as its sign rulership. Venus rules Taurus and Libra in Parashari, but its pakka ghar is the 7th alone. A graha sitting in its own pakka ghar is said to be awake and able to act fully; `in_pakka_ghar` tells you which are.\n\nThe positions underneath come from the same engine as /api/astro/planet-positions/, so the longitudes are identical — only the arrangement into houses differs.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Lal Kitab"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Lal Kitab",
                    "house_system": "fixed",
                    "note": "Houses are fixed to signs: house 1 is always Aries. A planet's house is its sign number, and the ascendant does not move the houses.",
                    "ascendant": {
                      "longitude": 177.7489463338338,
                      "zodiac_name": "Virgo",
                      "nakshatra": "Chitra",
                      "pada": 2
                    },
                    "planets": [
                      {
                        "planet": "sun",
                        "sign": "Cancer",
                        "house": 4,
                        "longitude": 118.395,
                        "nakshatra": "Aasresha",
                        "pakka_ghar": [
                          1
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "moon",
                        "sign": "Taurus",
                        "house": 2,
                        "longitude": 48.93,
                        "nakshatra": "Rohini",
                        "pakka_ghar": [
                          4
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "mars",
                        "sign": "Aries",
                        "house": 1,
                        "longitude": 27.487,
                        "nakshatra": "Krittika",
                        "pakka_ghar": [
                          3,
                          8
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "mercury",
                        "sign": "Leo",
                        "house": 5,
                        "longitude": 145.446,
                        "nakshatra": "Poorva Phalguni",
                        "pakka_ghar": [
                          6,
                          7
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "jupiter",
                        "sign": "Cancer",
                        "house": 4,
                        "longitude": 95.607,
                        "nakshatra": "Pushyami",
                        "pakka_ghar": [
                          2,
                          5,
                          9,
                          12
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "venus",
                        "sign": "Cancer",
                        "house": 4,
                        "longitude": 97.843,
                        "nakshatra": "Pushyami",
                        "pakka_ghar": [
                          7
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "saturn",
                        "sign": "Sagittarius",
                        "house": 9,
                        "longitude": 266.148,
                        "nakshatra": "Poorvaashaadha",
                        "pakka_ghar": [
                          8,
                          10,
                          11
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "rahu",
                        "sign": "Capricorn",
                        "house": 10,
                        "longitude": 283.503,
                        "nakshatra": "Sravanam",
                        "pakka_ghar": [
                          12
                        ],
                        "in_pakka_ghar": false
                      },
                      {
                        "planet": "ketu",
                        "sign": "Cancer",
                        "house": 4,
                        "longitude": 103.503,
                        "nakshatra": "Pushyami",
                        "pakka_ghar": [
                          6
                        ],
                        "in_pakka_ghar": false
                      }
                    ],
                    "houses": [
                      {
                        "house": 1,
                        "sign": "Aries",
                        "planets": [
                          "mars"
                        ]
                      },
                      {
                        "house": 2,
                        "sign": "Taurus",
                        "planets": [
                          "moon"
                        ]
                      },
                      {
                        "house": 3,
                        "sign": "Gemini",
                        "planets": []
                      },
                      {
                        "house": 4,
                        "sign": "Cancer",
                        "planets": [
                          "sun",
                          "jupiter",
                          "venus",
                          "ketu"
                        ]
                      },
                      {
                        "house": 5,
                        "sign": "Leo",
                        "planets": [
                          "mercury"
                        ]
                      },
                      {
                        "house": 6,
                        "sign": "Virgo",
                        "planets": []
                      },
                      {
                        "house": 7,
                        "sign": "Libra",
                        "planets": []
                      },
                      {
                        "house": 8,
                        "sign": "Scorpio",
                        "planets": []
                      },
                      {
                        "house": 9,
                        "sign": "Sagittarius",
                        "planets": [
                          "saturn"
                        ]
                      },
                      {
                        "house": 10,
                        "sign": "Capricorn",
                        "planets": [
                          "rahu"
                        ]
                      },
                      {
                        "house": 11,
                        "sign": "Aquarius",
                        "planets": []
                      },
                      {
                        "house": 12,
                        "sign": "Pisces",
                        "planets": []
                      }
                    ],
                    "in_pakka_ghar": []
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Ayanamsa for the underlying sidereal positions. Lal Kitab itself is house-based and does not prescribe one; this is passed through to the position engine.",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lal-kitab/horoscope/": {
      "post": {
        "operationId": "astro_lal_kitab_horoscope",
        "summary": "Lal Kitab chart layout",
        "description": "The Lal Kitab chart as twelve sign-slots, ready to draw.\n\nThe same arrangement /api/astro/lal-kitab/chart/ returns, turned inside out: that endpoint is a list of grahas each carrying its house, this one is a list of the twelve houses each carrying its occupants, their two-letter forms and their degrees. `planet_degree` is the position WITHIN the sign, which is what a chart is drawn from - a graha at 118.395 absolute sits at 28.395 of Cancer.\n\nIN LAL KITAB THE HOUSES ARE FIXED TO THE SIGNS: house 1 is always Aries, through to house 12 always Pisces, for every chart. So `sign` and `house` are the same number. The ascendant is reported but does not move the houses, and these will therefore disagree with /api/astro/chart/ for almost every native. That is the system, not an error.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Lal Kitab"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Ayanamsa for the underlying sidereal positions. Lal Kitab itself is house-based and does not prescribe one; this is passed through to the position engine.",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lal-kitab/houses/": {
      "post": {
        "operationId": "astro_lal_kitab_houses",
        "summary": "Lal Kitab houses",
        "description": "The twelve Lal Kitab houses: each one's lord (maalik), the grahas whose pakka ghar it is, the grahas exalted and debilitated in it, and who is actually sitting there.\n\nMOST OF THIS RESPONSE IS THE SAME FOR EVERY NATIVE, and `is_chart_dependent` says which fields are which. Because the houses are fixed to the signs, a house's lord, its pakka ghar and its exaltations are properties of the SIGN, not of the chart - only `planets` comes from the birth details.\n\n`pakka_ghar` is a LIST, not a single graha: Mercury and Venus share the 7th, Mars and Saturn the 8th, Jupiter and Rahu the 12th, and Mercury and Ketu the 6th. Debilitation is derived as the seventh sign from exaltation rather than held in a second table, so the two can never contradict each other.\n\nRahu is taken as exalted in Gemini and Ketu in Sagittarius; sources differ and the other tradition puts them in Taurus and Scorpio, so the choice is stated in `node_exaltation`. The `soya` and `kismat` fields other vendors return are deliberately absent - we could not establish a rule for either from a source rather than a guess.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Lal Kitab"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Ayanamsa for the underlying sidereal positions. Lal Kitab itself is house-based and does not prescribe one; this is passed through to the position engine.",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lal-kitab/planets/": {
      "post": {
        "operationId": "astro_lal_kitab_planets",
        "summary": "Lal Kitab planets",
        "description": "Each graha's sign, Lal Kitab house, degree, dignity and nature.\n\n`position` is the graha's standing in the sign it occupies: EXALTED, DEBILITATED, OWN, FRIEND SIGN, ENEMY SIGN or NEUTRAL SIGN.\n\nWORTH KNOWING: `position` is null for Rahu and Ketu unless they are exalted or debilitated. The nodes rule no sign and the classical friendship tables leave them out, so there is nothing for a friend or enemy verdict to be measured against.\n\n`nature` is benefic or malefic, and for the Moon and Mercury it is COMPUTED rather than looked up - the Moon from its paksha (benefic while waxing), Mercury from whether a natural malefic shares its sign. Every row carries `nature_basis` giving the rule that decided it and the numbers behind it, so the verdict can be checked rather than taken.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Lal Kitab"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Ayanamsa for the underlying sidereal positions. Lal Kitab itself is house-based and does not prescribe one; this is passed through to the position engine.",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lal-kitab/varshphal/": {
      "post": {
        "operationId": "astro_lal_kitab_varshphal",
        "summary": "Lal Kitab varshphal",
        "description": "The Lal Kitab annual chart for a given year.\n\nLal Kitab fixes the houses to the signs: house 1 is ALWAYS Aries, house 2 always Taurus, through to house 12 always Pisces — for every chart, whoever the native is. A planet's house is therefore its sign number, and the ascendant does not move the houses the way it does in Parashari astrology.\n\nThis means these endpoints will disagree with /api/astro/chart/ and /api/astro/planet-positions/ for almost everyone. That is the system, not an error: they are two different traditions answering two different questions.\n\nThe progression is arithmetic rather than astronomical. Where the Tajika varshphal at /api/astro/tajika/ casts a real solar-return chart, Lal Kitab advances every planet one house per completed year of age:\n\n    annual_house = ((natal_house - 1) + age) % 12 + 1\n\nSo every planet moves by the same number of houses, and the annual chart returns to the natal arrangement every twelfth year — `full_cycle` marks those years. Age is counted in COMPLETED years as of the birthday in the year you asked for, which is when the varshphal year opens.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Lal Kitab"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "Lal Kitab",
                    "year": 2027,
                    "age": 37,
                    "year_opens": "2027-08-15",
                    "method": "((natal_house - 1) + age) % 12 + 1",
                    "note": "The annual chart is a progression, not a solar return: every planet advances one house per completed year, so the chart repeats every twelve years.",
                    "ascendant": {
                      "longitude": 177.7489463338338,
                      "zodiac_name": "Virgo",
                      "nakshatra": "Chitra",
                      "pada": 2
                    },
                    "planets": [
                      {
                        "planet": "sun",
                        "natal_house": 4,
                        "house": 5,
                        "sign": "Leo",
                        "pakka_ghar": [
                          1
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "moon",
                        "natal_house": 2,
                        "house": 3,
                        "sign": "Gemini",
                        "pakka_ghar": [
                          4
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "mars",
                        "natal_house": 1,
                        "house": 2,
                        "sign": "Taurus",
                        "pakka_ghar": [
                          3,
                          8
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "mercury",
                        "natal_house": 5,
                        "house": 6,
                        "sign": "Virgo",
                        "pakka_ghar": [
                          6,
                          7
                        ],
                        "in_pakka_ghar": true,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "jupiter",
                        "natal_house": 4,
                        "house": 5,
                        "sign": "Leo",
                        "pakka_ghar": [
                          2,
                          5,
                          9,
                          12
                        ],
                        "in_pakka_ghar": true,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "venus",
                        "natal_house": 4,
                        "house": 5,
                        "sign": "Leo",
                        "pakka_ghar": [
                          7
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "saturn",
                        "natal_house": 9,
                        "house": 10,
                        "sign": "Capricorn",
                        "pakka_ghar": [
                          8,
                          10,
                          11
                        ],
                        "in_pakka_ghar": true,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "rahu",
                        "natal_house": 10,
                        "house": 11,
                        "sign": "Aquarius",
                        "pakka_ghar": [
                          12
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      },
                      {
                        "planet": "ketu",
                        "natal_house": 4,
                        "house": 5,
                        "sign": "Leo",
                        "pakka_ghar": [
                          6
                        ],
                        "in_pakka_ghar": false,
                        "returned_to_natal": false
                      }
                    ],
                    "houses": [
                      {
                        "house": 1,
                        "sign": "Aries",
                        "planets": []
                      },
                      {
                        "house": 2,
                        "sign": "Taurus",
                        "planets": [
                          "mars"
                        ]
                      },
                      {
                        "house": 3,
                        "sign": "Gemini",
                        "planets": [
                          "moon"
                        ]
                      },
                      {
                        "house": 4,
                        "sign": "Cancer",
                        "planets": []
                      },
                      {
                        "house": 5,
                        "sign": "Leo",
                        "planets": [
                          "sun",
                          "jupiter",
                          "venus",
                          "ketu"
                        ]
                      },
                      {
                        "house": 6,
                        "sign": "Virgo",
                        "planets": [
                          "mercury"
                        ]
                      },
                      {
                        "house": 7,
                        "sign": "Libra",
                        "planets": []
                      },
                      {
                        "house": 8,
                        "sign": "Scorpio",
                        "planets": []
                      },
                      {
                        "house": 9,
                        "sign": "Sagittarius",
                        "planets": []
                      },
                      {
                        "house": 10,
                        "sign": "Capricorn",
                        "planets": [
                          "saturn"
                        ]
                      },
                      {
                        "house": 11,
                        "sign": "Aquarius",
                        "planets": [
                          "rahu"
                        ]
                      },
                      {
                        "house": 12,
                        "sign": "Pisces",
                        "planets": []
                      }
                    ],
                    "full_cycle": false
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1900,
                    "maximum": 2200,
                    "examples": [
                      2026
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "description": "Ayanamsa for the underlying sidereal positions. Lal Kitab itself is house-based and does not prescribe one; this is passed through to the position engine.",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2027
              }
            }
          }
        }
      }
    },
    "/api/astro/longevity-factors/": {
      "post": {
        "operationId": "astro_longevity_factors",
        "summary": "Longevity factors",
        "description": "Marakas, maheshwara, rudra, brahma and the trishoola rasis — the classical longevity indicators.\n\nMarakas, maheshwara and rudra are each returned in both of the forms the engine computes, one derived from the chart as a whole and one from the planet positions directly, because the texts disagree about which to use and presenting only one would be taking a side silently.\n\nThese are house and planet indicators. Nothing here predicts when anyone dies.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Jaimini"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "marakas": {
                      "from_chart": [
                        4,
                        5
                      ],
                      "from_planet_positions": [
                        4,
                        5
                      ]
                    },
                    "maheshwara": {
                      "from_chart": 5,
                      "from_planet_positions": 5
                    },
                    "rudra": {
                      "from_chart": [
                        3,
                        0,
                        [
                          0,
                          4,
                          8
                        ]
                      ],
                      "from_planet_positions": [
                        6,
                        9,
                        [
                          9,
                          1,
                          5
                        ]
                      ]
                    },
                    "brahma": 3,
                    "trishoola_rasis": [
                      0,
                      4,
                      8
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Sun",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true"
              }
            }
          }
        }
      }
    },
    "/api/astro/lunar-month/": {
      "post": {
        "operationId": "astro_lunar_month",
        "summary": "Lunar month",
        "description": "The lunar month under both reckonings, and the season.\n\n`amanta` runs new moon to new moon and is used across western and southern India; `purnimanta` runs full moon to full moon and is used across the north. They are NOT the same name for most of the month - purnimanta is typically one month ahead during the waning fortnight - so returning both is deliberate rather than redundant.\n\n`ritu` is the season. `mode` selects how it is derived, `drik` from the Sun's tropical sign or `vedic` from the lunar month, and defaults to `drik`; the parent requires it and errors without it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "amanta": "Shravana",
                    "amanta_hi": "श्रावण",
                    "purnimanta": "Bhadrapada",
                    "purnimanta_hi": "भाद्रपद",
                    "ritu": {
                      "ritu": "Sharad",
                      "season": "Autumn",
                      "lord": "Mercury",
                      "ritu_hi": "शरद",
                      "season_hi": "शरद ऋतु"
                    },
                    "ritu_mode": "drik"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "vedic",
                      "drik"
                    ],
                    "default": "drik",
                    "examples": [
                      "vedic"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/lunar-phase/": {
      "post": {
        "operationId": "astro_lunar_phase",
        "summary": "Lunar phase",
        "description": "Which paksha the Moon is in, and how far through the lunation.\n\n`paksha` is the fortnight — Shukla while the Moon waxes, Krishna while it wanes — and `moon_phase_deg` is the Moon's elongation from the Sun, so 0 is the new moon, 180 the full moon and 360 the next new moon. `lunation_fraction` is the same figure as a 0-1 progress value.\n\nThat angle is the quantity /api/astro/mundane/lunations/ solves for when it finds exact phase moments; this is its value right now.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "paksha": "Krishna",
                    "moon_phase_deg": 198.30021704180095,
                    "lunation_fraction": 0.550834,
                    "waxing": false
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-06-02T06:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lunar/mansions/": {
      "post": {
        "operationId": "astro_lunar_mansions",
        "summary": "Lunar mansions",
        "description": "Which of the twenty-eight manazil the Moon occupies.\n\nTwenty-eight divisions of the ecliptic of 12°51'26\" each, used throughout medieval Western electional and magical astrology.\n\nNOT the Vedic nakshatras, which are twenty-SEVEN and are served by /api/astro/nakshatra/. The two traditions divide the same circle differently and a mansion never lines up with a nakshatra except by coincidence, so using one where the other is meant is a real error rather than a naming preference. These are tropical; the nakshatras are sidereal.\n\nReturns the current mansion with progress through it, when the Moon enters the next, and the full table of twenty-eight for reference.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Lunar"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "as_of": "1990-08-15T05:00:00+00:00",
                    "moon": {
                      "longitude": 72.660043,
                      "speed": 14.262958,
                      "sign": "Gemini",
                      "sign_index": 3,
                      "degree_in_sign": 12.66,
                      "formatted": "12°39' Gemini"
                    },
                    "mansion": {
                      "number": 6,
                      "name": "Al Hana",
                      "from_degree": 64.285714,
                      "to_degree": 77.142857,
                      "degrees_into": 8.374328,
                      "percent_through": 65.1337
                    },
                    "next_mansion": {
                      "number": 7,
                      "name": "Al Dhira",
                      "enters_at": "1990-08-15T12:32:37+00:00"
                    },
                    "mansion_arc_degrees": 12.857143,
                    "mansions": [
                      {
                        "number": 1,
                        "name": "Al Sharatain",
                        "from_degree": 0,
                        "to_degree": 12.8571
                      },
                      {
                        "number": 2,
                        "name": "Al Butain",
                        "from_degree": 12.8571,
                        "to_degree": 25.7143
                      },
                      {
                        "number": 3,
                        "name": "Al Thurayya",
                        "from_degree": 25.7143,
                        "to_degree": 38.5714
                      },
                      {
                        "number": 4,
                        "name": "Al Dabaran",
                        "from_degree": 38.5714,
                        "to_degree": 51.4286
                      },
                      {
                        "number": 5,
                        "name": "Al Haqa",
                        "from_degree": 51.4286,
                        "to_degree": 64.2857
                      },
                      {
                        "number": 6,
                        "name": "Al Hana",
                        "from_degree": 64.2857,
                        "to_degree": 77.1429
                      },
                      {
                        "number": 7,
                        "name": "Al Dhira",
                        "from_degree": 77.1429,
                        "to_degree": 90
                      },
                      {
                        "number": 8,
                        "name": "Al Nathra",
                        "from_degree": 90,
                        "to_degree": 102.8571
                      },
                      {
                        "number": 9,
                        "name": "Al Tarf",
                        "from_degree": 102.8571,
                        "to_degree": 115.7143
                      },
                      {
                        "number": 10,
                        "name": "Al Jabhah",
                        "from_degree": 115.7143,
                        "to_degree": 128.5714
                      },
                      {
                        "number": 11,
                        "name": "Al Zubrah",
                        "from_degree": 128.5714,
                        "to_degree": 141.4286
                      },
                      {
                        "number": 12,
                        "name": "Al Sarfah",
                        "from_degree": 141.4286,
                        "to_degree": 154.2857
                      },
                      {
                        "number": 13,
                        "name": "Al Awwa",
                        "from_degree": 154.2857,
                        "to_degree": 167.1429
                      },
                      {
                        "number": 14,
                        "name": "Al Simak",
                        "from_degree": 167.1429,
                        "to_degree": 180
                      },
                      {
                        "number": 15,
                        "name": "Al Ghafr",
                        "from_degree": 180,
                        "to_degree": 192.8571
                      },
                      {
                        "number": 16,
                        "name": "Al Jubana",
                        "from_degree": 192.8571,
                        "to_degree": 205.7143
                      },
                      {
                        "number": 17,
                        "name": "Iklil al Jabhah",
                        "from_degree": 205.7143,
                        "to_degree": 218.5714
                      },
                      {
                        "number": 18,
                        "name": "Al Qalb",
                        "from_degree": 218.5714,
                        "to_degree": 231.4286
                      },
                      {
                        "number": 19,
                        "name": "Al Shaulah",
                        "from_degree": 231.4286,
                        "to_degree": 244.2857
                      },
                      {
                        "number": 20,
                        "name": "Al Naaim",
                        "from_degree": 244.2857,
                        "to_degree": 257.1429
                      },
                      {
                        "number": 21,
                        "name": "Al Baldah",
                        "from_degree": 257.1429,
                        "to_degree": 270
                      },
                      {
                        "number": 22,
                        "name": "Saad al Dhabih",
                        "from_degree": 270,
                        "to_degree": 282.8571
                      },
                      {
                        "number": 23,
                        "name": "Saad Bula",
                        "from_degree": 282.8571,
                        "to_degree": 295.7143
                      },
                      {
                        "number": 24,
                        "name": "Saad al Suud",
                        "from_degree": 295.7143,
                        "to_degree": 308.5714
                      },
                      {
                        "number": 25,
                        "name": "Saad al Akhbiyah",
                        "from_degree": 308.5714,
                        "to_degree": 321.4286
                      },
                      {
                        "number": 26,
                        "name": "Al Fargh al Mukdim",
                        "from_degree": 321.4286,
                        "to_degree": 334.2857
                      },
                      {
                        "number": 27,
                        "name": "Al Fargh al Thani",
                        "from_degree": 334.2857,
                        "to_degree": 347.1429
                      },
                      {
                        "number": 28,
                        "name": "Batn al Hut",
                        "from_degree": 347.1429,
                        "to_degree": 360
                      }
                    ],
                    "note": "Twenty-eight Arabic manazil, not the twenty-seven Vedic nakshatras — see /api/astro/nakshatra/ for those. These are tropical; the nakshatras are sidereal."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lunar/void-of-course/": {
      "post": {
        "operationId": "astro_lunar_void_of_course",
        "summary": "Void of course Moon",
        "description": "Whether the Moon will make any further aspect before it changes sign.\n\nThe Moon is void of course once it has completed its last aspect in a sign and has nothing left to perfect. Electional astrology reads a void Moon as a poor time to begin anything, which makes this the lunar question people actually search for.\n\nAnswering it needs a forward SEARCH, not a snapshot: the Moon moves about thirteen degrees a day and the other planets move too, so an aspect two degrees away can perfect or be missed depending on whether the slower body is running away from it. This scans to the sign egress and bisects onto every aspect that perfects, in both directions — the Moon can apply to a planet from ahead or from behind, and both are aspects.\n\nReturns whether the Moon is void now, every remaining aspect with the exact moment it perfects, when the Moon leaves the sign, and when the void begins and ends.\n\n`include_modern` decides whether Uranus, Neptune and Pluto count. Off by default, because no traditional source uses them and including them makes void periods much rarer. The convention used is named in the response.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Lunar"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "as_of": "1990-08-15T05:00:00+00:00",
                    "void_of_course": false,
                    "moon": {
                      "longitude": 72.660043,
                      "speed": 14.262958,
                      "sign": "Gemini",
                      "sign_index": 3,
                      "degree_in_sign": 12.66,
                      "formatted": "12°39' Gemini"
                    },
                    "degrees_to_sign_change": 17.339957,
                    "leaves_sign_at": "1990-08-16T10:12:11+00:00",
                    "enters_sign": "Cancer",
                    "next_aspect": {
                      "planet": "mercury",
                      "aspect": "square",
                      "exact_angle": 90,
                      "moon_is": "behind",
                      "perfects_at": "1990-08-15T16:35:09+00:00",
                      "julian_day": 2448119.1910816
                    },
                    "remaining_aspects": [
                      {
                        "planet": "mercury",
                        "aspect": "square",
                        "exact_angle": 90,
                        "moon_is": "behind",
                        "perfects_at": "1990-08-15T16:35:09+00:00",
                        "julian_day": 2448119.1910816
                      },
                      {
                        "planet": "sun",
                        "aspect": "sextile",
                        "exact_angle": 60,
                        "moon_is": "behind",
                        "perfects_at": "1990-08-15T22:04:59+00:00",
                        "julian_day": 2448119.42013053
                      }
                    ],
                    "void_begins_at": "1990-08-15T22:04:59+00:00",
                    "void_ends_at": "1990-08-16T10:12:11+00:00",
                    "bodies_considered": [
                      "sun",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn"
                    ],
                    "convention": "traditional (classical seven only)",
                    "note": "Void of course means no further Ptolemaic aspect perfects before the Moon changes sign. Judged here on seven bodies; the choice changes the answer."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "include_modern": {
                    "type": "boolean",
                    "description": "Count aspects to Uranus, Neptune and Pluto as well. Traditional practice uses the seven classical bodies only, and adding three more makes void periods markedly rarer.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/lunar_month_scan/": {
      "post": {
        "operationId": "astro_lunar_month_scan",
        "summary": "Lunar month scan",
        "description": "Finds the exact start and end instants of one named Hindu lunar month within a calendar year — Chaitra, Vaisakha, Jyeshtha and so on. Useful for scheduling anything anchored to a lunar month rather than a Gregorian one.\n\nreckoning decides where the boundaries sit. Under 'amanta' (the default, used in the south and west) a month runs from one new moon to the next and takes its name from the Moon's sign at the opening new moon. Under 'poornima' it runs from one full moon to the next and takes its name from the Sun's sign at the opening full moon; northern calendars use this, and for the dark fortnight the two reckonings put the same day in differently named months.\n\nPass month_name, year and timezone_as_float; no place is needed. The response is {year, month_name, reckoning, rows}, where rows is a list of {start, end} UTC timestamps — usually one entry, and two when an adhika (leap) month of the same name also falls in that year. The scan does not label which of the two is the leap month.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "month_name": "Vaisakha",
                    "reckoning": "amanta",
                    "rows": [
                      {
                        "start": "2026-04-17T11:52:21+00:00",
                        "end": "2026-05-16T20:01:32+00:00"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "month_name": {
                    "type": "string",
                    "enum": [
                      "Vaisakha",
                      "Jyeshtha",
                      "Ashadha",
                      "Shravana",
                      "Bhadrapada",
                      "Ashwin",
                      "Kartika",
                      "Margashirsha",
                      "Pausha",
                      "Magha",
                      "Phalguna",
                      "Chaitra"
                    ],
                    "examples": [
                      "Vaisakha"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "reckoning": {
                    "type": "string",
                    "enum": [
                      "amanta",
                      "poornima"
                    ],
                    "default": "amanta",
                    "examples": [
                      "amanta"
                    ]
                  }
                },
                "required": [
                  "month_name",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "month_name": "Vaisakha",
                "timezone_as_float": 5.5,
                "year": 2026,
                "reckoning": "amanta"
              }
            }
          }
        }
      }
    },
    "/api/astro/malayalam_calendar/": {
      "post": {
        "operationId": "astro_malayalam_calendar",
        "summary": "Malayalam calendar",
        "description": "A year of Kerala observances on the Malayalam (Kollam era) calendar, which is solar: months begin with the Sun's entry into each sidereal sign, and the year opens at Chingam Sankramam in August. The list covers the twelve Sankramams, the Kerala temple festivals and vratas — Thiruvathira, Makaravilakku, Attukal Pongal, Painkuni Uthram, Guruvayur Ekadasi, the start of Mandalakala — and the pan-Indian days as observed there.\n\nPass year with latitude, longitude and UTC offset. The response is {year, events}, each event {name, date}, in date order; a typical year returns around fifty entries. The year must be between 2006 and 2046.\n\nOnam appears here as a single dated entry. For the festival week day by day, with nakshatra timings and the Malayalam day numbers, use /api/astro/onam_calendar/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "events": [
                      {
                        "name": "Thiruvathira",
                        "date": "2026-01-03"
                      },
                      {
                        "name": "Makaram Sankramam",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Pongal",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Makaravilakku",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Thai Pooyam",
                        "date": "2026-02-01"
                      },
                      {
                        "name": "Kumbham Sankramam",
                        "date": "2026-02-13"
                      },
                      {
                        "name": "Shivarathri",
                        "date": "2026-02-15"
                      },
                      {
                        "name": "Attukal Pongal",
                        "date": "2026-02-23"
                      },
                      {
                        "name": "Meenam Sankramam",
                        "date": "2026-03-15"
                      },
                      {
                        "name": "Matsyavathara Dinam",
                        "date": "2026-03-21"
                      },
                      {
                        "name": "Shree Rama Navami *Smarta",
                        "date": "2026-03-26"
                      },
                      {
                        "name": "Painkuni Uthram",
                        "date": "2026-04-01"
                      },
                      {
                        "name": "Metam Sankramam",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Solar New Year",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Parashurama Jayanthi",
                        "date": "2026-04-19"
                      },
                      {
                        "name": "Akshaya Trithiya",
                        "date": "2026-04-19"
                      },
                      {
                        "name": "Shree Shankara Jayanthi",
                        "date": "2026-04-21"
                      },
                      {
                        "name": "Narasimha Jayanthi",
                        "date": "2026-04-30"
                      },
                      {
                        "name": "Chitra Pournami",
                        "date": "2026-05-01"
                      },
                      {
                        "name": "Kurmavathara Dinam",
                        "date": "2026-05-01"
                      },
                      {
                        "name": "Itavam Sankramam",
                        "date": "2026-05-15"
                      },
                      {
                        "name": "Mithunam Sankramam",
                        "date": "2026-06-15"
                      },
                      {
                        "name": "Karkatakam Sankramam",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Guru Poornima",
                        "date": "2026-07-29"
                      },
                      {
                        "name": "Chingam Sankramam",
                        "date": "2026-08-17"
                      },
                      {
                        "name": "Malayalam New Year",
                        "date": "2026-08-17"
                      },
                      {
                        "name": "Onam",
                        "date": "2026-08-26"
                      },
                      {
                        "name": "Ashtami Rohini",
                        "date": "2026-09-04"
                      },
                      {
                        "name": "Varaha Jayanthi",
                        "date": "2026-09-13"
                      },
                      {
                        "name": "Kerala Vinayaka Chathurthi",
                        "date": "2026-09-14"
                      },
                      {
                        "name": "Rishi Panchami",
                        "date": "2026-09-15"
                      },
                      {
                        "name": "Kanni Sankramam",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Vishwakarma Puja",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Vamana Jayanthi",
                        "date": "2026-09-23"
                      },
                      {
                        "name": "Navarathri",
                        "date": "2026-10-11"
                      },
                      {
                        "name": "Thulam Sankramam",
                        "date": "2026-10-17"
                      },
                      {
                        "name": "Durgashtami",
                        "date": "2026-10-19"
                      },
                      {
                        "name": "Maha Navami",
                        "date": "2026-10-20"
                      },
                      {
                        "name": "Vijayadashami",
                        "date": "2026-10-21"
                      },
                      {
                        "name": "Vidyarambham Day",
                        "date": "2026-10-21"
                      },
                      {
                        "name": "Diwali",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Vrischikam Sankramam",
                        "date": "2026-11-16"
                      },
                      {
                        "name": "Mandalakala Begins",
                        "date": "2026-11-16"
                      },
                      {
                        "name": "Guruvayur Ekadasi",
                        "date": "2026-11-20"
                      },
                      {
                        "name": "Karthigai Deepam",
                        "date": "2026-11-24"
                      },
                      {
                        "name": "Dhanu Sankramam",
                        "date": "2026-12-16"
                      },
                      {
                        "name": "Mukkoti Ekadasi",
                        "date": "2026-12-20"
                      },
                      {
                        "name": "Geeta Dinam",
                        "date": "2026-12-20"
                      },
                      {
                        "name": "Thiruvathira",
                        "date": "2026-12-24"
                      },
                      {
                        "name": "Mandalakala Pooja",
                        "date": "2026-12-26"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/marathi_calendar/": {
      "post": {
        "operationId": "astro_marathi_calendar",
        "summary": "Marathi calendar",
        "description": "A year of Maharashtrian festivals and vratas. The Marathi calendar is amanta luni-solar on the Shaka era, the same month scheme as Kannada and Telugu.\n\nThe list covers every Sankashti Chaturthi under its own monthly name — Lambodara, Dwijapriya, Bhalachandra, Vikata, Ekadanta and the rest — all the Ekadashis, the twelve Sankrantis, the eclipses, and the regional days such as Gudi Padwa, Holika Dahan, Dhulivandan and Vat Purnima.\n\nPass year with latitude, longitude and UTC offset; the place matters because several of these are fixed by moonrise or by the tithi prevailing at sunrise. The response is {year, events}, each event {name, date}, in date order, typically well over a hundred entries. The year must be between 2006 and 2046.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"events\": [{\"name\": \"Shakambhari Purnima\", \"date\": \"2026-01-03\"}, {\"name\": \"Lambodara Sankashti\", \"date\": \"2026-01-06\"}, {\"name\": \"Shattila Ekadashi\", \"date\": \"2026-01-14\"}, {\"name\": \"Makara Sankranti\", \"date\": \"2026-01-14\"}, {\"name\": \"Vasant Panchami\", \"date\": \"2026-01-23\"}, {\"name\": \"Ratha Saptami\", \"date\": \"2026-01-25\"}, {\"name\": \"Bhanu Saptami\", \"date\": \"2026-01-25\"}, {\"name\": \"Bhishma Ashtami\", \"date\": \"2026-01-26\"}, {\"name\": \"Jaya Ekadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Dwijapriya Sankashti\", \"date\": \"2026-02-05\"}, {\"name\": \"Bhanu Saptami\", \"date\": \"2026-02-08\"}, {\"name\": \"Vijaya Ekadashi\", \"date\": \"2026-02-13\"}, {\"name\": \"Kumbha Sankranti\", \"date\": \"2026-02-13\"}, {\"name\": \"Maha Shivaratri\", \"date\": \"2026-02-15\"}, {\"name\": \"Amalaki Ekadashi\", \"date\": \"2026-02-27\"}, {\"name\": \"Holi\", \"date\": \"2026-03-03\"}, {\"name\": \"Holika Dahan\", \"date\": \"2026-03-03\"}, {\"name\": \"Dhulivandan\", \"date\": \"2026-03-04\"}, {\"name\": \"Bhalachandra Sankashti\", \"date\": \"2026-03-06\"}, {\"name\": \"Papamochani Ekadashi\", \"date\": \"2026-03-15\"}, {\"name\": \"Meena Sankranti\", \"date\": \"2026-03-15\"}, {\"name\": \"Gudi Padwa\", \"date\": \"2026-03-19\"}, {\"name\": \"Chaitra Navratri\", \"date\": \"2026-03-19\"}, {\"name\": \"Rama Navami *Smarta\", \"date\": \"2026-03-26\"}, {\"name\": \"Kamada Ekadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Hanuman Jayanti\", \"date\": \"2026-04-02\"}, {\"name\": \"Hanuman Janmotsava\", \"date\": \"2026-04-02\"}, {\"name\": \"Vikata Sankashti\", \"date\": \"2026-04-05\"}, {\"name\": \"Varuthini Ekadashi\", \"date\": \"2026-04-13\"}, {\"name\": \"Mesha Sankranti\", \"date\": \"2026-04-14\"}, {\"name\": \"Solar New Year\", \"date\": \"2026-04-14\"}, {\"name\": \"Parashurama Jayanti\", \"date\": \"2026-04-19\"}, {\"name\": \"Akshaya Tritiya\", \"date\": \"2026-04-19\"}, {\"name\": \"Ganga Pujan\", \"date\": \"2026-04-23\"}, {\"name\": \"Mohini Ekadashi\", \"date\": \"2026-04-27\"}, {\"name\": \"Narasimha Jayanti\", \"date\": \"2026-04-30\"}, {\"name\": \"Buddha Purnima\", \"date\": \"2026-05-01\"}, {\"name\": \"Ekadanta Sankashti\", \"date\": \"2026-05-05\"}, {\"name\": \"Apara Ekadashi\", \"date\": \"2026-05-13\"}, {\"name\": \"Vrishabha Sankranti\", \"date\": \"2026-05-15\"}, {\"name\": \"Shani Jayanti\", \"date\": \"2026-05-16\"}, {\"name\": \"Ganga Dussehra\", \"date\": \"2026-05-25\"}, {\"name\": \"Vibhuvana Sankashti\", \"date\": \"2026-06-03\"}, {\"name\": \"Adhika Bhanu Saptami\", \"date\": \"2026-06-07\"}, {\"name\": \"Parama Ekadashi\", \"date\": \"2026-06-11\"}, {\"name\": \"Mithuna Sankranti\", \"date\": \"2026-06-15\"}, {\"name\": \"Bhanu Saptami\", \"date\": \"2026-06-21\"}, {\"name\": \"Nirjala Ekadashi\", \"date\": \"2026-06-25\"}, {\"name\": \"Krishnapingala Sankashti\", \"date\": \"2026-07-03\"}, {\"name\": \"Yogini Ekadashi\", \"date\": \"2026-07-10\"}, {\"name\": \"Karka Sankranti\", \"date\": \"2026-07-16\"}, {\"name\": \"Devshayani Ekadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Guru Purnima\", \"date\": \"2026-07-29\"}, {\"name\": \"Gajanana Sankashti\", \"date\": \"2026-08-02\"}, {\"name\": \"Kamika Ekadashi\", \"date\": \"2026-08-09\"}, {\"name\": \"Nag Panchami\", \"date\": \"2026-08-17\"}, {\"name\": \"Simha Sankranti\", \"date\": \"2026-08-17\"}, {\"name\": \"Shravana Putrada Ekadashi\", \"date\": \"2026-08-23\"}, {\"name\": \"Raksha Bandhan\", \"date\": \"2026-08-28\"}, {\"name\": \"Narali Purnima\", \"date\": \"2026-08-28\"}, {\"name\": \"Heramba Sankashti\", \"date\": \"2026-08-31\"}, {\"name\": \"Krishna Janmashtami\", \"date\": \"2026-09-04\"}, {\"name\": \"Aja Ekadashi\", \"date\": \"2026-09-07\"}, {\"name\": \"Ganesh Chaturthi\", \"date\": \"2026-09-14\"}, {\"name\": \"Rishi Panchami\", \"date\": \"2026-09-15\"}, {\"name\": \"Kanya Sankranti\", \"date\": \"2026-09-17\"}, {\"name\": \"Parsva Ekadashi\", \"date\": \"2026-09-22\"}, {\"name\": \"Ganesh Visarjan\", \"date\": \"2026-09-25\"}, {\"name\": \"Vighnaraja Sankashti\", \"date\": \"2026-09-29\"}, {\"name\": \"Indira Ekadashi\", \"date\": \"2026-10-06\"}, {\"name\": \"Navratri Begins\", \"date\": \"2026-10-11\"}, {\"name\": \"Ghatasthapana\", \"date\": \"2026-10-11\"}, {\"name\": \"Tula Sankranti\", \"date\": \"2026-10-17\"}, {\"name\": \"Bhanu Saptami\", \"date\": \"2026-10-18\"}, {\"name\": \"Durga Ashtami\", \"date\": \"2026-10-19\"}, {\"name\": \"Maha Navami\", \"date\": \"2026-10-19\"}, {\"name\": \"Vijayadashami\", \"date\": \"2026-10-20\"}, {"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/monthly_panchang/": {
      "post": {
        "operationId": "astro_monthly_panchang",
        "summary": "Monthly panchang",
        "description": "One row per calendar day for a whole Gregorian month — the grid a panchang wall calendar prints. Each day carries sunrise, sunset, moonrise and moonset, the weekday in Sanskrit, the lunar month under both reckonings, the Vikram and Shaka years with their sixty-year cycle names, and the tithi, Moon sign and Moon nakshatra prevailing at that day's sunrise.\n\nBecause a tithi or nakshatra usually changes partway through a day, each of those three carries an exit_time: the exact instant it gives way to the next, or null if it lasts past the following sunrise. That is what lets you render the familiar 'Vrishchika 01:08+' style labels.\n\nPass year, month, latitude, longitude and UTC offset. moon_option chooses which reckoning the row's lunar_month field follows, 'purnimanta' (the default) or 'amanta'; both amanta_month and purnimanta_month are returned on every row regardless, so you can switch presentation without a second call. The response is {year, month, days} with one entry per day of that month.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"month\": 9, \"days\": [{\"date\": \"2026-09-01\", \"vaara\": \"Mangalavara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-01T06:09:56+05:30\", \"sunset\": \"2026-09-01T18:43:30+05:30\", \"moonrise\": \"2026-09-01T21:09:00+05:30\", \"moonset\": \"2026-09-01T09:53:10+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Chaturthi\", \"exit_time\": \"2026-09-01T07:42:57+05:30\"}, \"moon_rashi\": {\"name\": \"Mesha\", \"exit_time\": null}, \"moon_nakshatra\": {\"name\": \"Ashwini\", \"exit_time\": \"2026-09-02T02:42:25+05:30\"}, \"sun_rashi\": \"Simha\"}, {\"date\": \"2026-09-02\", \"vaara\": \"Budhavara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-02T06:10:22+05:30\", \"sunset\": \"2026-09-02T18:42:26+05:30\", \"moonrise\": \"2026-09-02T21:50:26+05:30\", \"moonset\": \"2026-09-02T10:57:09+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Panchami\", \"exit_time\": \"2026-09-02T06:13:35+05:30\"}, \"moon_rashi\": {\"name\": \"Mesha\", \"exit_time\": null}, \"moon_nakshatra\": {\"name\": \"Bharani\", \"exit_time\": \"2026-09-03T01:43:16+05:30\"}, \"sun_rashi\": \"Simha\"}, {\"date\": \"2026-09-03\", \"vaara\": \"Guruvara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-03T06:10:48+05:30\", \"sunset\": \"2026-09-03T18:41:21+05:30\", \"moonrise\": \"2026-09-03T22:38:43+05:30\", \"moonset\": \"2026-09-03T12:03:39+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Saptami\", \"exit_time\": \"2026-09-04T02:26:25+05:30\"}, \"moon_rashi\": {\"name\": \"Mesha\", \"exit_time\": \"2026-09-03T07:26:05+05:30\"}, \"moon_nakshatra\": {\"name\": \"Krittika\", \"exit_time\": \"2026-09-04T00:29:36+05:30\"}, \"sun_rashi\": \"Simha\"}, {\"date\": \"2026-09-04\", \"vaara\": \"Shukravara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-04T06:11:14+05:30\", \"sunset\": \"2026-09-04T18:40:15+05:30\", \"moonrise\": \"2026-09-04T23:34:48+05:30\", \"moonset\": \"2026-09-04T13:10:53+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Ashtami\", \"exit_time\": \"2026-09-05T00:14:34+05:30\"}, \"moon_rashi\": {\"name\": \"Vrishabha\", \"exit_time\": null}, \"moon_nakshatra\": {\"name\": \"Rohini\", \"exit_time\": \"2026-09-04T23:04:27+05:30\"}, \"sun_rashi\": \"Simha\"}, {\"date\": \"2026-09-05\", \"vaara\": \"Shanivara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-05T06:11:40+05:30\", \"sunset\": \"2026-09-05T18:39:09+05:30\", \"moonrise\": \"2026-09-06T00:38:03+05:30\", \"moonset\": \"2026-09-05T14:15:49+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Navami\", \"exit_time\": \"2026-09-05T21:54:40+05:30\"}, \"moon_rashi\": {\"name\": \"Vrishabha\", \"exit_time\": \"2026-09-05T10:18:34+05:30\"}, \"moon_nakshatra\": {\"name\": \"Mrigasira\", \"exit_time\": \"2026-09-05T21:31:03+05:30\"}, \"sun_rashi\": \"Simha\"}, {\"date\": \"2026-09-06\", \"vaara\": \"Ravivara\", \"lunar_month\": \"Bhadrapada\", \"amanta_month\": \"Shravana\", \"purnimanta_month\": \"Bhadrapada\", \"vikram_samvat\": 2083, \"vikram_samvatsara\": \"Kalayukthi\", \"shaka_samvat\": 1948, \"shaka_samvatsara\": \"Krodhi\", \"sunrise\": \"2026-09-06T06:12:06+05:30\", \"sunset\": \"2026-09-06T18:38:03+05:30\", \"moonrise\": \"2026-09-07T01:45:53+05:30\", \"moonset\": \"2026-09-06T15:15:16+05:30\", \"tithi\": {\"paksha\": \"Krishna\", \"name\": \"Dashami\", \"exit_time\": \"2026-09-06T19:30:12+05:30\"}, \"moon_rashi\": {\"name\": \"Mithuna\", \"exit_time\": null}, \"moon_nakshatra\": {\"name\": \"Aardra\", \"exit_time\": \"2026-09-06T19:52:"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "examples": [
                      9
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "moon_option": {
                    "type": "string",
                    "enum": [
                      "purnimanta",
                      "amanta"
                    ],
                    "default": "purnimanta",
                    "examples": [
                      "purnimanta"
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "month",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "month": 9,
                "timezone_as_float": 5.5,
                "year": 2026,
                "moon_option": "purnimanta"
              }
            }
          }
        }
      }
    },
    "/api/astro/moon-illumination/": {
      "post": {
        "operationId": "astro_moon_illumination",
        "summary": "Moon illumination and phase",
        "description": "How much of the Moon is lit, as a real fraction.\n\nComputed from the elongation between the Sun and the Moon: lit = (1 - cos(elongation)) / 2, which is 0 at new moon, 0.5 at either quarter and 1 at full. Returned as both a fraction and a percentage, with the elongation, the phase angle, whether the Moon is waxing, and the conventional phase name.\n\nThis endpoint exists because the engine key called `get_illumination` does not return illumination. It returns APPARENT MAGNITUDE — about -26.7 for the Sun and between -6 and -12 for the Moon depending on phase. A fraction cannot be negative and cannot be -26, and anything wiring that field to a \"percent lit\" display shows nonsense. That value is still returned here, under the name it deserves: apparent_magnitude, where smaller is brighter.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Lunar"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "illuminated_fraction": 0.034082,
                    "illuminated_percent": 3.4082,
                    "elongation_degrees": 21.277,
                    "phase_angle_degrees": 338.723,
                    "waxing": false,
                    "phase_name": "New moon",
                    "apparent_magnitude": {
                      "moon": -6.123776,
                      "sun": -26.726421
                    },
                    "longitudes": {
                      "sun": 166.834,
                      "moon": 145.557
                    },
                    "notes": {
                      "apparent_magnitude": "The engine key named get_illumination returns apparent magnitude, not illumination. Smaller is brighter; it is negative for both of these bodies. Use illuminated_fraction for how much of the disc is lit."
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "altitude": {
                    "type": "number",
                    "format": "double",
                    "description": "OBSERVER elevation in metres, not a body's altitude.",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet_names": {
                    "type": "array",
                    "description": "Ignored. This endpoint always reads the Sun and the Moon.",
                    "default": [
                      "SUN",
                      "MOON"
                    ],
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "time_zone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset. Either this or timezone_as_float; they mirror.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-09T12:00:00+00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/moonrise/": {
      "post": {
        "operationId": "astro_moonrise",
        "summary": "Moonrise and moonset",
        "description": "Moonrise and moonset for a date and place, with the time the moon spends above the horizon in seconds. For the sun, use /api/astro/sunrise/.\n\nSend a date, a latitude, a longitude and the UTC offset. As with sunrise, the same instants are reachable through /api/astro/celestial/ only if you know to pass planet_names=[\"MOON\"], to put the rising switch first in the keys array, and to unwrap a nested array.\n\nThe moonset returned is always the one that FOLLOWS the moonrise, so the pair is a usable interval. That matters more for the moon than the sun: it rises about fifty minutes later each day, so on many dates the moonset that falls inside your calendar day belongs to the previous moonrise.\n\nBoth fields can be null. Above about 61 degrees of latitude the moon can stay above or below the horizon for more than a day - at Reykjavik in December it does - and there is then no rise or set to report. Null says that; /api/astro/celestial/ returns \"2000-11-24T12:00:00Z\", which is julian day zero from a search that failed rather than a real instant, and is easy to mistake for an answer.\n\nFor the moon's phase and paksha, see /api/astro/panchang/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Sunrise & moonrise"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "moonrise": "2026-09-01T21:09:00+05:30",
                    "moonset": "2026-09-02T10:57:09+05:30",
                    "moon_above_horizon_seconds": 49689
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/mudda-dasha/": {
      "post": {
        "operationId": "astro_mudda_dasha",
        "summary": "Mudda dasha (varsha vimshottari)",
        "description": "The Vimshottari cycle compressed into a single varshaphal year: each lord holds the same SHARE of the year that it holds of the 120-year cycle, so the Sun receives eighteen days where it receives six years.\n\nReturns all eighty-one sub-periods - nine lords, nine sub-lords each - with the start of each as an ISO timestamp and its length in days. The whole cycle sums to roughly 360 days.\n\nWORTH KNOWING: this is read INSIDE the annual chart and is not a second opinion on the natal Vimshottari at /api/astro/dasha/vimshottari/. The two will not agree and are not meant to - one divides a life, the other divides a year.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1900,
                    "maximum": 2200,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/muddha_dasha/": {
      "post": {
        "operationId": "astro_muddha_dasha",
        "summary": "Muddha dasha",
        "description": "Muddha dasha, also called Varsha Vimshottari, is the annual-chart counterpart of the ordinary Vimshottari dasha: the same nine planetary periods in the same sequence, compressed from 120 years into the single solar-return year you are examining. It is one of the standard timing tools of Tajika (Varshaphala) practice, used to say which stretch of a particular year belongs to which planet.\n\nPass the birth details plus years — the number of completed years since birth, which selects the annual chart — and include_antardhasa. With antardashas you get 81 rows; without, nine.\n\nTwo things to watch in the output. The lords are integers rather than names: 0 Sun, 1 Moon, 2 Mars, 3 Mercury, 4 Jupiter, 5 Venus, 6 Saturn, 7 Rahu, 8 Ketu. And each start date is a string of the form \"2025-02-02 {'degrees': 13, 'minutes': 0, 'seconds': 54.16}\", where the braced part is the time of day left in the degrees-minutes-seconds form the Julian-day conversion produced rather than converted to hours. Durations are in days, and the nine top-level periods add up to one tropical year.\n\nAvailable `keys` (1), all covered by the same single credit: mudda_dhasa_bhukthi.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"mudda_dhasa_bhukthi\": [[0, 0, \"2025-02-02 {'degrees': 13, 'minutes': 0, 'seconds': 54.16}\", 0.91], [0, 1, \"2025-02-03 {'degrees': 10, 'minutes': 55, 'seconds': 46.47}\", 1.52], [0, 2, \"2025-02-04 {'degrees': 23, 'minutes': 27, 'seconds': 13.66}\", 1.07], [0, 7, \"2025-02-06 {'degrees': 1, 'minutes': 1, 'seconds': 14.69}\", 2.74], [0, 4, \"2025-02-08 {'degrees': 18, 'minutes': 45, 'seconds': 51.63}\", 2.43], [0, 6, \"2025-02-11 {'degrees': 5, 'minutes': 12, 'seconds': 11.13}\", 2.89], [0, 3, \"2025-02-14 {'degrees': 2, 'minutes': 35, 'seconds': 56.79}\", 2.59], [0, 8, \"2025-02-16 {'degrees': 16, 'minutes': 41, 'seconds': 25.01}\", 1.07], [0, 5, \"2025-02-17 {'degrees': 18, 'minutes': 15, 'seconds': 26.04}\", 3.04], [1, 1, \"2025-02-20 {'degrees': 19, 'minutes': 18, 'seconds': 20.42}\", 2.54], [1, 2, \"2025-02-23 {'degrees': 8, 'minutes': 10, 'seconds': 45.73}\", 1.78], [1, 7, \"2025-02-25 {'degrees': 2, 'minutes': 47, 'seconds': 27.45}\", 4.57], [1, 4, \"2025-03-01 {'degrees': 16, 'minutes': 21, 'seconds': 49.02}\", 4.06], [1, 6, \"2025-03-05 {'degrees': 17, 'minutes': 45, 'seconds': 41.52}\", 4.82], [1, 3, \"2025-03-10 {'degrees': 13, 'minutes': 25, 'seconds': 17.62}\", 4.31], [1, 8, \"2025-03-14 {'degrees': 20, 'minutes': 54, 'seconds': 24.65}\", 1.78], [1, 5, \"2025-03-16 {'degrees': 15, 'minutes': 31, 'seconds': 6.37}\", 5.07], [1, 0, \"2025-03-21 {'degrees': 17, 'minutes': 15, 'seconds': 57.0}\", 1.52], [2, 2, \"2025-03-23 {'degrees': 5, 'minutes': 47, 'seconds': 24.19}\", 1.24], [2, 7, \"2025-03-24 {'degrees': 11, 'minutes': 37, 'seconds': 5.39}\", 3.2], [2, 4, \"2025-03-27 {'degrees': 16, 'minutes': 19, 'seconds': 8.49}\", 2.84], [2, 6, \"2025-03-30 {'degrees': 12, 'minutes': 29, 'seconds': 51.24}\", 3.37], [2, 3, \"2025-04-02 {'degrees': 21, 'minutes': 27, 'seconds': 34.51}\", 3.02], [2, 8, \"2025-04-05 {'degrees': 21, 'minutes': 53, 'seconds': 57.43}\", 1.24], [2, 5, \"2025-04-07 {'degrees': 3, 'minutes': 43, 'seconds': 38.64}\", 3.55], [2, 0, \"2025-04-10 {'degrees': 16, 'minutes': 57, 'seconds': 2.07}\", 1.07], [2, 1, \"2025-04-11 {'degrees': 18, 'minutes': 31, 'seconds': 3.11}\", 1.78], [7, 7, \"2025-04-13 {'degrees': 13, 'minutes': 7, 'seconds': 44.83}\", 8.22], [7, 4, \"2025-04-21 {'degrees': 18, 'minutes': 21, 'seconds': 35.64}\", 7.3], [7, 6, \"2025-04-29 {'degrees': 1, 'minutes': 40, 'seconds': 34.15}\", 8.67], [7, 3, \"2025-05-07 {'degrees': 17, 'minutes': 51, 'seconds': 51.12}\", 7.76], [7, 8, \"2025-05-15 {'degrees': 12, 'minutes': 8, 'seconds': 15.78}\", 3.2], [7, 5, \"2025-05-18 {'degrees': 16, 'minutes': 50, 'seconds': 18.88}\", 9.13], [7, 0, \"2025-05-27 {'degrees': 19, 'minutes': 59, 'seconds': 2.01}\", 2.74], [7, 1, \"2025-05-30 {'degrees': 13, 'minutes': 43, 'seconds': 38.95}\", 4.57], [7, 2, \"2025-06-04 {'degrees': 3, 'minutes': 18, 'seconds': 0.51}\", 3.2], [4, 4, \"2025-06-07 {'degrees': 8, 'minutes': 0, 'seconds': 3.61}\", 6.49], [4, 6, \"2025-06-13 {'degrees': 19, 'minutes': 50, 'seconds': 15.61}\", 7.71], [4, 3, \"2025-06-21 {'degrees': 12, 'minutes': 53, 'seconds': 37.37}\", 6.9], [4, 8, \"2025-06-28 {'degrees': 10, 'minutes': 28, 'seconds': 12.62}\", 2.84], [4, 5, \"2025-07-01 {'degrees': 6, 'minutes': 38, 'seconds': 55.37}\", 8.12], [4, 0, \"2025-07-09 {'degrees': 9, 'minutes': 26, 'seconds': 40.38}\", 2.43], [4, 1, \"2025-07-11 {'degrees': 19, 'minutes': 52, 'seconds': 59.88}\", 4.06], [4, 2, \"2025-07-15 {'degrees': 21, 'minutes': 16, 'seconds': 52.38}\", 2.84], [4, 7, \"2025-07-18 {'degrees': 17, 'minutes': 27, 'seconds': 35.13}\", 7.3], [6, 6, \"2025-07-26 {'degrees': 0, 'minutes': 46, 'seconds': 33.64}\", 9.16], [6, 3, \"2025-08-04 {'degrees': 4, 'minutes': 31, 'seconds': 48.22}\", 8.19], [6, 8, \"2025-08-12 {'degrees': 9, 'minutes': 9, 'seconds': 7.59}\", 3.37], [6, 5, \"2025-08-15 {'degrees': 18, 'minutes': 6, 'seconds': 50.85}\", 9.64], [6, 0, \"2025-08-25 {'degrees': 9, 'minutes': 26, 'seconds': 3.05}\", 2.89], [6, 1, \"2025-08-28 {'degrees': 6, 'minutes': 49, 'seconds': 48.7}\", 4.82], [6, 2, \"2025-09-02 {'degrees': 2, 'minutes': 29, 'seconds': 24.8}\", 3.37], [6, 7,"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "include_antardhasa": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "years": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "include_antardhasa",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "years"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "mudda_dhasa_bhukthi"
                ],
                "years": 0,
                "date_time": "2025-02-13T05:10:10.565Z",
                "include_antardhasa": true,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/muhurat/": {
      "post": {
        "operationId": "astro_muhurat",
        "summary": "Ceremony muhurats",
        "description": "Finds the times within a date range at which one of five Hindu rites of passage may be performed. Each rite has its own list of permitted nakshatras plus further conditions on tithi, weekday or the Sun's sign, and every sampling instant in the range is tested against all five.\n\nThe five are mundan (a child's first tonsure), vidyarambha (beginning formal education), upanayana (the sacred thread), graha_pravesha (entering a new house) and deva_pratishtha (installing a deity). Mundan additionally checks the child's age against birth_date and only permits years 1, 3, 5, 7, 10 and 11.\n\nPass start_date, end_date, birth_date, interval_hours and the place. The scan steps through the range at interval_hours and reports each qualifying step as its own two-hour window, so a qualifying day produces several overlapping rows that you will usually want to merge; a smaller interval gives finer boundaries and many more rows. Keep the range to a few weeks — the price is one credit either way, but every step recomputes a full panchanga. The single key is find_muhurats_in_range.\n\nAvailable `keys` (1), all covered by the same single credit: find_muhurats_in_range.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"find_muhurats_in_range\": [{\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-02-28 01:20:05.104000+05:30\", \"end_time\": \"2025-02-28 03:20:05.104000+05:30\", \"nakshatra\": \"Satabhishak\", \"tithi\": 1}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-02-28 03:20:05.104000+05:30\", \"end_time\": \"2025-02-28 05:20:05.104000+05:30\", \"nakshatra\": \"Satabhishak\", \"tithi\": 1}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-02-28 05:20:05.104000+05:30\", \"end_time\": \"2025-02-28 07:20:05.104000+05:30\", \"nakshatra\": \"Satabhishak\", \"tithi\": 1}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-02-28 07:20:05.104000+05:30\", \"end_time\": \"2025-02-28 09:20:05.104000+05:30\", \"nakshatra\": \"Satabhishak\", \"tithi\": 1}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-02-28 09:20:05.104000+05:30\", \"end_time\": \"2025-02-28 11:20:05.104000+05:30\", \"nakshatra\": \"Satabhishak\", \"tithi\": 1}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-02 01:20:05.104000+05:30\", \"end_time\": \"2025-03-02 03:20:05.104000+05:30\", \"nakshatra\": \"Uttaraabhaadra\", \"tithi\": 3}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-02 03:20:05.104000+05:30\", \"end_time\": \"2025-03-02 05:20:05.104000+05:30\", \"nakshatra\": \"Uttaraabhaadra\", \"tithi\": 3}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 13:20:05.104000+05:30\", \"end_time\": \"2025-03-03 15:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 13:20:05.104000+05:30\", \"end_time\": \"2025-03-03 15:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 15:20:05.104000+05:30\", \"end_time\": \"2025-03-03 17:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 15:20:05.104000+05:30\", \"end_time\": \"2025-03-03 17:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 17:20:05.104000+05:30\", \"end_time\": \"2025-03-03 19:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 17:20:05.104000+05:30\", \"end_time\": \"2025-03-03 19:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 19:20:05.104000+05:30\", \"end_time\": \"2025-03-03 21:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 19:20:05.104000+05:30\", \"end_time\": \"2025-03-03 21:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 21:20:05.104000+05:30\", \"end_time\": \"2025-03-03 23:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 21:20:05.104000+05:30\", \"end_time\": \"2025-03-03 23:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"vidyarambha\", \"start_time\": \"2025-03-03 23:20:05.104000+05:30\", \"end_time\": \"2025-03-04 01:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-03 23:20:05.104000+05:30\", \"end_time\": \"2025-03-04 01:20:05.104000+05:30\", \"nakshatra\": \"Ashwini\", \"tithi\": 5}, {\"muhurat\": \"graha_pravesha\", \"start_time\": \"2025-03-05 21:20:05.104000+05:30\", \"end_time\": \"2025-03-05 23:20:05.104000+05:30\", \"nakshatra\": \"Rohini\", \"tithi\": 7}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-05 21:20:05.104000+05:30\", \"end_time\": \"2025-03-05 23:20:05.104000+05:30\", \"nakshatra\": \"Rohini\", \"tithi\": 7}, {\"muhurat\": \"graha_pravesha\", \"start_time\": \"2025-03-05 23:20:05.104000+05:30\", \"end_time\": \"2025-03-06 01:20:05.104000+05:30\", \"nakshatra\": \"Rohini\", \"tithi\": 7}, {\"muhurat\": \"deva_pratishtha\", \"start_time\": \"2025-03-05 23:20:05.104000+05:30\", \"end_time\": \"2025-03-06 01:20:05.104000+05:30\", \"nakshatra\": \"Rohini\", \"tithi\": 7}, {\"muhurat\": \"graha_pravesha\", \"start_time\": \"2025-03-06 01:20:05.104000+05:30\", \"end_time\": \"2025-03-06 03:20:05.104000+05:30\", \"nakshatra\": "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "interval_hours": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "start_date": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  }
                },
                "required": [
                  "birth_date",
                  "date_time",
                  "end_date",
                  "interval_hours",
                  "keys",
                  "latitude",
                  "longitude",
                  "start_date",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "find_muhurats_in_range"
                ],
                "date_time": "2025-03-27T13:50:05.104Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "start_date": "2025-02-27T13:50:05.104Z",
                "end_date": "2025-03-27T13:50:05.104Z",
                "birth_date": "2025-03-27T13:50:05.104Z",
                "interval_hours": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/muhurta-table/": {
      "post": {
        "operationId": "astro_muhurta_table",
        "summary": "Muhurta table",
        "description": "All thirty muhurtas of the day: fifteen dividing sunrise to sunset and fifteen dividing sunset to the next sunrise.\n\nEach carries its name, its number and whether it is held auspicious, so this is the endpoint to build a full day strip from. A muhurta is a fifteenth of the actual daylight or darkness, not a fixed forty-eight minutes, so lengths change with latitude and season.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"muhurtas\": {\"day_muhurtas\": [{\"index\": 1, \"number\": 1, \"muhurta\": \"Rudra\", \"auspicious\": false, \"name\": \"Ardra\", \"division\": \"Pratah\", \"special\": null, \"start\": \"2026-08-31T06:09:30+05:30\", \"end\": \"2026-08-31T06:59:50.266667+05:30\"}, {\"index\": 2, \"number\": 2, \"muhurta\": \"Uraga\", \"auspicious\": false, \"name\": \"Ashlesha\", \"division\": \"Pratah\", \"special\": null, \"start\": \"2026-08-31T06:59:50.266667+05:30\", \"end\": \"2026-08-31T07:50:10.533334+05:30\"}, {\"index\": 3, \"number\": 3, \"muhurta\": \"Mitra\", \"auspicious\": true, \"name\": \"Anuradha\", \"division\": \"Pratah\", \"special\": null, \"start\": \"2026-08-31T07:50:10.533334+05:30\", \"end\": \"2026-08-31T08:40:30.800001+05:30\"}, {\"index\": 4, \"number\": 4, \"muhurta\": \"Pitara\", \"auspicious\": false, \"name\": \"Magha\", \"division\": \"Sangava\", \"special\": null, \"start\": \"2026-08-31T08:40:30.800001+05:30\", \"end\": \"2026-08-31T09:30:51.066668+05:30\"}, {\"index\": 5, \"number\": 5, \"muhurta\": \"Vasu\", \"auspicious\": true, \"name\": \"Dhanishtha\", \"division\": \"Sangava\", \"special\": null, \"start\": \"2026-08-31T09:30:51.066668+05:30\", \"end\": \"2026-08-31T10:21:11.333335+05:30\"}, {\"index\": 6, \"number\": 6, \"muhurta\": \"Ambu\", \"auspicious\": true, \"name\": \"Purva Ashadha\", \"division\": \"Sangava\", \"special\": null, \"start\": \"2026-08-31T10:21:11.333335+05:30\", \"end\": \"2026-08-31T11:11:31.600002+05:30\"}, {\"index\": 7, \"number\": 7, \"muhurta\": \"Vishwedeva\", \"auspicious\": true, \"name\": \"Uttara Ashadha\", \"division\": \"Madhyahna\", \"special\": null, \"start\": \"2026-08-31T11:11:31.600002+05:30\", \"end\": \"2026-08-31T12:01:51.866669+05:30\"}, {\"index\": 8, \"number\": 8, \"muhurta\": \"Vidhi\", \"auspicious\": true, \"name\": \"Abhijita\", \"division\": \"Madhyahna\", \"special\": \"Abhijit Muhurat\", \"start\": \"2026-08-31T12:01:51.866669+05:30\", \"end\": \"2026-08-31T12:52:12.133336+05:30\"}, {\"index\": 9, \"number\": 9, \"muhurta\": \"Brahma\", \"auspicious\": true, \"name\": \"Rohini\", \"division\": \"Madhyahna\", \"special\": null, \"start\": \"2026-08-31T12:52:12.133336+05:30\", \"end\": \"2026-08-31T13:42:32.400003+05:30\"}, {\"index\": 10, \"number\": 10, \"muhurta\": \"Indra\", \"auspicious\": true, \"name\": \"Jyeshtha\", \"division\": \"Aparahna\", \"special\": null, \"start\": \"2026-08-31T13:42:32.400003+05:30\", \"end\": \"2026-08-31T14:32:52.666670+05:30\"}, {\"index\": 11, \"number\": 11, \"muhurta\": \"Indragni\", \"auspicious\": false, \"name\": \"Vishakha\", \"division\": \"Aparahna\", \"special\": \"Vijay Muhurat\", \"start\": \"2026-08-31T14:32:52.666670+05:30\", \"end\": \"2026-08-31T15:23:12.933337+05:30\"}, {\"index\": 12, \"number\": 12, \"muhurta\": \"Daitya\", \"auspicious\": false, \"name\": \"Mula\", \"division\": \"Aparahna\", \"special\": null, \"start\": \"2026-08-31T15:23:12.933337+05:30\", \"end\": \"2026-08-31T16:13:33.200004+05:30\"}, {\"index\": 13, \"number\": 13, \"muhurta\": \"Varuna\", \"auspicious\": true, \"name\": \"Shatabhisha\", \"division\": \"Sayahna\", \"special\": null, \"start\": \"2026-08-31T16:13:33.200004+05:30\", \"end\": \"2026-08-31T17:03:53.466671+05:30\"}, {\"index\": 14, \"number\": 14, \"muhurta\": \"Aryama\", \"auspicious\": true, \"name\": \"Uttara Phalguni\", \"division\": \"Sayahna\", \"special\": null, \"start\": \"2026-08-31T17:03:53.466671+05:30\", \"end\": \"2026-08-31T17:54:13.733338+05:30\"}, {\"index\": 15, \"number\": 15, \"muhurta\": \"Bhaga\", \"auspicious\": false, \"name\": \"Purva Phalguni\", \"division\": \"Sayahna\", \"special\": null, \"start\": \"2026-08-31T17:54:13.733338+05:30\", \"end\": \"2026-08-31T18:44:34.000005+05:30\"}], \"night_muhurtas\": [{\"index\": 1, \"number\": 16, \"muhurta\": \"Ishwara\", \"auspicious\": false, \"name\": \"Ardra\", \"division\": \"Pradosha\", \"special\": \"Sayan Sandhya\", \"start\": \"2026-08-31T18:44:34+05:30\", \"end\": \"2026-08-31T19:30:15.466667+05:30\"}, {\"index\": 2, \"number\": 17, \"muhurta\": \"Ajaikapada\", \"auspicious\": false, \"name\": \"Purva Bhadrapada\", \"division\": \"Pradosha\", \"special\": \"1/2 Sayan Sandhya\", \"start\": \"2026-08-31T19:30:15.466667+05:30\", \"end\": \"2026-08-31T20:15:56.933334+05:30\"}, {\"index\": 3, \"number\": 18, \"muhurta\": \"Ahirbudhnya\", \"auspicious\": true, \"name\": \"Uttara Bhadrapada\", \"division\": \"Pradosha\", \"special\": null, \"start\": \"2026-08-31T20:15:56.933334"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane-charts/": {
      "post": {
        "operationId": "astro_mundane_charts",
        "summary": "Mundane ingress charts",
        "description": "The ingress charts a Vedic year is judged from.\n\nThe world ascendant chart cast at the solar ingress, the Ardra pravesh chart read for the monsoon, and the summer and autumn crop charts. Each carries the exact moment it is cast for and a complete set of planetary positions at that instant — these are the charts annual almanac predictions are actually read out of.\n\nA large response: four full charts plus an ingress time.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2025, \"charts\": [{\"chart\": \"jagat_lagna_chart\", \"describes\": \"World ascendant chart, cast at the solar ingress\", \"result\": {\"ingress_time\": \"2025-04-13T21:51:25Z\", \"chart\": {\"celestial\": {\"sun\": {\"longitude\": {\"degree\": 0, \"sign\": \"Ar\", \"minutes\": 0, \"seconds\": 0}, \"latitude\": -0.0, \"nakshatra\": \"Ashwini\", \"pada\": 1, \"kakshya\": \"saturn\", \"zodiac_name\": \"Aries\", \"house\": 3}, \"moon\": {\"longitude\": {\"degree\": 9, \"sign\": \"Li\", \"minutes\": 42, \"seconds\": 32}, \"latitude\": -3.122, \"nakshatra\": \"Swaati\", \"pada\": 1, \"kakshya\": \"mars\", \"zodiac_name\": \"Libra\", \"house\": 9}, \"mercury\": {\"longitude\": {\"degree\": 4, \"sign\": \"Pi\", \"minutes\": 22, \"seconds\": 15}, \"latitude\": -1.443, \"nakshatra\": \"Uttaraabhaadra\", \"pada\": 1, \"kakshya\": \"jupiter\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"venus\": {\"longitude\": {\"degree\": 0, \"sign\": \"Pi\", \"minutes\": 25, \"seconds\": 44}, \"latitude\": 4.46, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 4, \"kakshya\": \"saturn\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"mars\": {\"longitude\": {\"degree\": 4, \"sign\": \"Cn\", \"minutes\": 4, \"seconds\": 4}, \"latitude\": 2.355, \"nakshatra\": \"Pushyami\", \"pada\": 1, \"kakshya\": \"jupiter\", \"zodiac_name\": \"Cancer\", \"house\": 6}, \"jupiter\": {\"longitude\": {\"degree\": 23, \"sign\": \"Ta\", \"minutes\": 55, \"seconds\": 8}, \"latitude\": -0.276, \"nakshatra\": \"Mrigasira\", \"pada\": 1, \"kakshya\": \"moon\", \"zodiac_name\": \"Taurus\", \"house\": 4}, \"saturn\": {\"longitude\": {\"degree\": 1, \"sign\": \"Pi\", \"minutes\": 47, \"seconds\": 31}, \"latitude\": -1.959, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 4, \"kakshya\": \"saturn\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"uranus\": {\"longitude\": {\"degree\": 1, \"sign\": \"Ta\", \"minutes\": 10, \"seconds\": 37}, \"latitude\": -0.219, \"nakshatra\": \"Krittika\", \"pada\": 2, \"kakshya\": \"saturn\", \"zodiac_name\": \"Taurus\", \"house\": 4}, \"neptune\": {\"longitude\": {\"degree\": 6, \"sign\": \"Pi\", \"minutes\": 19, \"seconds\": 1}, \"latitude\": -1.269, \"nakshatra\": \"Uttaraabhaadra\", \"pada\": 1, \"kakshya\": \"jupiter\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"pluto\": {\"longitude\": {\"degree\": 9, \"sign\": \"Cp\", \"minutes\": 30, \"seconds\": 25}, \"latitude\": -3.489, \"nakshatra\": \"Uttaraashaadha\", \"pada\": 4, \"kakshya\": \"mars\", \"zodiac_name\": \"Capricorn\", \"house\": 12}, \"northtruenode\": {\"longitude\": {\"degree\": 3, \"sign\": \"Pi\", \"minutes\": 4, \"seconds\": 22}, \"latitude\": -0.0, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 4, \"kakshya\": \"saturn\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"northmeannode\": {\"longitude\": {\"degree\": 1, \"sign\": \"Pi\", \"minutes\": 50, \"seconds\": 16}, \"latitude\": 0.0, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 4, \"kakshya\": \"saturn\", \"zodiac_name\": \"Pisces\", \"house\": 2}, \"southtruenode\": {\"longitude\": {\"degree\": 3, \"sign\": \"Vi\", \"minutes\": 4, \"seconds\": 22}, \"latitude\": -0.0, \"nakshatra\": \"Uttara Phalguni\", \"pada\": 2, \"kakshya\": \"saturn\", \"zodiac_name\": \"Virgo\", \"house\": 8}, \"southmeannode\": {\"longitude\": {\"degree\": 1, \"sign\": \"Vi\", \"minutes\": 50, \"seconds\": 16}, \"latitude\": 0.0, \"nakshatra\": \"Uttara Phalguni\", \"pada\": 2, \"kakshya\": \"saturn\", \"zodiac_name\": \"Virgo\", \"house\": 8}}, \"houses\": {\"1\": {\"start\": \"18 Cp 10 4\", \"cusp\": \"3 Aq 10 4\", \"end\": \"18 Aq 10 4\"}, \"2\": {\"start\": \"18 Aq 10 4\", \"cusp\": \"3 Pi 10 4\", \"end\": \"18 Pi 10 4\"}, \"3\": {\"start\": \"18 Pi 10 4\", \"cusp\": \"3 Ar 10 4\", \"end\": \"18 Ar 10 4\"}, \"4\": {\"start\": \"18 Ar 10 4\", \"cusp\": \"3 Ta 10 4\", \"end\": \"18 Ta 10 4\"}, \"5\": {\"start\": \"18 Ta 10 4\", \"cusp\": \"3 Ge 10 4\", \"end\": \"18 Ge 10 4\"}, \"6\": {\"start\": \"18 Ge 10 4\", \"cusp\": \"3 Cn 10 4\", \"end\": \"18 Cn 10 4\"}, \"7\": {\"start\": \"18 Cn 10 4\", \"cusp\": \"3 Le 10 4\", \"end\": \"18 Le 10 4\"}, \"8\": {\"start\": \"18 Le 10 4\", \"cusp\": \"3 Vi 10 4\", \"end\": \"18 Vi 10 4\"}, \"9\": {\"start\": \"18 Vi 10 4\", \"cusp\": \"3 Li 10 4\", \"end\": \"18 Li 10 4\"}, \"10\": {\"start\": \"18 Li 10 4\", \"cusp\": \"3 Sc 10 4\", \"end\": \"18 Sc 10 4\"}, \"11\": {\"start\": \"18 Sc 10 4\", \"cusp\": \"3 Sg 10 4\", \"end\": \"18 Sg 10 4\"}, \"12\": {\"start\": \"18 Sg 10 4\", \"cusp\": \"3 Cp 10 4\", \"end\": \"18 Cp 10 4\"}}, \"ascendant\": {\"longitude\": {\"degree\": 3, \"sign\": \"Aq\", \"minutes\": 10, \"seconds\": 4}, \"zodia"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "Only read by /nakshatra-chakras/; ignored elsewhere.",
                    "default": "Ashwini",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2025,
                "date_time": "2025-02-13T05:00:37Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/": {
      "post": {
        "operationId": "astro_mundane",
        "summary": "Mundane astrology",
        "description": "Mundane astrology reads the year for a country rather than for a person. Its central device is the samvatsara cabinet: ten 'officers' of the year, each a planet, each fixed by the weekday on which a particular solar event falls — the king from the lunar new year, the minister from the Sun's entry into Aries, the lord of clouds from its entry into Ardra, and so on down to the lords of grain, treasury and fruits. A year with Saturn as king is read very differently from one with Jupiter.\n\nPass the year you want plus a place and UTC offset. das_adhikari returns the whole cabinet in one object and is the key to start with; the individual keys — king_of_year, mantri_of_year, meghesha_of_year and the rest — return the same planets one at a time. vaahan_of_samvat gives the year's symbolic vehicle, derived from the king.\n\nAlongside the cabinet the endpoint returns the year's astronomical frame — equinoxes, solstices, indian_ritus for the six seasons as real date ranges, chaitra_shukla_pratipada and ardra_entry — and four charts cast for particular ingresses: jagat_lagna_chart at the Sun's entry into Aries, ardra_pravesh_chart for the monsoon, and sharatsasya_chart and greeshmasasya_chart for the winter and summer crops.\n\nsapta_nadi_chakra and samvatsara_purusha_chakra are static reference tables that do not vary by year, and nakshatra_lord_effects looks a single nakshatra up in the first of them. That key's nakshatra field uses an older transliteration and covers only twenty-six names — check the field's list rather than assuming modern spellings.\n\nAvailable `keys` (24), all covered by the same single credit: ardra_entry, ardra_pravesh_chart, chaitra_shukla_pratipada, das_adhikari, dhaanyesha_of_year, dhanesha_of_year, durgesha_of_year, equinoxes, greeshmasasya_chart, indian_ritus, jagat_lagna_chart, king_of_year, mantri_of_year, meghesha_of_year, nakshatra_lord_effects, neersesha_of_year, phalesha_of_year, rasesha_of_year, samvatsara_purusha_chakra, sapta_nadi_chakra, sashyesha_of_year, sharatsasya_chart, solstices, vaahan_of_samvat.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "nakshatra_lord_effects": {
                      "lord": "Saturn",
                      "nadi": "Chandaa",
                      "means": "Aggressive",
                      "effect": "Heat, Wind"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "Used only by the 'nakshatra_lord_effects' key. EXACT case-sensitive match against the Sapta Nadi Chakra table - these are older transliterations, not the modern spellings; note 'Aardra' (not Ardra), 'Aasresha' (not Ashlesha), 'Makha' (not Magha), 'Sravanam' (not Shravana), 'Visaakha', 'Anooraadha', 'Mrigasira', 'Pushyami', 'Satabhishak', 'Poorvaabhaadra', 'Uttaraashaadha'. Only 26 of the 28 nakshatra names appear - 'Poorvaashaadha' and 'Uttaraabhaadra' are absent from the table. An unmatched name does NOT error: the method returns null.",
                    "enum": [
                      "Krittika",
                      "Visaakha",
                      "Anooraadha",
                      "Bharani",
                      "Rohini",
                      "Swaati",
                      "Jyeshtha",
                      "Ashwini",
                      "Mrigasira",
                      "Chitra",
                      "Moola",
                      "Revati",
                      "Aardra",
                      "Hasta",
                      "Poorva Phalguni",
                      "Uttara Phalguni",
                      "Punarvasu",
                      "Uttaraashaadha",
                      "Poorvaabhaadra",
                      "Pushyami",
                      "Abhijit",
                      "Satabhishak",
                      "Aasresha",
                      "Makha",
                      "Sravanam",
                      "Dhanishtha"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "nakshatra",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "nakshatra_lord_effects"
                ],
                "year": 2025,
                "date_time": "2025-02-13T05:00:37.682Z",
                "nakshatra": "Krittika",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/conjunctions/": {
      "post": {
        "operationId": "astro_mundane_conjunctions",
        "summary": "Planetary conjunctions",
        "description": "When two bodies next share the same ecliptic longitude.\n\nA planetary conjunction is a sky event with no birth chart in it, which is why this sits beside /api/astro/mundane/ingresses/ and /api/astro/mundane/stations/ rather than under transits.\n\nChoose the pair with `celestial1` and `celestial2`. Both longitudes at the moment found are returned as well as the date — the search stops when they meet, so seeing the two values agree is how you check that it really did.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "bodies": [
                      "jupiter",
                      "saturn"
                    ],
                    "conjunction": "2040-10-31T09:02:40Z",
                    "longitude_1": 173.483,
                    "longitude_2": 173.493
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after",
                "celestial1": "jupiter",
                "celestial2": "saturn"
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/events/": {
      "post": {
        "operationId": "astro_mundane_events",
        "summary": "Sky events timeline",
        "description": "Every sky event in a window, as one ordered timeline.\n\nIngresses, retrograde stations, lunations and eclipses merged and sorted — a year-ahead calendar in one call rather than four. This is the feed to build a scheduler or a content calendar on.\n\nUse `include` to pick which families you want and `bodies` to narrow the planets; a five-year window with everything switched on is a large response. Eclipses come from the same engine code as the /api/astro/eclipse/ endpoints, so the two never disagree.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"count\": 30, \"counts_by_type\": {\"ingress\": 12, \"lunation\": 13, \"eclipse\": 2, \"station\": 3}, \"included\": [\"eclipses\", \"ingresses\", \"lunations\", \"stations\"], \"events\": [{\"type\": \"ingress\", \"body\": \"mercury\", \"datetime_utc\": \"2026-01-01T21:10:42Z\", \"julian_day_ut\": 2461042.38243192, \"from_sign\": \"Sagittarius\", \"to_sign\": \"Capricorn\", \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 0.0}, {\"type\": \"lunation\", \"phase\": \"full_moon\", \"datetime_utc\": \"2026-01-03T10:02:55Z\", \"julian_day_ut\": 2461043.91868991, \"elongation_deg\": 180.0, \"moon\": {\"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 13.0329}, \"sun\": {\"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 13.0329}}, {\"type\": \"lunation\", \"phase\": \"new_moon\", \"datetime_utc\": \"2026-01-18T19:51:59Z\", \"julian_day_ut\": 2461059.32776864, \"elongation_deg\": 0.0, \"moon\": {\"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 28.7321}, \"sun\": {\"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 28.7321}}, {\"type\": \"ingress\", \"body\": \"mercury\", \"datetime_utc\": \"2026-01-20T16:41:11Z\", \"julian_day_ut\": 2461061.19526785, \"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 0.0}, {\"type\": \"ingress\", \"body\": \"mars\", \"datetime_utc\": \"2026-01-23T09:16:45Z\", \"julian_day_ut\": 2461063.88663757, \"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 0.0}, {\"type\": \"lunation\", \"phase\": \"full_moon\", \"datetime_utc\": \"2026-02-01T22:09:15Z\", \"julian_day_ut\": 2461073.4230902, \"elongation_deg\": 180.0, \"moon\": {\"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 13.0612}, \"sun\": {\"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 13.0612}}, {\"type\": \"ingress\", \"body\": \"mercury\", \"datetime_utc\": \"2026-02-06T22:48:04Z\", \"julian_day_ut\": 2461078.45004688, \"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 30.0}, {\"type\": \"lunation\", \"phase\": \"new_moon\", \"datetime_utc\": \"2026-02-17T12:01:09Z\", \"julian_day_ut\": 2461089.00080288, \"elongation_deg\": 0.0, \"moon\": {\"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 28.8289}, \"sun\": {\"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 28.8289}}, {\"type\": \"eclipse\", \"kind\": \"solar\", \"eclipse_type\": \"annular\", \"datetime_utc\": \"2026-02-17T12:11:53Z\", \"julian_day_ut\": 2461089.00825231, \"times\": {\"maximum\": \"2026-02-17T12:11:53Z\", \"local_apparent_noon\": \"2026-02-17T11:18:50Z\", \"begin\": \"2026-02-17T09:56:47Z\", \"end\": \"2026-02-17T14:27:39Z\", \"totality_begin\": \"2026-02-17T11:43:04Z\", \"totality_end\": \"2026-02-17T12:41:04Z\", \"centre_line_begin\": \"2026-02-17T11:48:26Z\", \"centre_line_end\": \"2026-02-17T12:35:43Z\"}}, {\"type\": \"station\", \"body\": \"mercury\", \"station\": \"retrograde\", \"datetime_utc\": \"2026-02-26T06:48:10Z\", \"julian_day_ut\": 2461097.78344903, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 22.5653}, {\"type\": \"ingress\", \"body\": \"mars\", \"datetime_utc\": \"2026-03-02T14:15:50Z\", \"julian_day_ut\": 2461102.09433434, \"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 0.0}, {\"type\": \"eclipse\", \"kind\": \"lunar\", \"eclipse_type\": \"total\", \"datetime_utc\": \"2026-03-03T11:33:41Z\", \"julian_day_ut\": 2461102.98172454, \"times\": {\"maximum\": \"2026-03-03T11:33:41Z\", \"partial_begin\": \"2026-03-03T09:50:05Z\", \"partial_end\": \"2026-03-03T13:17:17Z\", \"totality_begin\": \"2026-03-03T11:04:32Z\", \"totality_end\": \"2026-03-03T12:02:51Z\", \"penumbral_begin\": \"2026-03-03T08:44:24Z\", \"penumbral_end\": \"2026-03-03T14:23:07Z\"}}, {\"type\": \"lunation\", \"phase\": \"full_moon\", \"datetime_utc\": \"2026-03-03T11:37:54Z\", \"julian_day_ut\": 2461102.98465322, \"elongation_deg\": 180.0, \"moon\": {\"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 12.8981}, \"sun\": {\"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 12.8981}}, {\"type\": \"lunation\", \"phase\": \"new_moon\", \"datetime_utc\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "End of the window.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to all eleven. Narrow it to keep responses small.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "include": {
                    "type": "array",
                    "description": "Which event families to merge. Defaults to all four.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "phases": {
                    "type": "array",
                    "description": "Defaults to all four. Ask for new_moon and full_moon only if you do not need the quarters.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "end_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "end_date_time": "2026-06-30T23:59:59+00:00",
                "timezone_as_float": 0,
                "bodies": [
                  "mars",
                  "mercury"
                ],
                "phases": [
                  "new_moon",
                  "full_moon"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/ingresses/": {
      "post": {
        "operationId": "astro_mundane_ingresses",
        "summary": "Sign ingresses",
        "description": "Every sign change, for every body, across a window of dates.\n\nMundane astrology asks about the sky itself rather than about a person, so there is no birth data here — just a window and what happens in it. Each event names the sign left and the sign entered, and flags whether the body was retrograde: a retrograde ingress is a planet re-entering the sign it just left, which products normally label differently from an ordinary one.\n\nFound by scanning rather than by formula, which matters for correctness — a retrograde planet can cross the same boundary three times in a few weeks, and a closed-form solution returns one answer where there are really three.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "count": 10,
                    "ingresses": [
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-01-23T09:16:45Z",
                        "julian_day_ut": 2461063.88663757,
                        "from_sign": "Capricorn",
                        "to_sign": "Aquarius",
                        "retrograde": false,
                        "sign": "Aquarius",
                        "sign_index": 11,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "saturn",
                        "datetime_utc": "2026-02-14T00:11:39Z",
                        "julian_day_ut": 2461085.50809114,
                        "from_sign": "Pisces",
                        "to_sign": "Aries",
                        "retrograde": false,
                        "sign": "Aries",
                        "sign_index": 1,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-03-02T14:15:50Z",
                        "julian_day_ut": 2461102.09433434,
                        "from_sign": "Aquarius",
                        "to_sign": "Pisces",
                        "retrograde": false,
                        "sign": "Pisces",
                        "sign_index": 12,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-04-09T19:36:10Z",
                        "julian_day_ut": 2461140.3167767,
                        "from_sign": "Pisces",
                        "to_sign": "Aries",
                        "retrograde": false,
                        "sign": "Aries",
                        "sign_index": 1,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-05-18T22:25:28Z",
                        "julian_day_ut": 2461179.43435282,
                        "from_sign": "Aries",
                        "to_sign": "Taurus",
                        "retrograde": false,
                        "sign": "Aries",
                        "sign_index": 1,
                        "degree_in_sign": 30
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-06-28T19:29:15Z",
                        "julian_day_ut": 2461220.31197564,
                        "from_sign": "Taurus",
                        "to_sign": "Gemini",
                        "retrograde": false,
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "jupiter",
                        "datetime_utc": "2026-06-30T05:52:22Z",
                        "julian_day_ut": 2461221.74469549,
                        "from_sign": "Cancer",
                        "to_sign": "Leo",
                        "retrograde": false,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 30
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-08-11T08:30:31Z",
                        "julian_day_ut": 2461263.85452433,
                        "from_sign": "Gemini",
                        "to_sign": "Cancer",
                        "retrograde": false,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 0
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-09-28T02:48:53Z",
                        "julian_day_ut": 2461311.61727514,
                        "from_sign": "Cancer",
                        "to_sign": "Leo",
                        "retrograde": false,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 30
                      },
                      {
                        "type": "ingress",
                        "body": "mars",
                        "datetime_utc": "2026-11-25T23:37:06Z",
                        "julian_day_ut": 2461370.48409604,
                        "from_sign": "Leo",
                        "to_sign": "Virgo",
                        "retrograde": false,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 30
                      }
                    ],
                    "from": "2026-01-01T00:00:00Z",
                    "to": "2026-12-31T23:59:59Z",
                    "window_days": 365
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "End of the window.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to all eleven. Narrow it to keep responses small.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "end_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "end_date_time": "2026-12-31T23:59:59+00:00",
                "timezone_as_float": 0,
                "bodies": [
                  "mars",
                  "jupiter",
                  "saturn"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/lunations/": {
      "post": {
        "operationId": "astro_mundane_lunations",
        "summary": "New and full moons",
        "description": "New moons, full moons and both quarters across a window of dates.\n\nSolved on the Moon's elongation from the Sun rather than on the Moon's position alone. That distinction is not pedantic: a full moon is the Moon 180 degrees from where the SUN is now, and using the Moon's longitude by itself drifts by up to a day over a year.\n\nEach entry gives the sign of both the Moon and the Sun at that moment. Filter with `phases` if you only want new and full.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "count": 13,
                    "phases": [
                      "full_moon",
                      "new_moon"
                    ],
                    "lunations": [
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-01-03T10:02:55Z",
                        "julian_day_ut": 2461043.91868991,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Cancer",
                          "sign_index": 4,
                          "degree_in_sign": 13.0329
                        },
                        "sun": {
                          "sign": "Capricorn",
                          "sign_index": 10,
                          "degree_in_sign": 13.0329
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-01-18T19:51:59Z",
                        "julian_day_ut": 2461059.32776864,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Capricorn",
                          "sign_index": 10,
                          "degree_in_sign": 28.7321
                        },
                        "sun": {
                          "sign": "Capricorn",
                          "sign_index": 10,
                          "degree_in_sign": 28.7321
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-02-01T22:09:15Z",
                        "julian_day_ut": 2461073.4230902,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Leo",
                          "sign_index": 5,
                          "degree_in_sign": 13.0612
                        },
                        "sun": {
                          "sign": "Aquarius",
                          "sign_index": 11,
                          "degree_in_sign": 13.0612
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-02-17T12:01:09Z",
                        "julian_day_ut": 2461089.00080288,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Aquarius",
                          "sign_index": 11,
                          "degree_in_sign": 28.8289
                        },
                        "sun": {
                          "sign": "Aquarius",
                          "sign_index": 11,
                          "degree_in_sign": 28.8289
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-03-03T11:37:54Z",
                        "julian_day_ut": 2461102.98465322,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Virgo",
                          "sign_index": 6,
                          "degree_in_sign": 12.8981
                        },
                        "sun": {
                          "sign": "Pisces",
                          "sign_index": 12,
                          "degree_in_sign": 12.8981
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-03-19T01:23:29Z",
                        "julian_day_ut": 2461118.557975,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Pisces",
                          "sign_index": 12,
                          "degree_in_sign": 28.4514
                        },
                        "sun": {
                          "sign": "Pisces",
                          "sign_index": 12,
                          "degree_in_sign": 28.4514
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-04-02T02:11:58Z",
                        "julian_day_ut": 2461132.59164714,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Libra",
                          "sign_index": 7,
                          "degree_in_sign": 12.3529
                        },
                        "sun": {
                          "sign": "Aries",
                          "sign_index": 1,
                          "degree_in_sign": 12.3529
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-04-17T11:51:49Z",
                        "julian_day_ut": 2461147.99431205,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Aries",
                          "sign_index": 1,
                          "degree_in_sign": 27.4828
                        },
                        "sun": {
                          "sign": "Aries",
                          "sign_index": 1,
                          "degree_in_sign": 27.4828
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-05-01T17:23:11Z",
                        "julian_day_ut": 2461162.22443318,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Scorpio",
                          "sign_index": 8,
                          "degree_in_sign": 11.3473
                        },
                        "sun": {
                          "sign": "Taurus",
                          "sign_index": 2,
                          "degree_in_sign": 11.3473
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-05-16T20:01:03Z",
                        "julian_day_ut": 2461177.334064,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Taurus",
                          "sign_index": 2,
                          "degree_in_sign": 25.9615
                        },
                        "sun": {
                          "sign": "Taurus",
                          "sign_index": 2,
                          "degree_in_sign": 25.9615
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-05-31T08:45:13Z",
                        "julian_day_ut": 2461191.86473158,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Sagittarius",
                          "sign_index": 9,
                          "degree_in_sign": 9.9295
                        },
                        "sun": {
                          "sign": "Gemini",
                          "sign_index": 3,
                          "degree_in_sign": 9.9295
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "new_moon",
                        "datetime_utc": "2026-06-15T02:54:10Z",
                        "julian_day_ut": 2461206.62095431,
                        "elongation_deg": 0,
                        "moon": {
                          "sign": "Gemini",
                          "sign_index": 3,
                          "degree_in_sign": 24.0502
                        },
                        "sun": {
                          "sign": "Gemini",
                          "sign_index": 3,
                          "degree_in_sign": 24.0502
                        }
                      },
                      {
                        "type": "lunation",
                        "phase": "full_moon",
                        "datetime_utc": "2026-06-29T23:56:42Z",
                        "julian_day_ut": 2461221.49770298,
                        "elongation_deg": 180,
                        "moon": {
                          "sign": "Capricorn",
                          "sign_index": 10,
                          "degree_in_sign": 8.2474
                        },
                        "sun": {
                          "sign": "Cancer",
                          "sign_index": 4,
                          "degree_in_sign": 8.2474
                        }
                      }
                    ],
                    "from": "2026-01-01T00:00:00Z",
                    "to": "2026-06-30T23:59:59Z",
                    "window_days": 181
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "End of the window.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to all eleven. Narrow it to keep responses small.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "phases": {
                    "type": "array",
                    "description": "Defaults to all four. Ask for new_moon and full_moon only if you do not need the quarters.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "end_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "end_date_time": "2026-06-30T23:59:59+00:00",
                "timezone_as_float": 0,
                "phases": [
                  "new_moon",
                  "full_moon"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/mundane/stations/": {
      "post": {
        "operationId": "astro_mundane_stations",
        "summary": "Retrograde stations",
        "description": "When each planet turns retrograde, and when it turns direct again.\n\nThe moment of station is where the planet's apparent motion passes through zero, solved to within a second. Each event gives the sign and degree it stations at.\n\nThe Sun and Moon never station and the mean node is always retrograde, so those three are simply absent rather than reported as having none.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "count": 6,
                    "stations": [
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "retrograde",
                        "datetime_utc": "2026-02-26T06:48:10Z",
                        "julian_day_ut": 2461097.78344903,
                        "sign": "Pisces",
                        "sign_index": 12,
                        "degree_in_sign": 22.5653
                      },
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "direct",
                        "datetime_utc": "2026-03-20T19:32:50Z",
                        "julian_day_ut": 2461120.31446844,
                        "sign": "Pisces",
                        "sign_index": 12,
                        "degree_in_sign": 8.4908
                      },
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "retrograde",
                        "datetime_utc": "2026-06-29T17:35:55Z",
                        "julian_day_ut": 2461221.23327872,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 26.2574
                      },
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "direct",
                        "datetime_utc": "2026-07-23T22:57:52Z",
                        "julian_day_ut": 2461245.45684821,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 16.3165
                      },
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "retrograde",
                        "datetime_utc": "2026-10-24T07:12:43Z",
                        "julian_day_ut": 2461337.80049678,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 20.979
                      },
                      {
                        "type": "station",
                        "body": "mercury",
                        "station": "direct",
                        "datetime_utc": "2026-11-13T15:53:53Z",
                        "julian_day_ut": 2461358.16241616,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 5.0335
                      }
                    ],
                    "from": "2026-01-01T00:00:00Z",
                    "to": "2026-12-31T23:59:59Z",
                    "window_days": 365
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "end_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "End of the window.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "bodies": {
                    "type": "array",
                    "description": "Defaults to all eleven. Narrow it to keep responses small.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "end_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-01-01T00:00:00+00:00",
                "end_date_time": "2026-12-31T23:59:59+00:00",
                "timezone_as_float": 0,
                "bodies": [
                  "mercury",
                  "mars"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/muntha/": {
      "post": {
        "operationId": "astro_muntha",
        "summary": "Muntha (varshaphal)",
        "description": "The Muntha for a varshaphal year: its sign, and the house it falls in within that year's annual chart.\n\nThe Muntha begins at the natal ascendant and advances ONE SIGN PER COMPLETED YEAR, so it returns to where it started every twelfth year. Its house, though, is counted from the ANNUAL (varshapravesh) ascendant rather than the natal one - and that ascendant moves each year - which is why two years sharing a Muntha sign will usually not share its house. Both ascendants are returned so the count can be checked.\n\n`year` is optional and defaults to the native's current solar-return year. `age_completed` is the number of solar returns that have passed, which is what the advance is counted from - a running year does not move the Muntha.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1900,
                    "maximum": 2200,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/naadi_marriage_prediction/": {
      "post": {
        "operationId": "astro_naadi_marriage_prediction",
        "summary": "Naadi marriage yogas",
        "description": "A short set of marriage indications from the Naadi tradition, following Satyanarayana Naik's presentation of Rao's system. Rather than weighing the seventh house, it looks only at which planets aspect the marriage significator — Venus for one gender, Mars for the other — reading Jupiter or Saturn as promising the marriage, Jupiter alone as early and Saturn alone as late, and Ketu or Rahu as obstruction or delay.\n\nPass the birth date and time, the place, timezone and gender: 0 uses Venus as the significator, 1 uses Mars. The single key check_marriage_yogas returns four numbered results, each a boolean and an explanatory string.\n\nThis is a narrow, four-rule reading and is best used as one input among several. For marriage timing use the dasha and transit endpoints, and for compatibility between two charts use the matching endpoints.\n\nAvailable `keys` (1), all covered by the same single credit: check_marriage_yogas.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "check_marriage_yogas": {
                      "yoga_1": [
                        false,
                        "Obstacles in marriage, if married, disputes with spouse"
                      ],
                      "yoga_2": [
                        false,
                        "Neither Early/Late Marriage"
                      ],
                      "yoga_3": [
                        false,
                        ""
                      ],
                      "yoga_4": [
                        false,
                        ""
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "gender": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "gender",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "check_marriage_yogas"
                ],
                "date_time": "2025-07-09T10:28:22.014Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 0,
                "gender": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/nakshatra-chakras/": {
      "post": {
        "operationId": "astro_nakshatra_chakras",
        "summary": "Mundane nakshatra chakras",
        "description": "The samvatsara purusha and sapta nadi chakras, and the effects of a nakshatra's lord.\n\nThe samvatsara purusha chakra maps the twenty-seven nakshatras onto the body of the year-being; the sapta nadi chakra groups them under the seven planets. Both are used to judge which parts of a year, and which regions, are afflicted.\n\n`nakshatra` selects the star for the lord-effects lookup and is the only input the mundane set takes beyond the year itself.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2025,
                    "samvatsara_purusha_chakra": {
                      "Entire body": {
                        "nakshatras": [
                          "Krittika",
                          "Rohini"
                        ]
                      },
                      "Navel": {
                        "nakshatras": [
                          "Poorvaashaadha",
                          "Uttaraashaadha"
                        ]
                      },
                      "Heart": {
                        "nakshatras": [
                          "Aasresha"
                        ]
                      },
                      "Vitality": {
                        "nakshatras": [
                          "Makha"
                        ],
                        "significance": "Vitality, strength, generative ability"
                      }
                    },
                    "sapta_nadi_chakra": {
                      "Saturn": {
                        "nakshatras": [
                          "Krittika",
                          "Visaakha",
                          "Anooraadha",
                          "Bharani"
                        ],
                        "nadi": "Chandaa",
                        "means": "Aggressive",
                        "effect": "Heat, Wind"
                      },
                      "Sun": {
                        "nakshatras": [
                          "Rohini",
                          "Swaati",
                          "Jyeshtha",
                          "Ashwini"
                        ],
                        "nadi": "Vaayu",
                        "means": "Wind",
                        "effect": "Excessive heat, cyclone"
                      },
                      "Mars": {
                        "nakshatras": [
                          "Mrigasira",
                          "Chitra",
                          "Moola",
                          "Revati"
                        ],
                        "nadi": "Dahana",
                        "means": "Fire",
                        "effect": "Excessive heat, fire"
                      },
                      "Jupiter": {
                        "nakshatras": [
                          "Aardra",
                          "Hasta",
                          "Poorva Phalguni",
                          "Uttara Phalguni"
                        ],
                        "nadi": "Saumya",
                        "means": "Gentle",
                        "effect": "Rainfall"
                      },
                      "Venus": {
                        "nakshatras": [
                          "Punarvasu",
                          "Uttara Phalguni",
                          "Uttaraashaadha",
                          "Poorvaabhaadra"
                        ],
                        "nadi": "Neera",
                        "means": "Water",
                        "effect": "Rainfall"
                      },
                      "Mercury": {
                        "nakshatras": [
                          "Pushyami",
                          "Poorva Phalguni",
                          "Abhijit",
                          "Satabhishak"
                        ],
                        "nadi": "Jala",
                        "means": "Water",
                        "effect": "Rainfall"
                      },
                      "Moon": {
                        "nakshatras": [
                          "Aasresha",
                          "Makha",
                          "Sravanam",
                          "Dhanishtha"
                        ],
                        "nadi": "Amrita",
                        "means": "Water",
                        "effect": "Rainfall"
                      }
                    },
                    "nakshatra": "Krittika",
                    "nakshatra_lord_effects": {
                      "lord": "Saturn",
                      "nadi": "Chandaa",
                      "means": "Aggressive",
                      "effect": "Heat, Wind"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "Only read by /nakshatra-chakras/; ignored elsewhere.",
                    "default": "Ashwini",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2025,
                "date_time": "2025-02-13T05:00:37Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "nakshatra": "Krittika"
              }
            }
          }
        }
      }
    },
    "/api/astro/nakshatra/": {
      "post": {
        "operationId": "astro_nakshatra",
        "summary": "Nakshatra",
        "description": "The Moon's nakshatra now, and every nakshatra touching the local day.\n\n`current` is the one actually in force at the instant you asked, already resolved: the underlying calculation returns every segment overlapping the day and leaves you to work out which applies. `segments` keeps that full list for a strip or a timeline.\n\nEach carries its start and end, so you can show when the nakshatra changes rather than only which one it is.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "current": {
                      "name": "Ashwini",
                      "name_hi": "अश्विनी",
                      "start": "2026-08-31T21:53:59.999999Z",
                      "end": "2026-09-01T21:12:25.999999Z"
                    },
                    "segments": [
                      {
                        "name": "Revati",
                        "start_time": "2026-08-30T22:15:03.999999Z",
                        "end_time": "2026-08-31T21:53:59.999999Z",
                        "name_hi": "रेवती"
                      },
                      {
                        "name": "Ashwini",
                        "start_time": "2026-08-31T21:53:59.999999Z",
                        "end_time": "2026-09-01T21:12:25.999999Z",
                        "name_hi": "अश्विनी"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/nakshatra_transitions/": {
      "post": {
        "operationId": "astro_nakshatra_transitions",
        "summary": "Nakshatra transitions",
        "description": "Every planet's movement from one nakshatra to the next across a calendar year, with each crossing resolved to about a second. This is the 'planet nakshatra gochar' table: when Saturn leaves Purva Bhadrapada, when Jupiter enters Pushya, when the Moon changes star — the events transit predictions are timed from.\n\ngranularity chooses the resolution. 'nakshatra' uses the 13°20' divisions and returns from and to as plain names; 'pada' uses the 3°20' quarters and returns from and to as {nakshatra, pada} objects instead. Set use_28_nakshatras to true to include Abhijit as a twenty-eighth division.\n\nPass year and timezone_as_float. The offset decides where the local year starts and ends, but the returned timestamps are UTC — convert them yourself for display. The response is {year, granularity, planets}, where planets is keyed by name (sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, rahu, ketu), each holding a chronological list of {from, to, datetime}. The Moon alone produces over three hundred nakshatra transitions in a year and around fourteen hundred pada transitions, so pada responses are large.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"granularity\": \"nakshatra\", \"planets\": {\"jupiter\": [{\"from\": \"Punarvasu\", \"to\": \"Pushyami\", \"datetime\": \"2026-06-18 15:31:55\"}, {\"from\": \"Pushyami\", \"to\": \"Aasresha\", \"datetime\": \"2026-08-18 21:42:28\"}, {\"from\": \"Aasresha\", \"to\": \"Makha\", \"datetime\": \"2026-10-31 06:32:43\"}], \"sun\": [{\"from\": \"Poorvaashaadha\", \"to\": \"Uttaraashaadha\", \"datetime\": \"2026-01-11 03:06:16\"}, {\"from\": \"Uttaraashaadha\", \"to\": \"Sravanam\", \"datetime\": \"2026-01-24 05:20:24\"}, {\"from\": \"Sravanam\", \"to\": \"Dhanishtha\", \"datetime\": \"2026-02-06 08:35:04\"}, {\"from\": \"Dhanishtha\", \"to\": \"Satabhishak\", \"datetime\": \"2026-02-19 13:03:28\"}, {\"from\": \"Satabhishak\", \"to\": \"Poorvaabhaadra\", \"datetime\": \"2026-03-04 19:24:10\"}, {\"from\": \"Poorvaabhaadra\", \"to\": \"Uttaraabhaadra\", \"datetime\": \"2026-03-18 03:51:12\"}, {\"from\": \"Uttaraabhaadra\", \"to\": \"Revati\", \"datetime\": \"2026-03-31 14:40:06\"}, {\"from\": \"Revati\", \"to\": \"Ashwini\", \"datetime\": \"2026-04-14 04:02:39\"}, {\"from\": \"Ashwini\", \"to\": \"Bharani\", \"datetime\": \"2026-04-27 19:47:57\"}, {\"from\": \"Bharani\", \"to\": \"Krittika\", \"datetime\": \"2026-05-11 14:01:16\"}, {\"from\": \"Krittika\", \"to\": \"Rohini\", \"datetime\": \"2026-05-25 10:07:52\"}, {\"from\": \"Rohini\", \"to\": \"Mrigasira\", \"datetime\": \"2026-06-08 08:03:01\"}, {\"from\": \"Mrigasira\", \"to\": \"Aardra\", \"datetime\": \"2026-06-22 06:56:07\"}, {\"from\": \"Aardra\", \"to\": \"Punarvasu\", \"datetime\": \"2026-07-06 06:33:36\"}, {\"from\": \"Punarvasu\", \"to\": \"Pushyami\", \"datetime\": \"2026-07-20 05:58:19\"}, {\"from\": \"Pushyami\", \"to\": \"Aasresha\", \"datetime\": \"2026-08-03 04:54:24\"}, {\"from\": \"Aasresha\", \"to\": \"Makha\", \"datetime\": \"2026-08-17 02:28:46\"}, {\"from\": \"Makha\", \"to\": \"Poorva Phalguni\", \"datetime\": \"2026-08-30 22:29:09\"}, {\"from\": \"Poorva Phalguni\", \"to\": \"Uttara Phalguni\", \"datetime\": \"2026-09-13 16:17:57\"}, {\"from\": \"Uttara Phalguni\", \"to\": \"Hasta\", \"datetime\": \"2026-09-27 07:49:50\"}, {\"from\": \"Hasta\", \"to\": \"Chitra\", \"datetime\": \"2026-10-10 20:50:07\"}, {\"from\": \"Chitra\", \"to\": \"Swaati\", \"datetime\": \"2026-10-24 07:20:48\"}, {\"from\": \"Swaati\", \"to\": \"Visaakha\", \"datetime\": \"2026-11-06 15:33:21\"}, {\"from\": \"Visaakha\", \"to\": \"Anooraadha\", \"datetime\": \"2026-11-19 21:33:50\"}, {\"from\": \"Anooraadha\", \"to\": \"Jyeshtha\", \"datetime\": \"2026-12-03 01:58:15\"}, {\"from\": \"Jyeshtha\", \"to\": \"Moola\", \"datetime\": \"2026-12-16 04:55:02\"}, {\"from\": \"Moola\", \"to\": \"Poorvaashaadha\", \"datetime\": \"2026-12-29 07:14:19\"}], \"rahu\": [{\"from\": \"Satabhishak\", \"to\": \"Dhanishtha\", \"datetime\": \"2026-08-01 21:41:47\"}], \"pluto\": [{\"from\": \"Uttaraashaadha\", \"to\": \"Sravanam\", \"datetime\": \"2026-02-18 02:18:30\"}, {\"from\": \"Sravanam\", \"to\": \"Uttaraashaadha\", \"datetime\": \"2026-07-29 15:00:03\"}, {\"from\": \"Uttaraashaadha\", \"to\": \"Sravanam\", \"datetime\": \"2026-12-28 01:39:54\"}], \"saturn\": [{\"from\": \"Poorvaabhaadra\", \"to\": \"Uttaraabhaadra\", \"datetime\": \"2026-01-20 05:22:43\"}, {\"from\": \"Uttaraabhaadra\", \"to\": \"Revati\", \"datetime\": \"2026-05-17 09:07:48\"}, {\"from\": \"Revati\", \"to\": \"Uttaraabhaadra\", \"datetime\": \"2026-10-09 15:21:10\"}], \"uranus\": [{\"from\": \"Krittika\", \"to\": \"Rohini\", \"datetime\": \"2026-07-11 23:54:01\"}, {\"from\": \"Rohini\", \"to\": \"Krittika\", \"datetime\": \"2026-11-12 10:52:56\"}], \"mars\": [{\"from\": \"Poorvaashaadha\", \"to\": \"Uttaraashaadha\", \"datetime\": \"2026-01-11 15:40:42\"}, {\"from\": \"Uttaraashaadha\", \"to\": \"Sravanam\", \"datetime\": \"2026-01-28 19:08:49\"}, {\"from\": \"Sravanam\", \"to\": \"Dhanishtha\", \"datetime\": \"2026-02-14 19:08:16\"}, {\"from\": \"Dhanishtha\", \"to\": \"Satabhishak\", \"datetime\": \"2026-03-03 17:24:52\"}, {\"from\": \"Satabhishak\", \"to\": \"Poorvaabhaadra\", \"datetime\": \"2026-03-20 15:51:47\"}, {\"from\": \"Poorvaabhaadra\", \"to\": \"Uttaraabhaadra\", \"datetime\": \"2026-04-06 16:26:20\"}, {\"from\": \"Uttaraabhaadra\", \"to\": \"Revati\", \"datetime\": \"2026-04-23 20:52:02\"}, {\"from\": \"Revati\", \"to\": \"Ashwini\", \"datetime\": \"2026-05-11 07:08:41\"}, {\"from\": \"Ashwini\", \"to\": \"Bharani\", \"datetime\": \"2026-05-29 00:55:31\"}, {\"from\": \"Bharani\", \"to\": \"Krittika\", \"datetime\": \"2026-06-16 04:02:43\"}, {\"from\": \"Krittika\", \"to\": \"Rohini\", \"datetime\": \"20"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "granularity": {
                    "type": "string",
                    "enum": [
                      "nakshatra",
                      "pada"
                    ],
                    "examples": [
                      "nakshatra"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "default": 5.5,
                    "examples": [
                      5.5
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "granularity",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "granularity": "nakshatra",
                "year": 2026,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/nakshatramsa/": {
      "post": {
        "operationId": "astro_nakshatramsa",
        "summary": "Nakshatramsa (D27)",
        "description": "The nakshatramsa, the twenty-seventh divisional chart, also called bhamsa: each sign divided into twenty-seven parts of 1°6'40\" each, one per nakshatra of the zodiac.\n\nRead for general strength and weakness, and for underlying vitality.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/navamsa/": {
      "post": {
        "operationId": "astro_navamsa",
        "summary": "Navamsa (D9)",
        "description": "The navamsa, the ninth divisional chart: each sign divided into nine parts of 3°20' each.\n\nAfter the rashi chart this is the one that matters most. It is read for marriage and partnership, for dharma, and as a check on the rashi chart - a planet strong in D1 but weak here is generally taken as promising more than it delivers. A planet in the same sign in both charts is vargottama and held especially strong.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 129.4275,
                        "latitude": 0,
                        "nakshatra": "Makha",
                        "pada": 3,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 2
                      },
                      {
                        "name": "moon",
                        "longitude": 13.3,
                        "latitude": 4.37,
                        "nakshatra": "Ashwini",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Aries",
                        "house": 10
                      },
                      {
                        "name": "mars",
                        "longitude": 352.5725,
                        "latitude": 0.535,
                        "nakshatra": "Revati",
                        "pada": 2,
                        "kakshya": "moon",
                        "zodiac_name": "Pisces",
                        "house": 9
                      },
                      {
                        "name": "mercury",
                        "longitude": 166.57000000000002,
                        "latitude": 1.574,
                        "nakshatra": "Hasta",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Virgo",
                        "house": 3
                      },
                      {
                        "name": "jupiter",
                        "longitude": 265.24749999999995,
                        "latitude": 0.529,
                        "nakshatra": "Poorvaashaadha",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Sagittarius",
                        "house": 6
                      },
                      {
                        "name": "venus",
                        "longitude": 170.60249999999996,
                        "latitude": -3.391,
                        "nakshatra": "Hasta",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Virgo",
                        "house": 3
                      },
                      {
                        "name": "saturn",
                        "longitude": 265.02250000000004,
                        "latitude": -2.651,
                        "nakshatra": "Poorvaashaadha",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Sagittarius",
                        "house": 6
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 230.0925,
                        "latitude": 0,
                        "nakshatra": "Jyeshtha",
                        "pada": 2,
                        "kakshya": "Mercury",
                        "zodiac_name": "Scorpio",
                        "house": 5
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 50.092499999999994,
                        "latitude": 0,
                        "nakshatra": "Rohini",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Taurus",
                        "house": 11
                      },
                      {
                        "name": "uranus",
                        "longitude": 12.814999999999984,
                        "latitude": -0.154,
                        "nakshatra": "Ashwini",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Aries",
                        "house": 10
                      },
                      {
                        "name": "neptune",
                        "longitude": 174.89499999999998,
                        "latitude": -1.412,
                        "nakshatra": "Chitra",
                        "pada": 1,
                        "kakshya": "moon",
                        "zodiac_name": "Virgo",
                        "house": 3
                      },
                      {
                        "name": "pluto",
                        "longitude": 353.51,
                        "latitude": -4.3,
                        "nakshatra": "Revati",
                        "pada": 3,
                        "kakshya": "moon",
                        "zodiac_name": "Pisces",
                        "house": 9
                      }
                    ],
                    "ascendant": {
                      "longitude": 132.1878846274937,
                      "zodiac_name": "Cancer",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/navnavamsa/": {
      "post": {
        "operationId": "astro_navnavamsa",
        "summary": "Navnavamsa (D81)",
        "description": "The navnavamsa, the eighty-first division - the navamsa OF the navamsa, which is what the name says: nava-navamsa.\n\nTHE ENGINE CARRIES TWO READINGS OF D81 and this route serves the compounded one. The other divides the rashi straight into eighty-one parts and is reachable through /api/astro/chart/ with `chart_name: \"NavnavamsaChart\"`. They disagree for most planets - they are different charts, not two spellings of one.\n\nAT ROUGHLY 22' PER DIVISION, treat this as worth reading only when the birth time is genuinely known to the minute.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/nepali_calendar/": {
      "post": {
        "operationId": "astro_nepali_calendar",
        "summary": "Nepali calendar",
        "description": "A year of Nepali festivals and observances on the Bikram Sambat calendar. The Nepali calendar is solar — twelve months each opening with the Sun's entry into a sidereal sign, Baishakh first — and the response reports the Bikram Sambat year or year-pair spanning the Gregorian year you asked for.\n\nThe event list covers every Sankranti under its Nepali name (Maghe, Falgun, Baishakh and so on), all the Ekadashis, both Pradosh Vrats of each month named for their weekday, the eclipses, and national festivals such as Nawa Barsha and Bisket Jatra.\n\nPass year with latitude, longitude and UTC offset — and note that Nepal Standard Time is UTC+05:45, so timezone_as_float should be 5.75 for Kathmandu; 5.5 will shift the day boundaries. The response is {year, bikram_sambat, events} with each event {name, date}. The year must be between 2006 and 2046.\n\nThe month-start rule follows the practice of dating a Sankranti on the transit day when the transit occurs before that day's sunset and on the following day otherwise. Nepal's official month starts are set by committee rather than derived from a single astronomical test, so a small number of transits each decade will not match the published Patro.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"bikram_sambat\": \"2082 - 2083\", \"events\": [{\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-01-01\"}, {\"name\": \"Maghe Sankranti\", \"date\": \"2026-01-14\"}, {\"name\": \"Sat-Tila Ekadashi\", \"date\": \"2026-01-14\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-01-16\"}, {\"name\": \"Shree Panchami\", \"date\": \"2026-01-23\"}, {\"name\": \"Bhima Ekadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-01-30\"}, {\"name\": \"Falgun Sankranti\", \"date\": \"2026-02-13\"}, {\"name\": \"Vijaya Ekadashi\", \"date\": \"2026-02-13\"}, {\"name\": \"Shani Pradosh Vrat\", \"date\": \"2026-02-14\"}, {\"name\": \"Maha Shivaratri\", \"date\": \"2026-02-15\"}, {\"name\": \"Surya Grahan *Valayakara\", \"date\": \"2026-02-17\"}, {\"name\": \"Amalaki Ekadashi\", \"date\": \"2026-02-27\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-03-01\"}, {\"name\": \"Chandra Grahan *Purna\", \"date\": \"2026-03-03\"}, {\"name\": \"Fagu Poornima\", \"date\": \"2026-03-03\"}, {\"name\": \"Chaitra Sankranti\", \"date\": \"2026-03-15\"}, {\"name\": \"Papamochani Ekadashi\", \"date\": \"2026-03-15\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-03-16\"}, {\"name\": \"Ram Nawami\", \"date\": \"2026-03-26\"}, {\"name\": \"Kamada Ekadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-03-30\"}, {\"name\": \"Hanuman Jayenti\", \"date\": \"2026-04-02\"}, {\"name\": \"Hanuman Janmotsava\", \"date\": \"2026-04-02\"}, {\"name\": \"Baruthini Ekadashi\", \"date\": \"2026-04-13\"}, {\"name\": \"Baishakh Sankranti\", \"date\": \"2026-04-14\"}, {\"name\": \"Nawa Barsha\", \"date\": \"2026-04-14\"}, {\"name\": \"Bisket Jatra\", \"date\": \"2026-04-14\"}, {\"name\": \"Budha Pradosh Vrat\", \"date\": \"2026-04-15\"}, {\"name\": \"Parasuram Jayenti\", \"date\": \"2026-04-19\"}, {\"name\": \"Aachya Tritiya\", \"date\": \"2026-04-20\"}, {\"name\": \"Sita Jayanti\", \"date\": \"2026-04-25\"}, {\"name\": \"Mohini Ekadashi\", \"date\": \"2026-04-27\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-04-28\"}, {\"name\": \"Buddha Jayanti\", \"date\": \"2026-05-01\"}, {\"name\": \"Apara Ekadashi\", \"date\": \"2026-05-13\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-05-14\"}, {\"name\": \"Jeshta Sankranti\", \"date\": \"2026-05-15\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-05-28\"}, {\"name\": \"Parama Ekadashi\", \"date\": \"2026-06-11\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-06-12\"}, {\"name\": \"Asar Sankranti\", \"date\": \"2026-06-15\"}, {\"name\": \"Nirjala Ekadashi\", \"date\": \"2026-06-25\"}, {\"name\": \"Shani Pradosh Vrat\", \"date\": \"2026-06-27\"}, {\"name\": \"Yogini Ekadashi\", \"date\": \"2026-07-10\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-07-12\"}, {\"name\": \"Shrawane Sankranti\", \"date\": \"2026-07-17\"}, {\"name\": \"Harisayani Ekadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-07-26\"}, {\"name\": \"Kamika Ekadashi\", \"date\": \"2026-08-09\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-08-10\"}, {\"name\": \"Surya Grahan *Purna\", \"date\": \"2026-08-12\"}, {\"name\": \"Bhadra Sankranti\", \"date\": \"2026-08-17\"}, {\"name\": \"Putrada Ekadashi\", \"date\": \"2026-08-23\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-08-25\"}, {\"name\": \"Chandra Grahan *Anshika\", \"date\": \"2026-08-28\"}, {\"name\": \"Janai Purnima\", \"date\": \"2026-08-28\"}, {\"name\": \"Kwati Punhi\", \"date\": \"2026-08-28\"}, {\"name\": \"Rakshya Bandhan\", \"date\": \"2026-08-28\"}, {\"name\": \"Gai Jatra\", \"date\": \"2026-08-29\"}, {\"name\": \"Shree Krishna Janmastami\", \"date\": \"2026-09-04\"}, {\"name\": \"Aja Ekadashi\", \"date\": \"2026-09-07\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-09-08\"}, {\"name\": \"Hartalika Teej\", \"date\": \"2026-09-14\"}, {\"name\": \"Ganesh Chaturthi\", \"date\": \"2026-09-14\"}, {\"name\": \"Rishi Panchami\", \"date\": \"2026-09-15\"}, {\"name\": \"Ashoj Sankranti\", \"date\": \"2026-09-17\"}, {\"name\": \"Bishwakarma Pooja\", \"date\": \"2026-09-17\"}, {\"name\": \"Radhastami\", \"date\": \"2026-09-19\"}, {\"name\": \"Hari-Parivartan Ekadashi\", \"date\": \"2026-09-22\"}, {\"name\": \"Indra Jatra\", \"date\": \"2026-09-23\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-09-24\"}, {\"name\": \"Pitrupaksha Arambha\", \"date\": \"2026-09-27\"}, {\"name\": \"Pratiprada Shradham\", \"date\": \"2026-09-27\"}, {\"name\": \"Indira Ekadashi\", \"date\": \"2026-10-06\"}, {\"name\": \"Guru "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/nitya-yoga/": {
      "post": {
        "operationId": "astro_nitya_yoga",
        "summary": "Nitya yoga",
        "description": "The Nityayoga in force, and every one touching the day.\n\nThe Sun's and Moon's sidereal longitudes are added and the total divided into twenty-seven parts, giving Vishkumbha through Vaidhriti. This is one of the five limbs of the panchanga and is unrelated to the yogas at /api/astro/yogas/, which are named tithi, nakshatra and weekday combinations - hence the route name.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "current": "Vriddhi",
                    "current_hi": "वृद्धि",
                    "segments": [
                      {
                        "name": "Ganda",
                        "start_time": "2026-08-30T22:16:01.999999Z",
                        "end_time": "2026-08-31T20:21:00.999999Z",
                        "name_hi": "गण्ड"
                      },
                      {
                        "name": "Vriddhi",
                        "start_time": "2026-08-31T20:21:00.999999Z",
                        "end_time": "2026-09-01T18:08:54.999999Z",
                        "name_hi": "वृद्धि"
                      },
                      {
                        "name": "Dhruva",
                        "start_time": "2026-09-01T18:08:54.999999Z",
                        "end_time": "2026-09-02T15:42:11.999999Z",
                        "name_hi": "ध्रुव"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/": {
      "post": {
        "operationId": "astro_numerology",
        "summary": "Numerology",
        "description": "Numerology reduces a name and a birth date to single digits and reads them. This endpoint implements four systems, chosen with system, and each has its own letter table and its own set of available keys.\n\n'chaldean' (the default) and 'pythagorean' are the Western pair and share sixteen keys — life path, expression, soul urge, personality and the rest. They differ in the letter values used and in one behaviour worth knowing: Pythagorean preserves the master numbers 11 and 22 where Chaldean always reduces to a single digit, so expression_number, soul_urge_number, maturity_number and life_path_number can come back as 11 or 22 under Pythagorean only. Pythagorean adds three keys of its own: pinnacle_cycles, balance_number and rational_thought.\n\n'chinese' and 'vedic' are separate sets with no overlap except personal_year_number, which Chinese also allows. Asking for a key outside the chosen system is rejected with HTTP 400 naming the offending key.\n\nSend date_time and name on every call. year, month and day are the target date for the personal-year, month and day keys and default to today's; house_number and phone_number are required only when those keys are requested. Alongside each key's result the response carries a <key>_metadata object giving that key's input, formula and meaning, and either vedic_planet_associations or, for the Chinese system, chinese_number_meanings.\n\nAvailable `keys` (34), all covered by the same single credit: balance_number, bhagyank, birthday_number, bridge_number, challenge_number, chinese_name_number, compound_meaning, compound_number, expression_number, five_element_balance, growth_number, hidden_passion_number, house_number, karmic_debt_numbers, life_path_number, loshu_grid_arrows, lucky_numbers, maturity_number, moolank, namank, name_number, personal_life_path_number, personal_year_number, personality_number, phone_number, pinnacle_cycles, psychic_number, rational_thought, soul_urge_number, unlucky_numbers, vedic_grid, vedic_personal_day, vedic_personal_month, vedic_personal_year.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "birthday_number": 1,
                    "expression_number": 8,
                    "life_path_number": 2,
                    "birthday_number_metadata": {
                      "name": "Birthday Number",
                      "input": "Day of Birth (DD)",
                      "formula": "Use the day directly if it's a single digit; if it's a double-digit number, reduce to a single digit.",
                      "meaning": "Reveals natural talents and key characteristics based on birthdate."
                    },
                    "expression_number_metadata": {
                      "name": "Expression Number (Destiny Number)",
                      "input": "Full Name (Chaldean letter chart)",
                      "formula": "Sum the values of all letters based on Chaldean chart and reduce to a single digit.",
                      "meaning": "Reflects overall potential and life path, linked to name vibration."
                    },
                    "vedic_planet_associations": {
                      "1": {
                        "planet": "Sun (Surya)",
                        "meaning": "Leadership, authority, soul, father"
                      },
                      "2": {
                        "planet": "Moon (Chandra)",
                        "meaning": "Mind, emotions, mother, intuition"
                      },
                      "3": {
                        "planet": "Jupiter (Guru)",
                        "meaning": "Wisdom, knowledge, expansion, teacher"
                      },
                      "4": {
                        "planet": "Rahu (North Node)",
                        "meaning": "Illusion, material desires, sudden changes"
                      },
                      "5": {
                        "planet": "Mercury (Buddh)",
                        "meaning": "Communication, intellect, business, speech"
                      },
                      "6": {
                        "planet": "Venus (Shukra)",
                        "meaning": "Love, luxury, arts, relationships"
                      },
                      "7": {
                        "planet": "Ketu (South Node)",
                        "meaning": "Spirituality, detachment, intuition, moksha"
                      },
                      "8": {
                        "planet": "Saturn (Shani)",
                        "meaning": "Discipline, karma, hard work, delays"
                      },
                      "9": {
                        "planet": "Mars (Mangal)",
                        "meaning": "Energy, courage, action, aggression"
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Which keys are available depends on `system`. Chaldean and Pythagorean share sixteen keys; Pythagorean adds pinnacle_cycles, balance_number and rational_thought; Chinese and Vedic have their own sets and accept no others. Asking for a key outside the chosen system returns 400 naming the offending key.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "examples": [
                      1
                    ]
                  },
                  "house_number": {
                    "type": "string",
                    "description": "House or Apartment Number. Required only if 'house_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "examples": [
                      9
                    ]
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Full Phone Number. Required only if 'phone_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "description": "The numerological system to use. Note: Chaldean, Pythagorean, Chinese, and Vedic systems are supported.",
                    "enum": [
                      "chaldean",
                      "pythagorean",
                      "chinese",
                      "vedic"
                    ],
                    "default": "chaldean",
                    "examples": [
                      "chaldean"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "name": "Ramesh Kumar",
                "day": 1,
                "month": 9,
                "year": 2026,
                "system": "chaldean",
                "keys": [
                  "birthday_number",
                  "expression_number",
                  "life_path_number"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/abjad/": {
      "post": {
        "operationId": "astro_numerology_abjad",
        "summary": "Abjad numerals",
        "description": "Arabic text scored by abjad hawwaz, the eastern (mashriqi) order, 1-1000 across the 28 letters.\n\nDiacritics are stripped before scoring - harakat are not letters and carry no abjad value. Variant forms of alef and the ta marbuta are scored; standalone hamza is not, since it carries no independent value, and appears in `unscored` where you can see it.\n\nEXPECTS ARABIC SCRIPT. Latin text scores 0 and is listed in `unscored` rather than transliterated.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "text"
                ],
                "additionalProperties": true
              },
              "example": {
                "text": "string"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/angel/": {
      "post": {
        "operationId": "astro_numerology_angel",
        "summary": "Angel numbers",
        "description": "The meaning of a repeating or sequential number, and the angel number of a birth date.\n\nSend `sequence` (the number seen, e.g. \"1111\" - non-digits are ignored), a `date_time`, or both. A longer run of one digit reads as its triple, so 11111 takes the meaning of 111. A sequence that is not a recognised pattern returns its digit root and a note saying so, rather than a meaning invented for it.\n\nLabelled in the response for what it is: a contemporary devotional practice popularised in the twentieth century, not a classical system.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "sequence": {
                    "type": "string",
                    "description": "The number seen, e.g. \"1111\". Non-digits are ignored.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/aura/": {
      "post": {
        "operationId": "astro_numerology_aura",
        "summary": "Aura numerology",
        "description": "The aura colour of the life path number, with the name number giving a secondary hue, each with its chakra.\n\nMaster numbers are preserved rather than reduced - 11, 22 and 33 carry their own colours here, so reducing them to 2, 4 and 6 would lose three of the twelve.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/chaldean/": {
      "post": {
        "operationId": "astro_numerology_chaldean",
        "summary": "Chaldean numerology",
        "description": "Chaldean numerology: the older Western system, and the one most Indian practitioners use for names.\n\nLetters score 1 to 8 — there is no 9, which is held sacred — and the values follow sound rather than alphabetical order, so the same name can differ from its Pythagorean value. Returns life path, expression, soul urge, personality, birthday, maturity and the compound numbers.\n\nReturns 16 calculations.\n\nSend a name and a date of birth. The system is fixed by the route, so a `system` field in the body is ignored — this endpoint cannot return another system's numbers.\n\nThe parent /api/astro/numerology/ carries all 34 calculations behind a `system` field, and asking for a key that belongs to a different system returns a 400 that fails the WHOLE request. These routes remove that: each asks only for the keys its own system supports.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "birthday_number": 6,
                    "bridge_number": 2,
                    "challenge_number": 2,
                    "compound_meaning": "The Recluse",
                    "compound_number": 31,
                    "expression_number": 4,
                    "growth_number": 5,
                    "hidden_passion_number": 1,
                    "karmic_debt_numbers": [
                      3,
                      7,
                      8
                    ],
                    "life_path_number": 6,
                    "maturity_number": 1,
                    "name_number": 7,
                    "personal_year_number": 6,
                    "personality_number": 4,
                    "psychic_number": 6,
                    "soul_urge_number": 9
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "examples": [
                      1
                    ]
                  },
                  "house_number": {
                    "type": "string",
                    "description": "House or Apartment Number. Required only if 'house_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "examples": [
                      9
                    ]
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Full Phone Number. Required only if 'phone_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "default": "chaldean",
                    "examples": [
                      "string"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "name": "Ajeet Kumar",
                "day": 15,
                "month": 8,
                "year": 1990
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/cheiro/": {
      "post": {
        "operationId": "astro_numerology_cheiro",
        "summary": "Cheiro numerology",
        "description": "The Chaldean letter table read to a compound number, alongside the single digit and its planetary ruler.\n\nCheiro did not invent a letter table - his IS the Chaldean one, the same table /api/astro/numerology/chaldean/ uses. What is his is the reading of the compound number and the planetary rulership of each digit.\n\nWORTH KNOWING: Cheiro's compound meanings are defined for 10-52 only. A compound past 52 is folded back by digit-summing, but a short name never reaches 10 in the first place and a long one can fold below it. In those cases `compound_meaning` is null and `compound_note` says why - read `single_number` and `ruling_planet` instead. We would rather return null than invent a meaning the tradition does not have.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/chinese/": {
      "post": {
        "operationId": "astro_numerology_chinese",
        "summary": "Chinese numerology",
        "description": "Chinese numerology: the Lo Shu grid and the five elements.\n\n`loshu_grid_arrows` reads the arrows of strength and absence across the 3×3 grid of birth-date digits; `five_element_balance` reports Wood, Fire, Earth, Metal and Water as counts and percentages. Lucky and unlucky numbers follow the homophone tradition — 8 for prosperity, 4 avoided.\n\n`house_number` and `phone_number` reduce a number you supply. Both default to 0 if you omit them, so the call still succeeds.\n\nReturns 9 calculations.\n\nSend a name and a date of birth. The system is fixed by the route, so a `system` field in the body is ignored — this endpoint cannot return another system's numbers.\n\nThe parent /api/astro/numerology/ carries all 34 calculations behind a `system` field, and asking for a key that belongs to a different system returns a 400 that fails the WHOLE request. These routes remove that: each asks only for the keys its own system supports.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "chinese_name_number": 5,
                    "five_element_balance": {
                      "balance": {
                        "Wood": {
                          "count": 0,
                          "percentage": 0,
                          "meaning": "Growth, creativity, flexibility",
                          "associated_numbers": [
                            3,
                            4
                          ]
                        },
                        "Fire": {
                          "count": 2,
                          "percentage": 25,
                          "meaning": "Passion, energy, transformation",
                          "associated_numbers": [
                            9
                          ]
                        },
                        "Earth": {
                          "count": 3,
                          "percentage": 37.5,
                          "meaning": "Stability, nourishment, groundedness",
                          "associated_numbers": [
                            2,
                            5,
                            8
                          ]
                        },
                        "Metal": {
                          "count": 1,
                          "percentage": 12.5,
                          "meaning": "Strength, determination, clarity",
                          "associated_numbers": [
                            6,
                            7
                          ]
                        },
                        "Water": {
                          "count": 2,
                          "percentage": 25,
                          "meaning": "Wisdom, flow, adaptability",
                          "associated_numbers": [
                            1
                          ]
                        }
                      },
                      "interpretation": "The Five Elements show the distribution of energy in your chart. Wood represents growth, Fire is passion, Earth is stability, Metal represents strength, and Water represents wisdom."
                    },
                    "house_number": 0,
                    "loshu_grid_arrows": {
                      "arrow_of_determination": {
                        "present": true,
                        "meaning": "Indicates strong willpower and determination."
                      },
                      "arrow_of_emotional_balance": {
                        "present": false,
                        "meaning": "Indicates emotional stability and balance."
                      },
                      "arrow_of_practicality": {
                        "present": false,
                        "meaning": "Indicates a practical and grounded approach to life."
                      },
                      "arrow_of_intellect": {
                        "present": false,
                        "meaning": "Indicates strong intellectual capabilities and memory."
                      }
                    },
                    "lucky_numbers": [
                      2,
                      3,
                      6,
                      7,
                      8,
                      9
                    ],
                    "personal_life_path_number": 6,
                    "phone_number": 0,
                    "unlucky_numbers": [
                      1,
                      4,
                      5,
                      6
                    ],
                    "vedic_personal_day": 2
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "examples": [
                      1
                    ]
                  },
                  "house_number": {
                    "type": "string",
                    "default": "0",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "examples": [
                      9
                    ]
                  },
                  "phone_number": {
                    "type": "string",
                    "default": "0",
                    "examples": [
                      "string"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "default": "chinese",
                    "examples": [
                      "string"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "name": "Ajeet Kumar",
                "day": 15,
                "month": 8,
                "year": 1990
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/gematria/": {
      "post": {
        "operationId": "astro_numerology_gematria",
        "summary": "Hebrew gematria",
        "description": "Hebrew text scored under one of five ciphers.\n\nstandard (mispar hechrachi) the ordinary values; gadol the final forms at 500-900 instead of their base values; ordinal (mispar siduri) position in the alef-bet, 1-22; katan each letter reduced to a single digit; atbash each letter swapped for its mirror before valuing. Vowel points and other combining marks are stripped first - they are not letters and carry no value.\n\nEXPECTS HEBREW SCRIPT. Latin or any other alphabet scores 0 and every character comes back in `unscored`, rather than being transliterated: every source transliterates differently, and a confident number derived from an arbitrary choice is worse than an obvious zero.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "cipher": {
                    "type": "string",
                    "description": "standard = mispar hechrachi; gadol = finals at 500-900; ordinal = mispar siduri (1-22); katan = each letter reduced to a single digit; atbash = each letter mirrored before valuing.",
                    "enum": [
                      "standard",
                      "gadol",
                      "ordinal",
                      "katan",
                      "atbash"
                    ],
                    "default": "standard",
                    "examples": [
                      "standard"
                    ]
                  }
                },
                "required": [
                  "text"
                ],
                "additionalProperties": true
              },
              "example": {
                "text": "string",
                "cipher": "standard"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/iching/": {
      "post": {
        "operationId": "astro_numerology_iching",
        "summary": "I Ching numerology",
        "description": "A birth hexagram from the date and a name hexagram from the name, mapped onto the King Wen sequence of 64.\n\nThe digit total is taken modulo 64 with 0 read as 64, the ordinary way a 1-based cycle closes.\n\nWORTH KNOWING: this is a NUMEROLOGICAL MAPPING, not a cast reading. No coins or yarrow are thrown, so there are no changing lines and no relating hexagram. A reader expecting a cast will otherwise think half the answer is missing.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/isopsephy/": {
      "post": {
        "operationId": "astro_numerology_isopsephy",
        "summary": "Greek isopsephy",
        "description": "Greek text scored by the Milesian numerals, 1-900.\n\nThe three obsolete numeral letters are included - digamma or stigma at 6, koppa at 90, sampi at 900 - because classical isopsephy counts them even though they are not in the 24-letter alphabet. Final sigma has the same value as sigma. Accents and breathings are stripped first; they are diacritics, not letters.\n\nEXPECTS GREEK SCRIPT. Latin text scores 0 and is listed in `unscored`.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "text"
                ],
                "additionalProperties": true
              },
              "example": {
                "text": "string"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/kabbalah/": {
      "post": {
        "operationId": "astro_numerology_kabbalah",
        "summary": "Kabbalah numerology",
        "description": "A name's value reduced onto the 22 paths of the Tree of Life, each with its Hebrew letter, tarot trump and Hermetic attribution.\n\nThe reduction is repeated subtraction of 22 rather than digit-summing, which is what lands the result on a path rather than on a digit 1-9. Mother letters take elements, doubles take planets and simples take signs, the structure the Sefer Yetzirah sets out.\n\nWORTH KNOWING: this scores LATIN letters at their Hebrew-equivalent values, which is the modern Western convention for a Latin-script name, not traditional gematria. For gematria on actual Hebrew text use /api/astro/numerology/gematria/. Characters outside A-Z are listed in `unscored` rather than silently dropped.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "name": "string"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/pythagorean/": {
      "post": {
        "operationId": "astro_numerology_pythagorean",
        "summary": "Pythagorean numerology",
        "description": "Pythagorean numerology: the modern Western system, and the widest set here at nineteen calculations.\n\nLetters score 1 to 9 in alphabetical order, and master numbers 11 and 22 are preserved rather than reduced. Includes everything Chaldean returns plus balance number, pinnacle cycles and rational thought, which are defined only in this system.\n\nReturns 19 calculations.\n\nSend a name and a date of birth. The system is fixed by the route, so a `system` field in the body is ignored — this endpoint cannot return another system's numbers.\n\nThe parent /api/astro/numerology/ carries all 34 calculations behind a `system` field, and asking for a key that belongs to a different system returns a 400 that fails the WHOLE request. These routes remove that: each asks only for the keys its own system supports.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "balance_number": 3,
                    "birthday_number": 6,
                    "bridge_number": 0,
                    "challenge_number": 2,
                    "compound_meaning": "Love and Magic",
                    "compound_number": 33,
                    "expression_number": 6,
                    "growth_number": 5,
                    "hidden_passion_number": 1,
                    "karmic_debt_numbers": [
                      6,
                      7,
                      8
                    ],
                    "life_path_number": 6,
                    "maturity_number": 3,
                    "name_number": 5,
                    "personal_year_number": 6,
                    "personality_number": 9,
                    "pinnacle_cycles": {
                      "first": 5,
                      "second": 7,
                      "third": 3,
                      "fourth": 9
                    },
                    "psychic_number": 6,
                    "rational_thought": 2,
                    "soul_urge_number": 6
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "examples": [
                      1
                    ]
                  },
                  "house_number": {
                    "type": "string",
                    "description": "House or Apartment Number. Required only if 'house_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "examples": [
                      9
                    ]
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Full Phone Number. Required only if 'phone_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "default": "pythagorean",
                    "examples": [
                      "string"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "name": "Ajeet Kumar",
                "day": 15,
                "month": 8,
                "year": 1990
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/sepharial/": {
      "post": {
        "operationId": "astro_numerology_sepharial",
        "summary": "Sepharial numerology",
        "description": "Sepharial's own Hebraic letter table from The Kabala of Numbers (1920), with the planetary ruler of each digit.\n\nCLOSE TO CHALDEAN BUT NOT THE SAME, and the difference is exactly three letters: C is 2 here and 3 in Chaldean, H is 8 here and 5 there, X is 6 here and 5 there. The digraphs Th and Tz score 9 as single sounds, which is the only route to 9 in his system - no single Latin letter carries it, so a table that dropped them would quietly remove a ninth of the range.\n\nSend a birth date as well to get the birth number and its ruler.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/tarot/": {
      "post": {
        "operationId": "astro_numerology_tarot",
        "summary": "Tarot numerology",
        "description": "The birth card, its partner card, and the name card, across the 22 major arcana.\n\nThe birth card is the Angeles Arrien reduction: month plus day plus the FULL YEAR, digit-summed until it lands in 0-21. The partner card is the single-digit reduction of that, which is what pairs a high trump with a low one. The name card is the Pythagorean name total reduced the same way.\n\nSend `name`, `date_time`, or both. A field you omit simply does not appear in the response.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/numerology/vedic/": {
      "post": {
        "operationId": "astro_numerology_vedic",
        "summary": "Vedic numerology",
        "description": "Vedic numerology: the seven calculations of the Indian system.\n\n`moolank` is the root number from the birth day alone, `bhagyank` the destiny number from the full date, and `namank` the name number scored on the Chaldean letter table — Vedic practice borrows that table rather than using one of its own. `vedic_grid` is the 3×3 grid of digit counts, with personal day, month and year cycles alongside.\n\nReturns 7 calculations.\n\nSend a name and a date of birth. The system is fixed by the route, so a `system` field in the body is ignored — this endpoint cannot return another system's numbers.\n\nThe parent /api/astro/numerology/ carries all 34 calculations behind a `system` field, and asking for a key that belongs to a different system returns a 400 that fails the WHOLE request. These routes remove that: each asks only for the keys its own system supports.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Numerology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "bhagyank": 6,
                    "moolank": 6,
                    "namank": 4,
                    "vedic_grid": {
                      "grid": [
                        [
                          0,
                          2,
                          0
                        ],
                        [
                          0,
                          1,
                          0
                        ],
                        [
                          1,
                          2,
                          0
                        ]
                      ],
                      "grid_layout": [
                        [
                          4,
                          9,
                          2
                        ],
                        [
                          3,
                          5,
                          7
                        ],
                        [
                          8,
                          1,
                          6
                        ]
                      ],
                      "details": {
                        "1": {
                          "planet": "Sun (Surya)",
                          "meaning": "Leadership, authority, soul, father",
                          "count": 2,
                          "active": true
                        },
                        "2": {
                          "planet": "Moon (Chandra)",
                          "meaning": "Mind, emotions, mother, intuition",
                          "count": 0,
                          "active": false
                        },
                        "3": {
                          "planet": "Jupiter (Guru)",
                          "meaning": "Wisdom, knowledge, expansion, teacher",
                          "count": 0,
                          "active": false
                        },
                        "4": {
                          "planet": "Rahu (North Node)",
                          "meaning": "Illusion, material desires, sudden changes",
                          "count": 0,
                          "active": false
                        },
                        "5": {
                          "planet": "Mercury (Buddh)",
                          "meaning": "Communication, intellect, business, speech",
                          "count": 1,
                          "active": true
                        },
                        "6": {
                          "planet": "Venus (Shukra)",
                          "meaning": "Love, luxury, arts, relationships",
                          "count": 0,
                          "active": false
                        },
                        "7": {
                          "planet": "Ketu (South Node)",
                          "meaning": "Spirituality, detachment, intuition, moksha",
                          "count": 0,
                          "active": false
                        },
                        "8": {
                          "planet": "Saturn (Shani)",
                          "meaning": "Discipline, karma, hard work, delays",
                          "count": 1,
                          "active": true
                        },
                        "9": {
                          "planet": "Mars (Mangal)",
                          "meaning": "Energy, courage, action, aggression",
                          "count": 2,
                          "active": true
                        }
                      }
                    },
                    "vedic_personal_day": 2,
                    "vedic_personal_month": 5,
                    "vedic_personal_year": 6
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "examples": [
                      1
                    ]
                  },
                  "house_number": {
                    "type": "string",
                    "description": "House or Apartment Number. Required only if 'house_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "examples": [
                      9
                    ]
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Full Phone Number. Required only if 'phone_number' is included in 'keys'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "system": {
                    "type": "string",
                    "default": "vedic",
                    "examples": [
                      "string"
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "name"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "name": "Ajeet Kumar",
                "day": 15,
                "month": 8,
                "year": 1990
              }
            }
          }
        }
      }
    },
    "/api/astro/odia_calendar/": {
      "post": {
        "operationId": "astro_odia_calendar",
        "summary": "Odia calendar",
        "description": "A year of Odia (Oriya) festivals on the Vilayati era calendar. The list is dominated by three groups: the twelve Sankrantis under their Odia names — Mahabisuba Pana, Brusha, Raja, Dakhinaya Karkata, Singha, Garbhana and the rest — all the Ekadashis under Odia names such as Sattila, Pankoddhar, Jala Krida, Khalilagi and Kaliyadalan, and the major lunar festivals: Rath Yatra, Gamha Purnima, Savitri Amabasya, Mahastami and Dasahara.\n\nPass year with latitude, longitude and UTC offset. The response is {year, events} with each event {name, date}, in date order. The year must be between 2006 and 2046.\n\nIn a year with an adhika (leap) month the Ekadashi pair belonging to it is named Sarvasammata Padmini and Sarvasammata Parama, following Odia usage.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "events": [
                      {
                        "name": "Uttarayana Makar Sankranti",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Sattila Ekadashi",
                        "date": "2026-01-14"
                      },
                      {
                        "name": "Sri Panchami",
                        "date": "2026-01-23"
                      },
                      {
                        "name": "Bhouma Ekadashi",
                        "date": "2026-01-29"
                      },
                      {
                        "name": "Magha Purnima",
                        "date": "2026-02-01"
                      },
                      {
                        "name": "Kumbha Sankranti",
                        "date": "2026-02-13"
                      },
                      {
                        "name": "Pankoddhar Ekadashi",
                        "date": "2026-02-13"
                      },
                      {
                        "name": "Maha Shivaratri",
                        "date": "2026-02-15"
                      },
                      {
                        "name": "Papanasini Ekadashi",
                        "date": "2026-02-27"
                      },
                      {
                        "name": "Chhoti Holi",
                        "date": "2026-03-03"
                      },
                      {
                        "name": "Holika Dahan",
                        "date": "2026-03-03"
                      },
                      {
                        "name": "Holi",
                        "date": "2026-03-04"
                      },
                      {
                        "name": "Meena Sankranti",
                        "date": "2026-03-15"
                      },
                      {
                        "name": "Papamochani Ekadashi",
                        "date": "2026-03-15"
                      },
                      {
                        "name": "Rama Navami *Smarta",
                        "date": "2026-03-26"
                      },
                      {
                        "name": "Kamada Ekadashi",
                        "date": "2026-03-29"
                      },
                      {
                        "name": "Baruthini Ekadashi",
                        "date": "2026-04-13"
                      },
                      {
                        "name": "Mahabisuba Pana Sankranti",
                        "date": "2026-04-14"
                      },
                      {
                        "name": "Akshaya Tritiya",
                        "date": "2026-04-19"
                      },
                      {
                        "name": "Mohini Ekadashi",
                        "date": "2026-04-27"
                      },
                      {
                        "name": "Jala Krida Ekadashi",
                        "date": "2026-05-13"
                      },
                      {
                        "name": "Brusha Sankranti",
                        "date": "2026-05-15"
                      },
                      {
                        "name": "Savitri Amabasya",
                        "date": "2026-05-16"
                      },
                      {
                        "name": "Sarvasammata Parama Ekadashi",
                        "date": "2026-06-11"
                      },
                      {
                        "name": "Raja Sankranti",
                        "date": "2026-06-15"
                      },
                      {
                        "name": "Jamai Shashti",
                        "date": "2026-06-20"
                      },
                      {
                        "name": "Nirjala Ekadashi",
                        "date": "2026-06-25"
                      },
                      {
                        "name": "Khalilagi Ekadashi",
                        "date": "2026-07-10"
                      },
                      {
                        "name": "Dakhinaya Karkata Sankranti",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Rath Yatra",
                        "date": "2026-07-16"
                      },
                      {
                        "name": "Harishayan Ekadashi",
                        "date": "2026-07-25"
                      },
                      {
                        "name": "Kamika Ekadashi",
                        "date": "2026-08-09"
                      },
                      {
                        "name": "Singha Sankranti",
                        "date": "2026-08-17"
                      },
                      {
                        "name": "Shravana Putrada Ekadashi",
                        "date": "2026-08-23"
                      },
                      {
                        "name": "Gamha Purnima",
                        "date": "2026-08-28"
                      },
                      {
                        "name": "Krishna Janmashtami",
                        "date": "2026-09-04"
                      },
                      {
                        "name": "Kaliyadalan Ekadashi",
                        "date": "2026-09-07"
                      },
                      {
                        "name": "Ganesh Chaturthi",
                        "date": "2026-09-14"
                      },
                      {
                        "name": "Kanya Sankranti",
                        "date": "2026-09-17"
                      },
                      {
                        "name": "Parswa Paribartan Ekadashi",
                        "date": "2026-09-22"
                      },
                      {
                        "name": "Indira Ekadashi",
                        "date": "2026-10-06"
                      },
                      {
                        "name": "Mahalaya Amabasya",
                        "date": "2026-10-10"
                      },
                      {
                        "name": "Garbhana Sankranti",
                        "date": "2026-10-17"
                      },
                      {
                        "name": "Mahastami",
                        "date": "2026-10-19"
                      },
                      {
                        "name": "Dasahara",
                        "date": "2026-10-20"
                      },
                      {
                        "name": "Papankusha Ekadashi",
                        "date": "2026-10-22"
                      },
                      {
                        "name": "Rama Ekadashi",
                        "date": "2026-11-05"
                      },
                      {
                        "name": "Dhanteras",
                        "date": "2026-11-06"
                      },
                      {
                        "name": "Lakshmi Puja",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Dipavali",
                        "date": "2026-11-08"
                      },
                      {
                        "name": "Bichha Sankranti",
                        "date": "2026-11-16"
                      },
                      {
                        "name": "Deva Utthapan Ekadashi",
                        "date": "2026-11-20"
                      },
                      {
                        "name": "Kartika Purnima",
                        "date": "2026-11-24"
                      },
                      {
                        "name": "Utpanna Ekadashi",
                        "date": "2026-12-04"
                      },
                      {
                        "name": "Dhanu Sankranti",
                        "date": "2026-12-16"
                      },
                      {
                        "name": "Gomati Ekadashi",
                        "date": "2026-12-20"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/onam_calendar/": {
      "post": {
        "operationId": "astro_onam_calendar",
        "summary": "Onam calendar",
        "description": "Onam is not one day but a sequence keyed to consecutive nakshatras, running from Atham (Hasta) through Thiruvonam to Chathayam. This endpoint returns that whole window for a given year, one row per civil day.\n\nEach row gives day_number, the Gregorian date, the weekday in English and in Malayalam script, the governing nakshatra, the Malayalam month and day with the Kollam era year, a captions list naming what is observed that day (Atthachamayam, Athapoo Pookalam, Vallam Kali and so on), an is_repeat_day flag, and segments giving the nakshatra's exact begin and end instants in local time.\n\nThe day count is not fixed. A nakshatra long enough to span two sunrises produces a repeat day — same name, empty captions, null begin and end — and pushes the sequence out; a short one can instead be merged onto the following day, which then carries two names in its captions. Twelve or thirteen rows is normal.\n\nPass year with latitude, longitude and UTC offset; the year must be between 2006 and 2046. For Onam as a single dated entry among a full year of Kerala festivals, use /api/astro/malayalam_calendar/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"days\": [{\"day_number\": 1, \"date\": \"2026-08-16\", \"weekday_en\": \"Sunday\", \"weekday_ml\": \"ഞായറാഴ്ച\", \"nakshatra\": \"Atham\", \"malayalam_month\": \"Karkatakam\", \"malayalam_day\": 31, \"kollam_year\": 1201, \"captions\": [\"Atthachamayam\", \"Athapoo Pookalam\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Atham\", \"begin\": \"2026-08-16T03:25:45+05:30\", \"end\": \"2026-08-17T03:50:52+05:30\"}]}, {\"day_number\": 2, \"date\": \"2026-08-17\", \"weekday_en\": \"Monday\", \"weekday_ml\": \"തിങ്കളാഴ്ച\", \"nakshatra\": \"Chithira\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 1, \"kollam_year\": 1202, \"captions\": [\"Chithira Day\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Chithira\", \"begin\": \"2026-08-17T03:50:52+05:30\", \"end\": \"2026-08-18T04:58:59+05:30\"}]}, {\"day_number\": 3, \"date\": \"2026-08-18\", \"weekday_en\": \"Tuesday\", \"weekday_ml\": \"ചൊവ്വാഴ്ച\", \"nakshatra\": \"Chothi\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 2, \"kollam_year\": 1202, \"captions\": [\"Chodhi Day\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Chothi\", \"begin\": \"2026-08-18T04:58:59+05:30\", \"end\": \"2026-08-19T06:47:04+05:30\"}]}, {\"day_number\": 4, \"date\": \"2026-08-19\", \"weekday_en\": \"Wednesday\", \"weekday_ml\": \"ബുധനാഴ്ച\", \"nakshatra\": \"Vishakham\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 3, \"kollam_year\": 1202, \"captions\": [\"Vishakham Day\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Vishakham\", \"begin\": \"2026-08-19T06:47:04+05:30\", \"end\": \"2026-08-20T09:08:29+05:30\"}]}, {\"day_number\": 5, \"date\": \"2026-08-20\", \"weekday_en\": \"Thursday\", \"weekday_ml\": \"വ്യാഴാഴ്ച\", \"nakshatra\": \"Vishakham\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 4, \"kollam_year\": 1202, \"captions\": [], \"is_repeat_day\": true, \"segments\": [{\"name\": \"Vishakham\", \"begin\": null, \"end\": null}]}, {\"day_number\": 6, \"date\": \"2026-08-21\", \"weekday_en\": \"Friday\", \"weekday_ml\": \"വെള്ളിയാഴ്ച\", \"nakshatra\": \"Anizham\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 5, \"kollam_year\": 1202, \"captions\": [\"Anizham Day\", \"Vallam Kali\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Anizham\", \"begin\": \"2026-08-20T09:08:29+05:30\", \"end\": \"2026-08-21T11:53:15+05:30\"}]}, {\"day_number\": 7, \"date\": \"2026-08-22\", \"weekday_en\": \"Saturday\", \"weekday_ml\": \"ശനിയാഴ്ച\", \"nakshatra\": \"Thrikketta\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 6, \"kollam_year\": 1202, \"captions\": [\"Thriketa Day\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Thrikketta\", \"begin\": \"2026-08-21T11:53:15+05:30\", \"end\": \"2026-08-22T14:49:28+05:30\"}]}, {\"day_number\": 8, \"date\": \"2026-08-23\", \"weekday_en\": \"Sunday\", \"weekday_ml\": \"ഞായറാഴ്ച\", \"nakshatra\": \"Moolam\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 7, \"kollam_year\": 1202, \"captions\": [\"Moolam Day, Onam Sadya\", \"Puli Kali, Kaikotti Kali\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Moolam\", \"begin\": \"2026-08-22T14:49:28+05:30\", \"end\": \"2026-08-23T17:44:53+05:30\"}]}, {\"day_number\": 9, \"date\": \"2026-08-24\", \"weekday_en\": \"Monday\", \"weekday_ml\": \"തിങ്കളാഴ്ച\", \"nakshatra\": \"Pooradam\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 8, \"kollam_year\": 1202, \"captions\": [\"Pooradam Day, Onathappan\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Pooradam\", \"begin\": \"2026-08-23T17:44:53+05:30\", \"end\": \"2026-08-24T20:28:27+05:30\"}]}, {\"day_number\": 10, \"date\": \"2026-08-25\", \"weekday_en\": \"Tuesday\", \"weekday_ml\": \"ചൊവ്വാഴ്ച\", \"nakshatra\": \"Uthradam\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 9, \"kollam_year\": 1202, \"captions\": [\"Uthradom Day, First Onam\", \"Uthradappachil\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Uthradam\", \"begin\": \"2026-08-24T20:28:27+05:30\", \"end\": \"2026-08-25T22:51:30+05:30\"}]}, {\"day_number\": 11, \"date\": \"2026-08-26\", \"weekday_en\": \"Wednesday\", \"weekday_ml\": \"ബുധനാഴ്ച\", \"nakshatra\": \"Thiruvonam\", \"malayalam_month\": \"Chingam\", \"malayalam_day\": 10, \"kollam_year\": 1202, \"captions\": [\"Thiruvonam Day, Second Onam\", \"Thiru-Onam, Onam\"], \"is_repeat_day\": false, \"segments\": [{\"name\": \"Thiruvonam\", \"begin\": \"2026-08-25T22:51:30+05:30\", \"end\": \"2026-08-27T00:48:15+05:3"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/pancha-vargeeya-bala/": {
      "post": {
        "operationId": "astro_pancha_vargeeya_bala",
        "summary": "Pancha vargeeya bala",
        "description": "Pancha vargeeya bala: the five-fold strength, with the components that run.\n\nThe total is returned with exaltation, navamsa and drekkana strength. Kshetra bala and hadda bala are deliberately NOT included: both raise a TypeError in the engine because the configuration does not pass the argument they require, and one failing key fails the whole request — so asking for them would take the working components down too. The response names what it omitted and why.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "scale": "0-10",
                    "total": {
                      "Sun": 6.42,
                      "Moon": 2.26,
                      "Mars": 9.29,
                      "Mercury": 5.3,
                      "Jupiter": 4,
                      "Venus": 4.04,
                      "Saturn": 9.93
                    },
                    "components": [
                      {
                        "bala": "uchcha_bala",
                        "measures": "Exaltation strength",
                        "by_planet": {
                          "Sun": 18.33,
                          "Moon": 0.07,
                          "Mars": 11.46,
                          "Mercury": 0.26,
                          "Jupiter": 5.01,
                          "Venus": 11.44,
                          "Saturn": 12.14
                        }
                      },
                      {
                        "bala": "navamsa_bala_simple",
                        "measures": "Navamsa strength",
                        "by_planet": {
                          "Sun": 1.25,
                          "Moon": 2.5,
                          "Mars": 2.5,
                          "Mercury": 1.25,
                          "Jupiter": 1.25,
                          "Venus": 2.5,
                          "Saturn": 5
                        }
                      },
                      {
                        "bala": "drekkana_bala_simple",
                        "measures": "Drekkana strength",
                        "by_planet": {
                          "Sun": 5,
                          "Moon": 5,
                          "Mars": 2.5,
                          "Mercury": 2.5,
                          "Jupiter": 10,
                          "Venus": 2.5,
                          "Saturn": 2.5
                        }
                      }
                    ],
                    "components_omitted": [
                      "kshetra_bala",
                      "hadda_bala"
                    ],
                    "omission_reason": "Both raise TypeError in the engine: the configuration does not pass the argument they require."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "description": "Ascendant house number. Defaults to 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/pancha_pakshi_hora/": {
      "post": {
        "operationId": "astro_pancha_pakshi_hora",
        "summary": "Pancha Pakshi (bird activity by hora)",
        "description": "Pancha Pakshi Shastra is a Tamil system that assigns each person one of five birds — vulture, owl, crow, cock or peacock — from their birth nakshatra and fortnight, and then times the day by what that bird is doing. Every bird cycles through five activities, ruling, eating, walking, sleeping and dying, in descending order of favourability, and each part of the day is good or bad according to how your bird's activity relates to the one currently in force.\n\nUse get_birth_bird_from_nakshathra for the bird itself; get_birth_nakshathra and get_paksha return the two inputs it is derived from, useful if you want to show the working. All three return plain integers rather than names.\n\nget_matching_pancha_pakshi_data_from_db returns the raw activity table for that bird on the weekday and fortnight of the moment you asked about: fifty numeric rows covering five main periods of the day and five of the night, each split into five sub-periods. The columns are indices and fractions, not clock times — you build the times yourself from sunrise, sunset and the duration factors. The nakshatras request field is accepted by the serializer but is not used by this endpoint.\n\nAvailable `keys` (4), all covered by the same single credit: get_birth_bird_from_nakshathra, get_birth_nakshathra, get_matching_pancha_pakshi_data_from_db, get_paksha.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Pancha Pakshi"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"get_birth_bird_from_nakshathra\": 1, \"get_birth_nakshathra\": 27, \"get_matching_pancha_pakshi_data_from_db\": [[2.0, 1.0, 0.0, 0.0, 2.0, 0.0, 2.0, 0.208333333, 1.0, 0.36, 2.0, 4.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 2.0, 3.0, 1.0, 0.208333333, 0.0, 0.48, 2.0, 4.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 2.0, 1.0, 4.0, 0.25, 2.0, 0.12, 1.0, 2.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 2.0, 4.0, 3.0, 0.166666667, 2.0, 0.24, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 2.0, 2.0, 0.0, 0.166666667, 0.0, 0.6, 2.0, 5.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.208333333, 1.0, 0.64, 3.0, 6.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 1.0, 3.0, 4.0, 0.25, 0.0, 0.16, 0.0, 1.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 1.0, 1.0, 3.0, 0.166666667, 2.0, 0.32, 2.0, 4.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 1.0, 4.0, 0.0, 0.166666667, 2.0, 0.8, 4.0, 9.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 1.0, 2.0, 2.0, 0.208333333, 0.0, 0.48, 2.0, 4.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 4.0, 0.0, 4.0, 0.25, 1.0, 0.04, 0.0, 1.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 4.0, 3.0, 3.0, 0.166666667, 0.0, 0.08, 0.0, 1.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 4.0, 1.0, 0.0, 0.166666667, 2.0, 0.2, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 4.0, 4.0, 2.0, 0.208333333, 2.0, 0.12, 1.0, 2.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 4.0, 2.0, 1.0, 0.208333333, 0.0, 0.16, 0.0, 1.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 3.0, 0.0, 3.0, 0.166666667, 1.0, 0.16, 1.0, 2.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 3.0, 3.0, 0.0, 0.166666667, 0.0, 0.4, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 3.0, 1.0, 2.0, 0.208333333, 2.0, 0.24, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 3.0, 4.0, 1.0, 0.208333333, 2.0, 0.32, 2.0, 4.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 3.0, 2.0, 4.0, 0.25, 0.0, 0.08, 0.0, 1.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.166666667, 1.0, 1.0, 4.0, 10.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 2.0, 0.208333333, 0.0, 0.6, 2.0, 5.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.208333333, 2.0, 0.8, 4.0, 9.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 0.0, 4.0, 4.0, 0.25, 2.0, 0.2, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 0.0, 0.0, 0.0, 2.0, 3.0, 0.166666667, 0.0, 0.4, 2.0, 3.0, 0.0, 3.0], [2.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.208333333, 1.0, 0.64, 3.0, 6.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 1.0, 4.0, 3.0, 0.125, 2.0, 0.32, 2.0, 4.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 1.0, 3.0, 2.0, 0.25, 0.0, 0.48, 2.0, 4.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 1.0, 2.0, 4.0, 0.083333333, 2.0, 0.16, 2.0, 3.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.333333333, 0.0, 0.8, 3.0, 7.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 3.0, 0.0, 3.0, 0.125, 1.0, 0.16, 1.0, 2.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 3.0, 4.0, 2.0, 0.25, 2.0, 0.24, 2.0, 3.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 3.0, 3.0, 4.0, 0.083333333, 0.0, 0.08, 0.0, 1.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 3.0, 2.0, 0.0, 0.333333333, 2.0, 0.4, 2.0, 5.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 3.0, 1.0, 1.0, 0.208333333, 0.0, 0.32, 1.0, 2.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 2.0, 0.0, 2.0, 0.25, 1.0, 0.36, 2.0, 4.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 2.0, 4.0, 4.0, 0.083333333, 2.0, 0.12, 1.0, 2.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 2.0, 3.0, 0.0, 0.333333333, 0.0, 0.6, 2.0, 5.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 2.0, 2.0, 1.0, 0.208333333, 2.0, 0.48, 3.0, 6.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 2.0, 1.0, 3.0, 0.125, 0.0, 0.24, 0.0, 1.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 4.0, 0.083333333, 1.0, 0.04, 0.0, 1.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 4.0, 4.0, 0.0, 0.333333333, 2.0, 0.2, 2.0, 3.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 4.0, 3.0, 1.0, 0.208333333, 0.0, 0.16, 0.0, 1.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 4.0, 2.0, 3.0, 0.125, 2.0, 0.08, 1.0, 2.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 4.0, 1.0, 2.0, 0.25, 0.0, 0.12, 0.0, 1.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.333333333, 1.0, 1.0, 4.0, 10.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 0.0, 4.0, 1.0, 0.208333333, 2.0, 0.8, 4.0, 9.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 0.0, 3.0, 3.0, 0.125, 0.0, 0.4, 2.0, 3.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 0.0, 2.0, 2.0, 0.25, 2.0, 0.6, 3.0, 7.0, 0.0, 0.0], [2.0, 1.0, 1.0, 0.0, 0.0, 1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "description": "DEAD PARAMETER at the HTTP layer - PanchaPakshaHoraView passes only date_time, geopos and the pancha_pakshi_db CSV path. In the engine the only meaningful value is the literal 'special' (swaps in the 28-entry nakshatras_special table.",
                    "enum": [
                      "special"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01 06:00:00",
                "keys": [
                  "get_birth_bird_from_nakshathra",
                  "get_birth_nakshathra",
                  "get_matching_pancha_pakshi_data_from_db"
                ],
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "nakshatras": "special"
              }
            }
          }
        }
      }
    },
    "/api/astro/panchak/": {
      "post": {
        "operationId": "astro_panchak",
        "summary": "Panchak",
        "description": "The day divided into windows, each labelled with the panchaka it falls under.\n\nA `panchaka` of null means that window carries none - which is the favourable case, and the reason the underlying calculation is named for the absence rather than the presence. Windows are contiguous and cover the whole day.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "windows": [
                      {
                        "panchaka": null,
                        "start": "2026-08-31T00:39:30Z",
                        "end": "2026-08-31T01:53:56Z"
                      },
                      {
                        "panchaka": "Raja Panchaka",
                        "start": "2026-08-31T01:53:56Z",
                        "end": "2026-08-31T03:22:09Z"
                      },
                      {
                        "panchaka": "Raja Panchaka",
                        "start": "2026-08-31T03:22:09Z",
                        "end": "2026-08-31T04:08:26Z"
                      },
                      {
                        "panchaka": null,
                        "start": "2026-08-31T04:08:26Z",
                        "end": "2026-08-31T06:26:21Z"
                      },
                      {
                        "panchaka": "Chora Panchaka",
                        "start": "2026-08-31T06:26:21Z",
                        "end": "2026-08-31T08:44:04Z"
                      },
                      {
                        "panchaka": null,
                        "start": "2026-08-31T08:44:04Z",
                        "end": "2026-08-31T10:48:25Z"
                      },
                      {
                        "panchaka": "Roga Panchaka",
                        "start": "2026-08-31T10:48:25Z",
                        "end": "2026-08-31T12:32:03Z"
                      },
                      {
                        "panchaka": null,
                        "start": "2026-08-31T12:32:03Z",
                        "end": "2026-08-31T14:01:15Z"
                      },
                      {
                        "panchaka": "Mrityu Panchaka",
                        "start": "2026-08-31T14:01:15Z",
                        "end": "2026-08-31T15:28:01Z"
                      },
                      {
                        "panchaka": "Roga Panchaka",
                        "start": "2026-08-31T15:28:01Z",
                        "end": "2026-08-31T17:04:51Z"
                      },
                      {
                        "panchaka": null,
                        "start": "2026-08-31T17:04:51Z",
                        "end": "2026-08-31T19:01:17Z"
                      },
                      {
                        "panchaka": "Mrityu Panchaka",
                        "start": "2026-08-31T19:01:17Z",
                        "end": "2026-08-31T21:15:32Z"
                      },
                      {
                        "panchaka": "Agni Panchaka",
                        "start": "2026-08-31T21:15:32Z",
                        "end": "2026-08-31T21:53:59.999999Z"
                      },
                      {
                        "panchaka": null,
                        "start": "2026-08-31T21:53:59.999999Z",
                        "end": "2026-08-31T23:34:29Z"
                      },
                      {
                        "panchaka": "Raja Panchaka",
                        "start": "2026-08-31T23:34:29Z",
                        "end": "2026-09-01T00:39:56Z"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/panchamsa/": {
      "post": {
        "operationId": "astro_panchamsa",
        "summary": "Panchamsa (D5)",
        "description": "The panchamsa, the fifth divisional chart: each sign divided into five parts of 6° each.\n\nRead for fame, authority and spiritual merit. Outside the sixteen of the shodasavarga, but long used alongside them.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/panchang/": {
      "post": {
        "operationId": "astro_panchang",
        "summary": "Panchang (five limbs)",
        "description": "The five limbs of the panchanga - tithi, vaara, nakshatra, yoga and karana - and nothing else. This is what the word means in ordinary use.\n\n/api/astro/panchanga/ returns fifty-seven calculations and about 23 KB. If you are rendering a daily panchang header, this returns the five you show, in under a kilobyte.\n\nThe nakshatra is the one actually in force at the moment you asked, not the list of every nakshatra touching the day, so you do not have to work out which segment applies. Tithi carries its start, end and remaining time; Hindi names are included where the parent provides them.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "tithi": {
                      "name": "Chaturthi",
                      "name_hi": "चतुर्थी",
                      "number": 19,
                      "paksha": "Krishna",
                      "paksha_hi": "कृष्ण",
                      "start": "2026-08-31T03:22:09Z",
                      "end": "2026-09-01T02:12:57Z",
                      "remaining": {
                        "hours": 1,
                        "minutes": 42,
                        "seconds": 57
                      }
                    },
                    "vaara": "Somavara",
                    "nakshatra": {
                      "name": "Ashwini",
                      "name_hi": "अश्विनी",
                      "start": "2026-08-31T21:53:59.999999Z",
                      "end": "2026-09-01T21:12:25.999999Z"
                    },
                    "yoga": "Vriddhi",
                    "karana": "Balava"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/panchang_element_birth_effect/": {
      "post": {
        "operationId": "astro_panchang_element_birth_effect",
        "summary": "Birth panchanga effects (reference table)",
        "description": "The limbs of the panchanga — weekday, tithi, karana, yoga and fortnight, plus the planetary hora — each carry a classical character reading for a person born under them. This endpoint is the lookup table for those readings.\n\nIt is pure reference text: nothing is computed, and no date, time or place is sent. You establish the person's birth tithi, weekday and so on elsewhere (from /api/astro/panchanga/, say) and pass the names in to get the paragraph that goes with each. The six lookup keys are get_vaara_during_birth, get_birth_tithi_effects, get_birth_karana_effects, get_birth_panchang_yoga_effects, get_birth_paksha_effects and get_birth_hora_result, each taking a request field of the matching name.\n\nEvery accepted value is a lowercase transliteration and the exact spelling matters — 'shula' not 'shoola', 'priti' not 'preeti' — and the hora is named by the Sanskrit planet (surya, chandra, mangala…) rather than by the weekday. The six get_all_*_keys helpers return the accepted lists, and get_all_keys_summary returns all six at once; use one of those rather than hard-coding the vocabulary. An unrecognised value does not error: it returns HTTP 200 with a string listing the valid options.\n\nAvailable `keys` (13), all covered by the same single credit: get_all_hora_keys, get_all_karana_keys, get_all_keys_summary, get_all_paksha_keys, get_all_tithi_keys, get_all_vaara_keys, get_all_yoga_keys, get_birth_hora_result, get_birth_karana_effects, get_birth_paksha_effects, get_birth_panchang_yoga_effects, get_birth_tithi_effects, get_vaara_during_birth.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_vaara_during_birth": "Individuals born on Sunday typically possess a steady and determined nature with a fearless approach to life. They often have a naturally authoritative disposition and demonstrate skillfulness in their endeavors. These individuals tend to be honorable and maintain high standards of purity in their conduct. They may have a tendency toward bilious temperament and often exhibit leadership qualities with a noble bearing."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "hora": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid hora: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_hora_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "surya",
                      "chandra",
                      "mangala",
                      "budha",
                      "brihaspati",
                      "shukra",
                      "shani"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "karana": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid karana: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_karana_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "bava",
                      "balava",
                      "kaulava",
                      "taitila",
                      "gara",
                      "vanija",
                      "vishti",
                      "shakuni",
                      "chatushpada",
                      "naga",
                      "kimstughna"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "paksha": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid paksha: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_paksha_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "shukla",
                      "krishna"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "tithi": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid tithi: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_tithi_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "pratipada",
                      "dvitiya",
                      "tritiya",
                      "chaturthi",
                      "panchami",
                      "shashthi",
                      "saptami",
                      "ashtami",
                      "navami",
                      "dashami",
                      "ekadashi",
                      "dvadashi",
                      "trayodashi",
                      "chaturdashi",
                      "purnima",
                      "amavasya"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "vaara": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid vaara: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_vaara_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "sunday",
                      "monday",
                      "tuesday",
                      "wednesday",
                      "thursday",
                      "friday",
                      "saturday"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "yoga": {
                    "type": "string",
                    "description": "An unknown value returns the string \"Invalid yoga: <x>. Available options: [...]\" with HTTP 200 rather than an error status; the endpoint also exposes a companion key 'get_all_yoga_keys' that returns this exact list at runtime. Watch the transliteration style: 'shula'/'priti'/'siddha'/'siddhi'/'aindra' (not shoola/preeti/indra), and hora values are the Sanskrit planet names (surya/chandra/mangala/budha/brihaspati/shukra/shani), not English weekday or planet names.",
                    "enum": [
                      "vishkumbha",
                      "priti",
                      "ayushman",
                      "saubhagya",
                      "shobhana",
                      "atiganda",
                      "sukarma",
                      "dhriti",
                      "shula",
                      "ganda",
                      "vriddhi",
                      "dhruva",
                      "vyaghata",
                      "harshana",
                      "vajra",
                      "siddha",
                      "vyatipata",
                      "variyana",
                      "parigha",
                      "shiva",
                      "siddhi",
                      "sadhya",
                      "shubha",
                      "shukla",
                      "brahma",
                      "aindra",
                      "vaidhriti"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_vaara_during_birth"
                ],
                "vaara": "sunday",
                "hora": "surya",
                "paksha": "shukla",
                "tithi": "pratipada",
                "karana": "bava",
                "yoga": "vishkumbha"
              }
            }
          }
        }
      }
    },
    "/api/astro/panchanga-elements/": {
      "post": {
        "operationId": "astro_panchanga_elements",
        "summary": "Panchanga element names",
        "description": "Every value the birth-effect lookup accepts, for all six elements.\n\nSixteen tithis, eleven karanas, twenty-seven yogas, seven weekdays, seven horas and two pakshas. /api/astro/birth-panchanga-effects/ cannot really be used without this: the effects are keyed by name and the spellings the engine wants — `vishkumbha`, `surya`, `bava` — are not guessable.\n\nTakes no inputs.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "elements": {
                      "tithi": [
                        "pratipada",
                        "dvitiya",
                        "tritiya",
                        "chaturthi",
                        "panchami",
                        "shashthi",
                        "saptami",
                        "ashtami",
                        "navami",
                        "dashami",
                        "ekadashi",
                        "dvadashi",
                        "trayodashi",
                        "chaturdashi",
                        "purnima",
                        "amavasya"
                      ],
                      "karana": [
                        "bava",
                        "balava",
                        "kaulava",
                        "taitila",
                        "gara",
                        "vanija",
                        "vishti",
                        "shakuni",
                        "chatushpada",
                        "naga",
                        "kimstughna"
                      ],
                      "yoga": [
                        "vishkumbha",
                        "priti",
                        "ayushman",
                        "saubhagya",
                        "shobhana",
                        "atiganda",
                        "sukarma",
                        "dhriti",
                        "shula",
                        "ganda",
                        "vriddhi",
                        "dhruva",
                        "vyaghata",
                        "harshana",
                        "vajra",
                        "siddha",
                        "vyatipata",
                        "variyana",
                        "parigha",
                        "shiva",
                        "siddhi",
                        "sadhya",
                        "shubha",
                        "shukla",
                        "brahma",
                        "aindra",
                        "vaidhriti"
                      ],
                      "vaara": [
                        "sunday",
                        "monday",
                        "tuesday",
                        "wednesday",
                        "thursday",
                        "friday",
                        "saturday"
                      ],
                      "hora": [
                        "surya",
                        "chandra",
                        "mangala",
                        "budha",
                        "brihaspati",
                        "shukra",
                        "shani"
                      ],
                      "paksha": [
                        "shukla",
                        "krishna"
                      ]
                    },
                    "summary": {
                      "vaara_keys": [
                        "sunday",
                        "monday",
                        "tuesday",
                        "wednesday",
                        "thursday",
                        "friday",
                        "saturday"
                      ],
                      "hora_keys": [
                        "surya",
                        "chandra",
                        "mangala",
                        "budha",
                        "brihaspati",
                        "shukra",
                        "shani"
                      ],
                      "paksha_keys": [
                        "shukla",
                        "krishna"
                      ],
                      "tithi_keys": [
                        "pratipada",
                        "dvitiya",
                        "tritiya",
                        "chaturthi",
                        "panchami",
                        "shashthi",
                        "saptami",
                        "ashtami",
                        "navami",
                        "dashami",
                        "ekadashi",
                        "dvadashi",
                        "trayodashi",
                        "chaturdashi",
                        "purnima",
                        "amavasya"
                      ],
                      "karana_keys": [
                        "bava",
                        "balava",
                        "kaulava",
                        "taitila",
                        "gara",
                        "vanija",
                        "vishti",
                        "shakuni",
                        "chatushpada",
                        "naga",
                        "kimstughna"
                      ],
                      "yoga_keys": [
                        "vishkumbha",
                        "priti",
                        "ayushman",
                        "saubhagya",
                        "shobhana",
                        "atiganda",
                        "sukarma",
                        "dhriti",
                        "shula",
                        "ganda",
                        "vriddhi",
                        "dhruva",
                        "vyaghata",
                        "harshana",
                        "vajra",
                        "siddha",
                        "vyatipata",
                        "variyana",
                        "parigha",
                        "shiva",
                        "siddhi",
                        "sadhya",
                        "shubha",
                        "shukla",
                        "brahma",
                        "aindra",
                        "vaidhriti"
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "hora": {
                    "type": "string",
                    "default": "surya",
                    "examples": [
                      "string"
                    ]
                  },
                  "karana": {
                    "type": "string",
                    "default": "bava",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "paksha": {
                    "type": "string",
                    "default": "shukla",
                    "examples": [
                      "string"
                    ]
                  },
                  "tithi": {
                    "type": "string",
                    "default": "pratipada",
                    "examples": [
                      "string"
                    ]
                  },
                  "vaara": {
                    "type": "string",
                    "default": "sunday",
                    "examples": [
                      "string"
                    ]
                  },
                  "yoga": {
                    "type": "string",
                    "default": "vishkumbha",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {}
            }
          }
        }
      }
    },
    "/api/astro/panchanga/": {
      "post": {
        "operationId": "astro_panchanga",
        "summary": "Panchanga",
        "description": "The panchanga is the Hindu almanac for one moment at one place: five 'limbs' — tithi, vaara, nakshatra, yoga and karana — plus everything else a printed panchang carries. This is the largest endpoint in the API, with fifty-seven keys, and most callers use a handful.\n\nStart with tithi, vaara, nakshatra_segments, yogam and karana for the five limbs, and day_length, night_length, midday and midnight for the day's frame. The *_segments keys — tithi_segments, karana_segments, yoga_segments, nakshatra_segments — differ from their singular counterparts in a way that is easy to get wrong: the singular key answers 'what is in force at this instant', while the segments key lists every period touching the whole local calendar day with exact start and end times, which is what a calendar page needs.\n\nThe rest falls into groups. Time divisions: choghadiya and gauri_choghadiya into eighths, hora into planetary hours, do_ghati into the thirty muhurtas, trikalam into thirds. Named windows: abhijit_muhurta, brahma_muhurta, vijaya_muhurta, nishita_muhurta, godhuli_muhurta, amrit_kalam and the two sandhyas against rahu_kaalam, yamaganda_kaalam, gulika_kaalam and durmuhurata. Calendar: lunar_month and lunar_month_poornima (the same month under the two reckonings), shaka_samvat, vikram_samvat, kali_samvat, samvatsara_name, ritu, sankranti_dates and tamil_solar_month_date. Positions rather than times: upagraha_longitudes, special_longitudes, lagnas, sree_lagna and the two bhaava_madhya variants. Day-quality verdicts: tarabala, chandrabalam, panchaka_rahita, disha_shool, agni_vasa_segments, shiva_vasa_segments, yogas and shunya_nakshatra.\n\nEvery call needs date_time and timezone_as_float, and anything that depends on sunrise also needs latitude and longitude. Several optional fields change the answer rather than the formatting: samvata_type is required by samvatsara_name, mode selects how ritu is derived, and gulika_rises_at, mandi_rises_at, gulika_portion, mandi_portion, kala_mrityu_rise_at and dhuma_vyatipata_relation select between competing classical conventions for the upagraha positions. One call costs one credit however many keys you ask for, so request a whole page's worth at once.\n\nAvailable `keys` (57), all covered by the same single credit: abhijit_muhurta, agni_vasa_segments, amrit_kalam, bhaava_madhya_sripati, bhaava_madhya_swe, brahma_muhurta, calcualte_special_tithi, chandrabalam, choghadiya, day_length, disha_shool, do_ghati, durmuhurata, eccentric_anomaly, gauri_choghadiya, godhuli_muhurta, gulika_kaalam, hora, kali_samvat, karana, karana_segments, lagnas, lunar_month, lunar_month_poornima, lunar_phase, midday, midnight, nakshatra_segments, night_length, nishita_muhurta, panchaka_rahita, pratah_sandhya, rahu_kaalam, ritu, samvatsara_name, sankranti_dates, sayahna_sandhya, shaka_samvat, shiva_vasa_segments, shunya_nakshatra, special_longitudes, sree_lagna, tamil_solar_month_date, tarabala, tithi, tithi_segments, trikalam, true_anomaly, udaya_lagna_muhurta, upagraha_longitudes, vaara, vijaya_muhurta, vikram_samvat, yamaganda_kaalam, yoga_segments, yogam, yogas.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "midday": "2026-06-02T12:24:53+05:30"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "description": "Default '360_minus_dhuma'. Forwarded at.",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "description": "Default 'saturn'. Forwarded at.",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "description": "Default 'beginning'. Forwarded to the Panchanga engine object at.",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "description": "Default 'middle'. Forwarded at.",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "mandi_portion": {
                    "type": "string",
                    "description": "Default 'saturn'. Forwarded at.",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "description": "Default 'middle'. Forwarded at.",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "description": "Used only by the 'ritu' key. 'vedic' derives the season from the lunar month, 'drik' from the Sun's tropical sign. Engine default is 'drik'. WARNING: the function does not raise on a bad value - any other string silently falls through both branches and the key returns null (the shipped catalogue sample even sends mode=0 and gets a 200 with a null result).",
                    "enum": [
                      "vedic",
                      "drik"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "description": "In the engine the only meaningful value is the literal string 'special', which swaps the 27-entry `nakshatras` table for the 28-entry `nakshatras_special` table that includes Abhijit and uses modern spellings. Because it is never forwarded, the 'yogas' key of this endpoint currently 500s with \"'Panchanga' object has no attribute 'nakshatras'\".",
                    "enum": [
                      "special"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "description": "Used only by the 'samvatsara_name' key.",
                    "enum": [
                      "shaka",
                      "vikram"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-06-02T06:30:52.786Z",
                "keys": [
                  "midday"
                ],
                "latitude": 26.849,
                "longitude": 75.768,
                "timezone_as_float": 5.5,
                "samvata_type": "shaka",
                "mode": 0,
                "mean_anomaly": 0,
                "eccentricity": 1,
                "tolerance": 0.000001,
                "gulika_rises_at": "beginning",
                "mandi_rises_at": "middle",
                "kala_mrityu_rise_at": "middle",
                "dhuma_vyatipata_relation": "360_minus_dhuma"
              }
            }
          }
        }
      }
    },
    "/api/astro/panchanga_yogas/": {
      "post": {
        "operationId": "astro_panchanga_yogas",
        "summary": "Panchanga yogas",
        "description": "A Panchanga yoga is a named quality a whole day carries, good or bad, arising from the combination of that day's lunar day (tithi), weekday (vaara) and lunar mansion (nakshatra). Sarvartha Siddhi (\"all purposes succeed\"), Amrit Siddhi, Tripushkara, Dagdha, Mrityu and Yamaghanta are the familiar ones. Muhurta practice uses them as a first filter: pick a day that carries a benefic combination and avoid one that carries a malefic one.\n\nThis is the day-level scan. It walks every calendar day of the requested year, evaluates the yogas once at that day's sunrise, and returns only the days that carry at least one. The response is `data.days`, a list of `{date, yogas}` where `date` is `YYYY-MM-DD` and `yogas` is a list of names; days with nothing to report are omitted entirely. Most names carry their source convention in brackets, for example \"Amrit Yoga (Vaara Tithi Yoga)\" or \"Padma Yoga (Vashishta Samhita Yogas)\", because several classical texts define overlapping sets.\n\nThe yogas are read at sunrise, so latitude, longitude and `timezone_as_float` all change the result. `use_28_nakshatras` defaults to true and inserts Abhijit as a nakshatra in its own right; some yogas, such as Monday's Kaana Yoga, are defined in terms of Abhijit and cannot appear without it. Set it to false to use the plain 27-nakshatra list.\n\nThis endpoint is unrelated to `/api/astro/yogas/`, which finds combinations of planets in a birth chart; nothing here looks at a birth chart. For Ravi Yoga specifically, `/api/astro/ravi_yoga/` gives exact start and end times rather than a day flag.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"days\": [{\"date\": \"2026-01-01\", \"yogas\": [\"utpaata\", \"Naasha Yoga (Tithi-Nakshatra-Vaara combination)\", \"Amrit Yoga (Vaara Tithi Yoga)\", \"Utpaata/Pravas (Vaara Nakshatra Malefic/Bad Yoga)\", \"Some adverse combinations (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-02\", \"yogas\": [\"Ravi Yoga (Sun and Moon Nakshatra)\", \"Upagraha Dosha\", \"Amrit Yoga (Vaara Tithi Yoga)\", \"Some adverse combinations as per Vashishta Samhita (Vaara Nakshatra Malefic/Bad Yoga)\", \"Padma Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-03\", \"yogas\": [\"Mrityu (Vaara Tithi Yoga)\", \"Dushta Yoga (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-05\", \"yogas\": [\"sarvartha_siddhi\", \"Always bestows welfare (Tithi group-Nakshatra combination Benefic/Good Yogas)\", \"Some adverse combinations as per Vashishta Samhita (Vaara Nakshatra Malefic/Bad Yoga)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Sarvarth-Siddha Yoga (Vaara Nakshatra Auspicious/Good Yogas)\", \"Maha Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-06\", \"yogas\": [\"sarvartha_siddhi\", \"Dhumra Vashishta Samhita Yoga (Malefic)\", \"Dushta Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Some adverse combinations as per Vashishta Samhita (Vaara Nakshatra Malefic/Bad Yoga)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-09\", \"yogas\": [\"Ravi Yoga (Sun and Moon Nakshatra)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Padma Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-10\", \"yogas\": [\"mrityu\", \"yama_ghanta\", \"Mrityu/Maran (Vaara Nakshatra Malefic/Bad Yoga)\", \"Yamaghanta (Vaara Nakshatra Malefic/Bad Yoga)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Vimardan Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-11\", \"yogas\": [\"Amrit Yoga (Vaara Nakshatra Auspicious/Good Yogas)\", \"Saumya Yog (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-12\", \"yogas\": [\"Auspicious for all types of works (Tithi group-Nakshatra combination Benefic/Good Yogas)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Maha Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-13\", \"yogas\": [\"Din Mrityu Yoga\", \"Halahalopam Yogas (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-14\", \"yogas\": [\"amrit_siddhi\"]}, {\"date\": \"2026-01-16\", \"yogas\": [\"Upagraha Dosha\", \"Amrit Yoga (Vaara Nakshatra Auspicious/Good Yogas)\", \"Sarvarth-Siddha Yoga (Vaara Nakshatra Auspicious/Good Yogas)\"]}, {\"date\": \"2026-01-17\", \"yogas\": [\"Din Mrityu Yoga\", \"Upagraha Dosha\", \"Prashasta Yoga (Vaara Nakshatra Auspicious/Good Yogas)\", \"Amrit Yoga (Vaara Nakshatra Auspicious/Good Yogas)\"]}, {\"date\": \"2026-01-18\", \"yogas\": [\"Amrit Yoga (Vaara Tithi Yoga)\", \"Dushta Yoga (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-19\", \"yogas\": [\"kaana\", \"Ratnakur Yoga (Vaara Tithi Yoga)\", \"Kaana/Vyadhi (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-20\", \"yogas\": [\"Naasha Yoga (Tithi-Nakshatra-Vaara combination)\", \"Amrit Yoga (Vaara Tithi Yoga)\", \"Some adverse combinations as per Vashishta Samhita (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-21\", \"yogas\": [\"dagdha_nakshatra\", \"panchaka\", \"Auspicious for Manglik works (Tithi group-Nakshatra combination Benefic/Good Yogas)\", \"Tithi-Nakshatra-Vaara combination Malefic/Bad Yogas\", \"Naasha Yoga (Tithi-Nakshatra-Vaara combination)\", \"Mrityu (Vaara Tithi Yoga)\", \"Dagdha (Vashishta's opinion) (Vaara Tithi Yoga)\", \"Dagdha (Brihaspati's opinion) (Vaara Tithi Yoga)\", \"Dagdha (Vaara Nakshatra Malefic/Bad Yoga)\", \"Vish Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Some adverse combinations (Vaara Nakshatra Malefic/Bad Yoga)\"]}, {\"date\": \"2026-01-22\", \"yogas\": [\"panchaka\", \"Tithi-Nakshatra-Vaara combination Malefic/Bad Yogas\", \"Mrityu (Vaara Tithi Yoga)\", \"Dagdha (Brihaspati's opinion) (Vaara Tithi Yoga)\", \"Vish Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Some adverse combinations (Vaara Nakshatra Malefic/Bad Yoga)\", \"Ku Yoga (Vaara Nakshatra Malefic/Bad Yoga)\", \"Amrit Yoga (Vashishta Samhita Yogas)\"]}, {\"date\": \"2026-01-23\", \"yogas\": [\"panchaka\", \"Ratnaku"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/panchashalaka_chakra/": {
      "get": {
        "operationId": "astro_panchashalaka_chakra",
        "summary": "Panchashalaka chakra",
        "description": "The Panchashalaka chakra is a muhurta diagram: the 28 nakshatras (the usual 27 plus Abhijit) are laid out seven to a side around a square, and lines drawn across it pair each nakshatra with the one it faces. That facing relationship is called vedha, \"piercing\". If a malefic planet sits in the nakshatra opposite the one you meant to use, the moment counts as pierced and is dropped, which is why the chakra is consulted when fixing wedding dates.\n\nThis GET endpoint returns the whole diagram in one call and takes no parameters. `edges` is an object with `east`, `south`, `west` and `north`, each an ordered list of seven nakshatra names as they appear along that side. `vedha_map` is keyed by nakshatra name, 28 entries, each `{edge, vedha_nakshatra}` giving the side that nakshatra sits on and its single partner.\n\nThe table is fixed reference data, so the response never changes; cache it rather than calling repeatedly. Every pairing is symmetric, so if Ashwini maps to Purva Phalguni then Purva Phalguni maps back to Ashwini. Use `/api/astro/panchashalaka_vedha/` when you only want one nakshatra's partner. Note that Panchashalaka gives each nakshatra exactly one partner where the related Saptashalaka chakra gives three, and the two diagrams place the nakshatras on different sides, so the partners are not the same in both.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Prashna"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "edges": {
                    "east": [
                      "Dhanishtha",
                      "Shatabhisha",
                      "Purva Bhadrapada",
                      "Uttara Bhadrapada",
                      "Revati",
                      "Ashwini",
                      "Bharani"
                    ],
                    "south": [
                      "Krittika",
                      "Rohini",
                      "Mrigashira",
                      "Ardra",
                      "Punarvasu",
                      "Pushya",
                      "Ashlesha"
                    ],
                    "west": [
                      "Vishakha",
                      "Swati",
                      "Chitra",
                      "Hasta",
                      "Uttara Phalguni",
                      "Purva Phalguni",
                      "Magha"
                    ],
                    "north": [
                      "Shravana",
                      "Abhijit",
                      "Uttara Ashadha",
                      "Purva Ashadha",
                      "Moola",
                      "Jyeshtha",
                      "Anuradha"
                    ]
                  },
                  "vedha_map": {
                    "Ashwini": {
                      "edge": "east",
                      "vedha_nakshatra": "Purva Phalguni"
                    },
                    "Purva Phalguni": {
                      "edge": "west",
                      "vedha_nakshatra": "Ashwini"
                    },
                    "Swati": {
                      "edge": "west",
                      "vedha_nakshatra": "Shatabhisha"
                    },
                    "Shatabhisha": {
                      "edge": "east",
                      "vedha_nakshatra": "Swati"
                    },
                    "Chitra": {
                      "edge": "west",
                      "vedha_nakshatra": "Purva Bhadrapada"
                    },
                    "Purva Bhadrapada": {
                      "edge": "east",
                      "vedha_nakshatra": "Chitra"
                    },
                    "Hasta": {
                      "edge": "west",
                      "vedha_nakshatra": "Uttara Bhadrapada"
                    },
                    "Uttara Bhadrapada": {
                      "edge": "east",
                      "vedha_nakshatra": "Hasta"
                    },
                    "Uttara Phalguni": {
                      "edge": "west",
                      "vedha_nakshatra": "Revati"
                    },
                    "Revati": {
                      "edge": "east",
                      "vedha_nakshatra": "Uttara Phalguni"
                    },
                    "Rohini": {
                      "edge": "south",
                      "vedha_nakshatra": "Abhijit"
                    },
                    "Abhijit": {
                      "edge": "north",
                      "vedha_nakshatra": "Rohini"
                    },
                    "Mrigashira": {
                      "edge": "south",
                      "vedha_nakshatra": "Uttara Ashadha"
                    },
                    "Uttara Ashadha": {
                      "edge": "north",
                      "vedha_nakshatra": "Mrigashira"
                    },
                    "Ardra": {
                      "edge": "south",
                      "vedha_nakshatra": "Purva Ashadha"
                    },
                    "Purva Ashadha": {
                      "edge": "north",
                      "vedha_nakshatra": "Ardra"
                    },
                    "Punarvasu": {
                      "edge": "south",
                      "vedha_nakshatra": "Moola"
                    },
                    "Moola": {
                      "edge": "north",
                      "vedha_nakshatra": "Punarvasu"
                    },
                    "Pushya": {
                      "edge": "south",
                      "vedha_nakshatra": "Jyeshtha"
                    },
                    "Jyeshtha": {
                      "edge": "north",
                      "vedha_nakshatra": "Pushya"
                    },
                    "Dhanishtha": {
                      "edge": "east",
                      "vedha_nakshatra": "Ashlesha"
                    },
                    "Ashlesha": {
                      "edge": "south",
                      "vedha_nakshatra": "Dhanishtha"
                    },
                    "Magha": {
                      "edge": "west",
                      "vedha_nakshatra": "Shravana"
                    },
                    "Shravana": {
                      "edge": "north",
                      "vedha_nakshatra": "Magha"
                    },
                    "Bharani": {
                      "edge": "east",
                      "vedha_nakshatra": "Anuradha"
                    },
                    "Anuradha": {
                      "edge": "north",
                      "vedha_nakshatra": "Bharani"
                    },
                    "Krittika": {
                      "edge": "south",
                      "vedha_nakshatra": "Vishakha"
                    },
                    "Vishakha": {
                      "edge": "west",
                      "vedha_nakshatra": "Krittika"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/panchashalaka_vedha/": {
      "get": {
        "operationId": "astro_panchashalaka_vedha",
        "summary": "Panchashalaka vedha lookup",
        "description": "A single-nakshatra lookup into the Panchashalaka chakra. Given a nakshatra it returns the one nakshatra that faces it across the diagram — the pairing muhurta practice treats as an obstruction, so that a malefic occupying the partner afflicts any moment falling in your nakshatra.\n\nPass `nakshatra` as a query parameter, using the spellings from the chakra endpoint's `vedha_map` (Ashwini, Purva Bhadrapada, Uttara Ashadha, and so on; Abhijit is included). The response is `{nakshatra, edge, vedha_nakshatra}` — the name you asked for, which of the four sides it sits on, and its single partner. An unrecognised name is rejected with a 400.\n\nThe relationship is symmetric and never changes, so for more than a handful of lookups fetch the full map once from `/api/astro/panchashalaka_chakra/` instead.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Prashna"
        ],
        "parameters": [
          {
            "name": "nakshatra",
            "in": "query",
            "required": true,
            "description": "Name of the nakshatra to look up its Panchashalaka Chakra vedha partner.",
            "schema": {
              "type": "string",
              "description": "Name of the nakshatra to look up its Panchashalaka Chakra vedha partner.",
              "enum": [
                "Abhijit",
                "Anuradha",
                "Ardra",
                "Ashlesha",
                "Ashwini",
                "Bharani",
                "Chitra",
                "Dhanishtha",
                "Hasta",
                "Jyeshtha",
                "Krittika",
                "Magha",
                "Moola",
                "Mrigashira",
                "Punarvasu",
                "Purva Ashadha",
                "Purva Bhadrapada",
                "Purva Phalguni",
                "Pushya",
                "Revati",
                "Rohini",
                "Shatabhisha",
                "Shravana",
                "Swati",
                "Uttara Ashadha",
                "Uttara Bhadrapada",
                "Uttara Phalguni",
                "Vishakha"
              ],
              "examples": [
                "Abhijit"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "nakshatra": "Abhijit",
                  "edge": "north",
                  "vedha_nakshatra": "Rohini"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/part-of-fortune/": {
      "post": {
        "operationId": "astro_part_of_fortune",
        "summary": "Part of Fortune",
        "description": "The Part of Fortune, computed with the correct formula for the chart's sect.\n\nThe most requested lot in astrology, and the one where sect matters most:\n\n    day birth    Ascendant + Moon - Sun\n    night birth  Ascendant + Sun  - Moon\n\nThose two differ by twice the Sun-Moon distance — usually tens of degrees, often a different sign entirely. Sect is decided from the Sun's actual altitude at the birth moment (above the horizon is a day chart) rather than from a flag you have to work out, though you can override it with `sect`.\n\nBoth values are always returned alongside the chosen one, with the ascendant, Sun and Moon that produced them, so the decision is auditable.\n\nNote that this will disagree with the `punya_saham` key on /api/astro/saham/ for a night birth. That endpoint applies the day formula to every chart; this one is the classical answer.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Birth chart & houses"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "point": "part_of_fortune",
                    "also_known_as": "punya_saham",
                    "zodiac": "sidereal",
                    "ayanamsa": "lahiri",
                    "sect": "night",
                    "sect_detected": "night",
                    "sect_source": "auto",
                    "sun_altitude_deg": -11.186639,
                    "longitude": 29.064531,
                    "sign": "Aries",
                    "sign_index": 1,
                    "degree_in_sign": 29.0645,
                    "formula": "ascendant + sun - moon",
                    "day_formula_longitude": 46.248663,
                    "night_formula_longitude": 29.064531,
                    "components": {
                      "ascendant": 217.656597,
                      "sun": 25.94216,
                      "moon": 214.534226
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "sect": {
                    "type": "string",
                    "description": "Which formula to use. `auto` decides from the Sun's actual altitude at the birth moment, which is what sect means.",
                    "enum": [
                      "auto",
                      "day",
                      "night"
                    ],
                    "default": "auto",
                    "examples": [
                      "auto"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "sect": "auto"
              }
            }
          }
        }
      }
    },
    "/api/astro/patyayini_dasha/": {
      "post": {
        "operationId": "astro_patyayini_dasha",
        "summary": "Patyayini dasha",
        "description": "Patyayini is one of the timing systems used with the Tajaka annual chart, the chart cast for the moment the Sun returns to its natal longitude each year. Where Vimshottari divides time by nakshatra, Patyayini divides the year by the gaps between the planets: the seven classical planets are sorted by longitude, the arc from each to the next fixes that planet's share, and the shares are scaled to fill exactly one year. The result says which planet governs which stretch of the coming twelve months, and which planet runs each sub-period inside that stretch.\n\nOne key, `get_dasha_periods`. Send the moment you want the year measured from as `date_time`, plus `latitude`, `longitude` and `timezone_as_float`. Rahu and Ketu take no part.\n\nTwo things about the shape. Planets are returned as integer indices into the order Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, so 0 is the Sun and 6 is Saturn. And the sub-period start times are strings holding a date followed by a stringified dictionary, for example `\"2025-02-13 {'degrees': 5, 'minutes': 7, 'seconds': 54.0}\"`, in which degrees, minutes and seconds are the hours, minutes and seconds of the day rather than an angle. Parse accordingly.\n\nAvailable `keys` (1), all covered by the same single credit: get_dasha_periods.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_dasha_periods": [
                      [
                        4,
                        [
                          [
                            4,
                            "2025-02-13 {'degrees': 5, 'minutes': 7, 'seconds': 54.0}"
                          ],
                          [
                            2,
                            "2025-02-20 {'degrees': 4, 'minutes': 30, 'seconds': 43.98}"
                          ],
                          [
                            1,
                            "2025-02-25 {'degrees': 13, 'minutes': 27, 'seconds': 35.6}"
                          ],
                          [
                            0,
                            "2025-03-04 {'degrees': 2, 'minutes': 37, 'seconds': 52.14}"
                          ],
                          [
                            3,
                            "2025-03-29 {'degrees': 14, 'minutes': 51, 'seconds': 56.66}"
                          ],
                          [
                            6,
                            "2025-03-30 {'degrees': 1, 'minutes': 9, 'seconds': 49.25}"
                          ],
                          [
                            5,
                            "2025-04-02 {'degrees': 4, 'minutes': 10, 'seconds': 16.59}"
                          ]
                        ],
                        50.47049095824722
                      ],
                      [
                        2,
                        [
                          [
                            2,
                            "2025-04-04 {'degrees': 16, 'minutes': 25, 'seconds': 24.42}"
                          ],
                          [
                            1,
                            "2025-04-08 {'degrees': 19, 'minutes': 45, 'seconds': 46.65}"
                          ],
                          [
                            0,
                            "2025-04-13 {'degrees': 20, 'minutes': 50, 'seconds': 43.92}"
                          ],
                          [
                            3,
                            "2025-05-03 {'degrees': 12, 'minutes': 30, 'seconds': 9.45}"
                          ],
                          [
                            6,
                            "2025-05-03 {'degrees': 20, 'minutes': 26, 'seconds': 9.66}"
                          ],
                          [
                            5,
                            "2025-05-06 {'degrees': 6, 'minutes': 13, 'seconds': 15.0}"
                          ],
                          [
                            4,
                            "2025-05-08 {'degrees': 4, 'minutes': 38, 'seconds': 17.8}"
                          ]
                        ],
                        38.88177078271102
                      ],
                      [
                        1,
                        [
                          [
                            1,
                            "2025-05-13 {'degrees': 13, 'minutes': 35, 'seconds': 9.41}"
                          ],
                          [
                            0,
                            "2025-05-19 {'degrees': 17, 'minutes': 10, 'seconds': 14.28}"
                          ],
                          [
                            3,
                            "2025-06-12 {'degrees': 16, 'minutes': 3, 'seconds': 44.27}"
                          ],
                          [
                            6,
                            "2025-06-13 {'degrees': 1, 'minutes': 43, 'seconds': 55.64}"
                          ],
                          [
                            5,
                            "2025-06-16 {'degrees': 0, 'minutes': 9, 'seconds': 52.8}"
                          ],
                          [
                            4,
                            "2025-06-18 {'degrees': 8, 'minutes': 44, 'seconds': 30.45}"
                          ],
                          [
                            2,
                            "2025-06-24 {'degrees': 21, 'minutes': 54, 'seconds': 47.0}"
                          ]
                        ],
                        47.39207008858781
                      ],
                      [
                        0,
                        [
                          [
                            0,
                            "2025-06-29 {'degrees': 22, 'minutes': 59, 'seconds': 44.27}"
                          ],
                          [
                            3,
                            "2025-10-01 {'degrees': 6, 'minutes': 23, 'seconds': 26.73}"
                          ],
                          [
                            6,
                            "2025-10-02 {'degrees': 20, 'minutes': 3, 'seconds': 28.63}"
                          ],
                          [
                            5,
                            "2025-10-14 {'degrees': 6, 'minutes': 24, 'seconds': 58.5}"
                          ],
                          [
                            4,
                            "2025-10-23 {'degrees': 10, 'minutes': 48, 'seconds': 11.02}"
                          ],
                          [
                            2,
                            "2025-11-17 {'degrees': 23, 'minutes': 2, 'seconds': 15.54}"
                          ],
                          [
                            1,
                            "2025-12-07 {'degrees': 14, 'minutes': 41, 'seconds': 41.06}"
                          ]
                        ],
                        184.60794884537245
                      ],
                      [
                        3,
                        [
                          [
                            3,
                            "2025-12-31 {'degrees': 13, 'minutes': 35, 'seconds': 11.05}"
                          ],
                          [
                            6,
                            "2025-12-31 {'degrees': 14, 'minutes': 13, 'seconds': 11.91}"
                          ],
                          [
                            5,
                            "2025-12-31 {'degrees': 18, 'minutes': 50, 'seconds': 5.1}"
                          ],
                          [
                            4,
                            "2025-12-31 {'degrees': 22, 'minutes': 32, 'seconds': 30.17}"
                          ],
                          [
                            2,
                            "2026-01-01 {'degrees': 8, 'minutes': 50, 'seconds': 22.75}"
                          ],
                          [
                            1,
                            "2026-01-01 {'degrees': 16, 'minutes': 46, 'seconds': 22.97}"
                          ],
                          [
                            0,
                            "2026-01-02 {'degrees': 2, 'minutes': 26, 'seconds': 34.33}"
                          ]
                        ],
                        3.1051525548770096
                      ],
                      [
                        6,
                        [
                          [
                            6,
                            "2026-01-03 {'degrees': 16, 'minutes': 6, 'seconds': 36.23}"
                          ],
                          [
                            5,
                            "2026-01-05 {'degrees': 1, 'minutes': 43, 'seconds': 22.53}"
                          ],
                          [
                            4,
                            "2026-01-06 {'degrees': 4, 'minutes': 43, 'seconds': 24.59}"
                          ],
                          [
                            2,
                            "2026-01-09 {'degrees': 7, 'minutes': 43, 'seconds': 51.93}"
                          ],
                          [
                            1,
                            "2026-01-11 {'degrees': 17, 'minutes': 30, 'seconds': 57.26}"
                          ],
                          [
                            0,
                            "2026-01-14 {'degrees': 15, 'minutes': 56, 'seconds': 54.43}"
                          ],
                          [
                            3,
                            "2026-01-26 {'degrees': 2, 'minutes': 18, 'seconds': 24.3}"
                          ]
                        ],
                        22.617144228911343
                      ],
                      [
                        5,
                        [
                          [
                            5,
                            "2026-01-26 {'degrees': 6, 'minutes': 55, 'seconds': 17.49}"
                          ],
                          [
                            4,
                            "2026-01-27 {'degrees': 4, 'minutes': 36, 'seconds': 38.06}"
                          ],
                          [
                            2,
                            "2026-01-29 {'degrees': 16, 'minutes': 51, 'seconds': 45.9}"
                          ],
                          [
                            1,
                            "2026-01-31 {'degrees': 15, 'minutes': 16, 'seconds': 48.7}"
                          ],
                          [
                            0,
                            "2026-02-02 {'degrees': 23, 'minutes': 51, 'seconds': 26.35}"
                          ],
                          [
                            3,
                            "2026-02-12 {'degrees': 4, 'minutes': 14, 'seconds': 38.88}"
                          ],
                          [
                            6,
                            "2026-02-12 {'degrees': 7, 'minutes': 57, 'seconds': 3.94}"
                          ]
                        ],
                        18.167922541293144
                      ]
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_dasha_periods"
                ],
                "date_time": "2025-02-13T05:07:54.585Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/pdf/horoscope/": {
      "post": {
        "operationId": "astro_pdf_horoscope",
        "summary": "Horoscope PDF report",
        "description": "A complete Vedic horoscope as a finished PDF, in one call. The response body IS the PDF (`application/pdf`) — there is no second request and no hosted file.\n\nForty-plus pages: birth details and panchang, planetary positions with nakshatra lords, the lagna chart in both North and South Indian styles, the Moon chart, twelve divisional charts, house cusps, planetary friendships, KP placements, Sarvashtakavarga plus a page of Bhinnashtakavarga for every graha, three dasha systems with the running period expanded into sub-periods, Kala Sarpa and Manglik findings, the full Sade Sati timeline with its Ardha Kantaka and Ashtama Shani passages, numerology, gemstone, rudraksha and mantra recommendations, and a reading for each of the nine grahas.\n\nWE STORE NOTHING. Report APIs usually write the file to a bucket and hand back a link, which means a birth chart — a name, a birth time, a set of predictions — sits at a public URL for as long as the object lives. The bytes come back to you instead. Nothing is written on our side and there is no link for anyone else to find. If you want a hosted copy, save these bytes yourself, with your own expiry and your own access rules.\n\nWHITE LABEL. Everything in `branding` is optional and appears on the cover, the running header and the footer, so your customer sees your name. Nothing in the document carries ours.\n\nTHE BIRTH MOMENT. Send either `date_time` as ISO 8601, or the separate `day`/`month`/`year`/`hour`/`minute` fields with `timezone_as_float`. Sending both is rejected rather than resolved in your favour: when the two disagree there is no safe way to pick one, and the result would be a confidently wrong chart.\n\nEvery figure is computed by the same endpoints this API serves — the positions on page 3 are exactly what /api/astro/planet-positions/ returns. Sections fail independently: if one calculation is undefined for a chart, that page says so and the rest of the report is still produced. The `X-Report-Sections-Failed` response header counts how many, so you can tell a full report from a thin one without opening it.\n\nTypical end-to-end time is under two seconds.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "PDF reports"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_binary": true,
                  "content_type": "application/pdf",
                  "_note": "This endpoint returns a application/pdf file as the response body, not JSON. The call was verified and returned 200."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "branding": {
                    "type": "object",
                    "description": "Reseller details printed on the cover, header and footer.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Which convention the birth chart is drawn in. Both are included by default.",
                    "enum": [
                      "north",
                      "south",
                      "both"
                    ],
                    "default": "both",
                    "examples": [
                      "north"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "minimum": 1,
                    "maximum": 31,
                    "examples": [
                      1
                    ]
                  },
                  "gender": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "hour": {
                    "type": "integer",
                    "description": "Hour of birth in 24-hour form, 0-23. Local time at the place of birth.",
                    "minimum": 0,
                    "maximum": 23,
                    "examples": [
                      0
                    ]
                  },
                  "minute": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "examples": [
                      0
                    ]
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "examples": [
                      9
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "place": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2200,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "name": "Ajeet Kanojia",
                "gender": "male",
                "date_time": "1985-02-23T05:45:00+05:30",
                "latitude": 20.8833,
                "longitude": 76.2,
                "timezone_as_float": 5.5,
                "place": "Malkapur, Maharashtra, India",
                "chart_style": "both",
                "branding": {
                  "company_name": "Acme Astrology",
                  "company_info": "Vedic reports since 2011.",
                  "company_email": "hello@acme.example",
                  "company_mobile": "+91 90000 00000",
                  "domain_url": "https://acme.example",
                  "footer_link": "acme.example"
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/pdf/yearbook/": {
      "post": {
        "operationId": "astro_pdf_yearbook",
        "summary": "Year Book PDF report",
        "description": "The next twelve months as a finished PDF, divided by dasha period. The response body IS the PDF (`application/pdf`) — one call, nothing stored.\n\nWhere /api/astro/pdf/horoscope/ describes a nativity, this describes a year of it. The horoscope is the same document whether you generate it today or in ten years; this one is anchored to a date and goes stale — run it again next year and every page is different.\n\nTHE YEAR IS NOT DIVIDED INTO CALENDAR MONTHS. It is divided by the Vimshottari pratyantardasha — the third level of the dasha tree — so each section begins and ends on a date this chart dictates. A period can therefore run three weeks or two months, and the first and last usually overhang the twelve-month window, because a period is printed whole or not at all.\n\nEach period is read across finance, career, family life, love and marital life, and health, with what to do, what to avoid, and the traditional remedies for that period's graha. Whether a period reads as supportive or demanding is decided from the ruling graha's dignity, house and functional nature IN THIS CHART, and the grounds are printed beside the verdict — so two people in the same Venus period do not receive the same page.\n\nDETERMINISTIC. Every paragraph is looked up, not generated: the same birth data and the same `start_date` produce a byte-identical book, which is what makes a support question answerable.\n\n`start_date` defaults to today. Pass the native's next birthday to get a birthday-to-birthday book instead of a rolling one.\n\nTakes the same birth data and the same optional `branding` block as the horoscope report. Two response headers are worth reading: `X-Report-Periods` says how many dasha periods the year divided into, so you can tell a full book from a thin one without opening it, and `X-Report-Sections-Failed` counts any calculation that could not be completed.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "PDF reports"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_binary": true,
                  "content_type": "application/pdf",
                  "_note": "This endpoint returns a application/pdf file as the response body, not JSON. The call was verified and returned 200."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "branding": {
                    "type": "object",
                    "description": "Reseller details printed on the cover, header and footer.",
                    "examples": [
                      "string"
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "day": {
                    "type": "integer",
                    "description": "Day of the month as a number, 1-31.",
                    "minimum": 1,
                    "maximum": 31,
                    "examples": [
                      1
                    ]
                  },
                  "gender": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "hour": {
                    "type": "integer",
                    "description": "Hour of birth in 24-hour form, 0-23. Local time at the place of birth.",
                    "minimum": 0,
                    "maximum": 23,
                    "examples": [
                      0
                    ]
                  },
                  "minute": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "examples": [
                      0
                    ]
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "examples": [
                      9
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "place": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "start_date": {
                    "type": "string",
                    "format": "date",
                    "description": "First day of the twelve months to cover, YYYY-MM-DD. Defaults to today. Pass the native's next birthday to get a birthday-to-birthday book instead of a rolling one.",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2200,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "name": "Ajeet Kanojia",
                "gender": "male",
                "date_time": "1985-02-23T05:45:00+05:30",
                "latitude": 20.8833,
                "longitude": 76.2,
                "timezone_as_float": 5.5,
                "place": "Malkapur, Maharashtra, India",
                "start_date": "2026-01-01",
                "branding": {
                  "company_name": "Acme Astrology",
                  "company_info": "Vedic reports since 2011.",
                  "company_email": "hello@acme.example",
                  "domain_url": "https://acme.example",
                  "footer_link": "acme.example"
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/planet-aspects/": {
      "post": {
        "operationId": "astro_planet_aspects",
        "summary": "What a planet aspects",
        "description": "Everything one planet aspects, and everything that aspects it back.\n\nSix separate questions the parent endpoint answers only if you know six key names: the sign aspects it casts, the planets, signs and houses it aspects, the planets it is conjoined with, and the planets aspecting it. Choose the planet with `planet`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planet": "Mars",
                    "raasi_drishti": [
                      0,
                      3,
                      8
                    ],
                    "aspects_planets": [],
                    "aspects_rasis": [
                      1,
                      4,
                      5
                    ],
                    "aspects_houses": [
                      7,
                      10,
                      11
                    ],
                    "associated_with": [
                      "Sun",
                      "Mercury",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "aspected_by": []
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "Which planet the aspects are computed for.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "default": "Sun",
                    "examples": [
                      "Sun"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true",
                "planet": "Mars"
              }
            }
          }
        }
      }
    },
    "/api/astro/planet-equatorial/": {
      "post": {
        "operationId": "astro_planet_equatorial",
        "summary": "Planet equatorial coordinates",
        "description": "Right ascension and declination — the coordinates star catalogues use.\n\nEcliptic longitude is what astrology reads; equatorial coordinates are what every telescope, planetarium and astronomy database speaks. Both the sexagesimal form and a decimal form are returned, because you cannot subtract two {hours, minutes, seconds} objects, along with how fast each coordinate is changing.\n\nDistance is passed through in astronomical units exactly as the engine reports it. It is rounded to three decimal places, which is fine for a planet and far too coarse for the Moon — 0.002 AU spans about 85,000 km of the lunar orbit — so it is deliberately not converted to kilometres.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "bodies": {
                      "SUN": {
                        "right_ascension": {
                          "hours": 11,
                          "minutes": 11,
                          "seconds": 32.82
                        },
                        "right_ascension_hours": 11.19245,
                        "declination": {
                          "degrees": 5,
                          "minutes": 11,
                          "seconds": 52.8
                        },
                        "declination_degrees": 5.198,
                        "speeds": {
                          "right_ascension_speed": 0.898951,
                          "declination_speed": -0.377955,
                          "distance_speed": -0.000253
                        },
                        "distance_au": 1.007
                      },
                      "MARS": {
                        "right_ascension": {
                          "hours": 7,
                          "minutes": 21,
                          "seconds": 31.98
                        },
                        "right_ascension_hours": 7.358883,
                        "declination": {
                          "degrees": 22,
                          "minutes": 47,
                          "seconds": 13.2
                        },
                        "declination_degrees": 22.787,
                        "speeds": {
                          "right_ascension_speed": 0.669754,
                          "declination_speed": -0.070679,
                          "distance_speed": -0.005852
                        },
                        "distance_au": 1.802
                      }
                    },
                    "notes": {
                      "distance_au": "Rounded to three decimal places by the engine. Too coarse to convert to kilometres for the Moon."
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "altitude": {
                    "type": "number",
                    "format": "double",
                    "description": "OBSERVER elevation in metres, not a body's altitude.",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet_names": {
                    "type": "array",
                    "description": "Bodies to report, e.g. [\"SUN\", \"MOON\", \"MARS\"].",
                    "default": [
                      "SUN",
                      "MOON"
                    ],
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "time_zone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset. Either this or timezone_as_float; they mirror.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-09T12:00:00+00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 0,
                "planet_names": [
                  "SUN",
                  "MARS"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/planet-friendships/": {
      "post": {
        "operationId": "astro_planet_friendships",
        "summary": "Natural planetary friendships",
        "description": "Natural friends, neutrals and enemies for every planet, by name, plus the planets ranked by strength for this chart.\n\nThe natural relationships are permanent — they do not depend on the chart — and they decide a large part of whether a planet is read as comfortable where it sits. The strength ranking, unlike them, is specific to the birth given.\n\nFriendship is derived as the complement of neutrality and enmity rather than read from the engine's own key, which raises an error. The derivation reproduces the classical table exactly for all seven traditional planets, and the response says so in `friends_source`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "natural_friends": {
                      "Sun": [
                        "Moon",
                        "Mars",
                        "Jupiter"
                      ],
                      "Moon": [
                        "Sun",
                        "Mercury"
                      ],
                      "Mars": [
                        "Sun",
                        "Moon",
                        "Jupiter"
                      ],
                      "Mercury": [
                        "Sun",
                        "Venus"
                      ],
                      "Jupiter": [
                        "Sun",
                        "Moon",
                        "Mars"
                      ],
                      "Venus": [
                        "Mercury",
                        "Saturn",
                        "Rahu"
                      ],
                      "Saturn": [
                        "Mercury",
                        "Venus",
                        "Rahu"
                      ],
                      "Rahu": [
                        "Venus",
                        "Saturn"
                      ],
                      "Ketu": [
                        "Sun",
                        "Mars"
                      ]
                    },
                    "natural_neutrals": {
                      "Sun": [
                        "Mercury",
                        "Ketu"
                      ],
                      "Moon": [
                        "Mars",
                        "Jupiter",
                        "Venus",
                        "Saturn",
                        "Rahu",
                        "Ketu"
                      ],
                      "Mars": [
                        "Venus",
                        "Saturn",
                        "Rahu",
                        "Ketu"
                      ],
                      "Mercury": [
                        "Mars",
                        "Jupiter",
                        "Saturn",
                        "Rahu"
                      ],
                      "Jupiter": [
                        "Saturn",
                        "Ketu"
                      ],
                      "Venus": [
                        "Mars",
                        "Jupiter",
                        "Ketu"
                      ],
                      "Saturn": [
                        "Jupiter"
                      ],
                      "Rahu": [
                        "Mercury",
                        "Jupiter",
                        "Ketu"
                      ],
                      "Ketu": [
                        "Moon",
                        "Mercury",
                        "Jupiter",
                        "Rahu"
                      ]
                    },
                    "natural_enemies": {
                      "Sun": [
                        "Venus",
                        "Saturn",
                        "Rahu"
                      ],
                      "Moon": [],
                      "Mars": [
                        "Mercury"
                      ],
                      "Mercury": [
                        "Moon",
                        "Ketu"
                      ],
                      "Jupiter": [
                        "Mercury",
                        "Venus",
                        "Rahu"
                      ],
                      "Venus": [
                        "Sun",
                        "Moon"
                      ],
                      "Saturn": [
                        "Sun",
                        "Moon",
                        "Mars",
                        "Ketu"
                      ],
                      "Rahu": [
                        "Sun",
                        "Moon",
                        "Mars"
                      ],
                      "Ketu": [
                        "Venus",
                        "Saturn"
                      ]
                    },
                    "friends_source": "derived_complement",
                    "friends_note": "Friendship is derived as the complement of neutrality and enmity. The engine's own natural_friends_of_planets key raises an error, and the derivation reproduces the classical table for all seven traditional planets.",
                    "strength_order": [
                      "Sun",
                      "Mercury",
                      "Moon",
                      "Rahu",
                      "Saturn",
                      "Venus",
                      "Jupiter",
                      "Mars",
                      "Ketu"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Sun",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true"
              }
            }
          }
        }
      }
    },
    "/api/astro/planet-horizon/": {
      "post": {
        "operationId": "astro_planet_horizon",
        "summary": "Planet horizon coordinates",
        "description": "Where a body is in the sky right now: azimuth, altitude, and whether it is up at all.\n\nHorizon coordinates are what you need to point at something — a camera, a telescope, or a finger. Azimuth is degrees clockwise from due north, altitude is degrees above the horizon and goes negative once the body has set.\n\n`above_horizon` and a sixteen-point compass bearing are derived here rather than left to you, because \"is it up\" is the actual question and a negative altitude renders as a perfectly valid-looking position.\n\nAccepts the UTC offset as either `timezone_as_float` or `time_zone`; the parent endpoint only accepts the second.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "observer": {
                      "latitude": 26.9124,
                      "longitude": 75.7873,
                      "elevation_m": 0
                    },
                    "bodies": {
                      "SUN": {
                        "azimuth": 268.533017,
                        "compass": "W",
                        "altitude": 14.482392,
                        "above_horizon": true
                      },
                      "MOON": {
                        "azimuth": 284.783473,
                        "compass": "WNW",
                        "altitude": 0.890481,
                        "above_horizon": true
                      },
                      "MARS": {
                        "azimuth": 313.736218,
                        "compass": "NW",
                        "altitude": -22.802352,
                        "above_horizon": false
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "altitude": {
                    "type": "number",
                    "format": "double",
                    "description": "OBSERVER elevation in metres, not a body's altitude.",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet_names": {
                    "type": "array",
                    "description": "Bodies to report, e.g. [\"SUN\", \"MOON\", \"MARS\"].",
                    "default": [
                      "SUN",
                      "MOON"
                    ],
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "time_zone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset. Either this or timezone_as_float; they mirror.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-09T12:00:00+00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 0,
                "planet_names": [
                  "SUN",
                  "MOON",
                  "MARS"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/planet-positions/": {
      "post": {
        "operationId": "astro_planet_positions",
        "summary": "Planet positions",
        "description": "Sidereal positions of the nine grahas for a moment and place: longitude, sign, nakshatra, pada and house for each, plus the ascendant and the ayanamsa actually applied.\n\nThe planets come back as a LIST in traditional order with `name` on each entry, rather than nested under a chart name and keyed by planet, so you can iterate or render a table directly.\n\nDerived from /api/astro/chart/, which requires chart_name, notation, ayanamsa and ascendant_pos on every call. Here they default to RashiChart, degree, LAHIRI and cusp - send a date and a place and nothing else.\n\n`ayanamsa` is still worth setting deliberately: it shifts every longitude in the response, and Lahiri and Raman differ by about a degree, which is enough to move a planet into a different nakshatra. All 48 ayanamsas the chart endpoint supports are accepted here.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 134.381,
                        "latitude": 0,
                        "nakshatra": "Poorva Phalguni",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "moon",
                        "longitude": 1.478,
                        "latitude": 4.37,
                        "nakshatra": "Ashwini",
                        "pada": 1,
                        "kakshya": "saturn",
                        "zodiac_name": "Aries",
                        "house": 9
                      },
                      {
                        "name": "mars",
                        "longitude": 79.175,
                        "latitude": 0.535,
                        "nakshatra": "Aardra",
                        "pada": 4,
                        "kakshya": "Mercury",
                        "zodiac_name": "Gemini",
                        "house": 11
                      },
                      {
                        "name": "mercury",
                        "longitude": 138.508,
                        "latitude": 1.574,
                        "nakshatra": "Poorva Phalguni",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "jupiter",
                        "longitude": 109.472,
                        "latitude": 0.529,
                        "nakshatra": "Aasresha",
                        "pada": 1,
                        "kakshya": "Mercury",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "venus",
                        "longitude": 178.956,
                        "latitude": -3.391,
                        "nakshatra": "Chitra",
                        "pada": 2,
                        "kakshya": "ascendant",
                        "zodiac_name": "Virgo",
                        "house": 2
                      },
                      {
                        "name": "saturn",
                        "longitude": 349.447,
                        "latitude": -2.651,
                        "nakshatra": "Revati",
                        "pada": 1,
                        "kakshya": "Mercury",
                        "zodiac_name": "Pisces",
                        "house": 8
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 305.566,
                        "latitude": 0,
                        "nakshatra": "Dhanishtha",
                        "pada": 4,
                        "kakshya": "jupiter",
                        "zodiac_name": "Aquarius",
                        "house": 7
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 125.56599999999996,
                        "latitude": 0,
                        "nakshatra": "Makha",
                        "pada": 2,
                        "kakshya": "jupiter",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "uranus",
                        "longitude": 41.424,
                        "latitude": -0.154,
                        "nakshatra": "Rohini",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Taurus",
                        "house": 10
                      },
                      {
                        "name": "neptune",
                        "longitude": 339.433,
                        "latitude": -1.412,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 2,
                        "kakshya": "mars",
                        "zodiac_name": "Pisces",
                        "house": 8
                      },
                      {
                        "name": "pluto",
                        "longitude": 279.279,
                        "latitude": -4.3,
                        "nakshatra": "Uttaraashaadha",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Capricorn",
                        "house": 6
                      }
                    ],
                    "ascendant": {
                      "longitude": 132.1878846274937,
                      "zodiac_name": "Leo",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/planet_insights/": {
      "post": {
        "operationId": "astro_planet_insights",
        "summary": "Planet placement readings",
        "description": "Prewritten interpretations for a single planet in a single position. Give it a planet and where that planet sits — a zodiac sign, a house, or a nakshatra — and it returns the classical reading for that combination. It is a lookup into a text corpus, not a calculation: no date, time or place is involved, and the same request always returns the same text.\n\nUse it to caption a chart you have already computed. Take Jupiter's sign, house and nakshatra from `/api/astro/chart/`, then call this endpoint for the wording. All three keys can be requested in one call, but each has its own extra parameter, so `planet`, `sign`, `house` and `nakshatra` must all be present in the body when you ask for all three.\n\nCoverage is nine planets (the seven plus Rahu and Ketu) across twelve signs and twelve houses. Nakshatra readings exist for the seven classical planets only — Rahu and Ketu have none. An unrecognised planet, sign, house or nakshatra comes back as an explanatory string with HTTP 200 rather than an error, so check what type you were given before rendering it.\n\nAvailable `keys` (3), all covered by the same single credit: get_planet_house_insight, get_planet_nakshatra_insight, get_planet_sign_insight.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_planet_sign_insight": {
                      "sign": "Mesa Brhaspati",
                      "summary": "Jupiter in Aries produces a bold, authoritative, and resourceful individual with strong leadership capabilities. Aries is ruled by Mars (Maṅgala), a planet friendly to Jupiter and symbolizing courage, initiative, and battle-readiness. Jupiter here gains the spirit of a warrior-sage, combining spiritual strength with physical initiative. The placement enhances fame, wealth, power, and generational prosperity, especially through sons. However, the position also introduces difficulties like enemies, physical injuries, and excessive expenditures due to Aries being the debilitation sign for Saturn (Śani), whose tamasic qualities interfere with Jupiter's sattvic nature. The individual is splendorous, generous, and powerful, but also faces trials that temper their greatness",
                      "core traits": [
                        "Argumentative in disposition",
                        "Acquiring precious stones and ornaments through effort",
                        "Endowed with strength, sons, and wealth",
                        "Eminent and famous profession",
                        "Splendorous",
                        "Many enemies",
                        "Many expenses",
                        "Injured body",
                        "Confers severe and cruel punishments"
                      ],
                      "psychologicalPhysicalTraits": [
                        "Argumentative in disposition",
                        "Acquiring precious stones and ornaments through effort",
                        "Endowed with strength, sons, and wealth",
                        "Eminent and famous profession",
                        "Splendorous",
                        "Many enemies",
                        "Many expenses",
                        "Injured body",
                        "Confers severe and cruel punishments",
                        "Love of grandeur",
                        "Powerful",
                        "Wealthy",
                        "Prudent",
                        "Many children",
                        "Courteous",
                        "Generous",
                        "Firm",
                        "Sympathetic",
                        "Happy marriage",
                        "Patient nature",
                        "Harmonious",
                        "Refined",
                        "High position"
                      ],
                      "astrologicalReasoning": [
                        {
                          "heading": "Initiative & Argumentation",
                          "text": "Meṣa is ruled by Maṅgala, the god of war and action, endowing Jupiter with a strong fighting disposition and argumentative temperament."
                        },
                        {
                          "heading": "Wealth & Luxuries",
                          "text": "Sūrya, exalted in Meṣa, governs precious metals and gemstones. Jupiter, the Dhanakāraka, placed here results in acquiring valuables through effort."
                        },
                        {
                          "heading": "Progeny & Strength",
                          "text": "Meṣa is a masculine sign ruled by male planets (Sūrya and Maṅgala). Jupiter, as the Santana Kāraka, gains support here, indicating sons, strength, and vitality."
                        },
                        {
                          "heading": "Fame & Eminence",
                          "text": "As the 1st house of Kālapuruṣa, Aries governs fame. Jupiter's placement brings name, professional eminence, and public recognition."
                        },
                        {
                          "heading": "Drawbacks of the Sign",
                          "text": "Meṣa is Śani's debilitation sign. Jupiter here absorbs Śani's weaknesses, causing a rise in enemies (6H), injury-proneness, emotional detachment (due to 8H being Moon's debilitation), and heavy expenditure (12H effects)."
                        },
                        {
                          "heading": "Judgement & Harshness",
                          "text": "With Jupiter reflecting Maṅgala's and Śani's stern traits, the native may confer harsh or severe judgments lacking emotional nuance."
                        }
                      ],
                      "drstiphala": [
                        {
                          "planet": "Sūrya",
                          "aspect": "positive",
                          "result": "Charitable, truthful, famous sons, highly fortunate, abundant hair on the body."
                        },
                        {
                          "planet": "Candra",
                          "aspect": "positive",
                          "result": "Charitable, truthful, famous sons, highly fortunate, abundant hair on the body."
                        },
                        {
                          "planet": "Maṅgala",
                          "aspect": "positive",
                          "result": "Belonging to a royal dynasty, fearless, fierce, endowed with political knowledge, modest, affluent, has a disobedient wife and disobedient servants."
                        },
                        {
                          "planet": "Budha",
                          "aspect": "negative",
                          "result": "Liar, crafty, sinful, skilful in detecting others' flaws, serves others, grateful, modest, not outspoken."
                        },
                        {
                          "planet": "Śukra",
                          "aspect": "positive",
                          "result": "Very happy with residences, sleeping comforts, robes, perfumes, garlands, ornaments, wife, very timid."
                        },
                        {
                          "planet": "Śani",
                          "aspect": "mixed",
                          "result": "Talkative, eloquent, devoid of happiness, brilliant, has mean children and a mean wife."
                        }
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "house": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "The list above is the one used by jupiter, mercury, venus and saturn. 'rahu' and 'ketu' have no nakshatra data at all. Unmatched values return \"Invalid nakshatra: <x> for planet <p>\" with HTTP 200.",
                    "enum": [
                      "ashwini",
                      "bharani",
                      "krittika",
                      "rohini",
                      "mrigasira",
                      "aardra",
                      "punarvasu",
                      "pushyami",
                      "aasresha",
                      "makha",
                      "poorva phalguni",
                      "uttara phalguni",
                      "hasta",
                      "chitra",
                      "swaati",
                      "visaakha",
                      "anooraadha",
                      "yyeshtha",
                      "moola",
                      "poorvaashaadha",
                      "uttaraashaadha",
                      "sravanam",
                      "dhanishtha",
                      "satabhishak",
                      "poorvaabhaadra",
                      "uttaraabhaadra",
                      "revati"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "An unknown planet returns the string \"Invalid planet: <x>\" with HTTP 200, not an error status. Note rahu and ketu have NO nakshatra data (insights['rahu']['nakshatras'] is None), so get_planet_nakshatra_insight returns \"No nakshatra data available for rahu\".",
                    "enum": [
                      "sun",
                      "moon",
                      "mars",
                      "mercury",
                      "jupiter",
                      "venus",
                      "saturn",
                      "rahu",
                      "ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "sign": {
                    "type": "string",
                    "description": "DATA BUG worth documenting: for planet='sun' the key is misspelled 'vigro' instead of 'virgo', so sun+virgo returns \"Invalid sign: virgo for planet sun\" while sun+vigro works. All eight other planets use 'virgo'.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "house",
                  "keys",
                  "nakshatra",
                  "planet",
                  "sign"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_planet_sign_insight"
                ],
                "planet": "Jupiter",
                "sign": "aries",
                "house": 0,
                "nakshatra": "rohini"
              }
            }
          }
        }
      }
    },
    "/api/astro/planet_transit_natal_planets/": {
      "post": {
        "operationId": "astro_planet_transit_natal_planets",
        "summary": "Transit over natal planet",
        "description": "Prewritten readings for one planet passing over another planet's birth position — transiting Saturn over the natal Moon, transiting Jupiter over the natal Sun, and so on. This is the pairwise transit table most transit reports are built from.\n\nIt is a pure lookup with no chart calculation behind it: supply the transiting planet as `planet` and the birth-chart planet as `natal_planet` and you get the text back. Work out which contacts are actually live from a transit calculation such as `/api/astro/transit/` first, then call this for the wording.\n\nBoth arguments accept the nine bodies, although the transiting side omits Venus. Order matters: Saturn over the natal Sun is a different entry from the Sun over natal Saturn.\n\nAvailable `keys` (1), all covered by the same single credit: get_planet_transit_natal_planets.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_planet_transit_natal_planets": [
                      "Start of a new solar cycle",
                      "Brings new energy, optimism, and enthusiasm"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "natal_planet": {
                    "type": "string",
                    "description": "Exact lower-case match. All 9 are present under every transiting planet (verified by AST-parsing the mapping). An unknown value returns \"Invalid key: <x>\" with HTTP 200.",
                    "enum": [
                      "sun",
                      "moon",
                      "mars",
                      "mercury",
                      "jupiter",
                      "venus",
                      "saturn",
                      "rahu",
                      "ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "NOTE: 'venus' is MISSING as a transiting planet - the mapping has only these 8 top-level keys. An unknown value returns \"Invalid key: <x>\" with HTTP 200.",
                    "enum": [
                      "sun",
                      "moon",
                      "mars",
                      "mercury",
                      "jupiter",
                      "saturn",
                      "rahu",
                      "ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "keys",
                  "natal_planet",
                  "planet"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_planet_transit_natal_planets"
                ],
                "planet": "Sun",
                "natal_planet": "sun"
              }
            }
          }
        }
      }
    },
    "/api/astro/planet_transit_over_house/": {
      "post": {
        "operationId": "astro_planet_transit_over_house",
        "summary": "Transit over house",
        "description": "Prewritten readings for a planet transiting a given house of the birth chart: what the Sun's passage through the third house is said to bring, what Saturn's through the seventh is said to bring, and so on, for nine planets across twelve houses.\n\nA pure lookup — supply `planet` and `house` and get the text back. No date, time or place is involved, so pair it with a calculation that tells you which house each planet currently occupies.\n\nUse it alongside `/api/astro/planet_transit_natal_planets/`, which covers the other half of a transit report: a transiting planet's contact with a natal planet rather than with a house.\n\nAvailable `keys` (1), all covered by the same single credit: get_planet_transit_over_house.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_planet_transit_over_house": [
                      "Irritable temper",
                      "Gains physical strength, fame, and honour"
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "house": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planet": {
                    "type": "string",
                    "description": "Exact lower-case match. An unknown value returns \"Invalid key: <x>\" with HTTP 200. (The companion `house` field is an integer index into a list, 0-based - see the __main__ example at.",
                    "enum": [
                      "sun",
                      "moon",
                      "mars",
                      "mercury",
                      "jupiter",
                      "venus",
                      "saturn",
                      "rahu",
                      "ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "house",
                  "keys",
                  "planet"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_planet_transit_over_house"
                ],
                "planet": "Sun",
                "house": 3
              }
            }
          }
        }
      }
    },
    "/api/astro/porutham/": {
      "post": {
        "operationId": "astro_porutham",
        "summary": "Porutham (South Indian matching)",
        "description": "South Indian marriage compatibility: all twelve poruthams from one call.\n\nGive both partners' birth star (1-27) and pada (1-4). Each porutham comes back with its traditional result and its South Indian variant side by side.\n\nThis is a DIFFERENT system from North Indian Ashtakoota gun milan, which /api/astro/gun-milan/ answers. Both read the same two birth stars and disagree about what matters, so pick the one your tradition uses — Tamil, Telugu and Kannada matching use these poruthams.\n\nNo birth times or places are needed, and that is not a shortcut: porutham is assessed from the nakshatra and its quarter, so a date would be an input the calculation never reads.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Matching & compatibility"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "system": "porutham",
                    "count": 12,
                    "poruthams": [
                      {
                        "porutham": "varna",
                        "traditional": [
                          0,
                          1
                        ],
                        "south_indian": null,
                        "has_south_variant": false
                      },
                      {
                        "porutham": "vasiya",
                        "traditional": [
                          1,
                          2
                        ],
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "dina",
                        "traditional": [
                          3,
                          3
                        ],
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "gana",
                        "traditional": [
                          6,
                          6
                        ],
                        "south_indian": false,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "yoni",
                        "traditional": [
                          1,
                          4
                        ],
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "raasi_adhipathi",
                        "traditional": [
                          5,
                          5
                        ],
                        "south_indian": 0,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "raasi",
                        "traditional": [
                          7,
                          7
                        ],
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "naadi",
                        "traditional": [
                          8,
                          8
                        ],
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "mahendra",
                        "traditional": false,
                        "south_indian": false,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "vedha",
                        "traditional": true,
                        "south_indian": true,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "rajju",
                        "traditional": false,
                        "south_indian": false,
                        "has_south_variant": true
                      },
                      {
                        "porutham": "sthree_dheerga",
                        "traditional": true,
                        "south_indian": true,
                        "has_south_variant": true
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "boy_nakshatra_number": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 27,
                    "examples": [
                      1
                    ]
                  },
                  "boy_paadham_number": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 4,
                    "examples": [
                      1
                    ]
                  },
                  "girl_nakshatra_number": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 27,
                    "examples": [
                      1
                    ]
                  },
                  "girl_paadham_number": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 4,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "method": {
                    "type": "string",
                    "default": "South",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatra_number": {
                    "type": "integer",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "paadha_number": {
                    "type": "integer",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "use_astroyogi_method": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "boy_nakshatra_number",
                  "boy_paadham_number",
                  "girl_nakshatra_number",
                  "girl_paadham_number"
                ],
                "additionalProperties": true
              },
              "example": {
                "boy_nakshatra_number": 5,
                "boy_paadham_number": 3,
                "girl_nakshatra_number": 12,
                "girl_paadham_number": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/prashna/": {
      "post": {
        "operationId": "astro_prashna",
        "summary": "Prashna sensitive points",
        "description": "Prashna is horary astrology: a chart cast for the moment a question is asked rather than for a birth. This endpoint computes the sensitive points that Prashna and longevity work rely on — arithmetic combinations of longitudes that are not planets themselves but are read as though they were. Gulika, also called Mandi, the shadowy point associated with Saturn, is the ingredient most of them are built from.\n\nSend `date_time` in ISO 8601, `latitude`, `longitude`, a `name` label for the chart, `node_type` (`true` or `mean` lunar node) and `add_yogi_longitude`. Everything is returned at once; there are no keys to select. Apart from `gulika_longitude`, which is a bare number of degrees, every point comes back as `{longitude, astrological: {degree, sign, minutes, seconds}, constellation, nakshatra, pada}` — a sidereal longitude with its position in a sign, a zero-based nakshatra index, and the nakshatra name and quarter.\n\nWhat each one is: `trisphuta` is ascendant plus Moon plus Gulika; `chatursphuta` adds the Sun to that; `panchasphuta` adds the lunar node. `pranasphuta` (five times the ascendant, plus Gulika), `dehasphuta` (eight times the Moon, plus Gulika) and `mrityusphuta` (seven times Gulika, plus the Sun) are the life, body and death points, and `sookshmatrisphuta` is their sum. `beejasphuta` (Sun plus Jupiter plus Venus) and `kshetrasphuta` (Moon plus Jupiter plus Mars) are the male and female fertility points. `tithisphuta` is Moon minus Sun, and `rahutithisphuta` the same with the node in place of the Moon. `yogisphuta` is Sun plus Moon plus 93°20', `avayogisphuta` is that plus a further 186°40', and `santanatithi` is five twelfths of the Moon-minus-Sun arc.\n\nThree things to watch. `yogasphuta` is the same calculation as `yogisphuta` except that the 93°20' is added only when `add_yogi_longitude` is true, so with that flag set the two fields are identical. `santanatithi` is not reduced into the 0–360 range and can therefore come back negative. And Gulika is derived using a fixed +05:30 offset whatever location you supply, which shifts every Gulika-derived point for places well outside that zone.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Prashna"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "gulika_longitude": 243.2836111111111,
                    "trisphuta": {
                      "longitude": 277.6645540646069,
                      "astrological": {
                        "degree": 7,
                        "sign": "Cp",
                        "minutes": 39,
                        "seconds": 52
                      },
                      "constellation": 9,
                      "nakshatra": "Uttaraashaadha",
                      "pada": 4
                    },
                    "chatursphuta": {
                      "longitude": 126.06855406460689,
                      "astrological": {
                        "degree": 6,
                        "sign": "Le",
                        "minutes": 4,
                        "seconds": 6
                      },
                      "constellation": 4,
                      "nakshatra": "Makha",
                      "pada": 2
                    },
                    "panchasphuta": {
                      "longitude": 107.64255406460688,
                      "astrological": {
                        "degree": 17,
                        "sign": "Cn",
                        "minutes": 38,
                        "seconds": 33
                      },
                      "constellation": 3,
                      "nakshatra": "Aasresha",
                      "pada": 1
                    },
                    "pranasphuta": {
                      "longitude": 10.578325878590022,
                      "astrological": {
                        "degree": 10,
                        "sign": "Ar",
                        "minutes": 34,
                        "seconds": 41
                      },
                      "constellation": 0,
                      "nakshatra": "Ashwini",
                      "pada": 4
                    },
                    "dehasphuta": {
                      "longitude": 314.6596111111111,
                      "astrological": {
                        "degree": 14,
                        "sign": "Aq",
                        "minutes": 39,
                        "seconds": 34
                      },
                      "constellation": 10,
                      "nakshatra": "Satabhishak",
                      "pada": 3
                    },
                    "mrityusphuta": {
                      "longitude": 111.3892777777778,
                      "astrological": {
                        "degree": 21,
                        "sign": "Cn",
                        "minutes": 23,
                        "seconds": 21
                      },
                      "constellation": 3,
                      "nakshatra": "Aasresha",
                      "pada": 2
                    },
                    "sookshmatrisphuta": {
                      "longitude": 76.6272147674789,
                      "astrological": {
                        "degree": 16,
                        "sign": "Ge",
                        "minutes": 37,
                        "seconds": 37
                      },
                      "constellation": 2,
                      "nakshatra": "Aardra",
                      "pada": 3
                    },
                    "beejasphuta": {
                      "longitude": 152.48299999999995,
                      "astrological": {
                        "degree": 2,
                        "sign": "Vi",
                        "minutes": 28,
                        "seconds": 58
                      },
                      "constellation": 5,
                      "nakshatra": "Uttara Phalguni",
                      "pada": 2
                    },
                    "kshetrasphuta": {
                      "longitude": 162.847,
                      "astrological": {
                        "degree": 12,
                        "sign": "Vi",
                        "minutes": 50,
                        "seconds": 49
                      },
                      "constellation": 5,
                      "nakshatra": "Hasta",
                      "pada": 1
                    },
                    "tithisphuta": {
                      "longitude": 160.518,
                      "astrological": {
                        "degree": 10,
                        "sign": "Vi",
                        "minutes": 31,
                        "seconds": 4
                      },
                      "constellation": 5,
                      "nakshatra": "Hasta",
                      "pada": 1
                    },
                    "yogasphuta": {
                      "longitude": 310.65933333333334,
                      "astrological": {
                        "degree": 10,
                        "sign": "Aq",
                        "minutes": 39,
                        "seconds": 33
                      },
                      "constellation": 10,
                      "nakshatra": "Satabhishak",
                      "pada": 2
                    },
                    "yogisphuta": {
                      "longitude": 310.65933333333334,
                      "astrological": {
                        "degree": 10,
                        "sign": "Aq",
                        "minutes": 39,
                        "seconds": 33
                      },
                      "constellation": 10,
                      "nakshatra": "Satabhishak",
                      "pada": 2
                    },
                    "avayogisphuta": {
                      "longitude": 137.32600000000002,
                      "astrological": {
                        "degree": 17,
                        "sign": "Le",
                        "minutes": 19,
                        "seconds": 33
                      },
                      "constellation": 4,
                      "nakshatra": "Poorva Phalguni",
                      "pada": 2
                    },
                    "rahutithisphuta": {
                      "longitude": 133.17000000000002,
                      "astrological": {
                        "degree": 13,
                        "sign": "Le",
                        "minutes": 10,
                        "seconds": 12
                      },
                      "constellation": 4,
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "santanatithi": {
                      "longitude": -83.11749999999999,
                      "astrological": {
                        "degree": 6,
                        "sign": "Cp",
                        "minutes": 52,
                        "seconds": 56
                      },
                      "constellation": 9,
                      "nakshatra": "Uttaraashaadha",
                      "pada": 4
                    }
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "add_yogi_longitude": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "node_type": {
                    "type": "string",
                    "description": "Exact lower-case. Selects the true vs mean lunar node for the sphuta calculations.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "add_yogi_longitude",
                  "date_time",
                  "latitude",
                  "longitude",
                  "name",
                  "node_type"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2024-11-14T11:59:23.365Z",
                "longitude": 74.319,
                "latitude": 26.1046,
                "name": "RashiChart",
                "node_type": "true",
                "add_yogi_longitude": true
              }
            }
          }
        }
      }
    },
    "/api/astro/prashnavali/hanuman/": {
      "post": {
        "operationId": "astro_prashnavali_hanuman",
        "summary": "Hanuman Prashnavali",
        "description": "The Hanuman Prashnavali: 49 numbered answers. The querent settles on a number between 1 and 49 and reads the entry it lands on.\n\nEach entry has a `number`, an `answer` and a `description`. Omit `number` and all 49 come back in order; pass one to get a single entry. A number outside 1–49 returns 400.\n\nFixed devotional text, not a calculation — the response does not depend on a date or a place.\n\nThe example below is derived from the request schema.",
        "tags": [
          "prashnavali"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "number": {
                    "type": "integer",
                    "description": "Entry to fetch, 1 to 49. Omit for all 49.",
                    "minimum": 1,
                    "maximum": 49,
                    "examples": [
                      1
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {}
            }
          }
        }
      }
    },
    "/api/astro/prashnavali/mavji/": {
      "post": {
        "operationId": "astro_prashnavali_mavji",
        "summary": "Mavji Maharaj Prashnavali",
        "description": "Mavji Maharaj: 64 readings, one for every three-digit draw from '111' to '444'.\n\nEach digit is 1 to 4, as though three four-sided draws, which is why there are 64 and not a thousand. Each entry carries the number in English and Hindi digits and the reading in both languages.\n\n`number` is a STRING, because the leading digits matter and '111' is not the integer 111. Omit it for all 64. A draw that cannot occur — anything with a digit outside 1–4, such as '555' — returns 400.\n\nThe example below is derived from the request schema.",
        "tags": [
          "prashnavali"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "number": {
                    "type": "string",
                    "description": "Three-digit draw, each digit 1-4, e.g. '324'. Omit for all 64.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {}
            }
          }
        }
      }
    },
    "/api/astro/prashnavali/ram-shalaka/": {
      "post": {
        "operationId": "astro_prashnavali_ram_shalaka",
        "summary": "Ram Shalaka Prashnavali",
        "description": "The Ram Shalaka Prashnavali: 225 chaupais from the Ramcharitmanas, arranged in a nine-by-nine grid the querent points at after holding a question in mind.\n\nEach entry carries the Devanagari `letter` that indexes it in the traditional grid, the `chaupai` itself, a `source` note saying where in the epic it appears, and an English `answer`. `index` is the 1-based position in the grid.\n\nSend nothing and all 225 come back, which is the usual way to use this — fetch once, cache, and index locally as the querent picks. `letter` returns the entries under one Devanagari letter; `index` returns one entry by position. There is no astronomy here: nothing is calculated from a date or a place, so the response never varies.\n\nThe example below is derived from the request schema.",
        "tags": [
          "prashnavali"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "index": {
                    "type": "integer",
                    "description": "1-based position in the traditional grid. Omit for all 225 entries.",
                    "minimum": 1,
                    "maximum": 225,
                    "examples": [
                      1
                    ]
                  },
                  "letter": {
                    "type": "string",
                    "description": "Devanagari letter to look up, e.g. 'सु'. Omit for all 225 entries.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {}
            }
          }
        }
      }
    },
    "/api/astro/prashnavali/sai/": {
      "post": {
        "operationId": "astro_prashnavali_sai",
        "summary": "Sai Prashnavali",
        "description": "The Sai Prashnavali: 720 numbered answers.\n\n`number` is OPTIONAL here, which is the difference from /api/astro/chakra/ — that endpoint rejects a Sai request without one. Omit it and all 720 entries come back in numeric order, so the set can be fetched once and indexed client-side. Pass a number from 1 to 720 for a single entry; anything outside that range returns 400.\n\nFixed devotional text: nothing is calculated from a date or a place.\n\nThe example below is derived from the request schema.",
        "tags": [
          "prashnavali"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "number": {
                    "type": "integer",
                    "description": "Entry to fetch, 1 to 720. Omit for all 720 - unlike the parent endpoint, this is optional here.",
                    "minimum": 1,
                    "maximum": 720,
                    "examples": [
                      1
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {}
            }
          }
        }
      }
    },
    "/api/astro/rahu-kaal/": {
      "post": {
        "operationId": "astro_rahu_kaal",
        "summary": "Rahu kaal",
        "description": "Rahu kaal, and the two periods always quoted beside it - yamaganda and gulika. Three windows, each {start, end}.\n\nThe parent endpoint names these inconsistently: rahu_start/rahu_end, yamaganda_start/yamaganda_end, gulika_start/gulika_end. Here all three use the same two field names, so one rendering function handles all of them.\n\nEach is an eighth of the daylight, so all three move with sunrise and sunset and depend on the place, not only the date. Gulika's position within the day can be varied with gulika_rises_at and gulika_portion if your tradition places it differently.\n\nFor every avoided period of the day in one call, including durmuhurta and the travel direction, use /api/astro/inauspicious-timings/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "rahu_kaal": {
                      "start": "2026-08-31T15:35:48+05:30",
                      "end": "2026-08-31T17:10:11+05:30"
                    },
                    "yamaganda": {
                      "start": "2026-08-31T09:18:16+05:30",
                      "end": "2026-08-31T10:52:39+05:30"
                    },
                    "gulika": {
                      "start": "2026-08-31T12:27:02+05:30",
                      "end": "2026-08-31T14:01:25+05:30"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/raja_yoga/": {
      "post": {
        "operationId": "astro_raja_yoga",
        "summary": "Raja yogas",
        "description": "A raja yoga is a combination in a birth chart said to confer status and success. The core case is an association between the lord of an angular house (1, 4, 7, 10) and the lord of a trine (1, 5, 9) — the two conjoined, aspecting each other, or exchanging signs. This endpoint checks the three named variants the engine implements: Vipareeta raja yoga (the lords of the difficult sixth, eighth and twelfth houses falling among themselves), Neecha Bhanga raja yoga (a debilitated planet whose debilitation is cancelled) and Dharma-Karmadhipati raja yoga (the ninth and tenth lords in association).\n\nOne key, `get_raja_yoga_details_for_all_charts`, which runs the checks across every divisional chart the engine knows rather than the birth chart alone. Its value is a three-element array: an object mapping each yoga found to its details, the number found, and the number of checks made — three yoga types across twenty-three divisional charts, so 69. Each detail entry is a list of strings: first a line naming the divisional chart and the planet pairs responsible, such as `\"D1-Raja Yoga Pairs: [Viyaazhan-Sani]\"`, then the yoga's name, its definition and its predicted effects.\n\nTwo notes on reading the output. Planet names inside the pairs line are given in Tamil transliteration whatever else you send: Suriyan is the Sun, Chandran the Moon, Sevvay Mars, Budhan Mercury, Viyaazhan Jupiter, VeLLi Venus and Sani Saturn. And because the results from all divisional charts are merged into one object keyed by yoga name, each yoga appears once only, reported against the earliest divisional chart in which it was found — a `D4-` prefix means the birth chart itself did not have it.\n\nOne caveat before you build on this: the underlying calculation currently substitutes a fixed date for the `date_time` you send, so the result responds to the location fields but not to the birth date. Check it against a chart you know before relying on it.\n\nAvailable `keys` (1), all covered by the same single credit: get_raja_yoga_details_for_all_charts.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Yogas & doshas"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_raja_yoga_details_for_all_charts": [
                      {
                        "vipareetha_raja_yoga": [
                          "D1-Raja Yoga Pairs: [Viyaazhan-Sani]  [Viyaazhan-VeLLi] ",
                          "Vipareetha Raja yoga",
                          "The 6th, 8th and 12th houses are known as trik sthanas or dusthanas (bad houses). If their lords occupies dusthanas or conjoin dusthanas, it results in this yoga.",
                          "One having this yoga experiences tremedous success, typically after an initial struggle. Vipareeta means extreme."
                        ],
                        "neecha_bhanga_raja_yoga": [
                          "D4-Raja Yoga Pairs: [Sevvay-Sani]  [Sevvay-VeLLi] ",
                          "Neecha Bhanga Raja yoga",
                          "1. If the lord of the sign occupied by a weak or debilitated planet is exalted or is in Kendra from Moon. Ex, If Jupiter is debilitated in Capricorn and if Saturn is exalted and placed in Kendra from moon. 2. If the debilitated planet is conjunct with the Exalted Planet. 3. If the debilitated planet is aspected by the master of that sign. Ex, If Sun is debilitated in Libra and it is aspect by Venus with 7th aspect. 4. If the debilitated planet is Exalted in Navamsa Chart. 5. The planet which gets exalted in the sign where a debilitated planet is placed is in a Kendra from the Lagna or the Moon. Ex, If Sun is debilitated in the birth chart in Libra and Saturn which gets exalted in Libra is placed in Kendra from Lagna or Moon. NOTE: Checks only the first 3 conditions below. 4 and 5 to be done in future version",
                          "Neecha Bhanga Raja Yoga provides one with Fame, Property, and Control usually. But all the said prosperities will be used by the native only in the next half of life particularly after the age 36 corresponding to the age at the yoga developing dasha, sub-period and transits take place in one’s chart. This typical nature is attributed to this Yoga because the planet who create Neecha Bhanga Rajayoga is subjected to debilitation first and then attains the cancellation. Likewise, the native's life too would suffer adversities in the initial part of life and then will start excelling. Earning from multiple sources and earning a good reputation from a vast number of peoples and various communities along with holding a good image is the result of this Yoga. One will be admired within his/her personal, professional and social circles. Whatever they do brings a good reputation for them and people usually like them for what they are. They will gather huge property and start producing many sources of income once the Rajayoga is in operation. They will also hold power in life. The native will be holding power over many people once this Yoga is operational."
                        ],
                        "dharma_karmadhipati_raja_yoga": [
                          "D1-Raja Yoga Pairs: [Viyaazhan-Sani] ",
                          "Dharma Karmadhipati Raja yoga",
                          "If the lords of dharma sthana (9th) and karma sthana (10th) form a raja yoga, it is known by this special name. The 9th house is the most important trine and the 10th house is the most important quadrant.",
                          "One born with this yoga is sincere, devoted and righteous. He is fortunate."
                        ]
                      },
                      3,
                      69
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_raja_yoga_details_for_all_charts"
                ],
                "date_time": "2025-07-14T11:00:37.673Z",
                "latitude": 13,
                "longitude": 77.5946,
                "timezone": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/rashi-aspects/": {
      "post": {
        "operationId": "astro_rashi_aspects",
        "summary": "What a sign aspects",
        "description": "What one sign aspects, and which planets are its baadhaka.\n\nRashi drishti — sign-to-sign aspect — is a Jaimini idea rather than a Parashari one: signs aspect signs regardless of what stands in them. The baadhaka, the obstructing lord, is returned alongside because it is read from the same sign.\n\nSigns are numbered 1 for Aries through 12 for Pisces. The engine underneath numbers them from zero, so this endpoint converts — verified against the baadhaka rule for all twelve signs (movable afflicted from the 11th, fixed from the 9th, dual from the 7th).\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Jaimini"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "raasi": 5,
                    "sign": "Leo",
                    "aspects_houses": [
                      6,
                      12,
                      3
                    ],
                    "aspects_raasis": [
                      0,
                      6,
                      9
                    ],
                    "baadhaka": {
                      "rasi_number": 0,
                      "sign": "Aries",
                      "planets": [
                        "Mars"
                      ],
                      "raw": [
                        0,
                        [
                          2
                        ]
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "default": "true",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Sun",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "description": "Sign number, 1 = Aries through 12 = Pisces.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "node": "true",
                "raasi": 5
              }
            }
          }
        }
      }
    },
    "/api/astro/rashi/": {
      "post": {
        "operationId": "astro_rashi",
        "summary": "Rashi (D1)",
        "description": "The rashi chart - the birth chart itself, undivided.\n\nThis is the chart every other division is derived from, read for the whole life. It returns THE SAME NUMBERS as /api/astro/planet-positions/, because it is that view with the chart pinned rather than a second calculation. It exists as its own route so the varga series is complete and so D1 is findable by that name.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashi_in_house_insights/": {
      "post": {
        "operationId": "astro_rashi_in_house_insights",
        "summary": "Sign in house readings",
        "description": "Prewritten readings for a zodiac sign occupying a particular house of the chart — Aries on the second house, Cancer on the seventh, and so on, for all 144 combinations. Each describes what the house's affairs look like when coloured by that sign.\n\nA pure lookup with no calculation behind it. One key, `get_rashi_in_house`, taking `rashi` as a sign name and `house` by its Sanskrit name rather than a number: `lagna`, `dhana`, `sahaja`, `sukha`, `putra`, `satru`, `yuvati`, `randhra`, `bhagya`, `karma`, `labha`, `vyaya` for the first through twelfth houses.\n\nThe value is a list of short sentences, typically four to six, each a separate statement you can render on its own line. A name outside the accepted set returns an `Invalid key` string with HTTP 200 rather than an error.\n\nAvailable `keys` (1), all covered by the same single credit: get_rashi_in_house.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "get_rashi_in_house": [
                      "Gains wealth through righteous deeds.",
                      "Possesses a friendly and virtuous nature.",
                      "Blessed with male children.",
                      "Endowed with cattle and livestock.",
                      "Fond of the company of scholars."
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "house": {
                    "type": "string",
                    "description": "Despite the field name this is NOT a number - it is the Sanskrit bhava name, houses 1-12 in the order listed. Unknown values return \"Invalid key: <x>\" with HTTP 200.",
                    "enum": [
                      "lagna",
                      "dhana",
                      "sahaja",
                      "sukha",
                      "putra",
                      "satru",
                      "yuvati",
                      "randhra",
                      "bhagya",
                      "karma",
                      "labha",
                      "vyaya"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "rashi": {
                    "type": "string",
                    "description": "English sign names, not Sanskrit.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "house",
                  "keys",
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "get_rashi_in_house"
                ],
                "house": "dhana",
                "rashi": "aries"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/": {
      "post": {
        "operationId": "astro_rashifal",
        "summary": "Rashifal forecasts",
        "description": "Rashifal is the sign-based horoscope column: a forecast written for everyone born under one of the twelve Moon signs, with no birth chart involved. This endpoint produces four of them — daily, weekly, monthly and yearly — each in English and Hindi in the same response.\n\nThe astronomy underneath is real, and differs by timescale. The daily and weekly readings are driven by the Moon's actual transit through the houses counted from your sign, plus any genuine Mercury, Venus or Mars station falling inside the week. The monthly reading uses the Sun's sankranti, Mercury and Venus stations and Mars sign changes across the month; the yearly one uses Jupiter, Saturn and Rahu-Ketu transits plus a simplified sign-only Sade Sati flag taken from Saturn's house relative to your sign. The wording laid over those events, and the lucky colour and number, are selected from prewritten sets.\n\nSend `rashi` as a sign name and `date` as `YYYY-MM-DD`; the date is optional and defaults to today. Which part of the date matters depends on the key — the weekly reading treats it as the first day of the week, the monthly one takes only the month and year, and the yearly one only the year. Every text field has a `_hi` twin holding the Hindi rendering.\n\nBecause this is sign-level, treat it as a content feed rather than a chart reading. For anything personalised, compute the chart and use the transit endpoints.\n\nAvailable `keys` (4), all covered by the same single credit: get_daily_rashifal, get_monthly_rashifal, get_weekly_rashifal, get_yearly_rashifal.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"get_daily_rashifal\": {\"date\": \"01 September 2026\", \"date_hi\": \"1 सितंबर 2026\", \"sign\": \"Aries\", \"sign_hi\": \"मेष\", \"element\": \"Fire\", \"element_hi\": \"अग्नि\", \"general_prediction\": \"The Moon transits your 1st house today, bringing a mixed focus on your personality and overall energy.\", \"general_prediction_hi\": \"आज चंद्रमा आपके पहले भाव में गोचर कर रहा है, जिससे आपके व्यक्तित्व और समग्र ऊर्जा पर मिश्रित प्रभाव पड़ रहा है।\", \"aspects\": {\"love\": \"Avoid making major relationship decisions based on temporary emotions.\", \"career\": \"Routine work might feel monotonous. Find creative ways to stay engaged.\", \"health\": \"Moderate exercise will help maintain energy levels.\"}, \"aspects_hi\": {\"love\": \"क्षणिक भावनाओं के आधार पर बड़े रिश्ते संबंधी निर्णय लेने से बचें।\", \"career\": \"नियमित कार्य नीरस लग सकता है। जुड़े रहने के लिए रचनात्मक तरीके खोजें।\", \"health\": \"मध्यम व्यायाम ऊर्जा स्तर बनाए रखने में मदद करेगा।\"}, \"lucky\": {\"color\": \"red\", \"number\": 8, \"time\": \"Morning\", \"time_hi\": \"सुबह\"}, \"moon_transit\": {\"house\": 1, \"classification\": \"neutral\", \"classification_hi\": \"मिश्रित\", \"benefic_support\": [], \"malefic_pressure\": []}}, \"get_weekly_rashifal\": {\"week_start\": \"01 September 2026\", \"week_start_hi\": \"1 सितंबर 2026\", \"week_end\": \"07 September 2026\", \"week_end_hi\": \"7 सितंबर 2026\", \"sign\": \"Aries\", \"sign_hi\": \"मेष\", \"element\": \"Fire\", \"element_hi\": \"अग्नि\", \"overview\": \"Your best day(s) this week: Saturday (05 September), Sunday (06 September), with the Moon in favorable houses for courage, communication and short journeys. Be a little more careful on Monday (07 September) — the Moon moves through a more challenging house those days.\", \"overview_hi\": \"इस सप्ताह आपके सर्वश्रेष्ठ दिन: शनिवार (5 सितंबर), रविवार (6 सितंबर), जब चंद्रमा साहस, संचार और छोटी यात्राओं के लिए अनुकूल भावों में रहेगा। सोमवार (7 सितंबर) को थोड़ी अधिक सावधानी बरतें — इन दिनों चंद्रमा एक चुनौतीपूर्ण भाव से गोचर करेगा।\", \"aspects\": {\"Tuesday (01 September 2026)\": \"Mixed — Moon in your 1st house, focus on your personality and overall energy.\", \"Wednesday (02 September 2026)\": \"Mixed — Moon in your 1st house, focus on your personality and overall energy.\", \"Thursday (03 September 2026)\": \"Mixed — Moon in your 2nd house, focus on finances and family matters.\", \"Friday (04 September 2026)\": \"Mixed — Moon in your 2nd house, focus on finances and family matters.\", \"Saturday (05 September 2026)\": \"Favorable — Moon in your 3rd house, focus on courage, communication and short journeys.\", \"Sunday (06 September 2026)\": \"Favorable — Moon in your 3rd house, focus on courage, communication and short journeys.\", \"Monday (07 September 2026)\": \"Challenging — Moon in your 4th house, focus on home and emotional wellbeing.\"}, \"aspects_hi\": {\"मंगलवार (1 सितंबर 2026)\": \"मिश्रित — चंद्रमा आपके पहले भाव में, ध्यान केंद्रित रहेगा आपके व्यक्तित्व और समग्र ऊर्जा पर।\", \"बुधवार (2 सितंबर 2026)\": \"मिश्रित — चंद्रमा आपके पहले भाव में, ध्यान केंद्रित रहेगा आपके व्यक्तित्व और समग्र ऊर्जा पर।\", \"गुरुवार (3 सितंबर 2026)\": \"मिश्रित — चंद्रमा आपके दूसरे भाव में, ध्यान केंद्रित रहेगा धन और पारिवारिक मामलों पर।\", \"शुक्रवार (4 सितंबर 2026)\": \"मिश्रित — चंद्रमा आपके दूसरे भाव में, ध्यान केंद्रित रहेगा धन और पारिवारिक मामलों पर।\", \"शनिवार (5 सितंबर 2026)\": \"अनुकूल — चंद्रमा आपके तीसरे भाव में, ध्यान केंद्रित रहेगा साहस, संचार और छोटी यात्राओं पर।\", \"रविवार (6 सितंबर 2026)\": \"अनुकूल — चंद्रमा आपके तीसरे भाव में, ध्यान केंद्रित रहेगा साहस, संचार और छोटी यात्राओं पर।\", \"सोमवार (7 सितंबर 2026)\": \"चुनौतीपूर्ण — चंद्रमा आपके चौथे भाव में, ध्यान केंद्रित रहेगा घर और भावनात्मक कल्याण पर।\"}, \"best_days\": [\"05 September 2026\", \"06 September 2026\"], \"best_days_hi\": [\"5 सितंबर 2026\", \"6 सितंबर 2026\"], \"challenging_days\": [\"07 September 2026\"], \"challenging_days_hi\": [\"7 सितंबर 2026\"], \"planetary_alerts\": [], \"planetary_alerts_hi\": [], \"lucky\": {\"color\": \"red\", \"number\": 1}}, \"get_monthly_rashifal\": {\"month\": \"September\", \"month_hi\": \"सितंबर\", \"year\": 2026, \"sign\": \"Aries\", \"sign_hi\": \"मेष\", \"overview\": \"Sun enters Virgo "
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "examples": [
                      "2026-09-01"
                    ]
                  },
                  "rashi": {
                    "type": "string",
                    "description": "Validated in the constructor, so a bad value fails the whole request.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "keys"
                ],
                "additionalProperties": true
              },
              "example": {
                "date": "2026-09-01",
                "rashi": "aries",
                "keys": [
                  "get_daily_rashifal",
                  "get_weekly_rashifal",
                  "get_monthly_rashifal"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/daily/": {
      "post": {
        "operationId": "astro_rashifal_daily",
        "summary": "Rashifal today",
        "description": "Today's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/monthly/": {
      "post": {
        "operationId": "astro_rashifal_monthly",
        "summary": "Rashifal this month",
        "description": "This month's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nMonthly also returns the planetary transits for the month, its special days, and remedies.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/tomorrow/": {
      "post": {
        "operationId": "astro_rashifal_tomorrow",
        "summary": "Rashifal tomorrow",
        "description": "Tomorrow's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/weekly/": {
      "post": {
        "operationId": "astro_rashifal_weekly",
        "summary": "Rashifal this week",
        "description": "This week's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nWeekly also returns the best and the challenging days of the week, and any planetary alerts that fall inside it.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/yearly/": {
      "post": {
        "operationId": "astro_rashifal_yearly",
        "summary": "Rashifal this year",
        "description": "This year's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nYearly also returns a quarterly forecast, the year's planetary movements, lucky elements and remedies.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/rashifal/yesterday/": {
      "post": {
        "operationId": "astro_rashifal_yesterday",
        "summary": "Rashifal yesterday",
        "description": "Yesterday's reading for one rashi, with every life aspect.\n\nEVERY ASPECT IS RETURNED ON EVERY CALL - general, career and business, love and relationships, money and finances, health, education and student, family, travel, business, and professionals. That is the difference from /api/astro/rashifal/, which returns a rotating sample of three or four aspects chosen by the date, so a page for one fixed aspect could not be built from it. Send `aspect` to get just one.\n\nReadings are deterministic: the same sign, period, aspect and date always return the same words, so a page can be cached and will not contradict itself when someone refreshes. `rashi` and `aspect` are case-insensitive. `date` defaults to today; for tomorrow and yesterday the offset is applied to the date you send.\n\nThis is a sun-sign reading keyed to the Moon's transit, not a birth chart - it takes no birth time or place, and it is not a horoscope.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Predictions & readings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rashi": {
                    "type": "string",
                    "description": "Western sign name. Case-insensitive: Aries, aries and ARIES are all accepted.",
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ],
                    "examples": [
                      "aries"
                    ]
                  },
                  "aspect": {
                    "type": "string",
                    "description": "Return only this aspect, in any case. Omit for all ten.\n\n* `general` - general\n* `career_business` - career_business\n* `love_relationships` - love_relationships\n* `money_finances` - money_finances\n* `health` - health\n* `education_student` - education_student\n* `family` - family\n* `travel` - travel\n* `business` - business\n* `professionals` - professionals",
                    "examples": [
                      "string"
                    ]
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "The day to read from. Defaults to today. For `tomorrow` and `yesterday` the offset is applied to this date, so sending 2026-09-16 to /tomorrow/ reads 2026-09-17.",
                    "examples": [
                      "2026-09-01"
                    ]
                  }
                },
                "required": [
                  "rashi"
                ],
                "additionalProperties": true
              },
              "example": {
                "rashi": "aries",
                "date": "2026-09-01"
              }
            }
          }
        }
      }
    },
    "/api/astro/ravi_yoga/": {
      "post": {
        "operationId": "astro_ravi_yoga",
        "summary": "Ravi yoga windows",
        "description": "Ravi Yoga is present when the Moon's nakshatra stands 4, 6, 9, 10, 13 or 20 places from the Sun's. It is treated as an auspicious window that overrides an otherwise unfavourable muhurta, and is commonly used for house-warmings, taking delivery of a vehicle, opening a shop and similar one-off acts.\n\nBecause it depends only on the two nakshatras, and not on the lunar day or the weekday, it can be given as continuous windows with exact times rather than as a day flag. The response is `data.rows`, a list of `{start, end}` ISO 8601 timestamps in UTC covering the requested year. Windows are cut at every sunrise inside them, so one continuous three-day span appears as three consecutive rows meeting at the sunrise instants, the way Drik Panchang lays them out. Concatenate adjoining rows if you want the underlying spans back.\n\nSend `year`, `latitude`, `longitude` and `timezone_as_float`. Location affects only the sunrise split points, not the yoga itself. `/api/astro/panchanga_yogas/` reports the same yoga as a day-level flag alongside the tithi- and weekday-dependent ones; use this endpoint when you need exact start and end times.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"rows\": [{\"start\": \"2026-01-01T17:18:35+00:00\", \"end\": \"2026-01-02T01:50:16+00:00\"}, {\"start\": \"2026-01-02T01:50:16+00:00\", \"end\": \"2026-01-02T14:34:10+00:00\"}, {\"start\": \"2026-01-08T06:54:39+00:00\", \"end\": \"2026-01-09T01:51:24+00:00\"}, {\"start\": \"2026-01-09T01:51:24+00:00\", \"end\": \"2026-01-09T08:10:56+00:00\"}, {\"start\": \"2026-01-25T02:19:01+00:00\", \"end\": \"2026-01-25T08:05:57+00:00\"}, {\"start\": \"2026-01-27T05:39:05+00:00\", \"end\": \"2026-01-28T01:48:11+00:00\"}, {\"start\": \"2026-01-28T01:48:11+00:00\", \"end\": \"2026-01-29T01:47:45+00:00\"}, {\"start\": \"2026-01-29T01:47:45+00:00\", \"end\": \"2026-01-29T02:01:52+00:00\"}, {\"start\": \"2026-01-30T21:57:34+00:00\", \"end\": \"2026-01-31T01:46:50+00:00\"}, {\"start\": \"2026-01-31T01:46:50+00:00\", \"end\": \"2026-01-31T20:04:13+00:00\"}, {\"start\": \"2026-02-07T20:58:37+00:00\", \"end\": \"2026-02-08T01:42:18+00:00\"}, {\"start\": \"2026-02-08T01:42:18+00:00\", \"end\": \"2026-02-08T23:32:55+00:00\"}, {\"start\": \"2026-02-20T14:37:39+00:00\", \"end\": \"2026-02-21T01:32:17+00:00\"}, {\"start\": \"2026-02-21T01:32:17+00:00\", \"end\": \"2026-02-21T13:37:16+00:00\"}, {\"start\": \"2026-02-22T12:24:48+00:00\", \"end\": \"2026-02-23T01:30:30+00:00\"}, {\"start\": \"2026-02-23T01:30:30+00:00\", \"end\": \"2026-02-23T11:03:45+00:00\"}, {\"start\": \"2026-02-25T08:08:55+00:00\", \"end\": \"2026-02-26T01:27:44+00:00\"}, {\"start\": \"2026-02-26T01:27:44+00:00\", \"end\": \"2026-02-27T01:26:47+00:00\"}, {\"start\": \"2026-02-27T01:26:47+00:00\", \"end\": \"2026-02-27T05:19:02+00:00\"}, {\"start\": \"2026-03-01T03:04:29+00:00\", \"end\": \"2026-03-02T01:23:52+00:00\"}, {\"start\": \"2026-03-02T01:23:52+00:00\", \"end\": \"2026-03-02T02:21:41+00:00\"}, {\"start\": \"2026-03-09T10:41:41+00:00\", \"end\": \"2026-03-10T01:15:40+00:00\"}, {\"start\": \"2026-03-10T01:15:40+00:00\", \"end\": \"2026-03-10T13:35:20+00:00\"}, {\"start\": \"2026-03-21T19:07:56+00:00\", \"end\": \"2026-03-22T01:02:41+00:00\"}, {\"start\": \"2026-03-22T01:02:41+00:00\", \"end\": \"2026-03-22T17:12:49+00:00\"}, {\"start\": \"2026-03-23T15:19:47+00:00\", \"end\": \"2026-03-24T01:00:29+00:00\"}, {\"start\": \"2026-03-24T01:00:29+00:00\", \"end\": \"2026-03-24T13:35:03+00:00\"}, {\"start\": \"2026-03-26T10:49:16+00:00\", \"end\": \"2026-03-27T00:57:11+00:00\"}, {\"start\": \"2026-03-27T00:57:11+00:00\", \"end\": \"2026-03-28T00:56:05+00:00\"}, {\"start\": \"2026-03-28T00:56:05+00:00\", \"end\": \"2026-03-28T09:20:23+00:00\"}, {\"start\": \"2026-03-30T09:18:08+00:00\", \"end\": \"2026-03-31T00:52:48+00:00\"}, {\"start\": \"2026-03-31T00:52:48+00:00\", \"end\": \"2026-03-31T09:51:03+00:00\"}, {\"start\": \"2026-03-31T14:40:06+00:00\", \"end\": \"2026-04-01T00:51:43+00:00\"}, {\"start\": \"2026-04-01T00:51:43+00:00\", \"end\": \"2026-04-01T10:47:41+00:00\"}, {\"start\": \"2026-04-08T00:24:04+00:00\", \"end\": \"2026-04-08T00:44:13+00:00\"}, {\"start\": \"2026-04-08T00:44:13+00:00\", \"end\": \"2026-04-09T00:43:10+00:00\"}, {\"start\": \"2026-04-09T00:43:10+00:00\", \"end\": \"2026-04-09T03:18:37+00:00\"}, {\"start\": \"2026-04-19T23:05:23+00:00\", \"end\": \"2026-04-20T00:32:13+00:00\"}, {\"start\": \"2026-04-20T00:32:13+00:00\", \"end\": \"2026-04-20T20:38:33+00:00\"}, {\"start\": \"2026-04-21T18:28:41+00:00\", \"end\": \"2026-04-22T00:30:22+00:00\"}, {\"start\": \"2026-04-22T00:30:22+00:00\", \"end\": \"2026-04-22T16:43:13+00:00\"}, {\"start\": \"2026-04-24T14:44:34+00:00\", \"end\": \"2026-04-25T00:27:40+00:00\"}, {\"start\": \"2026-04-25T00:27:40+00:00\", \"end\": \"2026-04-26T00:26:48+00:00\"}, {\"start\": \"2026-04-26T00:26:48+00:00\", \"end\": \"2026-04-26T14:57:21+00:00\"}, {\"start\": \"2026-04-29T18:46:34+00:00\", \"end\": \"2026-04-30T00:23:28+00:00\"}, {\"start\": \"2026-04-30T00:23:28+00:00\", \"end\": \"2026-04-30T20:46:58+00:00\"}, {\"start\": \"2026-05-07T13:15:59+00:00\", \"end\": \"2026-05-08T00:17:33+00:00\"}, {\"start\": \"2026-05-08T00:17:33+00:00\", \"end\": \"2026-05-08T09:13:55+00:00\"}, {\"start\": \"2026-05-19T03:11:45+00:00\", \"end\": \"2026-05-20T00:10:54+00:00\"}, {\"start\": \"2026-05-20T00:10:54+00:00\", \"end\": \"2026-05-20T00:42:03+00:00\"}, {\"start\": \"2026-05-20T22:42:18+00:00\", \"end\": \"2026-05-21T00:10:29+00:00\"}, {\"start\": \"2026-05-21T00:10:29+00:00\", \"end\": \"2026-05-21T21:19:37+00:00\"}, {\"start\": \"2026"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/retrograde/": {
      "post": {
        "operationId": "astro_retrograde",
        "summary": "Retrograde periods",
        "description": "Every retrograde period for a year, in one small response. Retrograde, or vakri, motion is the apparent backwards drift of a planet against the stars, and astrological practice treats those spans as a distinct phase in the planet's behaviour.\n\nSend `year` and nothing else. The response is `data.planets`, an object keyed by planet name, each holding a list of `{start, end}` timestamps in UTC. Periods running across a year boundary are clipped to 1 January and 31 December, so a window beginning at `01-01 00:00:00` actually started in the previous year. A planet that never turns retrograde in that year gets an empty list.\n\nTen keys are returned: mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, rahu and ketu. The Sun and Moon are omitted because they are never retrograde as seen from Earth. Rahu and Ketu are derived from the mean lunar node, which drifts steadily backwards all year with no station, so both always show a single window covering the whole year; using the true node instead would produce dozens of spurious few-day entries.\n\nStation times are found by bracketing the day on which longitudinal speed changes sign and then narrowing within it, so they are precise to well under a minute. The same figures appear inside `/api/planetary_details/` bundled with eight other calculations; this endpoint returns the retrograde data alone.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "planets": {
                      "mercury": [
                        {
                          "start": "2026-02-26 06:47:34",
                          "end": "2026-03-20 19:33:02"
                        },
                        {
                          "start": "2026-06-29 17:34:35",
                          "end": "2026-07-23 22:58:49"
                        },
                        {
                          "start": "2026-10-24 07:12:44",
                          "end": "2026-11-13 15:54:27"
                        }
                      ],
                      "venus": [
                        {
                          "start": "2026-10-03 07:13:14",
                          "end": "2026-11-14 00:29:50"
                        }
                      ],
                      "mars": [],
                      "jupiter": [
                        {
                          "start": "2026-01-01 00:00:00",
                          "end": "2026-03-11 03:53:41"
                        },
                        {
                          "start": "2026-12-13 00:30:39",
                          "end": "2026-12-31 00:00:00"
                        }
                      ],
                      "saturn": [
                        {
                          "start": "2026-07-26 18:57:26",
                          "end": "2026-12-11 00:30:23"
                        }
                      ],
                      "uranus": [
                        {
                          "start": "2026-01-01 00:00:00",
                          "end": "2026-02-04 02:56:33"
                        },
                        {
                          "start": "2026-09-10 18:24:34",
                          "end": "2026-12-31 00:00:00"
                        }
                      ],
                      "neptune": [
                        {
                          "start": "2026-07-07 09:57:49",
                          "end": "2026-12-13 00:46:51"
                        }
                      ],
                      "pluto": [
                        {
                          "start": "2026-05-06 12:13:55",
                          "end": "2026-10-16 05:33:46"
                        }
                      ],
                      "rahu": [
                        {
                          "start": "2026-01-01 00:00:00",
                          "end": "2026-12-31 00:00:00"
                        }
                      ],
                      "ketu": [
                        {
                          "start": "2026-01-01 00:00:00",
                          "end": "2026-12-31 00:00:00"
                        }
                      ]
                    }
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/return/lunar/": {
      "post": {
        "operationId": "astro_return_lunar",
        "summary": "Lunar return",
        "description": "The Moon back on its natal degree, roughly every 27.3 days — the monthly chart.\n\nUse `count` for a run of months and `search_from` to begin at today rather than at birth. As with the solar return, each result carries its own accuracy in arcseconds.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Returns"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "moon",
                    "natal_longitude": 238.259725,
                    "sign": "Scorpio",
                    "sign_index": 8,
                    "degree_in_sign": 28.2597,
                    "natal_datetime_utc": "1990-05-10T14:25:00Z",
                    "count": 3,
                    "returns": [
                      {
                        "exact": "2026-01-13T20:02:19Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "moon",
                            "datetime_utc": "2026-01-13T20:02:19Z",
                            "julian_day_ut": 2461054.3349443,
                            "longitude": 238.259725,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Scorpio",
                            "sign_index": 8,
                            "degree_in_sign": 28.2597
                          }
                        ]
                      },
                      {
                        "exact": "2026-02-10T03:50:41Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "moon",
                            "datetime_utc": "2026-02-10T03:50:41Z",
                            "julian_day_ut": 2461081.66020244,
                            "longitude": 238.259725,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Scorpio",
                            "sign_index": 8,
                            "degree_in_sign": 28.2597
                          }
                        ]
                      },
                      {
                        "exact": "2026-03-09T12:06:22Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "moon",
                            "datetime_utc": "2026-03-09T12:06:22Z",
                            "julian_day_ut": 2461109.00441822,
                            "longitude": 238.259725,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Scorpio",
                            "sign_index": 8,
                            "degree_in_sign": 28.2597
                          }
                        ]
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many consecutive returns to report, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "search_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Start looking here instead of at the birth moment.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "search_from": "2026-01-01T00:00:00+00:00",
                "count": 3
              }
            }
          }
        }
      }
    },
    "/api/astro/return/planet/": {
      "post": {
        "operationId": "astro_return_planet",
        "summary": "Planetary return",
        "description": "A return of any body, chosen at request time with `body`.\n\nThe same search as the dedicated solar, lunar and Saturn endpoints — use this when the body is a runtime choice rather than fixed by the route. Jupiter returns every twelve years, Mars every two, and the outer planets do not return within a lifetime.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Returns"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "jupiter",
                    "natal_longitude": 98.630274,
                    "sign": "Cancer",
                    "sign_index": 4,
                    "degree_in_sign": 8.6303,
                    "natal_datetime_utc": "1990-05-10T14:25:00Z",
                    "count": 2,
                    "returns": [
                      {
                        "exact": "2037-07-01T15:24:17Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "jupiter",
                            "datetime_utc": "2037-07-01T15:24:17Z",
                            "julian_day_ut": 2465241.14186714,
                            "longitude": 98.630274,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Cancer",
                            "sign_index": 4,
                            "degree_in_sign": 8.6303
                          }
                        ]
                      },
                      {
                        "exact": "2049-06-15T14:11:29Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "jupiter",
                            "datetime_utc": "2049-06-15T14:11:29Z",
                            "julian_day_ut": 2469608.09131167,
                            "longitude": 98.630274,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Cancer",
                            "sign_index": 4,
                            "degree_in_sign": 8.6303
                          }
                        ]
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "body": {
                    "type": "string",
                    "enum": [
                      "jupiter",
                      "mars",
                      "mercury",
                      "moon",
                      "neptune",
                      "pluto",
                      "saturn",
                      "sun",
                      "uranus",
                      "venus"
                    ],
                    "default": "sun",
                    "examples": [
                      "jupiter"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many consecutive returns to report, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "search_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Start looking here instead of at the birth moment.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "body": "jupiter",
                "search_from": "2026-01-01T00:00:00+00:00",
                "count": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/return/saturn/": {
      "post": {
        "operationId": "astro_return_saturn",
        "summary": "Saturn return",
        "description": "Saturn back on its natal degree — around ages 29, 58 and 88.\n\nReturned as a list of exact PASSES rather than a single date, because Saturn usually crosses its own natal degree three times: direct, retrograde back over it, then direct again. Those three moments can be nine months apart, and quoting only the first is the usual way this gets reported wrongly. A return is either one pass or three, never two.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Returns"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "saturn",
                    "natal_longitude": 295.313114,
                    "sign": "Capricorn",
                    "sign_index": 10,
                    "degree_in_sign": 25.3131,
                    "natal_datetime_utc": "1990-05-10T14:25:00Z",
                    "count": 2,
                    "returns": [
                      {
                        "exact": "2020-02-03T08:18:01Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "saturn",
                            "datetime_utc": "2020-02-03T08:18:01Z",
                            "julian_day_ut": 2458882.84584161,
                            "longitude": 295.313114,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Capricorn",
                            "sign_index": 10,
                            "degree_in_sign": 25.3131
                          }
                        ]
                      },
                      {
                        "exact": "2049-03-15T17:17:54Z",
                        "pass_count": 3,
                        "passes": [
                          {
                            "body": "saturn",
                            "datetime_utc": "2049-03-15T17:17:54Z",
                            "julian_day_ut": 2469516.22076097,
                            "longitude": 295.313114,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Capricorn",
                            "sign_index": 10,
                            "degree_in_sign": 25.3131
                          },
                          {
                            "body": "saturn",
                            "datetime_utc": "2049-06-29T04:31:47Z",
                            "julian_day_ut": 2469621.68873515,
                            "longitude": 295.313114,
                            "error_arcseconds": 0,
                            "retrograde": true,
                            "sign": "Capricorn",
                            "sign_index": 10,
                            "degree_in_sign": 25.3131
                          },
                          {
                            "body": "saturn",
                            "datetime_utc": "2049-12-11T13:17:08Z",
                            "julian_day_ut": 2469787.05357004,
                            "longitude": 295.313114,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Capricorn",
                            "sign_index": 10,
                            "degree_in_sign": 25.3131
                          }
                        ]
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many consecutive returns to report, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "search_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Start looking here instead of at the birth moment.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "search_from": "2015-01-01T00:00:00+00:00",
                "count": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/return/solar/": {
      "post": {
        "operationId": "astro_return_solar",
        "summary": "Solar return",
        "description": "The exact instant the Sun regains the ecliptic longitude it held at birth — the astrological birthday, and the chart read for the year ahead.\n\nThis is usually NOT the calendar birthday. The return drifts about six hours a year against the calendar (that is the quarter-day that makes leap years), so it can fall a day either side.\n\nAsk for several consecutive years with `count`, and start somewhere other than birth with `search_from`. Every result publishes `error_arcseconds`, the distance between where the Sun actually was and the natal degree, so you can see the answer is exact rather than trust it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Returns"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "sun",
                    "natal_longitude": 49.66766,
                    "sign": "Taurus",
                    "sign_index": 2,
                    "degree_in_sign": 19.6677,
                    "natal_datetime_utc": "1990-05-10T14:25:00Z",
                    "count": 3,
                    "returns": [
                      {
                        "exact": "2026-05-10T07:34:40Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "sun",
                            "datetime_utc": "2026-05-10T07:34:40Z",
                            "julian_day_ut": 2461170.81573688,
                            "longitude": 49.66766,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Taurus",
                            "sign_index": 2,
                            "degree_in_sign": 19.6677
                          }
                        ]
                      },
                      {
                        "exact": "2027-05-10T13:07:54Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "sun",
                            "datetime_utc": "2027-05-10T13:07:54Z",
                            "julian_day_ut": 2461536.04715718,
                            "longitude": 49.66766,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Taurus",
                            "sign_index": 2,
                            "degree_in_sign": 19.6677
                          }
                        ]
                      },
                      {
                        "exact": "2028-05-09T19:00:18Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "sun",
                            "datetime_utc": "2028-05-09T19:00:18Z",
                            "julian_day_ut": 2461901.29187794,
                            "longitude": 49.66766,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Taurus",
                            "sign_index": 2,
                            "degree_in_sign": 19.6677
                          }
                        ]
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many consecutive returns to report, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "search_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Start looking here instead of at the birth moment.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "search_from": "2026-01-01T00:00:00+00:00",
                "count": 3
              }
            }
          }
        }
      }
    },
    "/api/astro/return/to-degree/": {
      "post": {
        "operationId": "astro_return_to_degree",
        "summary": "Return to a degree",
        "description": "When a body reaches an arbitrary ecliptic degree rather than its natal one.\n\nWhat demi- and quarter-returns are built from: a demi-solar return is the Sun opposite its natal place, so pass the natal longitude plus 180. It also answers plain ingress questions — when does Jupiter next reach 0 Aries — without needing a birth chart at all.\n\nRetrograde bodies cross a degree up to three times, and all the passes are returned.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Returns"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "sun",
                    "natal_longitude": 229.667,
                    "sign": "Scorpio",
                    "sign_index": 8,
                    "degree_in_sign": 19.667,
                    "natal_datetime_utc": "1990-05-10T14:25:00Z",
                    "count": 1,
                    "returns": [
                      {
                        "exact": "2026-11-12T01:20:13Z",
                        "pass_count": 1,
                        "passes": [
                          {
                            "body": "sun",
                            "datetime_utc": "2026-11-12T01:20:13Z",
                            "julian_day_ut": 2461356.55570795,
                            "longitude": 229.667,
                            "error_arcseconds": 0,
                            "retrograde": false,
                            "sign": "Scorpio",
                            "sign_index": 8,
                            "degree_in_sign": 19.667
                          }
                        ]
                      }
                    ],
                    "target_longitude": 229.667
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "target_longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to return to, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "examples": [
                      0
                    ]
                  },
                  "body": {
                    "type": "string",
                    "enum": [
                      "jupiter",
                      "mars",
                      "mercury",
                      "moon",
                      "neptune",
                      "pluto",
                      "saturn",
                      "sun",
                      "uranus",
                      "venus"
                    ],
                    "default": "sun",
                    "examples": [
                      "jupiter"
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many consecutive returns to report, at most 24.",
                    "minimum": 1,
                    "maximum": 24,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "search_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Start looking here instead of at the birth moment.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "target_longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "body": "sun",
                "target_longitude": 229.667,
                "search_from": "2026-01-01T00:00:00+00:00",
                "count": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/rudramsa/": {
      "post": {
        "operationId": "astro_rudramsa",
        "summary": "Rudramsa (D11)",
        "description": "The rudramsa, the eleventh divisional chart, also called ekadasamsa: each sign divided into eleven parts of 2°43' each.\n\nRead for gains, and in some schools for the manner of destruction - the two readings differ and the chart is the same either way. Outside the shodasavarga.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/saham/": {
      "post": {
        "operationId": "astro_saham",
        "summary": "Sahams",
        "description": "A saham is a sensitive point worked out by arithmetic on three positions in a chart: take the arc from one planet to another and lay it off from a third point, usually the ascendant. The technique reached Indian astrology from Perso-Arabic sources and is the same idea as the Arabic lot or the Hellenistic part — Punya Saham is the Lot of Fortune under another name. Each saham stands for one department of life, such as marriage, children, wealth, illness or litigation, and its position and the strength of its lord are read for what that department will bring, chiefly in the Tajaka annual chart.\n\nThirty-eight individual sahams are available as keys, plus `all_sahams`, which returns them all in one object. Every one returns a single point in the same shape: `{longitude, astrological: {degree, sign, minutes, seconds}, nakshatra, pada}`, where `longitude` is sidereal degrees from 0 to 360 and `sign` is a two-letter abbreviation such as `Cp` or `Sg`.\n\nRequest fields are `date_time`, `latitude`, `longitude`, `timezone_as_float`, and `chart`, naming the chart class the point is built from — `RashiChart` for the ordinary birth or annual chart, with the divisional chart classes also accepted. `night_time_birth` swaps the two planets in the formula for a night birth, and `compensation` adds 30° when the projected point does not fall in the arc the classical rule expects. Both are required fields, so set them deliberately. Fifteen of the sahams have no night-time variant in this implementation and return the day formula whichever way the flag is set; those say so in their own descriptions.\n\nThe `notation` field is accepted but currently makes no difference to the output: both settings return the same four fields.\n\nAvailable `keys` (39), all covered by the same single credit: all_sahams, anya_karma_saham, artha_saham, asha_saham, bandhana_saham, bandhu_saham, bhratri_saham, deshantara_saham, gaurava_saham, jadya_saham, jalpatha_saham, jeeva_saham, kali_saham, karma_saham, karya_sidhi_saham, labha_saham, mahatmya_saham, manmatha_saham, matri_saham, mitra_saham, mrityu_saham, paneeya_paata_saham, paradara_saham, pitri_saham, prasava_saham, preeti_saham, punya_saham, putra_saham, roga_saham, samarthya_saham, santaapa_saham, shastra_saham, shatru_saham, shraddha_saham, vanika_saham, vidya_saham, vivaha_saham, vyapara_saham, yasha_saham.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "vidya_saham": {
                      "longitude": 263.64509259138845,
                      "astrological": {
                        "degree": 23,
                        "sign": "Sg",
                        "minutes": 38,
                        "seconds": 42
                      },
                      "nakshatra": "Poorvaashaadha",
                      "pada": 4
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart": {
                    "type": "string",
                    "description": "The value is used directly as a CoreEngine registry key, so it must be one of the chart CLASS names (exact CamelCase, case-sensitive). This list is the chart-class subset of the CoreEngine registry and matches the valid_chart_types list used by /api/astro/chart/ (which lists ParivrittidwayaHoraChart twice).",
                    "enum": [
                      "BhavaChart",
                      "RashiChart",
                      "HoraChart",
                      "JagannathHoraChart",
                      "ParivrittidwayaHoraChart",
                      "DrekkanaChart",
                      "ParivrittitrayaDrekkanaChart",
                      "SomnathDrekkanaChart",
                      "JagannathDrekkanaChart",
                      "ChaturthamsaChart",
                      "PanchamsaChart",
                      "ShashthamsaChart",
                      "SaptamsaChart",
                      "AshtamsaChart",
                      "NavamsaChart",
                      "DasamsaChart",
                      "RudramsaChart",
                      "DwadasamsaChart",
                      "ShodasamsaChart",
                      "VimsamsaChart",
                      "ChaturvimsamsaChart",
                      "NakshatramsaChart",
                      "TrimsamsaChart",
                      "KhavedamsaChart",
                      "AkshavedamsaChart",
                      "ShashtyamsaChart",
                      "NavnavamsaChart",
                      "AstottaramsaChart",
                      "DwadasdwadasamsaChart",
                      "NavnavamsaChartNew",
                      "AstottaramsaChartNew",
                      "DwadasdwadasamsaChartNew"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "compensation": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "night_time_birth": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "description": "Only used by the 'all_sahams' key. 'astrological' returns sign/degree/nakshatra/pada form; anything else falls through to the raw-degree output, so 'degree' is the documented (and engine-default) value for the non-astrological branch. No exception is raised for other values. The individual saham keys ignore this field entirely.",
                    "enum": [
                      "degree",
                      "astrological"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "chart",
                  "compensation",
                  "date_time",
                  "keys",
                  "night_time_birth",
                  "notation",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "vidya_saham"
                ],
                "latitude": 26.1046,
                "longitude": 74.319,
                "timezone_as_float": 5.5,
                "chart": "RashiChart",
                "night_time_birth": true,
                "compensation": true,
                "notation": "degree",
                "date_time": "2026-09-01T06:00:00+05:30"
              }
            }
          }
        }
      }
    },
    "/api/astro/sahams/": {
      "post": {
        "operationId": "astro_sahams",
        "summary": "Sahams (Arabic Parts)",
        "description": "All thirty-eight sahams — the Vedic Arabic Parts — each with the English name it is usually known by.\n\nA saham is a calculated point rather than a body: a sensitive degree derived by arithmetic on two planets and an angle. They cover fortune, marriage, career, wealth, children, disease, travel and more, and until now every one of them was reachable only by knowing its Sanskrit key name.\n\nIMPORTANT: every saham here uses the day-chart formula. The underlying engine does not apply the day/night reversal, so lots that classically reverse for a night birth are not reversed, and the `night_time_birth` field is accepted but has no effect. For the Part of Fortune specifically, /api/astro/part-of-fortune/ computes it correctly for both sects.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"chart\": \"RashiChart\", \"sect_handling\": \"day_formula_always\", \"sect_note\": \"Every saham here uses the day-chart formula. The engine does not apply the day/night reversal, so lots that classically reverse for a night birth are not reversed. /api/astro/part-of-fortune/ computes that one correctly.\", \"count\": 38, \"sahams\": [{\"saham\": \"punya\", \"key\": \"punya_saham\", \"name\": \"Fortune\", \"result\": {\"longitude\": 46.24859691565723, \"astrological\": {\"degree\": 16, \"sign\": \"Ta\", \"minutes\": 14, \"seconds\": 54}, \"nakshatra\": \"Rohini\", \"pada\": 2}}, {\"saham\": \"vidya\", \"key\": \"vidya_saham\", \"name\": \"Learning\", \"result\": {\"longitude\": 29.064596915657262, \"astrological\": {\"degree\": 29, \"sign\": \"Ar\", \"minutes\": 3, \"seconds\": 52}, \"nakshatra\": \"Krittika\", \"pada\": 1}}, {\"saham\": \"yasha\", \"key\": \"yasha_saham\", \"name\": \"Fame\", \"result\": {\"longitude\": 246.31300000000002, \"astrological\": {\"degree\": 6, \"sign\": \"Sg\", \"minutes\": 18, \"seconds\": 46}, \"nakshatra\": \"Moola\", \"pada\": 2}}, {\"saham\": \"mitra\", \"key\": \"mitra_saham\", \"name\": \"Friendship\", \"result\": {\"longitude\": 326.341, \"astrological\": {\"degree\": 26, \"sign\": \"Aq\", \"minutes\": 20, \"seconds\": 27}, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 2}}, {\"saham\": \"mahatmya\", \"key\": \"mahatmya_saham\", \"name\": \"Greatness\", \"result\": {\"longitude\": 302.9401938313145, \"astrological\": {\"degree\": 2, \"sign\": \"Aq\", \"minutes\": 56, \"seconds\": 24}, \"nakshatra\": \"Dhanishtha\", \"pada\": 3}}, {\"saham\": \"asha\", \"key\": \"asha_saham\", \"name\": \"Hope\", \"result\": {\"longitude\": 145.7195969156573, \"astrological\": {\"degree\": 25, \"sign\": \"Le\", \"minutes\": 43, \"seconds\": 10}, \"nakshatra\": \"Poorva Phalguni\", \"pada\": 4}}, {\"saham\": \"samarthya\", \"key\": \"samarthya_saham\", \"name\": \"Capability\", \"result\": {\"longitude\": 217.65659691565725, \"astrological\": {\"degree\": 7, \"sign\": \"Sc\", \"minutes\": 39, \"seconds\": 23}, \"nakshatra\": \"Anooraadha\", \"pada\": 2}}, {\"saham\": \"bhratri\", \"key\": \"bhratri_saham\", \"name\": \"Siblings\", \"result\": {\"longitude\": 20.973596915657225, \"astrological\": {\"degree\": 20, \"sign\": \"Ar\", \"minutes\": 58, \"seconds\": 24}, \"nakshatra\": \"Bharani\", \"pada\": 3}}, {\"saham\": \"gaurava\", \"key\": \"gaurava_saham\", \"name\": \"Honour\", \"result\": {\"longitude\": 246.31300000000002, \"astrological\": {\"degree\": 6, \"sign\": \"Sg\", \"minutes\": 18, \"seconds\": 46}, \"nakshatra\": \"Moola\", \"pada\": 2}}, {\"saham\": \"pitri\", \"key\": \"pitri_saham\", \"name\": \"Father\", \"result\": {\"longitude\": 103.30259691565726, \"astrological\": {\"degree\": 13, \"sign\": \"Cn\", \"minutes\": 18, \"seconds\": 9}, \"nakshatra\": \"Pushyami\", \"pada\": 3}}, {\"saham\": \"matri\", \"key\": \"matri_saham\", \"name\": \"Mother\", \"result\": {\"longitude\": 88.66559691565726, \"astrological\": {\"degree\": 28, \"sign\": \"Ge\", \"minutes\": 39, \"seconds\": 56}, \"nakshatra\": \"Punarvasu\", \"pada\": 3}}, {\"saham\": \"putra\", \"key\": \"putra_saham\", \"name\": \"Children\", \"result\": {\"longitude\": 78.02759691565726, \"astrological\": {\"degree\": 18, \"sign\": \"Ge\", \"minutes\": 1, \"seconds\": 39}, \"nakshatra\": \"Aardra\", \"pada\": 4}}, {\"saham\": \"jeeva\", \"key\": \"jeeva_saham\", \"name\": \"Life\", \"result\": {\"longitude\": 54.33959691565724, \"astrological\": {\"degree\": 24, \"sign\": \"Ta\", \"minutes\": 20, \"seconds\": 22}, \"nakshatra\": \"Mrigasira\", \"pada\": 1}}, {\"saham\": \"karma\", \"key\": \"karma_saham\", \"name\": \"Career\", \"result\": {\"longitude\": 162.8945969156573, \"astrological\": {\"degree\": 12, \"sign\": \"Vi\", \"minutes\": 53, \"seconds\": 40}, \"nakshatra\": \"Hasta\", \"pada\": 1}}, {\"saham\": \"roga\", \"key\": \"roga_saham\", \"name\": \"Disease\", \"result\": {\"longitude\": 220.7791938313145, \"astrological\": {\"degree\": 10, \"sign\": \"Sc\", \"minutes\": 46, \"seconds\": 45}, \"nakshatra\": \"Anooraadha\", \"pada\": 3}}, {\"saham\": \"kali\", \"key\": \"kali_saham\", \"name\": \"Strife\", \"result\": {\"longitude\": 331.5965969156573, \"astrological\": {\"degree\": 1, \"sign\": \"Pi\", \"minutes\": 35, \"seconds\": 47}, \"nakshatra\": \"Poorvaabhaadra\", \"pada\": 4}}, {\"saham\": \"shatru\", \"key\": \"shatru_saham\", \"name\": \"Enemies\", \"result\": {\"longitude\": 267.0335969156572, \"astrological\": {\"degree\": 27, \"sign\": \"Sg\", \"minutes\": 2, \"seconds\": 0}, \"n"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "chart": {
                    "type": "string",
                    "default": "RashiChart",
                    "examples": [
                      "string"
                    ]
                  },
                  "compensation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "night_time_birth": {
                    "type": "boolean",
                    "description": "Several lots reverse their formula for a night birth.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "default": "degree",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "chart": "RashiChart",
                "notation": "degree"
              }
            }
          }
        }
      }
    },
    "/api/astro/samvat/": {
      "post": {
        "operationId": "astro_samvat",
        "summary": "Samvat years",
        "description": "The year in the Indian eras: Vikram, Shaka and Kali, plus its name in the sixty-year Jovian cycle.\n\nVikram runs 57 years ahead of the Gregorian year and Shaka 78 behind, so the two always differ by 135. Kali is Shaka plus 3179.\n\n`samvatsara` is the Jovian cycle name, Prabhava through Kshaya. The cycle is offset differently depending on which era it is reckoned from, so `samvata_type` selects that and is echoed back as `samvatsara_reckoned_from`. It defaults to `vikram`; the parent endpoint requires it and errors without it.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "vikram_samvat": 2083,
                    "shaka_samvat": 1948,
                    "kali_samvat": 5127,
                    "samvatsara": "Kalayukthi",
                    "samvatsara_reckoned_from": "vikram"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "enum": [
                      "shaka",
                      "vikram"
                    ],
                    "default": "vikram",
                    "examples": [
                      "shaka"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/samvatsara/": {
      "post": {
        "operationId": "astro_samvatsara",
        "summary": "Rulers of the Hindu year",
        "description": "The King, the Minister and eight more lords of the Hindu year.\n\nAt the start of the samvatsara the chart is cast and particular planets take particular offices for the twelve months that follow: the King over the year as a whole, the Minister over governance, and lords over rainfall, wealth, grain, juices, water, fruit, crops and defence. This is the frame almanac publishers write their annual predictions inside.\n\nEach office comes back with what it governs, so `neersesha_of_year` reads as 'Lord of Water, governs rivers and water supply'. Returned with the moment the year begins and the samvatsara's vaahana.\n\nNeeds only a year — there is no birth chart in mundane astrology, and the answer does not change with the place you ask from.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2025,
                    "year_begins": "2025-03-29T06:24:43+05:30",
                    "vaahana": "Elephant/Frog",
                    "cabinet": [
                      {
                        "office": "King (Raja)",
                        "key": "king_of_year",
                        "governs": "the year as a whole",
                        "planet": "Venus"
                      },
                      {
                        "office": "Minister (Mantri)",
                        "key": "mantri_of_year",
                        "governs": "governance and counsel",
                        "planet": "Saturn"
                      },
                      {
                        "office": "Lord of Clouds (Meghesha)",
                        "key": "meghesha_of_year",
                        "governs": "rainfall",
                        "planet": "Saturn"
                      },
                      {
                        "office": "Lord of Wealth (Dhanesha)",
                        "key": "dhanesha_of_year",
                        "governs": "money and trade",
                        "planet": "Moon"
                      },
                      {
                        "office": "Lord of Grain (Dhaanyesha)",
                        "key": "dhaanyesha_of_year",
                        "governs": "the grain harvest",
                        "planet": "Sun"
                      },
                      {
                        "office": "Lord of Juices (Rasesha)",
                        "key": "rasesha_of_year",
                        "governs": "sap, juices and liquids",
                        "planet": "Jupiter"
                      },
                      {
                        "office": "Lord of Water (Neeresha)",
                        "key": "neersesha_of_year",
                        "governs": "rivers and water supply",
                        "planet": "Mars"
                      },
                      {
                        "office": "Lord of Fruit (Phalesha)",
                        "key": "phalesha_of_year",
                        "governs": "fruit crops",
                        "planet": "Jupiter"
                      },
                      {
                        "office": "Lord of Crops (Sashyesha)",
                        "key": "sashyesha_of_year",
                        "governs": "standing crops",
                        "planet": "Mars"
                      },
                      {
                        "office": "Lord of Forts (Durgesha)",
                        "key": "durgesha_of_year",
                        "governs": "defence and strongholds",
                        "planet": "Venus"
                      }
                    ],
                    "das_adhikari": {
                      "King": "Venus",
                      "Minister": "Saturn",
                      "Lord of Clouds": "Saturn",
                      "Lord of Summer Crops": "Mars",
                      "Lord of Defence": "Venus",
                      "Lord of Treasury": "Moon",
                      "Lord of Juicy Products": "Jupiter",
                      "Lord of Food Grains": "Sun",
                      "Lord of Metals": "Mars",
                      "Lord of Fruits": "Jupiter",
                      "Vehicle of Year": "Elephant/Frog"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "Only read by /nakshatra-chakras/; ignored elsewhere.",
                    "default": "Ashwini",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2025,
                "date_time": "2025-02-13T05:00:37Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/sandhya/": {
      "post": {
        "operationId": "astro_sandhya",
        "summary": "Sandhya windows",
        "description": "The two twilight observance windows: pratah in the morning and sayahna in the evening, each {start, end}.\n\nPratah runs two ghatis before sunrise to one after, sayahna one ghati before sunset to two after, where a ghati here is derived from the day length rather than a fixed twenty-four minutes.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "pratah": {
                      "start": "2026-08-31T05:19:09.733334+05:30",
                      "end": "2026-08-31T06:34:40.133333+05:30"
                    },
                    "sayahna": {
                      "start": "2026-08-31T18:19:23.866667+05:30",
                      "end": "2026-08-31T19:34:54.266666+05:30"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/sankranti/": {
      "post": {
        "operationId": "astro_sankranti",
        "summary": "Sankranti dates",
        "description": "The previous and next Sankranti — the Sun's entry into a sidereal sign.\n\nSankranti is the Hindu calendar's solar month boundary, and the reason the dates matter well beyond astrology: Makar Sankranti, Mesha Sankranti and the rest are festival dates fixed by exactly this crossing.\n\nSidereal, so these do NOT coincide with the tropical ingresses /api/astro/transit/solar-ingress/ finds — the two are separated by the ayanamsa.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "previous": "2026-04-14T09:32:39+05:30",
                    "next": "2026-06-15T12:53:00+05:30",
                    "zodiac": "sidereal"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-06-02T06:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/saptamsa/": {
      "post": {
        "operationId": "astro_saptamsa",
        "summary": "Saptamsa (D7)",
        "description": "The saptamsa, the seventh divisional chart: each sign divided into seven parts of roughly 4°17' each.\n\nRead for children and progeny.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 220.66583333333335,
                        "latitude": 0,
                        "nakshatra": "Anooraadha",
                        "pada": 3,
                        "kakshya": "mars",
                        "zodiac_name": "Scorpio",
                        "house": 2
                      },
                      {
                        "name": "moon",
                        "longitude": 10.344444444444443,
                        "latitude": 4.37,
                        "nakshatra": "Ashwini",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Aries",
                        "house": 7
                      },
                      {
                        "name": "mars",
                        "longitude": 194.22305555555556,
                        "latitude": 0.535,
                        "nakshatra": "Swaati",
                        "pada": 3,
                        "kakshya": "sun",
                        "zodiac_name": "Libra",
                        "house": 1
                      },
                      {
                        "name": "mercury",
                        "longitude": 249.55444444444444,
                        "latitude": 1.574,
                        "nakshatra": "Moola",
                        "pada": 3,
                        "kakshya": "mars",
                        "zodiac_name": "Sagittarius",
                        "house": 3
                      },
                      {
                        "name": "jupiter",
                        "longitude": 46.30361111111111,
                        "latitude": 0.529,
                        "nakshatra": "Rohini",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Taurus",
                        "house": 8
                      },
                      {
                        "name": "venus",
                        "longitude": 172.69083333333333,
                        "latitude": -3.391,
                        "nakshatra": "Hasta",
                        "pada": 4,
                        "kakshya": "moon",
                        "zodiac_name": "Virgo",
                        "house": 12
                      },
                      {
                        "name": "saturn",
                        "longitude": 286.1286111111111,
                        "latitude": -2.651,
                        "nakshatra": "Sravanam",
                        "pada": 2,
                        "kakshya": "venus",
                        "zodiac_name": "Capricorn",
                        "house": 4
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 338.9608333333333,
                        "latitude": 0,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 2,
                        "kakshya": "mars",
                        "zodiac_name": "Pisces",
                        "house": 6
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 158.96083333333334,
                        "latitude": 0,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Virgo",
                        "house": 12
                      },
                      {
                        "name": "uranus",
                        "longitude": 289.96722222222223,
                        "latitude": -0.154,
                        "nakshatra": "Sravanam",
                        "pada": 3,
                        "kakshya": "Mercury",
                        "zodiac_name": "Capricorn",
                        "house": 4
                      },
                      {
                        "name": "neptune",
                        "longitude": 216.02944444444444,
                        "latitude": -1.412,
                        "nakshatra": "Anooraadha",
                        "pada": 1,
                        "kakshya": "jupiter",
                        "zodiac_name": "Scorpio",
                        "house": 2
                      },
                      {
                        "name": "pluto",
                        "longitude": 154.95222222222225,
                        "latitude": -4.3,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 3,
                        "kakshya": "jupiter",
                        "zodiac_name": "Virgo",
                        "house": 12
                      }
                    ],
                    "ascendant": {
                      "longitude": 205.3144444444445,
                      "zodiac_name": "Libra",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/saptashalaka_chakra/": {
      "get": {
        "operationId": "astro_saptashalaka_chakra",
        "summary": "Saptashalaka chakra",
        "description": "The Saptashalaka chakra is a muhurta diagram of seven rods: the 28 nakshatras (27 plus Abhijit) are arranged seven to a side around a square, and lines drawn across it link each nakshatra to three others — the one directly opposite and the two reached diagonally. A planet sitting in any of the three is said to pierce (vedha) the nakshatra in question, and a moment falling in a pierced nakshatra is dropped when fixing a date, particularly for a marriage.\n\nThis GET endpoint returns the whole diagram and takes no parameters. `edges` gives `east`, `south`, `west` and `north`, each an ordered list of the seven nakshatra names along that side. `vedha_map` is keyed by nakshatra, 28 entries, each `{front, diagonal_right, diagonal_left, edge}`.\n\nThe data is fixed, so cache it rather than calling repeatedly, and use `/api/astro/saptashalaka_vedha/` for a single lookup. The difference from the Panchashalaka chakra is the number of partners — three here, one there — and the two diagrams arrange the nakshatras differently, so a nakshatra's partners are not the same in both.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Prashna"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "edges": {
                    "east": [
                      "Krittika",
                      "Rohini",
                      "Mrigashira",
                      "Ardra",
                      "Punarvasu",
                      "Pushya",
                      "Ashlesha"
                    ],
                    "south": [
                      "Magha",
                      "Purva Phalguni",
                      "Uttara Phalguni",
                      "Hasta",
                      "Chitra",
                      "Swati",
                      "Vishakha"
                    ],
                    "west": [
                      "Shravana",
                      "Abhijit",
                      "Uttara Ashadha",
                      "Purva Ashadha",
                      "Moola",
                      "Jyeshtha",
                      "Anuradha"
                    ],
                    "north": [
                      "Dhanishtha",
                      "Shatabhisha",
                      "Purva Bhadrapada",
                      "Uttara Bhadrapada",
                      "Revati",
                      "Ashwini",
                      "Bharani"
                    ]
                  },
                  "vedha_map": {
                    "Krittika": {
                      "front": "Shravana",
                      "diagonal_right": "Bharani",
                      "diagonal_left": "Vishakha",
                      "edge": "east"
                    },
                    "Rohini": {
                      "front": "Abhijit",
                      "diagonal_right": "Ashwini",
                      "diagonal_left": "Swati",
                      "edge": "east"
                    },
                    "Mrigashira": {
                      "front": "Uttara Ashadha",
                      "diagonal_right": "Revati",
                      "diagonal_left": "Chitra",
                      "edge": "east"
                    },
                    "Ardra": {
                      "front": "Purva Ashadha",
                      "diagonal_right": "Uttara Bhadrapada",
                      "diagonal_left": "Hasta",
                      "edge": "east"
                    },
                    "Punarvasu": {
                      "front": "Moola",
                      "diagonal_right": "Purva Bhadrapada",
                      "diagonal_left": "Uttara Phalguni",
                      "edge": "east"
                    },
                    "Pushya": {
                      "front": "Jyeshtha",
                      "diagonal_right": "Shatabhisha",
                      "diagonal_left": "Purva Phalguni",
                      "edge": "east"
                    },
                    "Ashlesha": {
                      "front": "Anuradha",
                      "diagonal_right": "Dhanishtha",
                      "diagonal_left": "Magha",
                      "edge": "east"
                    },
                    "Magha": {
                      "front": "Bharani",
                      "diagonal_right": "Ashlesha",
                      "diagonal_left": "Shravana",
                      "edge": "south"
                    },
                    "Purva Phalguni": {
                      "front": "Ashwini",
                      "diagonal_right": "Pushya",
                      "diagonal_left": "Abhijit",
                      "edge": "south"
                    },
                    "Uttara Phalguni": {
                      "front": "Revati",
                      "diagonal_right": "Punarvasu",
                      "diagonal_left": "Uttara Ashadha",
                      "edge": "south"
                    },
                    "Hasta": {
                      "front": "Uttara Bhadrapada",
                      "diagonal_right": "Ardra",
                      "diagonal_left": "Purva Ashadha",
                      "edge": "south"
                    },
                    "Chitra": {
                      "front": "Purva Bhadrapada",
                      "diagonal_right": "Mrigashira",
                      "diagonal_left": "Moola",
                      "edge": "south"
                    },
                    "Swati": {
                      "front": "Shatabhisha",
                      "diagonal_right": "Rohini",
                      "diagonal_left": "Jyeshtha",
                      "edge": "south"
                    },
                    "Vishakha": {
                      "front": "Dhanishtha",
                      "diagonal_right": "Krittika",
                      "diagonal_left": "Anuradha",
                      "edge": "south"
                    },
                    "Shravana": {
                      "front": "Krittika",
                      "diagonal_right": "Magha",
                      "diagonal_left": "Dhanishtha",
                      "edge": "west"
                    },
                    "Abhijit": {
                      "front": "Rohini",
                      "diagonal_right": "Purva Phalguni",
                      "diagonal_left": "Shatabhisha",
                      "edge": "west"
                    },
                    "Uttara Ashadha": {
                      "front": "Mrigashira",
                      "diagonal_right": "Uttara Phalguni",
                      "diagonal_left": "Purva Bhadrapada",
                      "edge": "west"
                    },
                    "Purva Ashadha": {
                      "front": "Ardra",
                      "diagonal_right": "Hasta",
                      "diagonal_left": "Uttara Bhadrapada",
                      "edge": "west"
                    },
                    "Moola": {
                      "front": "Punarvasu",
                      "diagonal_right": "Chitra",
                      "diagonal_left": "Revati",
                      "edge": "west"
                    },
                    "Jyeshtha": {
                      "front": "Pushya",
                      "diagonal_right": "Swati",
                      "diagonal_left": "Ashwini",
                      "edge": "west"
                    },
                    "Anuradha": {
                      "front": "Ashlesha",
                      "diagonal_right": "Vishakha",
                      "diagonal_left": "Bharani",
                      "edge": "west"
                    },
                    "Dhanishtha": {
                      "front": "Vishakha",
                      "diagonal_right": "Ashlesha",
                      "diagonal_left": "Shravana",
                      "edge": "north"
                    },
                    "Shatabhisha": {
                      "front": "Swati",
                      "diagonal_right": "Pushya",
                      "diagonal_left": "Abhijit",
                      "edge": "north"
                    },
                    "Purva Bhadrapada": {
                      "front": "Chitra",
                      "diagonal_right": "Punarvasu",
                      "diagonal_left": "Uttara Ashadha",
                      "edge": "north"
                    },
                    "Uttara Bhadrapada": {
                      "front": "Hasta",
                      "diagonal_right": "Ardra",
                      "diagonal_left": "Purva Ashadha",
                      "edge": "north"
                    },
                    "Revati": {
                      "front": "Uttara Phalguni",
                      "diagonal_right": "Mrigashira",
                      "diagonal_left": "Moola",
                      "edge": "north"
                    },
                    "Ashwini": {
                      "front": "Purva Phalguni",
                      "diagonal_right": "Rohini",
                      "diagonal_left": "Jyeshtha",
                      "edge": "north"
                    },
                    "Bharani": {
                      "front": "Magha",
                      "diagonal_right": "Krittika",
                      "diagonal_left": "Anuradha",
                      "edge": "north"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/saptashalaka_vedha/": {
      "get": {
        "operationId": "astro_saptashalaka_vedha",
        "summary": "Saptashalaka vedha lookup",
        "description": "A single-nakshatra lookup into the Saptashalaka chakra. Given a nakshatra it returns the three others that pierce it: `front`, the one directly opposite on the diagram, and `diagonal_right` and `diagonal_left`, the two reached across the corners. In muhurta practice a malefic in any of the three afflicts a moment falling in your nakshatra.\n\nPass `nakshatra` as a query parameter using the spellings the chakra endpoint returns; Abhijit is included. The optional `type` parameter takes a comma-separated subset of `front`, `diagonal_right` and `diagonal_left` — omit it to get all three. The response is `{nakshatra, vedha}`, where `vedha` holds only the types you asked for.\n\nAn unrecognised nakshatra is rejected with a 400. The relationships never change, so for more than a few lookups fetch the full map once from `/api/astro/saptashalaka_chakra/`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Prashna"
        ],
        "parameters": [
          {
            "name": "nakshatra",
            "in": "query",
            "required": true,
            "description": "Name of the nakshatra to look up vedha relationships for.",
            "schema": {
              "type": "string",
              "description": "Name of the nakshatra to look up vedha relationships for.",
              "enum": [
                "Abhijit",
                "Anuradha",
                "Ardra",
                "Ashlesha",
                "Ashwini",
                "Bharani",
                "Chitra",
                "Dhanishtha",
                "Hasta",
                "Jyeshtha",
                "Krittika",
                "Magha",
                "Moola",
                "Mrigashira",
                "Punarvasu",
                "Purva Ashadha",
                "Purva Bhadrapada",
                "Purva Phalguni",
                "Pushya",
                "Revati",
                "Rohini",
                "Shatabhisha",
                "Shravana",
                "Swati",
                "Uttara Ashadha",
                "Uttara Bhadrapada",
                "Uttara Phalguni",
                "Vishakha"
              ],
              "examples": [
                "Abhijit"
              ]
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Comma-separated vedha types to return. Omit for all three.",
            "schema": {
              "type": "string",
              "description": "Comma-separated vedha types to return. Omit for all three.",
              "enum": [
                "diagonal_left",
                "diagonal_right",
                "front"
              ],
              "examples": [
                "diagonal_left"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "nakshatra": "Abhijit",
                  "vedha": {
                    "front": "Rohini",
                    "diagonal_right": "Purva Phalguni",
                    "diagonal_left": "Shatabhisha"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/astro/sarvashtakavarga/": {
      "post": {
        "operationId": "astro_sarvashtakavarga",
        "summary": "Sarvashtakavarga",
        "description": "Sarvashtakavarga: the totals, one number per sign, keyed `Raasi 1` to `Raasi 12` for Aries to Pisces.\n\nEach is the sum of all the planets' points in that sign, so the twelve add up to 337 in the classical scheme - a test asserts that on every chart. Use it to rank signs by strength in a single call, and to judge which transits are worth acting on.\n\nBuilt from the rashi chart by default; pass `chart_name` for a divisional chart. For the per-planet tables underneath these totals, use /api/astro/bhinnashtakavarga/.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Ashtakavarga"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "sarvashtakavarga": {
                      "Raasi 1": 28,
                      "Raasi 2": 36,
                      "Raasi 3": 40,
                      "Raasi 4": 25,
                      "Raasi 5": 24,
                      "Raasi 6": 23,
                      "Raasi 7": 26,
                      "Raasi 8": 25,
                      "Raasi 9": 28,
                      "Raasi 10": 34,
                      "Raasi 11": 25,
                      "Raasi 12": 23
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "apply_ekadhipatya_reductions": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "chart_name": {
                    "type": "string",
                    "default": "RashiChart",
                    "examples": [
                      "string"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "use_eight_ashtakavargas_in_sav": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/sarvatobhadra/": {
      "post": {
        "operationId": "astro_sarvatobhadra",
        "summary": "Sarvatobhadra chakra",
        "description": "The nine-by-nine board used to judge transits, with the grahas placed on it and the vedha (piercing) worked out.\n\nThe twenty-eight nakshatras — the usual twenty-seven plus Abhijit — sit around the outer ring in a fixed order that starts at Krittika and runs clockwise, NOT in the plain nakshatra sequence. The inner cells carry the twelve signs, the seven weekdays and a set of syllables. A graha standing in a nakshatra pierces the cell facing it across the board.\n\nThe whole 9×9 grid comes back alongside the placements, so you can draw the chakra rather than only read a verdict from it. Each cell says what it holds and whether it is on the ring.\n\nPass `transit_date_time` to place the transiting grahas on the same board — that is what the chakra is actually for. `hits_natal` then lists the transiting grahas whose vedha falls on a nakshatra your natal chart occupies.\n\n`rule` states which vedha rule was applied. Only positional vedha is used: top row pierces bottom in the same column, left column pierces right in the same row. Schools that add diagonal, tithi or vaara vedha will differ, and rather than pick one silently the rule is named in every response.\n\nA nakshatra spelling that cannot be resolved to a cell is returned under `unplaced` rather than dropped, so a graha never goes quietly missing from the board.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Chakras"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"system\": \"sarvatobhadra\", \"size\": 9, \"palette\": {\"W\": \"#ffffff\", \"C\": \"#FFEFD8\", \"L\": \"#CEE1F6\", \"D\": \"#A7CDFA\", \"border\": \"#C0CCDF\", \"frame\": \"#5D636C\", \"layer1\": \"#E8F1FB\", \"layer2\": \"#F9FAFB\", \"text\": \"#374151\"}, \"grid\": [[{\"row\": 0, \"column\": 0, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"अ\", \"ring\": false, \"shade\": \"W\", \"colour\": \"#ffffff\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 0, \"column\": 1, \"nakshatra\": \"Krittika\", \"nakshatra_key\": \"krittika\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"अ\", \"इ\", \"उ\", \"ए\"], \"short_name\": \"Kritika\", \"side\": \"top\"}, {\"row\": 0, \"column\": 2, \"nakshatra\": \"Rohini\", \"nakshatra_key\": \"rohini\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"ओ\", \"व\", \"वी\", \"वू\"], \"short_name\": \"Rohini\", \"side\": \"top\"}, {\"row\": 0, \"column\": 3, \"nakshatra\": \"Mrigashira\", \"nakshatra_key\": \"mrigashira\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"वे\", \"वो\", \"क\", \"की\"], \"short_name\": \"Mrigashi\", \"side\": \"top\"}, {\"row\": 0, \"column\": 4, \"nakshatra\": \"Ardra\", \"nakshatra_key\": \"ardra\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"कु\", \"घ\", \"ङ\", \"छ\"], \"short_name\": \"Ardra\", \"side\": \"top\"}, {\"row\": 0, \"column\": 5, \"nakshatra\": \"Punarvasu\", \"nakshatra_key\": \"punarvasu\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"के\", \"को\", \"ह\", \"ही\"], \"short_name\": \"Punarvasu\", \"side\": \"top\"}, {\"row\": 0, \"column\": 6, \"nakshatra\": \"Pushya\", \"nakshatra_key\": \"pushya\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"हु\", \"हे\", \"हो\", \"ड\"], \"short_name\": \"Pushya\", \"side\": \"top\"}, {\"row\": 0, \"column\": 7, \"nakshatra\": \"Ashlesha\", \"nakshatra_key\": \"ashlesha\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"डी\", \"डू\", \"डे\", \"डो\"], \"short_name\": \"Ashlesha\", \"side\": \"top\"}, {\"row\": 0, \"column\": 8, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"आ\", \"ring\": false, \"shade\": \"W\", \"colour\": \"#ffffff\", \"padas\": null, \"short_name\": null, \"side\": null}], [{\"row\": 1, \"column\": 0, \"nakshatra\": \"Bharani\", \"nakshatra_key\": \"bharani\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"ली\", \"लू\", \"ले\", \"लो\"], \"short_name\": \"Bharani\", \"side\": \"left\"}, {\"row\": 1, \"column\": 1, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"उ\", \"ring\": false, \"shade\": \"W\", \"colour\": \"#ffffff\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 2, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"अ\", \"ring\": false, \"shade\": \"D\", \"colour\": \"#A7CDFA\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 3, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"व\", \"ring\": false, \"shade\": \"D\", \"colour\": \"#A7CDFA\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 4, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"क\", \"ring\": false, \"shade\": \"D\", \"colour\": \"#A7CDFA\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 5, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"द\", \"ring\": false, \"shade\": \"D\", \"colour\": \"#A7CDFA\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 6, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"ह\", \"ring\": false, \"shade\": \"D\", \"colour\": \"#A7CDFA\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 7, \"nakshatra\": null, \"nakshatra_key\": null, \"label\": \"ऊ\", \"ring\": false, \"shade\": \"W\", \"colour\": \"#ffffff\", \"padas\": null, \"short_name\": null, \"side\": null}, {\"row\": 1, \"column\": 8, \"nakshatra\": \"Magha\", \"nakshatra_key\": \"magha\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"म\", \"मी\", \"मू\", \"मे\"], \"short_name\": \"Magha\", \"side\": \"right\"}], [{\"row\": 2, \"column\": 0, \"nakshatra\": \"Ashwini\", \"nakshatra_key\": \"ashwini\", \"label\": null, \"ring\": true, \"shade\": \"C\", \"colour\": \"#FFEFD8\", \"padas\": [\"चू\", \"चे\", \"चो\", \"ला\"], \"short_name\": \"Ashwini\", \"side"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "transit_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optional. When given, the transiting grahas for this moment are placed on the chakra alongside the natal ones, which is what the chakra is actually read for.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/seasons/": {
      "post": {
        "operationId": "astro_seasons",
        "summary": "Equinoxes, solstices and ritus",
        "description": "The two equinoxes, the two solstices and the six Indian ritus for a year.\n\nEach solar moment is named by its month and returned in chronological order. That matters: the underlying data gives the solstices December-first, so reading the first entry as the June one would be wrong half the time.\n\nThe ritus — Vasant, Grishma, Varsha, Sharad, Hemant and Shishir — are the Indian seasonal division and do not line up with the four-season calendar: there are six, each about two months, anchored to the Sun's sidereal position rather than to the solstices.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Mundane astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2025,
                    "equinoxes": [
                      {
                        "name": "March",
                        "moment": "2025-03-20T09:01:29Z"
                      },
                      {
                        "name": "September",
                        "moment": "2025-09-22T18:19:20Z"
                      }
                    ],
                    "solstices": [
                      {
                        "name": "June",
                        "moment": "2025-06-21T02:42:16Z"
                      },
                      {
                        "name": "December",
                        "moment": "2025-12-21T15:03:05Z"
                      }
                    ],
                    "ritus": [
                      {
                        "ritu": "Vasant",
                        "name": "Vasant Ritu (Indian Spring)",
                        "subtitle": "Spring - Vasant",
                        "begins": "2025-02-18T10:06:34Z",
                        "ends": "2025-04-19T19:56:00Z",
                        "tropical_zodiac": [
                          "Pisces",
                          "Aries"
                        ],
                        "note": "Vernal Equinox occurs at the middle of Vasant Ritu",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388301/Vasanta_Ritu_muqpf3.svg"
                      },
                      {
                        "ritu": "Grishma",
                        "name": "Grishma Ritu (Indian Summer)",
                        "subtitle": "Summer - Grishma",
                        "begins": "2025-04-19T19:56:00Z",
                        "ends": "2025-06-21T02:42:16Z",
                        "tropical_zodiac": [
                          "Taurus",
                          "Gemini"
                        ],
                        "note": "Grishma Ritu ends with Summer Solstice",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388300/Grishma_Ritu_vhdu0v.svg"
                      },
                      {
                        "ritu": "Varsha",
                        "name": "Varsha Ritu (Indian Monsoon)",
                        "subtitle": "Monsoon - Varsha",
                        "begins": "2025-06-21T02:42:16Z",
                        "ends": "2025-08-22T20:33:52Z",
                        "tropical_zodiac": [
                          "Cancer",
                          "Leo"
                        ],
                        "note": "Varsha Ritu starts with Summer Solstice",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388301/Varsha_Ritu_tvqnhl.svg"
                      },
                      {
                        "ritu": "Sharad",
                        "name": "Sharad Ritu (Indian Autumn)",
                        "subtitle": "Autumn - Sharad",
                        "begins": "2025-08-22T20:33:52Z",
                        "ends": "2025-10-23T03:50:55Z",
                        "tropical_zodiac": [
                          "Virgo",
                          "Libra"
                        ],
                        "note": "Autumnal Equinox occurs at the middle of Sharad Ritu",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388302/Sharad_Ritu_nvzy4z.svg"
                      },
                      {
                        "ritu": "Hemant",
                        "name": "Hemant Ritu (Indian Prewinter)",
                        "subtitle": "Prewinter - Hemant",
                        "begins": "2025-10-23T03:50:55Z",
                        "ends": "2025-12-21T15:03:05Z",
                        "tropical_zodiac": [
                          "Scorpio",
                          "Sagittarius"
                        ],
                        "note": "Hemant Ritu ends with Winter Solstice",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388300/Hemanta_Ritu_a3sole.svg"
                      },
                      {
                        "ritu": "Shishir",
                        "name": "Shishir Ritu (Indian Winter)",
                        "subtitle": "Winter - Shishir",
                        "begins": "2025-12-21T15:03:05Z",
                        "ends": "2026-02-18T15:51:55Z",
                        "tropical_zodiac": [
                          "Capricorn",
                          "Aquarius"
                        ],
                        "note": "Shishir Ritu starts with Winter Solstice",
                        "image_url": "https://res.cloudinary.com/dd5qujmj9/image/upload/v1785388300/Shishira_Ritu_sffdv3.svg"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "examples": [
                      2026
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nakshatra": {
                    "type": "string",
                    "description": "Only read by /nakshatra-chakras/; ignored elsewhere.",
                    "default": "Ashwini",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2025,
                "date_time": "2025-02-13T05:00:37Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/shadbala/": {
      "post": {
        "operationId": "astro_shadbala",
        "summary": "Shadbala",
        "description": "Shadbala: the six-fold strength of each of the seven planets, with the six components the total is built from.\n\n`shadbala` is the total. `components` breaks it into sthana (positional), dig (directional), kaala (temporal), cheshta (motional), naisargika (natural) and drik (aspectual), so you can show WHY a planet scores as it does rather than only the score.\n\nValues are in virupas; sixty virupas make one rupa, and a planet is conventionally judged strong above its own required minimum.\n\nNote this endpoint takes `timezone`, not `timezone_as_float`, following its parent. `asc_house` is required on that parent and unused by this calculation, so it is not needed here.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Strength (bala)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "shadbala": [
                      [
                        238.78,
                        57.65,
                        148.43,
                        187.3,
                        98.77,
                        110.72,
                        175.99
                      ],
                      [
                        96.56,
                        286.1,
                        115.99,
                        179.5,
                        163.42,
                        155.82,
                        109.39
                      ],
                      [
                        34.21,
                        18.51,
                        32.83,
                        48.89,
                        82.15,
                        17.49,
                        67.94
                      ],
                      [
                        0,
                        0,
                        2.81,
                        11.62,
                        22.59,
                        0.03,
                        7.5
                      ],
                      [
                        60,
                        51.43,
                        17.14,
                        25.71,
                        34.29,
                        42.86,
                        8.57
                      ],
                      [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ],
                      [
                        429.55,
                        413.69,
                        317.2,
                        453.02,
                        401.22,
                        326.92,
                        369.39
                      ],
                      [
                        7.16,
                        6.89,
                        5.29,
                        7.55,
                        6.69,
                        5.45,
                        6.16
                      ],
                      [
                        1.43,
                        1.15,
                        1.06,
                        1.08,
                        1.03,
                        0.99,
                        1.23
                      ]
                    ],
                    "components": {
                      "sthana": [
                        238.78,
                        57.65,
                        148.43,
                        187.3,
                        98.77,
                        110.72,
                        175.99
                      ],
                      "dig": [
                        34.21,
                        18.51,
                        32.83,
                        48.89,
                        82.15,
                        17.49,
                        67.94
                      ],
                      "kaala": [
                        96.56,
                        286.1,
                        115.99,
                        179.5,
                        163.42,
                        155.82,
                        109.39
                      ],
                      "cheshta": [
                        0,
                        0,
                        2.81,
                        11.62,
                        22.59,
                        0.03,
                        7.5
                      ],
                      "naisargika": [
                        60,
                        51.43,
                        17.14,
                        25.71,
                        34.29,
                        42.86,
                        8.57
                      ],
                      "drik": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ]
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "include_houses": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planet_index": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "use_epoch_table": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/shani_analysis/": {
      "post": {
        "operationId": "astro_shani_analysis",
        "summary": "Saturn transit phases",
        "description": "Saturn's slow circuit of the zodiac produces four named phases that Indian astrology watches closely, all measured from the birth Moon or birth ascendant: Sade Sati, the seven-and-a-half years around Saturn's passage over that point; Ashtama Shani, Saturn in the eighth from it; Kantaka Shani, Saturn in the fourth, seventh or tenth; and Dhaiya, also called Ardhashtama, Saturn in the fourth or eighth. This endpoint says whether each is running at a given moment, when it ends, and when the next one begins.\n\nSend two charts: the birth data as `date_time_natal`, `latitude_natal`, `longitude_natal` and `chart_name_natal`, and the moment you are asking about as the matching `_transit` fields. `ref_celestial` chooses whether the phases are measured from the natal Moon or the natal ascendant. `mode` selects how strict the test is — 0 tests whole-sign house placement, and the higher values test a degree window around the reference point instead, which yields noticeably tighter start and end dates.\n\nThe response holds eight objects. `ashtama_shani`, `kantaka_shani`, `dhaiya_shani` and `sade_sati_shani` are each `{status, end_date}`: a boolean for whether the phase is running at the transit moment, and an ISO 8601 UTC end date when it is, or null when it is not. `next_ashtama_shani`, `next_kantaka_shani` and `next_dhaiya_shani` are `{date, ref_house_from_natal}`, giving when the next occurrence starts and which house from the reference point triggers it; `next_sade_sati_shani` gives just `{date}`. The forward search runs a hundred years from the transit moment.\n\nBecause Kantaka and Dhaiya both include the fourth house, the two often report the same dates. That is expected, not a duplicate.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "ashtama_shani": {
                      "status": false,
                      "end_date": null
                    },
                    "kantaka_shani": {
                      "status": false,
                      "end_date": null
                    },
                    "dhaiya_shani": {
                      "status": false,
                      "end_date": null
                    },
                    "sade_sati_shani": {
                      "status": true,
                      "end_date": "2025-03-09T10:21:25Z"
                    },
                    "next_ashtama_shani": {
                      "date": "2036-08-08T03:38:39Z",
                      "ref_house_from_natal": 8
                    },
                    "next_kantaka_shani": {
                      "date": "2027-05-11T00:01:56Z",
                      "ref_house_from_natal": 4
                    },
                    "next_dhaiya_shani": {
                      "date": "2027-05-11T00:01:56Z",
                      "ref_house_from_natal": 4
                    },
                    "next_sade_sati_shani": {
                      "date": "2046-02-22T02:59:10Z"
                    }
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name_natal": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_name_transit": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "date_time_natal": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "date_time_transit": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude_natal": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "latitude_transit": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "longitude_natal": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "longitude_transit": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "mode": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "ref_celestial": {
                    "type": "string",
                    "enum": [
                      "ascendant",
                      "moon"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "chart_name_natal",
                  "chart_name_transit",
                  "date_time_natal",
                  "date_time_transit",
                  "latitude_natal",
                  "latitude_transit",
                  "longitude_natal",
                  "longitude_transit",
                  "mode",
                  "ref_celestial"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time_natal": "2025-11-21T05:41:58.124Z",
                "date_time_transit": "2024-11-21T05:41:58.124Z",
                "longitude_natal": 77.5946,
                "latitude_natal": 12.9716,
                "longitude_transit": 26.1046,
                "latitude_transit": 26.9124,
                "chart_name_natal": "RashiChart",
                "chart_name_transit": "RashiChart",
                "ref_celestial": "ascendant",
                "mode": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/shashthamsa/": {
      "post": {
        "operationId": "astro_shashthamsa",
        "summary": "Shashthamsa (D6)",
        "description": "The shashthamsa, the sixth divisional chart, also called kaulaka: each sign divided into six parts of 5° each.\n\nRead for health, disease and enemies. Outside the shodasavarga.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/shashtyamsa/": {
      "post": {
        "operationId": "astro_shashtyamsa",
        "summary": "Shashtyamsa (D60)",
        "description": "The shashtyamsa, the sixtieth divisional chart: each sign divided into sixty parts of 30' each.\n\nThe finest division of the shodasavarga and traditionally given great weight. It is also the most sensitive to birth-time accuracy in the whole set: half a degree is about two minutes of clock time, so an uncertain birth time moves planets between divisions and changes the reading. Treat it as unreliable unless the time is rectified.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 262.85,
                        "latitude": 0,
                        "nakshatra": "Poorvaashaadha",
                        "pada": 3,
                        "kakshya": "moon",
                        "zodiac_name": "Sagittarius",
                        "house": 5
                      },
                      {
                        "name": "moon",
                        "longitude": 88.66666666666667,
                        "latitude": 4.37,
                        "nakshatra": "Punarvasu",
                        "pada": 3,
                        "kakshya": "ascendant",
                        "zodiac_name": "Gemini",
                        "house": 11
                      },
                      {
                        "name": "mars",
                        "longitude": 130.48333333333335,
                        "latitude": 0.535,
                        "nakshatra": "Makha",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Leo",
                        "house": 1
                      },
                      {
                        "name": "mercury",
                        "longitude": 150.4666666666667,
                        "latitude": 1.574,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 2,
                        "kakshya": "saturn",
                        "zodiac_name": "Virgo",
                        "house": 2
                      },
                      {
                        "name": "jupiter",
                        "longitude": 178.3166666666666,
                        "latitude": 0.529,
                        "nakshatra": "Chitra",
                        "pada": 2,
                        "kakshya": "ascendant",
                        "zodiac_name": "Virgo",
                        "house": 2
                      },
                      {
                        "name": "venus",
                        "longitude": 87.34999999999991,
                        "latitude": -3.391,
                        "nakshatra": "Punarvasu",
                        "pada": 3,
                        "kakshya": "ascendant",
                        "zodiac_name": "Gemini",
                        "house": 11
                      },
                      {
                        "name": "saturn",
                        "longitude": 56.816666666666606,
                        "latitude": -2.651,
                        "nakshatra": "Mrigasira",
                        "pada": 2,
                        "kakshya": "ascendant",
                        "zodiac_name": "Taurus",
                        "house": 10
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 273.95,
                        "latitude": 0,
                        "nakshatra": "Uttaraashaadha",
                        "pada": 3,
                        "kakshya": "jupiter",
                        "zodiac_name": "Capricorn",
                        "house": 6
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 93.95,
                        "latitude": 0,
                        "nakshatra": "Pushyami",
                        "pada": 1,
                        "kakshya": "jupiter",
                        "zodiac_name": "Cancer",
                        "house": 12
                      },
                      {
                        "name": "uranus",
                        "longitude": 355.4333333333333,
                        "latitude": -0.154,
                        "nakshatra": "Revati",
                        "pada": 3,
                        "kakshya": "moon",
                        "zodiac_name": "Pisces",
                        "house": 8
                      },
                      {
                        "name": "neptune",
                        "longitude": 175.9666666666667,
                        "latitude": -1.412,
                        "nakshatra": "Chitra",
                        "pada": 1,
                        "kakshya": "moon",
                        "zodiac_name": "Virgo",
                        "house": 2
                      },
                      {
                        "name": "pluto",
                        "longitude": 106.73333333333336,
                        "latitude": -4.3,
                        "nakshatra": "Aasresha",
                        "pada": 1,
                        "kakshya": "venus",
                        "zodiac_name": "Cancer",
                        "house": 12
                      }
                    ],
                    "ascendant": {
                      "longitude": 131.26666666666677,
                      "zodiac_name": "Leo",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/shodasamsa/": {
      "post": {
        "operationId": "astro_shodasamsa",
        "summary": "Shodasamsa (D16)",
        "description": "The shodasamsa, the sixteenth divisional chart, also called kalamsa: each sign divided into sixteen parts of 1°52'30\" each.\n\nRead for vehicles, comforts and the happiness actually got from them, as distinct from the means to buy them.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/sign_transitions/": {
      "post": {
        "operationId": "astro_sign_transitions",
        "summary": "Sign transitions",
        "description": "Every moment a planet crosses from one sidereal sign into the next, for a whole year — the event Indian astrology calls gochar, or sankranti in the Sun's case. The Sun's twelve crossings mark the solar months, Jupiter's and Saturn's are what long-range predictions hang on, and the Moon's come round every two and a half days.\n\nSend `year` and `timezone_as_float`. The response is `data.planets`, an object keyed by planet name, each holding a list of `{from_sign, to_sign, datetime}` in date order. Twelve bodies are covered: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, truenode and meannode. Note that the lunar nodes appear under those two names rather than as rahu and ketu.\n\nTimestamps are UTC, and the crossing instant is the same everywhere on Earth — the offset you send decides which local calendar year the scan covers, so that a crossing late on 31 December UTC is correctly returned in the following year for an Indian viewer. Convert to local time for display.\n\nCrossings are located by walking day by day and then narrowing within the day, giving times good to a small fraction of a degree. The Moon alone contributes over 150 entries a year, so expect a sizeable response. The same figures appear inside `/api/planetary_details/` alongside eight other calculations; this endpoint returns only the transitions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"planets\": {\"sun\": [{\"from_sign\": \"Sagittarius\", \"to_sign\": \"Capricorn\", \"datetime\": \"2026-01-14 09:38:26\"}, {\"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"datetime\": \"2026-02-12 22:40:18\"}, {\"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"datetime\": \"2026-03-14 19:31:52\"}, {\"from_sign\": \"Pisces\", \"to_sign\": \"Aries\", \"datetime\": \"2026-04-14 04:03:45\"}, {\"from_sign\": \"Aries\", \"to_sign\": \"Taurus\", \"datetime\": \"2026-05-15 00:52:30\"}, {\"from_sign\": \"Taurus\", \"to_sign\": \"Gemini\", \"datetime\": \"2026-06-15 07:23:26\"}, {\"from_sign\": \"Gemini\", \"to_sign\": \"Cancer\", \"datetime\": \"2026-07-16 18:10:18\"}, {\"from_sign\": \"Cancer\", \"to_sign\": \"Leo\", \"datetime\": \"2026-08-17 02:28:07\"}, {\"from_sign\": \"Leo\", \"to_sign\": \"Virgo\", \"datetime\": \"2026-09-17 02:22:30\"}, {\"from_sign\": \"Virgo\", \"to_sign\": \"Libra\", \"datetime\": \"2026-10-17 14:22:30\"}, {\"from_sign\": \"Libra\", \"to_sign\": \"Scorpio\", \"datetime\": \"2026-11-16 14:14:03\"}, {\"from_sign\": \"Scorpio\", \"to_sign\": \"Sagittarius\", \"datetime\": \"2026-12-16 04:54:22\"}], \"moon\": [{\"from_sign\": \"Taurus\", \"to_sign\": \"Gemini\", \"datetime\": \"2026-01-02 03:56:00\"}, {\"from_sign\": \"Gemini\", \"to_sign\": \"Cancer\", \"datetime\": \"2026-01-04 04:13:14\"}, {\"from_sign\": \"Cancer\", \"to_sign\": \"Leo\", \"datetime\": \"2026-01-06 06:47:55\"}, {\"from_sign\": \"Leo\", \"to_sign\": \"Virgo\", \"datetime\": \"2026-01-08 13:09:22\"}, {\"from_sign\": \"Virgo\", \"to_sign\": \"Libra\", \"datetime\": \"2026-01-10 23:22:40\"}, {\"from_sign\": \"Libra\", \"to_sign\": \"Scorpio\", \"datetime\": \"2026-01-13 11:51:19\"}, {\"from_sign\": \"Scorpio\", \"to_sign\": \"Sagittarius\", \"datetime\": \"2026-01-16 00:17:52\"}, {\"from_sign\": \"Sagittarius\", \"to_sign\": \"Capricorn\", \"datetime\": \"2026-01-18 11:11:15\"}, {\"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"datetime\": \"2026-01-20 20:05:37\"}, {\"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"datetime\": \"2026-01-23 03:03:48\"}, {\"from_sign\": \"Pisces\", \"to_sign\": \"Aries\", \"datetime\": \"2026-01-25 08:05:58\"}, {\"from_sign\": \"Aries\", \"to_sign\": \"Taurus\", \"datetime\": \"2026-01-27 11:15:07\"}, {\"from_sign\": \"Taurus\", \"to_sign\": \"Gemini\", \"datetime\": \"2026-01-29 13:01:06\"}, {\"from_sign\": \"Gemini\", \"to_sign\": \"Cancer\", \"datetime\": \"2026-01-31 14:31:17\"}, {\"from_sign\": \"Cancer\", \"to_sign\": \"Leo\", \"datetime\": \"2026-02-02 17:17:55\"}, {\"from_sign\": \"Leo\", \"to_sign\": \"Virgo\", \"datetime\": \"2026-02-04 22:50:09\"}, {\"from_sign\": \"Virgo\", \"to_sign\": \"Libra\", \"datetime\": \"2026-02-07 07:51:54\"}, {\"from_sign\": \"Libra\", \"to_sign\": \"Scorpio\", \"datetime\": \"2026-02-09 19:41:22\"}, {\"from_sign\": \"Scorpio\", \"to_sign\": \"Sagittarius\", \"datetime\": \"2026-02-12 08:12:28\"}, {\"from_sign\": \"Sagittarius\", \"to_sign\": \"Capricorn\", \"datetime\": \"2026-02-14 19:12:32\"}, {\"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"datetime\": \"2026-02-17 03:35:58\"}, {\"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"datetime\": \"2026-02-19 09:30:10\"}, {\"from_sign\": \"Pisces\", \"to_sign\": \"Aries\", \"datetime\": \"2026-02-21 13:37:19\"}, {\"from_sign\": \"Aries\", \"to_sign\": \"Taurus\", \"datetime\": \"2026-02-23 16:42:35\"}, {\"from_sign\": \"Taurus\", \"to_sign\": \"Gemini\", \"datetime\": \"2026-02-25 19:24:50\"}, {\"from_sign\": \"Gemini\", \"to_sign\": \"Cancer\", \"datetime\": \"2026-02-27 22:22:33\"}, {\"from_sign\": \"Cancer\", \"to_sign\": \"Leo\", \"datetime\": \"2026-03-02 02:21:37\"}, {\"from_sign\": \"Leo\", \"to_sign\": \"Virgo\", \"datetime\": \"2026-03-04 08:15:49\"}, {\"from_sign\": \"Virgo\", \"to_sign\": \"Libra\", \"datetime\": \"2026-03-06 16:48:55\"}, {\"from_sign\": \"Libra\", \"to_sign\": \"Scorpio\", \"datetime\": \"2026-03-09 03:59:52\"}, {\"from_sign\": \"Scorpio\", \"to_sign\": \"Sagittarius\", \"datetime\": \"2026-03-11 16:30:28\"}, {\"from_sign\": \"Sagittarius\", \"to_sign\": \"Capricorn\", \"datetime\": \"2026-03-14 04:03:13\"}, {\"from_sign\": \"Capricorn\", \"to_sign\": \"Aquarius\", \"datetime\": \"2026-03-16 12:44:24\"}, {\"from_sign\": \"Aquarius\", \"to_sign\": \"Pisces\", \"datetime\": \"2026-03-18 18:06:16\"}, {\"from_sign\": \"Pisces\", \"to_sign\": \"Aries\", \"datetime\": \"2026-03-20 20:58:00\"}, {\"from_sign\": \"Aries\", \"to_sign\": \"Taurus\", \"datetime\": \"2026-03-22 22:44:10\"}, {\"from_sign\": \"Tau"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "default": 5.5,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2026,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/star/": {
      "post": {
        "operationId": "astro_star",
        "summary": "Fixed stars",
        "description": "Positional data for a named fixed star, taken from the standard fixed-star catalogue. Both Vedic and Western astrology use a handful of bright stars as markers — Aldebaran, Regulus, Spica, Antares — and the nakshatras are themselves named after their yogataras, the junction stars that define them. This endpoint gives a star's ecliptic and equatorial coordinates, its rate of change, and its brightness.\n\nSend `name` as either a traditional name (`Aldebaran`, `Regulus`) or a Bayer designation (`alTau`, `alLeo`); matching ignores case and spaces, and a leading comma forces the Bayer form. Add `date_time`, `timezone_as_float`, and the `keys` you want.\n\nImportant: list `set_default_positions` as the first entry of `keys`. Keys are executed in the order you give them, and every positional key depends on the calculation flags that call installs — without it they fail. Only `magnitude`, which comes straight from the catalogue, works on its own. Positions are sidereal.\n\n`latitude` and `longitude` are accepted but not used; a fixed star's geocentric position does not depend on where you stand.\n\nAvailable `keys` (10), all covered by the same single credit: declination, distance, ecliptic_speeds, equatorial_speeds, latitude, longitude, magnitude, retrograde, right_ascension, set_default_positions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "set_default_positions": null,
                    "magnitude": 0.86
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "name": {
                    "type": "string",
                    "description": "A fixed star from the standard fixed-star catalogue: either a traditional name (Aldebaran, Regulus, Spica) or a Bayer designation (alTau, alLeo). Matching ignores case and spaces. Prefix a comma to force the Bayer form, e.g. ',alTau'. About 735 traditional names and 1117 designations are available, including non-stellar points such as Galactic Center. An unrecognised name returns 400.",
                    "enum": [
                      "Aldebaran",
                      "Rohini",
                      "Algol",
                      "Antares",
                      "Regulus",
                      "Sirius",
                      "Spica",
                      "Trappist-1",
                      "Galactic Center",
                      "Gal. Center",
                      "Great Attractor",
                      "Virgo Cluster",
                      "Andromeda Galaxy",
                      "Praesepe Cluster",
                      "Polaris",
                      "Messier 87",
                      "Shapley Supercluster",
                      "Deneb",
                      "Deneb Adige",
                      "Rigel",
                      "Mira",
                      "Ain",
                      "Segin",
                      "Alpheratz",
                      "Sirrah",
                      "Mirach",
                      "Almaak",
                      "Almak",
                      "Almac",
                      "Almach"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "name",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "name": "Aldebaran",
                "keys": [
                  "set_default_positions",
                  "magnitude"
                ]
              }
            }
          }
        }
      }
    },
    "/api/astro/strength/": {
      "post": {
        "operationId": "astro_strength",
        "summary": "Planetary strength",
        "description": "Shadbala, \"six strengths\", is the classical way of putting a number on how much a planet can actually deliver. Six sources are scored separately — position, time, direction, motion, natural rank and aspects received — and added together. The total is expressed in virupas, sixty of which make one rupa; each planet has a threshold in rupas it is expected to clear, and the ratio of what it scored to what it needed is the usable answer. This endpoint exposes that total, every component and sub-component of it, and several related strength schemes.\n\nStart with `shad_bala`. It returns a nine-element array: the six component lists, then the totals in virupas, the same totals in rupas, and finally each planet's rupas divided by its requirement (Sun 5, Moon 6, Mars 5, Mercury 7, Jupiter 6.5, Venus 5.5, Saturn 5). A ratio above 1 means the planet met its requirement. Every seven-element list on this endpoint is in the order Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn; every twelve-element list is houses one to twelve.\n\nSend `date_time`, `latitude`, `longitude` and `timezone`. Note that the field is `timezone` here, not `timezone_as_float` as on most other endpoints. `asc_house` is required but is used only by the three house-classification keys, and `planet_index`, `include_houses` and `use_epoch_table` only by the keys that name them.\n\nAlongside Shadbala the endpoint carries the Tajaka five-fold and twelve-fold strengths, the Ishta Phala benefic score, the Rashmi ray measures and Harsha Bala. Bhava Bala, the strength of the houses rather than the planets, is present in the key list but its three components are unimplemented stubs returning zeros, so `bhava_bala` returns zeros too.\n\nAvailable `keys` (50), all covered by the same single credit: abda_bala, abdadhipathi, apoklimas, ayana_bala, bhava_adhipathi_bala, bhava_bala, bhava_dig_bala, bhava_drik_bala, bhava_madhya, cheshta_bala, cheshta_bala_new, cheshta_rashmi, dig_bala, drekkana_bala, drekkana_bala_simple, dreshkon_bala, drik_bala, dwadhasa_vargeeya_bala, get_planet_mean_longitude, get_planet_mean_longitude_using_epoch_table, hadda_bala, hadda_bala_simple, harsha_bala, hora_bala, ishta_phala, kaala_bala, kendra_bala, kendras, kshetra_bala, masa_bala, masadhipathi, naisargika_bala, nathonnath_bala, navamsa_bala, navamsa_bala_simple, ojayugama_bala, paksha_bala, panapharas, pancha_vargeeya_bala, planet_aspect_relationship_table, sapthavargaja_bala, shad_bala, sthana_bala, subha_rashmi, tribhaga_bala, uccha_rashmi, uchcha_bala, vaara_bala, vaaradhipathi, yuddha_bala.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Strength (bala)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "harsha_bala": {
                      "0": 10,
                      "1": 0,
                      "2": 10,
                      "3": 0,
                      "4": 5,
                      "5": 10,
                      "6": 5
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "asc_house": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "include_houses": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "planet_index": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "use_epoch_table": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "asc_house",
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "harsha_bala"
                ],
                "date_time": "2025-03-27T11:11:24.366Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 2
              }
            }
          }
        }
      }
    },
    "/api/astro/sunrise/": {
      "post": {
        "operationId": "astro_sunrise",
        "summary": "Sunrise and sunset",
        "description": "Sunrise and sunset for a date and place, with the length of the day in seconds. For the moon, use /api/astro/moonrise/.\n\nSend a date, a latitude, a longitude and the UTC offset. Nothing else. The same figures are reachable through /api/astro/celestial/, but only if you know to ask for the SUN by name, to put the rising-convention switch first in the keys array, and to read element zero of a two-element array whose second element is a ten-float ephemeris tuple.\n\nThis uses Hindu rising - upper limb, no refraction - the same convention /api/astro/panchanga/ builds its day from, so sunset minus sunrise here equals that endpoint's day_length to the second. The sunset returned is always the one that follows the sunrise.\n\nEither field can be null: inside a polar day or night the sun does not rise or set, and null says so. /api/astro/celestial/ returns \"2000-11-24T12:00:00Z\" for that case, which is julian day zero rather than an instant.\n\nOne boundary to know: this answers for the CIVIL day you named, while the panchanga day runs sunrise to sunrise. Ask for a moment before sunrise and panchanga is still describing the previous day, so its day_length will differ from the interval here. Both are correct for their own question.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Sunrise & moonrise"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "sunrise": "2026-09-01T06:09:56+05:30",
                    "sunset": "2026-09-01T18:43:30+05:30",
                    "day_length_seconds": 45214
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/tajaka/": {
      "post": {
        "operationId": "astro_tajaka",
        "summary": "Tajika aspects",
        "description": "Tajika is the branch of Indian astrology that absorbed Perso-Arabic technique, and it uses a different aspect scheme from ordinary Vedic drishti. Signs and planets relate to one another by trine, sextile, square, opposition, conjunction and semi-sextile, much as in Western astrology, and each of those is classed benefic, malefic or neutral: trine and sextile are benefic, square, opposition and conjunction malefic, semi-sextile neutral. This endpoint answers aspect questions about a single chart cast for the date, time and place you send.\n\nEvery key works from that one chart, so ask for as many as you need in a single call. The keys ending `_of_the_raasi` take the `raasi` field, a sign index running 0 for Aries to 11 for Pisces; the keys ending `_of_the_planet` take `planet` instead and start from whichever sign that planet occupies. Planet names must be spelled exactly as in the enum (`Sun`, `Moon`, `Mars`, and so on) because the engine looks them up by exact match; a lower-case name is rejected.\n\nThe aspect keys all return a two-element array. The first element is the list of aspected sign indices in the same 0-11 scheme; the second is the planets standing in those signs, given as string ids where '0' is the Sun, '1' the Moon, '2' Mars, '3' Mercury, '4' Jupiter, '5' Venus, '6' Saturn, '7' Rahu and '8' Ketu, with 'L' for the ascendant. Start with `aspects_of_the_planet` if you simply want everything one planet touches, then narrow down to the benefic or malefic subsets.\n\nAvailable `keys` (28), all covered by the same single credit: aspects_of_the_planet, aspects_of_the_raasi, benefic_aspects_of_the_planet, benefic_aspects_of_the_raasi, both_planets_approaching, both_planets_within_their_deeptamsa, conjunction_aspects_of_the_planet, conjunction_aspects_of_the_raasi, malefic_aspects_of_the_planet, malefic_aspects_of_the_raasi, neutral_aspects_of_the_planet, neutral_aspects_of_the_raasi, opposition_aspects_of_the_planet, opposition_aspects_of_the_raasi, planet_aspects_from_chart, planet_has_benefic_aspect_on_house, planet_has_malefic_aspect_on_house, planets_have_aspects, planets_have_benefic_aspects, planets_have_malefic_aspects, planets_have_neutral_aspects, semi_sextile_aspects_of_the_raasi, sextile_aspects_of_the_planet, sextile_aspects_of_the_raasi, square_aspects_of_the_planet, square_aspects_of_the_raasi, trinal_aspects_of_the_planet, trinal_aspects_of_the_raasi.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "trinal_aspects_of_the_raasi": [
                      [
                        4,
                        8
                      ],
                      []
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "house": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Exact lower-case; interpolated into the chart celestial key name.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "Capitalised, e.g. 'Mars' not 'mars'. A lowercase name returns 500.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet1": {
                    "type": "string",
                    "description": "CASE-SENSITIVE, capitalised first letter only ('Mars', not 'mars' or 'MARS'. Confirmed empirically by the shipped catalogue verification results: planet='moon' returns 500 \"'moon' is not in list\" while planet1='Mars' succeeds.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet2": {
                    "type": "string",
                    "description": "CASE-SENSITIVE, capitalised first letter only ('Mars', not 'mars' or 'MARS'. Confirmed empirically by the shipped catalogue verification results: planet='moon' returns 500 \"'moon' is not in list\" while planet1='Mars' succeeds.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "examples": [
                      0
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "house",
                  "keys",
                  "latitude",
                  "longitude",
                  "node",
                  "planet",
                  "planet1",
                  "planet2",
                  "raasi",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "trinal_aspects_of_the_raasi"
                ],
                "raasi": 0,
                "planet": "Moon",
                "planet1": "Mercury",
                "planet2": "Saturn",
                "node": "true",
                "date_time": "2025-02-12T08:55:55.430Z",
                "house": 0,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/tajaka_yoga/": {
      "post": {
        "operationId": "astro_tajaka_yoga",
        "summary": "Tajika yogas",
        "description": "The Tajika yogas are the named planetary relationships used to judge whether a matter will actually come off, and they are the working tools of the annual solar-return chart (Varshaphala) and of horary work. The central pair is ithasala, where two planets are inside each other's orb and the faster one is still applying to the slower, taken as a promise that will be kept, and eesarpha, where the same two are separating, taken as an opportunity already gone. The rest qualify those: nakta and yamaya describe a third planet carrying the connection between two that do not aspect each other, kamboola brings the Moon into an ithasala, manahoo has Mars or Saturn spoiling one, and ishkavala and induvara are whole-chart patterns based on where the planets fall relative to the angles.\n\nThe chart is built from `date_time`, `latitude`, `longitude` and `node`. Keys whose names begin `get_` take no further fields and scan the chart themselves, over the seven classical planets only, so Rahu and Ketu never appear in their output. `ithasala_yoga` and `eesarpha_yoga` take `planet1` and `planet2`; `check_yamaya_yoga` takes `planet` as well.\n\nTwo keys are placeholders in the current build and return null rather than a result: `get_gairi_kamboola_yoga_planet_pairs` and `get_khallasara_yoga_planet_pairs`. Begin with `get_ithasala_yoga_planet_pairs`, which gives you every applying pair in the chart in one call, and use the single-pair keys only when you already know which two planets you care about.\n\nAvailable `keys` (13), all covered by the same single credit: check_yamaya_yoga, eesarpha_yoga, get_eesarpha_yoga_planet_pairs, get_gairi_kamboola_yoga_planet_pairs, get_ithasala_yoga_planet_pairs, get_kamboola_yoga_planet_pairs, get_khallasara_yoga_planet_pairs, get_manahoo_yoga_planet_pairs, get_nakta_yoga_planet_triples, get_yamaya_yoga_planet_triples, induvara_yoga, ishkavala_yoga, ithasala_yoga.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "check_yamaya_yoga": false
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Exact lower-case; interpolated into the chart celestial key name.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "CASE-SENSITIVE, capitalised first letter only ('Mars', not 'mars' or 'MARS'. Confirmed empirically by the shipped catalogue verification results: planet='moon' returns 500 \"'moon' is not in list\" while planet1='Mars' succeeds.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet1": {
                    "type": "string",
                    "description": "Capitalised, e.g. 'Mars' not 'mars'. A lowercase name returns 500.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "planet2": {
                    "type": "string",
                    "description": "Capitalised, e.g. 'Mars' not 'mars'. A lowercase name returns 500.",
                    "enum": [
                      "Sun",
                      "Moon",
                      "Mars",
                      "Mercury",
                      "Jupiter",
                      "Venus",
                      "Saturn",
                      "Rahu",
                      "Ketu"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "keys",
                  "latitude",
                  "longitude",
                  "node",
                  "planet",
                  "planet1",
                  "planet2",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "keys": [
                  "check_yamaya_yoga"
                ],
                "planet": "Pluto",
                "planet1": "Mars",
                "planet2": "Saturn",
                "node": "mean",
                "date_time": "2025-02-12T09:13:52.017Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/tajika/": {
      "post": {
        "operationId": "astro_tajika",
        "summary": "Tajika annual charts",
        "description": "Tajika timing works by re-casting the birth chart for the moment the Sun comes back to a chosen longitude. The annual chart, varshapravesh, is cast for the instant the Sun returns to its exact natal longitude, which is the birthday to the minute rather than to the day; the monthly chart, maasapravesh, advances that longitude by 30 degrees at a time. This endpoint returns those two plus four progressively shorter subdivisions of the same idea, down to charts that change every couple of minutes.\n\n`date_time`, `latitude` and `longitude` are the birth data. `solaryears` and `solarmonths` say how many returns forward to walk. `date_time_target` is the moment the short-period charts must bracket: for each of them the engine steps the natal solar longitude by a fixed increment (2.5 degrees for the sixty-hour chart, 0.208333 for the five-hour, 0.008 for the twenty-five-minute and 0.0007 for the two-minute) and keeps the crossing that falls closest before your target. `degree_increment` drives the general-purpose chart the same way, so you can choose your own subdivision. `notation` picks 'astrological', which reports positions as sign plus degrees, minutes and seconds, or 'degree' for plain decimals.\n\nThe response holds `varshapravesh`, `maasapravesh`, `tajika_chart`, `tajika_sixtyhour`, `tajika_fivehour`, `tajika_twentyfiveminute` and `tajika_twominute`, each a complete Rashi chart with an ascendant and every celestial body carrying longitude, latitude, nakshatra, pada, kakshya, sign and house. The last two are gated behind the booleans `tajika_25min` and `tajika_2min` and come back null unless you ask for them, because each searches hundreds of thousands of solar crossings and is markedly slower than the rest of the call.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"varshapravesh\": {\"celestial\": {\"sun\": {\"longitude\": {\"degree\": 28, \"sign\": \"Li\", \"minutes\": 28, \"seconds\": 22}, \"latitude\": -0.0, \"nakshatra\": \"Visaakha\", \"pada\": 3, \"kakshya\": \"ascendant\", \"zodiac_name\": \"Libra\", \"house\": 12}, \"moon\": {\"longitude\": {\"degree\": 2, \"sign\": \"Cp\", \"minutes\": 2, \"seconds\": 27}, \"latitude\": -2.437, \"nakshatra\": \"Uttaraashaadha\", \"pada\": 2, \"kakshya\": \"saturn\", \"zodiac_name\": \"Capricorn\", \"house\": 3}, \"mercury\": {\"longitude\": {\"degree\": 10, \"sign\": \"Li\", \"minutes\": 58, \"seconds\": 47}, \"latitude\": 2.217, \"nakshatra\": \"Swaati\", \"pada\": 2, \"kakshya\": \"mars\", \"zodiac_name\": \"Libra\", \"house\": 12}, \"venus\": {\"longitude\": {\"degree\": 28, \"sign\": \"Vi\", \"minutes\": 39, \"seconds\": 3}, \"latitude\": -1.417, \"nakshatra\": \"Chitra\", \"pada\": 2, \"kakshya\": \"ascendant\", \"zodiac_name\": \"Virgo\", \"house\": 11}, \"mars\": {\"longitude\": {\"degree\": 1, \"sign\": \"Le\", \"minutes\": 7, \"seconds\": 15}, \"latitude\": 1.912, \"nakshatra\": \"Makha\", \"pada\": 1, \"kakshya\": \"saturn\", \"zodiac_name\": \"Leo\", \"house\": 10}, \"jupiter\": {\"longitude\": {\"degree\": 1, \"sign\": \"Le\", \"minutes\": 33, \"seconds\": 14}, \"latitude\": 0.74, \"nakshatra\": \"Makha\", \"pada\": 1, \"kakshya\": \"saturn\", \"zodiac_name\": \"Leo\", \"house\": 10}, \"saturn\": {\"longitude\": {\"degree\": 14, \"sign\": \"Pi\", \"minutes\": 17, \"seconds\": 20}, \"latitude\": -2.645, \"nakshatra\": \"Uttaraabhaadra\", \"pada\": 4, \"kakshya\": \"sun\", \"zodiac_name\": \"Pisces\", \"house\": 5}, \"uranus\": {\"longitude\": {\"degree\": 9, \"sign\": \"Ta\", \"minutes\": 53, \"seconds\": 34}, \"latitude\": -0.15, \"nakshatra\": \"Krittika\", \"pada\": 4, \"kakshya\": \"mars\", \"zodiac_name\": \"Taurus\", \"house\": 7}, \"neptune\": {\"longitude\": {\"degree\": 7, \"sign\": \"Pi\", \"minutes\": 35, \"seconds\": 38}, \"latitude\": -1.408, \"nakshatra\": \"Uttaraabhaadra\", \"pada\": 2, \"kakshya\": \"mars\", \"zodiac_name\": \"Pisces\", \"house\": 5}, \"pluto\": {\"longitude\": {\"degree\": 9, \"sign\": \"Cp\", \"minutes\": 2, \"seconds\": 45}, \"latitude\": -4.263, \"nakshatra\": \"Uttaraashaadha\", \"pada\": 4, \"kakshya\": \"mars\", \"zodiac_name\": \"Capricorn\", \"house\": 3}, \"northtruenode\": {\"longitude\": {\"degree\": 0, \"sign\": \"Aq\", \"minutes\": 57, \"seconds\": 3}, \"latitude\": 0.0, \"nakshatra\": \"Dhanishtha\", \"pada\": 3, \"kakshya\": \"saturn\", \"zodiac_name\": \"Aquarius\", \"house\": 4}, \"northmeannode\": {\"longitude\": {\"degree\": 1, \"sign\": \"Aq\", \"minutes\": 5, \"seconds\": 34}, \"latitude\": 0.0, \"nakshatra\": \"Dhanishtha\", \"pada\": 3, \"kakshya\": \"saturn\", \"zodiac_name\": \"Aquarius\", \"house\": 4}, \"southtruenode\": {\"longitude\": {\"degree\": 0, \"sign\": \"Le\", \"minutes\": 57, \"seconds\": 3}, \"latitude\": 0.0, \"nakshatra\": \"Makha\", \"pada\": 1, \"kakshya\": \"saturn\", \"zodiac_name\": \"Leo\", \"house\": 10}, \"southmeannode\": {\"longitude\": {\"degree\": 1, \"sign\": \"Le\", \"minutes\": 5, \"seconds\": 34}, \"latitude\": 0.0, \"nakshatra\": \"Makha\", \"pada\": 1, \"kakshya\": \"saturn\", \"zodiac_name\": \"Leo\", \"house\": 10}}, \"houses\": {\"1\": {\"start\": \"18 Li 58 40\", \"cusp\": \"3 Sc 58 40\", \"end\": \"18 Sc 58 40\"}, \"2\": {\"start\": \"18 Sc 58 40\", \"cusp\": \"3 Sg 58 40\", \"end\": \"18 Sg 58 40\"}, \"3\": {\"start\": \"18 Sg 58 40\", \"cusp\": \"3 Cp 58 40\", \"end\": \"18 Cp 58 40\"}, \"4\": {\"start\": \"18 Cp 58 40\", \"cusp\": \"3 Aq 58 40\", \"end\": \"18 Aq 58 40\"}, \"5\": {\"start\": \"18 Aq 58 40\", \"cusp\": \"3 Pi 58 40\", \"end\": \"18 Pi 58 40\"}, \"6\": {\"start\": \"18 Pi 58 40\", \"cusp\": \"3 Ar 58 40\", \"end\": \"18 Ar 58 40\"}, \"7\": {\"start\": \"18 Ar 58 40\", \"cusp\": \"3 Ta 58 40\", \"end\": \"18 Ta 58 40\"}, \"8\": {\"start\": \"18 Ta 58 40\", \"cusp\": \"3 Ge 58 40\", \"end\": \"18 Ge 58 40\"}, \"9\": {\"start\": \"18 Ge 58 40\", \"cusp\": \"3 Cn 58 40\", \"end\": \"18 Cn 58 40\"}, \"10\": {\"start\": \"18 Cn 58 40\", \"cusp\": \"3 Le 58 40\", \"end\": \"18 Le 58 40\"}, \"11\": {\"start\": \"18 Le 58 40\", \"cusp\": \"3 Vi 58 40\", \"end\": \"18 Vi 58 40\"}, \"12\": {\"start\": \"18 Vi 58 40\", \"cusp\": \"3 Li 58 40\", \"end\": \"18 Li 58 40\"}}, \"ascendant\": {\"longitude\": {\"degree\": 3, \"sign\": \"Sc\", \"minutes\": 58, \"seconds\": 40}, \"zodiac_name\": \"Scorpio\", \"nakshatra\": \"Anooraadha\", \"pada\": 1}}, \"maasapravesh\": {\"celestial\": {\"sun\": {\"longitude\": {\"degree\": 28, \"sign\": \"Sc\", \"minutes\": 28, \"seconds\": 22}"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "date_time_target": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degree_increment": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "description": "Forwarded to all seven tajika calculations at.",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "solarmonths": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "solaryears": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "tajika_25min": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "tajika_2min": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "date_time_target",
                  "degree_increment",
                  "latitude",
                  "longitude",
                  "name",
                  "notation",
                  "solarmonths",
                  "solaryears",
                  "tajika_25min",
                  "tajika_2min"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2024-11-14T13:38:12.924Z",
                "longitude": 74.319,
                "latitude": 26.1046,
                "name": "RashiChart",
                "solarmonths": 1,
                "solaryears": 2,
                "degree_increment": 1.5,
                "date_time_target": "2024-12-14T13:38:12.924Z",
                "tajika_25min": true,
                "tajika_2min": false,
                "notation": "astrological"
              }
            }
          }
        }
      }
    },
    "/api/astro/tajika/aspects/": {
      "post": {
        "operationId": "astro_tajika_aspects",
        "summary": "Tajika aspects",
        "description": "Every Tajika aspect to one sign and one planet, in a single call.\n\nTajika — the Persian-derived branch used for varshaphala, the annual chart — reads aspects by ANGLE the way Western astrology does, rather than by the whole-sign drishti of parashari astrology. Conjunction, semi-sextile, sextile, square, trine and opposition are each returned as the signs that make them, spelled out by name, alongside the tradition's own benefic / malefic / neutral grouping of the same set.\n\nAlso returned: whether your chosen pair of planets is inside its deeptamsa — the orb within which a Tajika aspect is held to actually operate — and whether the two are applying or separating. That last distinction is what separates an ithasala from an eesarpha, and so is the question most Tajika readings turn on.\n\nTwenty-seven engine keys for one credit. Reaching the same answers through /api/astro/tajaka/ costs a credit per call, requires you to supply a raasi, a planet, two more planets, a node and a house on every request whichever key you wanted, and returns unlabelled positional arrays whose sign indices are zero-based — so reading index 4 as Taurus rather than Leo gives a confident wrong answer. Here every field defaults and every index is named.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "focus": {
                      "raasi": 0,
                      "raasi_name": "Aries",
                      "planet": "Moon",
                      "house": 0
                    },
                    "by_angle": {
                      "conjunction": {
                        "from_raasi": {
                          "raasis": [
                            0
                          ],
                          "raasi_names": [
                            "Aries"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        },
                        "from_planet": {
                          "raasis": [
                            0
                          ],
                          "raasi_names": [
                            "Aries"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        }
                      },
                      "semi_sextile": {
                        "from_raasi": {
                          "raasis": [
                            1,
                            11
                          ],
                          "raasi_names": [
                            "Taurus",
                            "Pisces"
                          ],
                          "points": []
                        }
                      },
                      "sextile": {
                        "from_raasi": {
                          "raasis": [
                            2,
                            10
                          ],
                          "raasi_names": [
                            "Gemini",
                            "Aquarius"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            2,
                            10
                          ],
                          "raasi_names": [
                            "Gemini",
                            "Aquarius"
                          ],
                          "points": []
                        }
                      },
                      "square": {
                        "from_raasi": {
                          "raasis": [
                            3,
                            9
                          ],
                          "raasi_names": [
                            "Cancer",
                            "Capricorn"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            3,
                            9
                          ],
                          "raasi_names": [
                            "Cancer",
                            "Capricorn"
                          ],
                          "points": []
                        }
                      },
                      "trine": {
                        "from_raasi": {
                          "raasis": [
                            4,
                            8
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            4,
                            8
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius"
                          ],
                          "points": []
                        }
                      },
                      "opposition": {
                        "from_raasi": {
                          "raasis": [
                            6
                          ],
                          "raasi_names": [
                            "Libra"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            6
                          ],
                          "raasi_names": [
                            "Libra"
                          ],
                          "points": []
                        }
                      }
                    },
                    "by_nature": {
                      "benefic": {
                        "from_raasi": {
                          "raasis": [
                            4,
                            8,
                            2,
                            10
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius",
                            "Gemini",
                            "Aquarius"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            4,
                            8,
                            2,
                            10
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius",
                            "Gemini",
                            "Aquarius"
                          ],
                          "points": []
                        }
                      },
                      "malefic": {
                        "from_raasi": {
                          "raasis": [
                            3,
                            9,
                            0,
                            6
                          ],
                          "raasi_names": [
                            "Cancer",
                            "Capricorn",
                            "Aries",
                            "Libra"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        },
                        "from_planet": {
                          "raasis": [
                            3,
                            9,
                            0,
                            6
                          ],
                          "raasi_names": [
                            "Cancer",
                            "Capricorn",
                            "Aries",
                            "Libra"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        }
                      },
                      "neutral": {
                        "from_raasi": {
                          "raasis": [
                            1,
                            11
                          ],
                          "raasi_names": [
                            "Taurus",
                            "Pisces"
                          ],
                          "points": []
                        },
                        "from_planet": {
                          "raasis": [
                            1,
                            11
                          ],
                          "raasi_names": [
                            "Taurus",
                            "Pisces"
                          ],
                          "points": []
                        }
                      },
                      "all": {
                        "from_raasi": {
                          "raasis": [
                            4,
                            8,
                            2,
                            10,
                            3,
                            9,
                            0,
                            6,
                            1,
                            11
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius",
                            "Gemini",
                            "Aquarius",
                            "Cancer",
                            "Capricorn",
                            "Aries",
                            "Libra",
                            "Taurus",
                            "Pisces"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        },
                        "from_planet": {
                          "raasis": [
                            4,
                            8,
                            2,
                            10,
                            3,
                            9,
                            0,
                            6,
                            1,
                            11
                          ],
                          "raasi_names": [
                            "Leo",
                            "Sagittarius",
                            "Gemini",
                            "Aquarius",
                            "Cancer",
                            "Capricorn",
                            "Aries",
                            "Libra",
                            "Taurus",
                            "Pisces"
                          ],
                          "points": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "L",
                            "7",
                            "8"
                          ]
                        }
                      }
                    },
                    "chart_aspects": {
                      "0": [],
                      "1": [],
                      "2": [],
                      "3": [],
                      "4": [],
                      "5": [],
                      "6": [],
                      "7": [],
                      "8": []
                    },
                    "house_test": {
                      "house": 0,
                      "has_benefic_aspect": false,
                      "has_malefic_aspect": true
                    },
                    "pair": {
                      "planets": [
                        "Mercury",
                        "Saturn"
                      ],
                      "within_deeptamsa": [
                        false,
                        null
                      ],
                      "approaching": true,
                      "has_benefic_aspect": false,
                      "has_malefic_aspect": false,
                      "has_neutral_aspect": false
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "house": {
                    "type": "integer",
                    "description": "House to test for benefic/malefic aspect, zero-based.",
                    "minimum": 0,
                    "maximum": 11,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "description": "The planet whose aspects are read.",
                    "default": "Moon",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet1": {
                    "type": "string",
                    "default": "Mercury",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet2": {
                    "type": "string",
                    "description": "planet1 and planet2 are the PAIR tested for deeptamsa and approach; they do not affect the aspect lists.",
                    "default": "Saturn",
                    "examples": [
                      "string"
                    ]
                  },
                  "raasi": {
                    "type": "integer",
                    "description": "Sign to read aspects to, ZERO-BASED: 0 is Aries, 11 Pisces.",
                    "minimum": 0,
                    "maximum": 11,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "raasi": 0,
                "planet": "Moon",
                "planet1": "Mercury",
                "planet2": "Saturn"
              }
            }
          }
        }
      }
    },
    "/api/astro/tajika/yogas/": {
      "post": {
        "operationId": "astro_tajika_yogas",
        "summary": "Tajika yogas",
        "description": "The thirteen Tajika yogas, as named results rather than thirteen keys.\n\nThese are the combinations varshaphala is actually judged by. Ithasala — an applying aspect between the relevant lords, the promise of a thing coming about — and eesarpha — a separating one, the promise lapsing — are the two a reading usually turns on; the rest qualify them.\n\nEach yoga reports whether it is present, keeping whatever detail the engine attaches to it, and the pair- and triple-finding results are grouped separately because those answer which planets rather than whether.\n\nAs with /api/astro/tajika/aspects/, the parent requires a planet and two more planets and a node on every call regardless of which yoga you asked for. Here they default.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tajika & varshaphala"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": {
                      "planet": "Moon",
                      "pair": [
                        "Mars",
                        "Saturn"
                      ]
                    },
                    "yogas": {
                      "ishkavala": {
                        "present": true
                      },
                      "induvara": {
                        "present": false
                      },
                      "ithasala": {
                        "present": false,
                        "detail": [
                          1
                        ]
                      },
                      "eesarpha": {
                        "present": false
                      },
                      "yamaya": {
                        "present": false
                      }
                    },
                    "combinations": {
                      "nakta_triples": [],
                      "yamaya_triples": [],
                      "ithasala_pairs": [],
                      "eesarpha_pairs": [],
                      "manahoo_pairs": [],
                      "kamboola_pairs": [
                        false,
                        [],
                        []
                      ],
                      "gairi_kamboola_pairs": null,
                      "khallasara_pairs": null
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "node": {
                    "type": "string",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "default": "Moon",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet1": {
                    "type": "string",
                    "default": "Mars",
                    "examples": [
                      "string"
                    ]
                  },
                  "planet2": {
                    "type": "string",
                    "default": "Saturn",
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "planet": "Moon",
                "planet1": "Mars",
                "planet2": "Saturn"
              }
            }
          }
        }
      }
    },
    "/api/astro/tamil_calendar/": {
      "post": {
        "operationId": "astro_tamil_calendar",
        "summary": "Tamil calendar",
        "description": "The Tamil calendar is solar rather than lunar, and that is what separates it from most of the other regional calendars here. A month begins the moment the Sun enters a new sidereal sign, so the twelve months (Chithirai, Vaikasi, Aani, Aadi, Aavani, Purattasi, Aippasi, Karthigai, Margazhi, Thai, Maasi and Panguni) follow the Sun's position and start on roughly the same Gregorian dates each year, with Chithirai opening the year around 14 April. Day one of a month is fixed by the sunset rule: if the Sun's ingress falls between sunrise and sunset, that civil day is day one, and if it falls after sunset the following day is. The Telugu, Marathi, Gujarati and Kannada calendars, by contrast, count months from a new or full Moon.\n\nPost a `year` together with `latitude`, `longitude` and `timezone_as_float`. The sunrise and sunset that resolve each observance are computed for those coordinates, so an event can shift by a day if you change location. The response is `{year, events}`, where each event is `{name, date, tamil_month, tamil_day}` — the Gregorian date plus the position within the Tamil month — covering the whole Gregorian year. Pongal, Puthandu, Thai Pusam, Masi Magam, Panguni Uthiram, Aadi Perukku, Karadaiyan Nombu, Ayutha Poojai and the rest appear under their Tamil names.\n\nA number of these festivals are the same lunar tithi the main Hindu festival engine computes, looked up under a Tamil name and then resolved to its own observance rule (sunrise, madhyahna, aparahna, nishita, pradosha or purvahna). Those come from the precomputed festival table and so limit this endpoint to the years 2006-2046. A few entries are deliberately left out rather than guessed, among them Agni Nakshatram, the three Veda-specific Avani Avittam dates, Gayathri Japam and Agastya Arghya.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "events": [
                      {
                        "name": "Arudra Darshan",
                        "date": "2026-01-03",
                        "tamil_month": "Margazhi",
                        "tamil_day": 19
                      },
                      {
                        "name": "Bhogi Pandigai",
                        "date": "2026-01-13",
                        "tamil_month": "Margazhi",
                        "tamil_day": 29
                      },
                      {
                        "name": "Pongal",
                        "date": "2026-01-14",
                        "tamil_month": "Thai",
                        "tamil_day": 1
                      },
                      {
                        "name": "Mattu Pongal",
                        "date": "2026-01-15",
                        "tamil_month": "Thai",
                        "tamil_day": 2
                      },
                      {
                        "name": "Thai Amavasai",
                        "date": "2026-01-18",
                        "tamil_month": "Thai",
                        "tamil_day": 5
                      },
                      {
                        "name": "Ratha Sapthami",
                        "date": "2026-01-25",
                        "tamil_month": "Thai",
                        "tamil_day": 12
                      },
                      {
                        "name": "Thai Pusam",
                        "date": "2026-02-01",
                        "tamil_month": "Thai",
                        "tamil_day": 19
                      },
                      {
                        "name": "Shivaratri",
                        "date": "2026-02-15",
                        "tamil_month": "Maasi",
                        "tamil_day": 3
                      },
                      {
                        "name": "Masi Magam",
                        "date": "2026-03-03",
                        "tamil_month": "Maasi",
                        "tamil_day": 19
                      },
                      {
                        "name": "Karadaiyan Nombu",
                        "date": "2026-03-14",
                        "tamil_month": "Maasi",
                        "tamil_day": 30
                      },
                      {
                        "name": "Ugadi - Telugu New Year",
                        "date": "2026-03-19",
                        "tamil_month": "Panguni",
                        "tamil_day": 5
                      },
                      {
                        "name": "Rama Navami *Smarta",
                        "date": "2026-03-26",
                        "tamil_month": "Panguni",
                        "tamil_day": 12
                      },
                      {
                        "name": "Panguni Uthiram",
                        "date": "2026-04-01",
                        "tamil_month": "Panguni",
                        "tamil_day": 18
                      },
                      {
                        "name": "Puthandu",
                        "date": "2026-04-14",
                        "tamil_month": "Chithirai",
                        "tamil_day": 1
                      },
                      {
                        "name": "Vishu",
                        "date": "2026-04-15",
                        "tamil_month": "Chithirai",
                        "tamil_day": 2
                      },
                      {
                        "name": "Akshaya Thiruthiyai",
                        "date": "2026-04-19",
                        "tamil_month": "Chithirai",
                        "tamil_day": 6
                      },
                      {
                        "name": "Sankara Jayanthi",
                        "date": "2026-04-21",
                        "tamil_month": "Chithirai",
                        "tamil_day": 8
                      },
                      {
                        "name": "Ramanuja Jayanthi",
                        "date": "2026-04-22",
                        "tamil_month": "Chithirai",
                        "tamil_day": 9
                      },
                      {
                        "name": "Chitra Pournami",
                        "date": "2026-05-01",
                        "tamil_month": "Chithirai",
                        "tamil_day": 18
                      },
                      {
                        "name": "Vaikasi Visakam",
                        "date": "2026-05-30",
                        "tamil_month": "Vaikasi",
                        "tamil_day": 16
                      },
                      {
                        "name": "Aadi Perukku",
                        "date": "2026-08-03",
                        "tamil_month": "Aadi",
                        "tamil_day": 18
                      },
                      {
                        "name": "Aadi Amavasai",
                        "date": "2026-08-12",
                        "tamil_month": "Aadi",
                        "tamil_day": 27
                      },
                      {
                        "name": "Andal Jayanthi",
                        "date": "2026-08-14",
                        "tamil_month": "Aadi",
                        "tamil_day": 29
                      },
                      {
                        "name": "Gokulastami",
                        "date": "2026-09-04",
                        "tamil_month": "Aavani",
                        "tamil_day": 19
                      },
                      {
                        "name": "Astami Rohini",
                        "date": "2026-09-04",
                        "tamil_month": "Aavani",
                        "tamil_day": 19
                      },
                      {
                        "name": "Vinayagar Chathurthi",
                        "date": "2026-09-14",
                        "tamil_month": "Aavani",
                        "tamil_day": 29
                      },
                      {
                        "name": "Mahalaya Amavasai",
                        "date": "2026-10-10",
                        "tamil_month": "Purattasi",
                        "tamil_day": 24
                      },
                      {
                        "name": "Navarathiri",
                        "date": "2026-10-11",
                        "tamil_month": "Purattasi",
                        "tamil_day": 25
                      },
                      {
                        "name": "Ayutha Poojai",
                        "date": "2026-10-20",
                        "tamil_month": "Aippasi",
                        "tamil_day": 3
                      },
                      {
                        "name": "Saraswati Poojai",
                        "date": "2026-10-20",
                        "tamil_month": "Aippasi",
                        "tamil_day": 3
                      },
                      {
                        "name": "Vijaya Dashami",
                        "date": "2026-10-20",
                        "tamil_month": "Aippasi",
                        "tamil_day": 3
                      },
                      {
                        "name": "Vidyarambham",
                        "date": "2026-10-21",
                        "tamil_month": "Aippasi",
                        "tamil_day": 4
                      },
                      {
                        "name": "Lakshmi Puja",
                        "date": "2026-11-08",
                        "tamil_month": "Aippasi",
                        "tamil_day": 22
                      },
                      {
                        "name": "Kedara Gowri Vratham",
                        "date": "2026-11-08",
                        "tamil_month": "Aippasi",
                        "tamil_day": 22
                      },
                      {
                        "name": "Deepavali",
                        "date": "2026-11-08",
                        "tamil_month": "Aippasi",
                        "tamil_day": 22
                      },
                      {
                        "name": "Karthigai Deepam",
                        "date": "2026-11-24",
                        "tamil_month": "Karthigai",
                        "tamil_day": 8
                      },
                      {
                        "name": "Subrahmanya Sashti",
                        "date": "2026-12-15",
                        "tamil_month": "Karthigai",
                        "tamil_day": 29
                      },
                      {
                        "name": "Vaikuntha Ekadashi",
                        "date": "2026-12-20",
                        "tamil_month": "Margazhi",
                        "tamil_day": 5
                      },
                      {
                        "name": "Arudra Darshan",
                        "date": "2026-12-24",
                        "tamil_month": "Margazhi",
                        "tamil_day": 9
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/tarabala/": {
      "post": {
        "operationId": "astro_tarabala",
        "summary": "Tarabala",
        "description": "Tara bala: which of the twenty-seven birth nakshatras are well placed against the nakshatra the Moon is transiting.\n\nReturns the favourable nakshatras grouped by tier along with when the assessment stops being valid - the Moon changes nakshatra roughly every day, so this is a same-day answer. Use it to tell a user with a known birth nakshatra whether today favours them.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "tarabala": {
                      "good_nakshatras": [
                        "Bharani",
                        "Krittika",
                        "Mrigashira",
                        "Punarvasu",
                        "Ashlesha",
                        "Purva Phalguni",
                        "Uttara Phalguni",
                        "Chitra",
                        "Vishakha",
                        "Jyeshtha",
                        "Purva Ashadha",
                        "Uttara Ashadha",
                        "Dhanishtha",
                        "Purva Bhadrapada",
                        "Revati"
                      ],
                      "valid_until": "2026-08-31T21:53:59.999999Z",
                      "good_nakshatras_tier2": [
                        "Bharani",
                        "Krittika",
                        "Mrigashira",
                        "Punarvasu",
                        "Ashlesha",
                        "Purva Phalguni",
                        "Uttara Phalguni",
                        "Chitra",
                        "Vishakha",
                        "Jyeshtha",
                        "Purva Ashadha",
                        "Uttara Ashadha",
                        "Dhanishtha",
                        "Purva Bhadrapada",
                        "Revati"
                      ],
                      "tier2_valid_until": "2026-09-01T06:09:56+05:30"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/tarot/deck/": {
      "post": {
        "operationId": "astro_tarot_deck",
        "summary": "Tarot deck reference",
        "description": "The whole deck, and every spread, as reference data.\n\nAll seventy-eight cards — twenty-two major arcana and four suits of fourteen — each with its suit, element, number and the keywords for both orientations. Also every spread with its position labels, which is the only way to discover what `spread` accepts.\n\nExists so a client can render a card it has drawn without keeping its own copy of the deck and letting the two drift apart.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tarot"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"deck\": \"Rider-Waite-Smith\", \"arcana\": \"both\", \"suit\": \"all\", \"count\": 78, \"deck_size\": 78, \"suits\": [{\"suit\": \"Wands\", \"element\": \"fire\", \"covers\": \"action, ambition, creativity, drive\"}, {\"suit\": \"Cups\", \"element\": \"water\", \"covers\": \"emotion, relationship, intuition, the inner life\"}, {\"suit\": \"Swords\", \"element\": \"air\", \"covers\": \"thought, conflict, truth, communication\"}, {\"suit\": \"Pentacles\", \"element\": \"earth\", \"covers\": \"work, money, the body, the material world\"}], \"ranks\": [\"Ace\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\", \"Ten\", \"Page\", \"Knight\", \"Queen\", \"King\"], \"cards\": [{\"id\": 0, \"name\": \"The Fool\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 0, \"element\": null, \"upright\": \"beginnings, innocence, spontaneity, a leap taken\", \"reversed\": \"naivety, recklessness, a risk not thought through\"}, {\"id\": 1, \"name\": \"The Magician\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 1, \"element\": null, \"upright\": \"manifestation, resourcefulness, power, focused will\", \"reversed\": \"manipulation, untapped talent, scattered effort\"}, {\"id\": 2, \"name\": \"The High Priestess\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 2, \"element\": null, \"upright\": \"intuition, mystery, the inner voice, patience\", \"reversed\": \"secrets withheld, disconnection from instinct\"}, {\"id\": 3, \"name\": \"The Empress\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 3, \"element\": null, \"upright\": \"abundance, nurturing, fertility, creation\", \"reversed\": \"dependence, smothering, creative block\"}, {\"id\": 4, \"name\": \"The Emperor\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 4, \"element\": null, \"upright\": \"authority, structure, control, established order\", \"reversed\": \"domination, rigidity, authority misused\"}, {\"id\": 5, \"name\": \"The Hierophant\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 5, \"element\": null, \"upright\": \"tradition, institutions, guidance, orthodoxy\", \"reversed\": \"rebellion, dogma questioned, going your own way\"}, {\"id\": 6, \"name\": \"The Lovers\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 6, \"element\": null, \"upright\": \"union, choice, alignment of values\", \"reversed\": \"disharmony, misalignment, a choice avoided\"}, {\"id\": 7, \"name\": \"The Chariot\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 7, \"element\": null, \"upright\": \"determination, momentum, willpower, control held\", \"reversed\": \"lack of direction, aggression, momentum lost\"}, {\"id\": 8, \"name\": \"Strength\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 8, \"element\": null, \"upright\": \"courage, patience, gentle power, self-mastery\", \"reversed\": \"self-doubt, force misapplied, inner weakness\"}, {\"id\": 9, \"name\": \"The Hermit\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 9, \"element\": null, \"upright\": \"introspection, solitude, the search, inner guidance\", \"reversed\": \"isolation, withdrawal, refusing counsel\"}, {\"id\": 10, \"name\": \"Wheel of Fortune\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 10, \"element\": null, \"upright\": \"luck, cycles, a turning point, fate moving\", \"reversed\": \"bad luck, resistance to change, a cycle repeating\"}, {\"id\": 11, \"name\": \"Justice\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 11, \"element\": null, \"upright\": \"fairness, truth, cause and effect, accountability\", \"reversed\": \"unfairness, dishonesty, consequences dodged\"}, {\"id\": 12, \"name\": \"The Hanged Man\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 12, \"element\": null, \"upright\": \"pause, surrender, a new perspective, suspension\", \"reversed\": \"stalling, indecision, delay without purpose\"}, {\"id\": 13, \"name\": \"Death\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 13, \"element\": null, \"upright\": \"endings, transformation, transition, what must go\", \"reversed\": \"resistance to change, stagnation, holding on\"}, {\"id\": 14, \"name\": \"Temperance\", \"arcana\": \"major\", \"suit\": null, \"rank\": null, \"number\": 14, \"element\": null, \"upright\": \"b"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "arcana": {
                    "type": "string",
                    "description": "Narrow the listing. The twenty-two major arcana are often wanted on their own — some readers work with them alone.",
                    "enum": [
                      "both",
                      "major",
                      "minor"
                    ],
                    "default": "both",
                    "examples": [
                      "both"
                    ]
                  },
                  "suit": {
                    "type": "string",
                    "description": "Return only one suit. Ignored when arcana is 'major'.",
                    "enum": [
                      "all",
                      "Wands",
                      "Cups",
                      "Swords",
                      "Pentacles"
                    ],
                    "default": "all",
                    "examples": [
                      "all"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "arcana": "both",
                "suit": "all"
              }
            }
          }
        }
      }
    },
    "/api/astro/tarot/draw/": {
      "post": {
        "operationId": "astro_tarot_draw",
        "summary": "Tarot draw",
        "description": "Draw cards from a shuffled seventy-eight card Rider-Waite-Smith deck.\n\nCards are drawn without replacement, so a draw never repeats one. Each comes back with its arcana, suit, rank, number, orientation and the standard keywords for the way it landed.\n\nEvery response carries the `seed` that produced it, and sending that seed back reproduces the draw exactly — same cards, same order, same way up. Omit it and one is generated and returned, so a fresh draw is the default and repeating it afterwards is always possible. This is what lets a client store a reading and show it again rather than handing the querent a different answer to the same question.\n\n`allow_reversed` and `reversal_chance` are there because readers differ: some work upright-only, some reverse about half the deck, some far less.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tarot"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "question": "What should I focus on this month?",
                    "seed": "sample-draw",
                    "reproducible": "Send this seed back to get exactly this draw again.",
                    "deck": "Rider-Waite-Smith, 78 cards",
                    "reversals_allowed": true,
                    "cards": [
                      {
                        "position": 1,
                        "id": 50,
                        "name": "Ace of Swords",
                        "arcana": "minor",
                        "suit": "Swords",
                        "rank": "Ace",
                        "number": 1,
                        "element": "air",
                        "upright": "clarity, breakthrough, truth cutting through",
                        "reversed": "confusion, a truth misused",
                        "orientation": "reversed",
                        "meaning": "confusion, a truth misused",
                        "yes_no": "no"
                      },
                      {
                        "position": 2,
                        "id": 32,
                        "name": "Page of Wands",
                        "arcana": "minor",
                        "suit": "Wands",
                        "rank": "Page",
                        "number": 11,
                        "element": "fire",
                        "upright": "curiosity, an idea, enthusiasm",
                        "reversed": "unfocused energy, an idea unformed",
                        "orientation": "reversed",
                        "meaning": "unfocused energy, an idea unformed",
                        "yes_no": "no"
                      },
                      {
                        "position": 3,
                        "id": 31,
                        "name": "Ten of Wands",
                        "arcana": "minor",
                        "suit": "Wands",
                        "rank": "Ten",
                        "number": 10,
                        "element": "fire",
                        "upright": "burden, overload, carrying too much",
                        "reversed": "putting a load down, delegation",
                        "orientation": "upright",
                        "meaning": "burden, overload, carrying too much",
                        "yes_no": "no"
                      }
                    ],
                    "count": 3
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "allow_reversed": {
                    "type": "boolean",
                    "description": "Whether cards can come up reversed. Some readers work upright-only.",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "count": {
                    "type": "integer",
                    "description": "How many cards to draw, at most 21. Cards are drawn without replacement, so none can repeat.",
                    "minimum": 1,
                    "maximum": 21,
                    "default": 3,
                    "examples": [
                      1
                    ]
                  },
                  "question": {
                    "type": "string",
                    "description": "Optional. Echoed back, and folded into a generated seed.",
                    "examples": [
                      "string"
                    ]
                  },
                  "reversal_chance": {
                    "type": "number",
                    "format": "double",
                    "description": "Probability of a reversal, when reversals are allowed.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5,
                    "examples": [
                      0
                    ]
                  },
                  "seed": {
                    "type": "string",
                    "description": "Send a seed to reproduce a draw exactly. Omit it and one is generated and returned, so any draw can be repeated afterwards.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "question": "What should I focus on this month?",
                "count": 3,
                "seed": "sample-draw"
              }
            }
          }
        }
      }
    },
    "/api/astro/tarot/spread/": {
      "post": {
        "operationId": "astro_tarot_spread",
        "summary": "Tarot spread",
        "description": "A named spread with every position labelled.\n\nSix layouts, from a single card to the ten-card Celtic Cross — also past/present/future, situation/action/outcome, a five-card relationship spread and the seven-card horseshoe.\n\nThe labels are the point. Three unlabelled cards are three cards; \"Past, Present, Future\" is a reading. Each card comes back with the position it fell in and what that position stands for.\n\nEvery response carries the `seed` that produced it, and sending that seed back reproduces the draw exactly — same cards, same order, same way up. Omit it and one is generated and returned, so a fresh draw is the default and repeating it afterwards is always possible. This is what lets a client store a reading and show it again rather than handing the querent a different answer to the same question.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tarot"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "question": "How is this relationship placed?",
                    "seed": "sample-spread",
                    "reproducible": "Send this seed back to get exactly this draw again.",
                    "deck": "Rider-Waite-Smith, 78 cards",
                    "reversals_allowed": true,
                    "cards": [
                      {
                        "position": 1,
                        "id": 51,
                        "name": "Two of Swords",
                        "arcana": "minor",
                        "suit": "Swords",
                        "rank": "Two",
                        "number": 2,
                        "element": "air",
                        "upright": "stalemate, a decision deferred, blindfolded",
                        "reversed": "the blindfold lifted, deciding",
                        "orientation": "upright",
                        "meaning": "stalemate, a decision deferred, blindfolded",
                        "yes_no": "maybe",
                        "position_name": "Past"
                      },
                      {
                        "position": 2,
                        "id": 59,
                        "name": "Ten of Swords",
                        "arcana": "minor",
                        "suit": "Swords",
                        "rank": "Ten",
                        "number": 10,
                        "element": "air",
                        "upright": "an ending, rock bottom, the worst passed",
                        "reversed": "recovery, the only way is up",
                        "orientation": "reversed",
                        "meaning": "recovery, the only way is up",
                        "yes_no": "yes",
                        "position_name": "Present"
                      },
                      {
                        "position": 3,
                        "id": 30,
                        "name": "Nine of Wands",
                        "arcana": "minor",
                        "suit": "Wands",
                        "rank": "Nine",
                        "number": 9,
                        "element": "fire",
                        "upright": "resilience, the last stretch, guarded",
                        "reversed": "exhaustion, defensiveness",
                        "orientation": "upright",
                        "meaning": "resilience, the last stretch, guarded",
                        "yes_no": "maybe",
                        "position_name": "Future"
                      }
                    ],
                    "spread": "three_card",
                    "spread_name": "Past, present, future",
                    "positions": [
                      "Past",
                      "Present",
                      "Future"
                    ],
                    "count": 3
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "allow_reversed": {
                    "type": "boolean",
                    "description": "Whether cards can come up reversed. Some readers work upright-only.",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "question": {
                    "type": "string",
                    "description": "Optional. Echoed back, and folded into a generated seed.",
                    "examples": [
                      "string"
                    ]
                  },
                  "reversal_chance": {
                    "type": "number",
                    "format": "double",
                    "description": "Probability of a reversal, when reversals are allowed.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5,
                    "examples": [
                      0
                    ]
                  },
                  "seed": {
                    "type": "string",
                    "description": "Send a seed to reproduce a draw exactly. Omit it and one is generated and returned, so any draw can be repeated afterwards.",
                    "examples": [
                      "string"
                    ]
                  },
                  "spread": {
                    "type": "string",
                    "description": "Which named spread to lay out.",
                    "enum": [
                      "celtic_cross",
                      "horseshoe",
                      "one_card",
                      "relationship",
                      "situation",
                      "three_card"
                    ],
                    "default": "three_card",
                    "examples": [
                      "celtic_cross"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "question": "How is this relationship placed?",
                "spread": "three_card",
                "seed": "sample-spread"
              }
            }
          }
        }
      }
    },
    "/api/astro/tarot/yes-no/": {
      "post": {
        "operationId": "astro_tarot_yes_no",
        "summary": "Tarot yes or no",
        "description": "One card drawn against a question, read as yes, no or maybe.\n\nHow the answer is decided is stated rather than left implicit, because conventions differ between readers and a bare \"yes\" hides which one produced it. Each card carries a traditional leaning — the Sun and the Ace of Cups lean yes, the Tower and the Nine of Swords lean no, the Two of Swords and Seven of Cups are ambivalent. A reversal flips a yes to a no and a no to a yes; an ambivalent card stays ambivalent either way up. Set `allow_reversed` false to read upright-only.\n\nThe card and its full keywords come back with the verdict, because \"no\" on its own is not a reading and the card is what carries the meaning.\n\nEvery response carries the `seed` that produced it, and sending that seed back reproduces the draw exactly — same cards, same order, same way up. Omit it and one is generated and returned, so a fresh draw is the default and repeating it afterwards is always possible. This is what lets a client store a reading and show it again rather than handing the querent a different answer to the same question.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Tarot"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "question": "Should I take the offer?",
                    "seed": "sample-yesno",
                    "reproducible": "Send this seed back to get exactly this draw again.",
                    "deck": "Rider-Waite-Smith, 78 cards",
                    "reversals_allowed": true,
                    "cards": [
                      {
                        "position": 1,
                        "id": 14,
                        "name": "Temperance",
                        "arcana": "major",
                        "suit": null,
                        "rank": null,
                        "number": 14,
                        "element": null,
                        "upright": "balance, moderation, patience, blending",
                        "reversed": "imbalance, excess, impatience",
                        "orientation": "upright",
                        "meaning": "balance, moderation, patience, blending",
                        "yes_no": "yes"
                      }
                    ],
                    "answer": "yes",
                    "card": "Temperance",
                    "orientation": "upright",
                    "meaning": "balance, moderation, patience, blending",
                    "how_decided": "Each card has a traditional leaning. A reversal flips yes to no and no to yes; an ambivalent card stays ambivalent. Conventions differ between readers, so this one is stated rather than left implicit."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "allow_reversed": {
                    "type": "boolean",
                    "description": "Whether cards can come up reversed. Some readers work upright-only.",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "question": {
                    "type": "string",
                    "description": "Optional. Echoed back, and folded into a generated seed.",
                    "examples": [
                      "string"
                    ]
                  },
                  "reversal_chance": {
                    "type": "number",
                    "format": "double",
                    "description": "Probability of a reversal, when reversals are allowed.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5,
                    "examples": [
                      0
                    ]
                  },
                  "seed": {
                    "type": "string",
                    "description": "Send a seed to reproduce a draw exactly. Omit it and one is generated and returned, so any draw can be repeated afterwards.",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "question": "Should I take the offer?",
                "seed": "sample-yesno"
              }
            }
          }
        }
      }
    },
    "/api/astro/telugu_calendar/": {
      "post": {
        "operationId": "astro_telugu_calendar",
        "summary": "Telugu calendar",
        "description": "The Telugu calendar is Amanta luni-solar: months run from one new Moon to the next, carry Telugu names (Chaithramu, Vaisakhamu, Jyesthamu, Ashadhamu, Sravanamu, Bhadhrapadamu, Asvayujamu, Karthikamu, Margasiramu, Pushyamu, Maghamu and Phalgunamu), and the year is reckoned in Shaka Samvat and opens at Ugadi on Chaithramu Shukla Padyami. The underlying month arithmetic, adhika-month detection included, is the same one the Marathi and Kannada calendars use — the difference between those three is the month naming and the festival list, not the astronomy. It is not the solar sign-to-sign scheme of the Tamil and Malayalam calendars.\n\nPost a `year` with `latitude`, `longitude` and `timezone_as_float`. The response is `{year, events}` and each event is just `{name, date}`; unlike the Tamil calendar there are no month or day-of-month fields. Expect around ninety entries a year: the twenty-four Ekadashis (twenty-six in an adhika year) under their Telugu names along with the Gauna and Vaishnava next-day alternates that most other regional calendars omit, roughly twenty-five weekday-named Pradosh Vrats (Ravi, Soma, Bhauma, Budha, Guru, Shukra, Shani), the twelve Sankashtahara Chaturthis, the twelve Shukla Dwadashi vratas and the main festivals.\n\nSunrise, sunset and the Pradosha window are computed for the coordinates you send, so a different city can move a date by one day; the Pradosh Vrat rule in particular assigns each Trayodashi to the civil day whose post-sunset Pradosha window it overlaps most. Festivals shared with the main Hindu calendar are read from the precomputed table, which covers 2006-2046 only.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Calendars"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"year\": 2026, \"events\": [{\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-01-01\"}, {\"name\": \"Lambodara Sankashtahara\", \"date\": \"2026-01-06\"}, {\"name\": \"Shattila Ekadashi\", \"date\": \"2026-01-14\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-01-16\"}, {\"name\": \"Jaya Ekadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Bhishma Dwadashi\", \"date\": \"2026-01-29\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-01-30\"}, {\"name\": \"Dwijapriya Sankashtahara\", \"date\": \"2026-02-05\"}, {\"name\": \"Vijaya Ekadashi\", \"date\": \"2026-02-13\"}, {\"name\": \"Shani Trayodashi\", \"date\": \"2026-02-14\"}, {\"name\": \"Shani Pradosh Vrat\", \"date\": \"2026-02-14\"}, {\"name\": \"Maha Shivaratri\", \"date\": \"2026-02-15\"}, {\"name\": \"Amalaki Ekadashi\", \"date\": \"2026-02-27\"}, {\"name\": \"Narasimha Dwadashi\", \"date\": \"2026-02-28\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-03-01\"}, {\"name\": \"Chhoti Holi\", \"date\": \"2026-03-03\"}, {\"name\": \"Holika Dahan\", \"date\": \"2026-03-03\"}, {\"name\": \"Holi\", \"date\": \"2026-03-04\"}, {\"name\": \"Bhalachandra Sankashtahara\", \"date\": \"2026-03-06\"}, {\"name\": \"Papamochani Ekadashi\", \"date\": \"2026-03-15\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-03-16\"}, {\"name\": \"Ugadi\", \"date\": \"2026-03-19\"}, {\"name\": \"Dola Gowri Vratam\", \"date\": \"2026-03-21\"}, {\"name\": \"Andolana Trutiya\", \"date\": \"2026-03-21\"}, {\"name\": \"Shree Ramanavami\", \"date\": \"2026-03-26\"}, {\"name\": \"Kamada Ekadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Vamana Dwadashi\", \"date\": \"2026-03-29\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-03-30\"}, {\"name\": \"Madana Pournami\", \"date\": \"2026-04-02\"}, {\"name\": \"Vikata Sankashtahara\", \"date\": \"2026-04-05\"}, {\"name\": \"Varuthini Ekadashi\", \"date\": \"2026-04-13\"}, {\"name\": \"Budha Pradosh Vrat\", \"date\": \"2026-04-15\"}, {\"name\": \"Akshaya Trutiya\", \"date\": \"2026-04-19\"}, {\"name\": \"Mohini Ekadashi\", \"date\": \"2026-04-27\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-04-28\"}, {\"name\": \"Parashurama Dwadashi\", \"date\": \"2026-04-28\"}, {\"name\": \"Ekadanta Sankashtahara\", \"date\": \"2026-05-05\"}, {\"name\": \"Hanuman Jayanthi\", \"date\": \"2026-05-12\"}, {\"name\": \"Apara Ekadashi\", \"date\": \"2026-05-13\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-05-14\"}, {\"name\": \"Adhika Ramalakshmana Dwadashi\", \"date\": \"2026-05-27\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\": \"2026-05-28\"}, {\"name\": \"Vibhuvana Sankashtahara\", \"date\": \"2026-06-03\"}, {\"name\": \"Parama Ekadashi\", \"date\": \"2026-06-11\"}, {\"name\": \"Shukra Pradosh Vrat\", \"date\": \"2026-06-12\"}, {\"name\": \"Nirjala Ekadashi\", \"date\": \"2026-06-25\"}, {\"name\": \"Ramalakshmana Dwadashi\", \"date\": \"2026-06-26\"}, {\"name\": \"Shani Trayodashi\", \"date\": \"2026-06-27\"}, {\"name\": \"Shani Pradosh Vrat\", \"date\": \"2026-06-27\"}, {\"name\": \"Krishnapingala Sankashtahara\", \"date\": \"2026-07-03\"}, {\"name\": \"Yogini Ekadashi\", \"date\": \"2026-07-10\"}, {\"name\": \"Gauna Yogini Ekadashi\", \"date\": \"2026-07-11\"}, {\"name\": \"Vaishnava Yogini Ekadashi\", \"date\": \"2026-07-11\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-07-12\"}, {\"name\": \"Devshayani Ekadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Vasudeva Dwadashi\", \"date\": \"2026-07-25\"}, {\"name\": \"Ravi Pradosh Vrat\", \"date\": \"2026-07-26\"}, {\"name\": \"Gajanana Sankashtahara\", \"date\": \"2026-08-02\"}, {\"name\": \"Kamika Ekadashi\", \"date\": \"2026-08-09\"}, {\"name\": \"Soma Pradosh Vrat\", \"date\": \"2026-08-10\"}, {\"name\": \"Shravana Putrada Ekadashi\", \"date\": \"2026-08-23\"}, {\"name\": \"Vaishnava Shravana Putrada Ekadashi\", \"date\": \"2026-08-24\"}, {\"name\": \"Damodara Dwadashi\", \"date\": \"2026-08-24\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-08-25\"}, {\"name\": \"Varalakshmi Vratam\", \"date\": \"2026-08-28\"}, {\"name\": \"Raksha Bandhan\", \"date\": \"2026-08-28\"}, {\"name\": \"Heramba Sankashtahara\", \"date\": \"2026-08-31\"}, {\"name\": \"Krishna Janmashtami\", \"date\": \"2026-09-04\"}, {\"name\": \"Aja Ekadashi\", \"date\": \"2026-09-07\"}, {\"name\": \"Bhauma Pradosh Vrat\", \"date\": \"2026-09-08\"}, {\"name\": \"Ganesh Chaturthi\", \"date\": \"2026-09-14\"}, {\"name\": \"Parivartani Ekadashi\", \"date\": \"2026-09-22\"}, {\"name\": \"Kalki Dwadashi\", \"date\": \"2026-09-23\"}, {\"name\": \"Guru Pradosh Vrat\", \"date\":"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 2006,
                    "maximum": 2046,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "latitude",
                  "longitude",
                  "timezone_as_float",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/tithi/": {
      "post": {
        "operationId": "astro_tithi",
        "summary": "Tithi",
        "description": "The lunar day in force at the moment you ask, with its start, end and how much of it is left, plus every tithi touching the local day.\n\nA tithi is one thirtieth of the moon's cycle relative to the sun, so it is not a fixed length: it can run anywhere from about nineteen to twenty-six hours, which is why `start`, `end` and `remaining` matter more than the name alone. `paksha` says which fortnight - Shukla waxing, Krishna waning.\n\n`special_name` carries the classical name where the tithi has one, and `segments` lists every tithi overlapping the calendar day, for a timeline.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Panchang"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "name": "Chaturthi",
                    "name_hi": "चतुर्थी",
                    "number": 19,
                    "paksha": "Krishna",
                    "paksha_hi": "कृष्ण",
                    "start": "2026-08-31T03:22:09Z",
                    "end": "2026-09-01T02:12:57Z",
                    "remaining": {
                      "hours": 1,
                      "minutes": 42,
                      "seconds": 57
                    },
                    "special_name": null,
                    "segments": [
                      {
                        "paksha": "Krishna",
                        "name": "Chaturthi",
                        "number": 19,
                        "start_time": "2026-08-31T03:22:09Z",
                        "end_time": "2026-09-01T02:12:57Z",
                        "paksha_hi": "कृष्ण",
                        "name_hi": "चतुर्थी"
                      },
                      {
                        "paksha": "Krishna",
                        "name": "Panchami",
                        "number": 20,
                        "start_time": "2026-09-01T02:12:57Z",
                        "end_time": "2026-09-02T00:43:35Z",
                        "paksha_hi": "कृष्ण",
                        "name_hi": "पंचमी"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/tithi_scan/": {
      "post": {
        "operationId": "astro_tithi_scan",
        "summary": "Tithi year scan",
        "description": "A tithi is one thirtieth of the lunar month — the stretch of time during which the Moon gains a further 12 degrees of elongation on the Sun. Tithis are the unit almost every Hindu observance is defined on, and they do not line up with civil days: one can be as short as about nineteen hours or as long as about twenty-six, so a single occurrence often spans two dates. This endpoint takes one named tithi and returns every occurrence of it in a calendar year, with the true instant it begins and ends.\n\n`tithi_number` runs 1 to 30: 1-15 are Shukla Pratipada through Purnima, 16-29 are Krishna Pratipada through Chaturdashi, and 30 is Amavasya. `year` is the local calendar year and `timezone_as_float` decides which local year that is (5.5 for IST). No coordinates are required, because a tithi begins and ends at the same instant everywhere on Earth.\n\nThe response is `{year, tithi_number, rows}`, with `rows` a chronological list of `{start, end}` UTC ISO timestamps — usually twelve or thirteen entries, since a given tithi recurs once per lunar month. Windows are not split at intervening sunrises, so an occurrence that runs across two civil days is returned as a single row.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "tithi_number": 1,
                    "rows": [
                      {
                        "start": "2026-01-18T19:52:39+00:00",
                        "end": "2026-01-19T20:45:19+00:00"
                      },
                      {
                        "start": "2026-02-17T12:01:47+00:00",
                        "end": "2026-02-18T11:28:41+00:00"
                      },
                      {
                        "start": "2026-03-19T01:24:05+00:00",
                        "end": "2026-03-19T23:23:24+00:00"
                      },
                      {
                        "start": "2026-04-17T11:52:21+00:00",
                        "end": "2026-04-18T08:41:36+00:00"
                      },
                      {
                        "start": "2026-05-16T20:01:32+00:00",
                        "end": "2026-05-17T16:11:46+00:00"
                      },
                      {
                        "start": "2026-06-15T02:54:39+00:00",
                        "end": "2026-06-15T23:01:51+00:00"
                      },
                      {
                        "start": "2026-07-14T09:44:04+00:00",
                        "end": "2026-07-15T06:21:58+00:00"
                      },
                      {
                        "start": "2026-08-12T17:37:11+00:00",
                        "end": "2026-08-13T15:12:30+00:00"
                      },
                      {
                        "start": "2026-09-11T03:27:28+00:00",
                        "end": "2026-09-12T02:17:22+00:00"
                      },
                      {
                        "start": "2026-10-10T15:50:36+00:00",
                        "end": "2026-10-11T16:02:05+00:00"
                      },
                      {
                        "start": "2026-11-09T07:02:42+00:00",
                        "end": "2026-11-10T08:31:14+00:00"
                      },
                      {
                        "start": "2026-12-09T00:52:31+00:00",
                        "end": "2026-12-10T03:17:14+00:00"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "tithi_number": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30,
                    "examples": [
                      1
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  }
                },
                "required": [
                  "timezone_as_float",
                  "tithi_number",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "timezone_as_float": 5.5,
                "tithi_number": 1,
                "year": 2026
              }
            }
          }
        }
      }
    },
    "/api/astro/traditional/almuten/": {
      "post": {
        "operationId": "astro_traditional_almuten",
        "summary": "Almuten",
        "description": "Which planet has most dignity over the chart, and over each of its key points.\n\nTraditional astrology asks not only where the planets are but which of them is strongest over a given degree. The almuten is the answer: the planet holding the most weighted dignity there.\n\nReturned three ways. `by_point` gives the almuten of the Sun, Moon, ascendant, midheaven and part of fortune, with every candidate's score so you can see the margin. `by_planet` totals each planet across all of them. `almuten_figuris` is the overall winner — the chart's ruler in the medieval scheme.\n\nOnly dignities count, not debilities: an almuten asks who rules a degree, not who is weak in it, so no score is ever negative. The part of fortune reverses by sect — ascendant + Moon − Sun by day, the reverse by night — which is the step most implementations skip.\n\nTies are reported as ties. Where two planets score equally, `tied` lists them and the almuten is null, because breaking a tie silently would be an opinion presented as a calculation.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Traditional & Hellenistic"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "sect": {
                      "sect": "diurnal",
                      "is_day_chart": true,
                      "sun_altitude": 58.950403,
                      "light": "sun",
                      "benefic": "jupiter",
                      "malefic": "saturn",
                      "contrary_malefic": "mars",
                      "contrary_benefic": "venus"
                    },
                    "points": {
                      "sun": 142.125,
                      "moon": 72.66,
                      "ascendant": 201.479077,
                      "midheaven": 112.347516,
                      "part_of_fortune": 132.014077
                    },
                    "by_point": {
                      "sun": {
                        "degree": 142.125,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 22.125,
                        "formatted": "22°07' Leo",
                        "scores": {
                          "sun": 8,
                          "moon": 0,
                          "mercury": 2,
                          "venus": 0,
                          "mars": 1,
                          "jupiter": 0,
                          "saturn": 0
                        },
                        "almuten": "sun",
                        "tied": []
                      },
                      "moon": {
                        "degree": 72.66,
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 12.66,
                        "formatted": "12°39' Gemini",
                        "scores": {
                          "sun": 0,
                          "moon": 0,
                          "mercury": 5,
                          "venus": 2,
                          "mars": 1,
                          "jupiter": 0,
                          "saturn": 3
                        },
                        "almuten": "mercury",
                        "tied": []
                      },
                      "ascendant": {
                        "degree": 201.479077,
                        "sign": "Libra",
                        "sign_index": 7,
                        "degree_in_sign": 21.4791,
                        "formatted": "21°28' Libra",
                        "scores": {
                          "sun": 0,
                          "moon": 0,
                          "mercury": 0,
                          "venus": 7,
                          "mars": 0,
                          "jupiter": 1,
                          "saturn": 7
                        },
                        "almuten": null,
                        "tied": [
                          "saturn",
                          "venus"
                        ]
                      },
                      "midheaven": {
                        "degree": 112.347516,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 22.3475,
                        "formatted": "22°20' Cancer",
                        "scores": {
                          "sun": 0,
                          "moon": 6,
                          "mercury": 0,
                          "venus": 3,
                          "mars": 0,
                          "jupiter": 6,
                          "saturn": 0
                        },
                        "almuten": null,
                        "tied": [
                          "jupiter",
                          "moon"
                        ]
                      },
                      "part_of_fortune": {
                        "degree": 132.014077,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 12.0141,
                        "formatted": "12°00' Leo",
                        "scores": {
                          "sun": 8,
                          "moon": 0,
                          "mercury": 0,
                          "venus": 0,
                          "mars": 0,
                          "jupiter": 1,
                          "saturn": 2
                        },
                        "almuten": "sun",
                        "tied": []
                      }
                    },
                    "by_planet": {
                      "sun": 16,
                      "moon": 6,
                      "mercury": 7,
                      "venus": 12,
                      "mars": 2,
                      "jupiter": 8,
                      "saturn": 12
                    },
                    "almuten_figuris": "sun",
                    "tied": [],
                    "note": "The prenatal syzygy, a fifth hylegiacal point in some sources, is not included; the midheaven is used in its place. Ties are reported rather than broken."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/traditional/dignities/": {
      "post": {
        "operationId": "astro_traditional_dignities",
        "summary": "Essential dignities",
        "description": "Domicile, exaltation, triplicity, term and face for every planet, with Lilly's score.\n\nThe backbone of traditional Western astrology and the thing that decides whether a planet is in a position to act at all. For each planet: which of the five dignities it holds where it stands, which debilities, and the weighted total — domicile +5, exaltation +4, triplicity +3, term +2, face +1, against detriment -5, fall -4 and peregrine -5.\n\nTROPICAL, necessarily. Essential dignity is defined against the tropical zodiac. Every other chart endpoint here is sidereal, and reading these tables off sidereal longitudes would move nearly every planet back a sign and report a planet in its own domicile as peregrine.\n\nTriplicity depends on SECT, so the sect is computed first from the Sun's actual altitude and returned alongside: the day and night rulers of an element are different planets, and a table applied with the wrong one is wrong in a way nothing in the output would reveal.\n\nBounds are the Egyptian set and faces the Chaldean order. Sources disagree — Ptolemy's bounds differ from the Egyptian — so the choice is named in `tables_used` rather than left to be inferred from numbers that will not match your book. Peregrine is applied only when a planet holds no dignity and is neither in detriment nor fall, so one placement is never penalised twice.\n\nUranus, Neptune and Pluto rule nothing in this doctrine and are returned with a null score rather than a zero that would read like a measurement.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Traditional & Hellenistic"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"sect\": {\"sect\": \"diurnal\", \"is_day_chart\": true, \"sun_altitude\": 58.950403, \"light\": \"sun\", \"benefic\": \"jupiter\", \"malefic\": \"saturn\", \"contrary_malefic\": \"mars\", \"contrary_benefic\": \"venus\"}, \"planets\": [{\"name\": \"sun\", \"longitude\": 142.125, \"retrograde\": false, \"speed\": 0.960934, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 22.125, \"formatted\": \"22°07' Leo\", \"sign_rulers\": {\"domicile\": \"sun\", \"detriment\": \"saturn\", \"triplicity\": \"sun\", \"triplicity_participating\": \"saturn\", \"term\": \"mercury\", \"face\": \"mars\", \"exaltation\": null, \"fall\": null}, \"dignities\": [\"domicile\", \"triplicity\"], \"debilities\": [], \"peregrine\": false, \"score\": 8, \"score_breakdown\": {\"domicile\": 5, \"triplicity\": 3}, \"exaltation_degree\": null}, {\"name\": \"moon\", \"longitude\": 72.66, \"retrograde\": false, \"speed\": 14.262958, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 12.66, \"formatted\": \"12°39' Gemini\", \"sign_rulers\": {\"domicile\": \"mercury\", \"detriment\": \"jupiter\", \"triplicity\": \"saturn\", \"triplicity_participating\": \"jupiter\", \"term\": \"venus\", \"face\": \"mars\", \"exaltation\": \"north_node\", \"fall\": null}, \"dignities\": [], \"debilities\": [\"peregrine\"], \"peregrine\": true, \"score\": -5, \"score_breakdown\": {\"peregrine\": -5}, \"exaltation_degree\": null}, {\"name\": \"mercury\", \"longitude\": 169.176, \"retrograde\": false, \"speed\": 0.776615, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 19.176, \"formatted\": \"19°10' Virgo\", \"sign_rulers\": {\"domicile\": \"mercury\", \"detriment\": \"jupiter\", \"triplicity\": \"venus\", \"triplicity_participating\": \"mars\", \"term\": \"jupiter\", \"face\": \"venus\", \"exaltation\": \"mercury\", \"fall\": \"venus\"}, \"dignities\": [\"domicile\", \"exaltation\"], \"debilities\": [], \"peregrine\": false, \"score\": 9, \"score_breakdown\": {\"domicile\": 5, \"exaltation\": 4}, \"exaltation_degree\": 15.0}, {\"name\": \"venus\", \"longitude\": 121.573, \"retrograde\": false, \"speed\": 1.22118, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 1.573, \"formatted\": \"1°34' Leo\", \"sign_rulers\": {\"domicile\": \"sun\", \"detriment\": \"saturn\", \"triplicity\": \"sun\", \"triplicity_participating\": \"saturn\", \"term\": \"jupiter\", \"face\": \"saturn\", \"exaltation\": null, \"fall\": null}, \"dignities\": [], \"debilities\": [\"peregrine\"], \"peregrine\": true, \"score\": -5, \"score_breakdown\": {\"peregrine\": -5}, \"exaltation_degree\": null}, {\"name\": \"mars\", \"longitude\": 51.217, \"retrograde\": false, \"speed\": 0.576982, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 21.217, \"formatted\": \"21°13' Taurus\", \"sign_rulers\": {\"domicile\": \"venus\", \"detriment\": \"mars\", \"triplicity\": \"venus\", \"triplicity_participating\": \"mars\", \"term\": \"jupiter\", \"face\": \"saturn\", \"exaltation\": \"moon\", \"fall\": null}, \"dignities\": [], \"debilities\": [\"detriment\"], \"peregrine\": false, \"score\": -5, \"score_breakdown\": {\"detriment\": -5}, \"exaltation_degree\": null}, {\"name\": \"jupiter\", \"longitude\": 119.337, \"retrograde\": false, \"speed\": 0.214649, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 29.337, \"formatted\": \"29°20' Cancer\", \"sign_rulers\": {\"domicile\": \"moon\", \"detriment\": \"saturn\", \"triplicity\": \"venus\", \"triplicity_participating\": \"moon\", \"term\": \"saturn\", \"face\": \"moon\", \"exaltation\": \"jupiter\", \"fall\": \"mars\"}, \"dignities\": [\"exaltation\"], \"debilities\": [], \"peregrine\": false, \"score\": 4, \"score_breakdown\": {\"exaltation\": 4}, \"exaltation_degree\": 15.0}, {\"name\": \"saturn\", \"longitude\": 289.878, \"retrograde\": true, \"speed\": -0.056381, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 19.878, \"formatted\": \"19°52' Capricorn\", \"sign_rulers\": {\"domicile\": \"saturn\", \"detriment\": \"moon\", \"triplicity\": \"venus\", \"triplicity_participating\": \"mars\", \"term\": \"venus\", \"face\": \"mars\", \"exaltation\": \"mars\", \"fall\": \"jupiter\"}, \"dignities\": [\"domicile\"], \"debilities\": [], \"peregrine\": false, \"score\": 5, \"score_breakdown\": {\"domicile\": 5}, \"exaltation_degree\": null}, {\"name\": \"uranus\", \"longitude\": 275.978, \"retrograde\": true, \"speed\": -0.023775, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 5.978, \"formatted\":"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/traditional/profections/": {
      "post": {
        "operationId": "astro_traditional_profections",
        "summary": "Profections",
        "description": "Annual, monthly and daily profections, with the lord of each period.\n\nThe main Hellenistic timing technique, and the simplest: the chart advances one whole sign per year of life from the ascendant, so a 33-year-old is in a 10th-house profection and the ruler of that sign becomes Lord of the Year — the planet the year is read through. The same motion repeats faster inside the year, one sign per month and one per roughly two and a half days.\n\nAll three are returned together with each period's exact start and end, because a reading normally uses the annual for theme and the monthly to place it. The monthly continues from the annual sign rather than restarting at the ascendant, and the daily from the monthly.\n\nAge is counted by BIRTHDAY, not by dividing elapsed days: the profection turns over on the solar return, so someone eleven months past their thirty-third birthday is still in their thirty-fourth year. That is the detail most implementations get wrong.\n\nEvery timestamp is UTC, so the periods can be compared and sorted without reparsing.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Traditional & Hellenistic"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "as_of": "2026-09-09T12:00:00+00:00",
                    "age": 36,
                    "ascendant": {
                      "degree": 201.479077,
                      "sign": "Libra",
                      "sign_index": 7,
                      "degree_in_sign": 21.4791,
                      "formatted": "21°28' Libra"
                    },
                    "annual": {
                      "period": "year",
                      "house": 1,
                      "sign": "Libra",
                      "sign_index": 7,
                      "lord": "venus",
                      "lord_position": {
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 1.573,
                        "formatted": "1°34' Leo",
                        "retrograde": false
                      },
                      "from": "2026-08-15T05:00:00+00:00",
                      "to": "2027-08-15T05:00:00+00:00"
                    },
                    "monthly": {
                      "period": "month",
                      "house": 1,
                      "sign": "Libra",
                      "sign_index": 7,
                      "lord": "venus",
                      "lord_position": {
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 1.573,
                        "formatted": "1°34' Leo",
                        "retrograde": false
                      },
                      "from": "2026-08-15T05:00:00+00:00",
                      "to": "2026-09-14T15:00:00+00:00"
                    },
                    "daily": {
                      "period": "day",
                      "house": 10,
                      "sign": "Cancer",
                      "sign_index": 4,
                      "lord": "moon",
                      "lord_position": {
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 12.66,
                        "formatted": "12°39' Gemini",
                        "retrograde": false
                      },
                      "from": "2026-09-07T00:30:00+00:00",
                      "to": "2026-09-09T13:20:00+00:00"
                    },
                    "lord_of_the_year": "venus",
                    "note": "Age is counted by birthday, so the annual profection turns over on the solar return rather than on 1 January or on a 365-day division of elapsed time."
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "as_of": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The date to profect to. Defaults to now (UTC).",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "house_system": {
                    "type": "string",
                    "description": "Profections are traditionally whole-sign; the option is here because the ascendant SIGN is all that is used.",
                    "enum": [
                      "campanus",
                      "equal",
                      "koch",
                      "placidus",
                      "porphyry",
                      "regiomontanus",
                      "topocentric",
                      "whole_sign"
                    ],
                    "default": "whole_sign",
                    "examples": [
                      "campanus"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "as_of": "2026-09-09T12:00:00+00:00"
              }
            }
          }
        }
      }
    },
    "/api/astro/traditional/sect/": {
      "post": {
        "operationId": "astro_traditional_sect",
        "summary": "Sect",
        "description": "Whether a chart is diurnal or nocturnal, and everything that follows from it.\n\nSect is the first question traditional astrology asks of a chart and it changes almost everything after: which luminary leads, which benefic and which malefic are working with the chart rather than against it, and which triplicity rulers apply. By day the Sun leads, Jupiter is the benefic of the sect and Mars the malefic out of it; by night all of that reverses.\n\nDecided by the Sun's actual ALTITUDE rather than by house placement, so the answer does not depend on a house system. The altitude is returned, so a borderline chart is visible instead of arriving as a bare label.\n\nFor each planet: whether it is in its own sect, whether it is above the horizon, and whether it is in hayz — in sect, in the matching half of the sky, and in a sign of matching gender, the strongest condition the tradition recognises. Mercury takes its sect from which side of the Sun it sits on, being a morning or evening star rather than diurnal or nocturnal by nature.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Traditional & Hellenistic"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "sect": "diurnal",
                    "is_day_chart": true,
                    "sun_altitude": 58.950403,
                    "light": "sun",
                    "benefic": "jupiter",
                    "malefic": "saturn",
                    "contrary_malefic": "mars",
                    "contrary_benefic": "venus",
                    "planets": [
                      {
                        "planet": "sun",
                        "own_sect": "diurnal",
                        "in_sect": true,
                        "above_horizon": true,
                        "altitude": 58.950403,
                        "in_hayz": true,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 22.125,
                        "formatted": "22°07' Leo"
                      },
                      {
                        "planet": "moon",
                        "own_sect": "nocturnal",
                        "in_sect": false,
                        "above_horizon": true,
                        "altitude": 50.882857,
                        "in_hayz": false,
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 12.66,
                        "formatted": "12°39' Gemini"
                      },
                      {
                        "planet": "mercury",
                        "own_sect": "nocturnal",
                        "in_sect": false,
                        "above_horizon": true,
                        "altitude": 32.151092,
                        "in_hayz": false,
                        "sign": "Virgo",
                        "sign_index": 6,
                        "degree_in_sign": 19.176,
                        "formatted": "19°10' Virgo"
                      },
                      {
                        "planet": "venus",
                        "own_sect": "nocturnal",
                        "in_sect": false,
                        "above_horizon": true,
                        "altitude": 78.633828,
                        "in_hayz": false,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 1.573,
                        "formatted": "1°34' Leo"
                      },
                      {
                        "planet": "mars",
                        "own_sect": "nocturnal",
                        "in_sect": false,
                        "above_horizon": true,
                        "altitude": 29.600577,
                        "in_hayz": false,
                        "sign": "Taurus",
                        "sign_index": 2,
                        "degree_in_sign": 21.217,
                        "formatted": "21°13' Taurus"
                      },
                      {
                        "planet": "jupiter",
                        "own_sect": "diurnal",
                        "in_sect": true,
                        "above_horizon": true,
                        "altitude": 80.557414,
                        "in_hayz": false,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 29.337,
                        "formatted": "29°20' Cancer"
                      },
                      {
                        "planet": "saturn",
                        "own_sect": "diurnal",
                        "in_sect": true,
                        "above_horizon": false,
                        "altitude": -84.509552,
                        "in_hayz": false,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 19.878,
                        "formatted": "19°52' Capricorn"
                      }
                    ],
                    "meaning": {
                      "light": "The luminary that leads the chart.",
                      "benefic": "The benefic working with the sect.",
                      "malefic": "The malefic of the sect — the easier of the two.",
                      "contrary_malefic": "The malefic out of sect, traditionally read as the harder one."
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/": {
      "post": {
        "operationId": "astro_transit",
        "summary": "Transit crossings",
        "description": "This endpoint searches for moments rather than describing a chart at a fixed time. It answers questions of the form: when does the Sun next reach 0 degrees of Aries, when does Mars next cross a given degree between two dates, when do Saturn and the Sun next share an ecliptic longitude, and where exactly does a body stand at an instant.\n\nTwo of the keys are mode switches rather than calculations. `set_default_transit` selects the plain tropical ephemeris and `set_sidereal_transit` selects the sidereal one, and both return null. Keys in a request are evaluated in the order you list them, so put the switch first if you want the searches that follow to be sidereal.\n\nThe `planet`, `celestial`, `celestial1` and `celestial2` fields use upper-case ephemeris names (`SUN`, `MOON`, `MEAN_NODE`, `TRUE_NODE`, `CHIRON`, the Uranian points and several planetary moons), which is a different vocabulary from the `Sun`/`Moon` names used on most other endpoints here. `tz` is a plain hour offset applied to every timestamp that comes back, `when` chooses whether to search 'after' or 'before' the reference time, and `datetime_start`/`datetime_end` bound the window for `planet_transit`.\n\nAvailable `keys` (8), all covered by the same single credit: celestial_conjunction, find_moon_crossing, moon_node_crossing, planet_transit, set_default_transit, set_sidereal_transit, solar_crossing, transit_details.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "set_sidereal_transit": null,
                    "planet_transit": "2026-05-11T12:38:41+05:30",
                    "solar_crossing": "2025-04-14T03:21:25+05:30",
                    "celestial_conjunction": {
                      "long1": 327.886,
                      "long2": 327.877,
                      "date": "2025-03-12T10:13:52.466000Z"
                    },
                    "transit_details": {
                      "longitude": "4° Mesh 4'° 25\"",
                      "nakshatra": "Makha",
                      "padam": 2,
                      "nakshatra_lord": "Ketu",
                      "full_degree": 4.15,
                      "latitude_shara": {
                        "degrees": 2,
                        "minutes": 5,
                        "seconds": 52.8
                      },
                      "speed": "0.2",
                      "right_ascension": "08.29.10.92",
                      "declination_kranti": "21.19"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planet": {
                    "type": "string",
                    "description": "36 accepted values covering the 10 planets, the two lunar nodes, 6 asteroids, 9 Uranian/fictitious bodies and 9 planetary moons. An unrecognised name silently maps to None rather than erroring, which then fails deeper inside swisseph. Note the nodes use the underscored forms MEAN_NODE / TRUE_NODE (there is no 'RAHU'/'KETU' alias).",
                    "enum": [
                      "SUN",
                      "MOON",
                      "MERCURY",
                      "VENUS",
                      "MARS",
                      "JUPITER",
                      "SATURN",
                      "URANUS",
                      "NEPTUNE",
                      "PLUTO",
                      "MEAN_NODE",
                      "TRUE_NODE",
                      "CHIRON",
                      "PHOLUS",
                      "CERES",
                      "PALLAS",
                      "JUNO",
                      "VESTA",
                      "CUPIDO",
                      "HADES",
                      "ZEUS",
                      "KRONOS",
                      "APOLLON",
                      "ADMETOS",
                      "VULKANUS",
                      "POSEIDON",
                      "SELENA",
                      "PHOBOS",
                      "DEIMOS",
                      "IO",
                      "EUROPA",
                      "GANYMEDE",
                      "CALLISTO",
                      "TITAN",
                      "TRITON",
                      "CHARON"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "description": "36 accepted values covering the 10 planets, the two lunar nodes, 6 asteroids, 9 Uranian/fictitious bodies and 9 planetary moons. An unrecognised name silently maps to None rather than erroring, which then fails deeper inside swisseph. Note the nodes use the underscored forms MEAN_NODE / TRUE_NODE (there is no 'RAHU'/'KETU' alias).",
                    "enum": [
                      "SUN",
                      "MOON",
                      "MERCURY",
                      "VENUS",
                      "MARS",
                      "JUPITER",
                      "SATURN",
                      "URANUS",
                      "NEPTUNE",
                      "PLUTO",
                      "MEAN_NODE",
                      "TRUE_NODE",
                      "CHIRON",
                      "PHOLUS",
                      "CERES",
                      "PALLAS",
                      "JUNO",
                      "VESTA",
                      "CUPIDO",
                      "HADES",
                      "ZEUS",
                      "KRONOS",
                      "APOLLON",
                      "ADMETOS",
                      "VULKANUS",
                      "POSEIDON",
                      "SELENA",
                      "PHOBOS",
                      "DEIMOS",
                      "IO",
                      "EUROPA",
                      "GANYMEDE",
                      "CALLISTO",
                      "TITAN",
                      "TRITON",
                      "CHARON"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "description": "36 accepted values covering the 10 planets, the two lunar nodes, 6 asteroids, 9 Uranian/fictitious bodies and 9 planetary moons. An unrecognised name silently maps to None rather than erroring, which then fails deeper inside swisseph. Note the nodes use the underscored forms MEAN_NODE / TRUE_NODE (there is no 'RAHU'/'KETU' alias).",
                    "enum": [
                      "SUN",
                      "MOON",
                      "MERCURY",
                      "VENUS",
                      "MARS",
                      "JUPITER",
                      "SATURN",
                      "URANUS",
                      "NEPTUNE",
                      "PLUTO",
                      "MEAN_NODE",
                      "TRUE_NODE",
                      "CHIRON",
                      "PHOLUS",
                      "CERES",
                      "PALLAS",
                      "JUNO",
                      "VESTA",
                      "CUPIDO",
                      "HADES",
                      "ZEUS",
                      "KRONOS",
                      "APOLLON",
                      "ADMETOS",
                      "VULKANUS",
                      "POSEIDON",
                      "SELENA",
                      "PHOBOS",
                      "DEIMOS",
                      "IO",
                      "EUROPA",
                      "GANYMEDE",
                      "CALLISTO",
                      "TITAN",
                      "TRITON",
                      "CHARON"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "description": "36 accepted values covering the 10 planets, the two lunar nodes, 6 asteroids, 9 Uranian/fictitious bodies and 9 planetary moons. An unrecognised name silently maps to None rather than erroring, which then fails deeper inside swisseph. Note the nodes use the underscored forms MEAN_NODE / TRUE_NODE (there is no 'RAHU'/'KETU' alias).",
                    "enum": [
                      "SUN",
                      "MOON",
                      "MERCURY",
                      "VENUS",
                      "MARS",
                      "JUPITER",
                      "SATURN",
                      "URANUS",
                      "NEPTUNE",
                      "PLUTO",
                      "MEAN_NODE",
                      "TRUE_NODE",
                      "CHIRON",
                      "PHOLUS",
                      "CERES",
                      "PALLAS",
                      "JUNO",
                      "VESTA",
                      "CUPIDO",
                      "HADES",
                      "ZEUS",
                      "KRONOS",
                      "APOLLON",
                      "ADMETOS",
                      "VULKANUS",
                      "POSEIDON",
                      "SELENA",
                      "PHOBOS",
                      "DEIMOS",
                      "IO",
                      "EUROPA",
                      "GANYMEDE",
                      "CALLISTO",
                      "TITAN",
                      "TRITON",
                      "CHARON"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "description": "DEAD PARAMETER at the HTTP layer: TransitView never forwards it, so sending it has no effect. In the engine the only meaningful value is the literal 'special', which selects the 28-entry nakshatras_special table over the default 27-entry one.",
                    "enum": [
                      "special"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Engine default is 'after'. Used by the 'solar_crossing', 'find_moon_crossing', 'moon_node_crossing' and 'celestial_conjunction' keys.",
                    "enum": [
                      "after",
                      "before"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "datetime_end",
                  "datetime_start",
                  "keys",
                  "planet",
                  "tz"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2024-11-20T06:52:42.466Z",
                "keys": [
                  "set_sidereal_transit",
                  "planet_transit",
                  "solar_crossing",
                  "celestial_conjunction",
                  "transit_details"
                ],
                "latitude": 26.1046,
                "longitude": 75.7873,
                "tz": 5.5,
                "planet": "MARS",
                "datetime_start": "2024-11-20T06:52:42.466Z",
                "datetime_end": "2040-11-20T06:52:42.466Z",
                "degr": 0,
                "x2cross": 0,
                "celestial1": "SATURN",
                "celestial2": "SUN",
                "celestial": "MARS",
                "when": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/details/": {
      "post": {
        "operationId": "astro_transit_details",
        "summary": "Transit snapshot",
        "description": "Where a body is right now: sign, degree, nakshatra, pada and nakshatra lord.\n\nThe snapshot a transit widget renders. Choose the body with `celestial`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "mars",
                    "details": {
                      "longitude": "4° Mesh 1'° 55\"",
                      "nakshatra": "Makha",
                      "padam": 1,
                      "nakshatra_lord": "Ketu",
                      "full_degree": 4.06,
                      "latitude_shara": {
                        "degrees": 3,
                        "minutes": 54,
                        "seconds": 54
                      },
                      "speed": "-0.33",
                      "right_ascension": "08.20.30.18",
                      "declination_kranti": "23.55"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after",
                "celestial": "mars"
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/moon-crossing/": {
      "post": {
        "operationId": "astro_transit_moon_crossing",
        "summary": "Moon crossing",
        "description": "When the Moon next reaches a given ecliptic longitude.\n\nThe Moon covers the whole zodiac in about 27 days, so a crossing is never more than a month away. Forward search only, for the same reason as the solar ingress.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "moon",
                    "target_longitude": 90,
                    "direction": "after",
                    "crossing": "2025-01-12T04:24:03Z"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after",
                "x2cross": 90
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/node-crossing/": {
      "post": {
        "operationId": "astro_transit_node_crossing",
        "summary": "Lunar node crossing",
        "description": "When the Moon next crosses its own node — the moments eclipses cluster around.\n\nReturns the moment, the longitude it happens at, and the Moon's ecliptic latitude there, which comes back as essentially zero: crossing the node IS the Moon passing through the ecliptic plane, so that value is how you check the search landed in the right place.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "direction": "after",
                    "crossing": "2025-01-05T19:46:38Z",
                    "longitude": 0.43376749922024,
                    "moon_latitude": -5.7147772233898945e-11
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after"
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/planet-at-degree/": {
      "post": {
        "operationId": "astro_transit_planet_at_degree",
        "summary": "Planet at a degree",
        "description": "When a planet reaches a given degree, within a date window.\n\nChoose the body with `planet` and the degree with `degr`. Leave `datetime_start` and `datetime_end` out and the window runs from the given moment to a year later, so a first call works without inventing one.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "degree": 135,
                    "window": {
                      "from": "2025-01-01T00:00:00Z",
                      "to": "2026-01-01T00:00:00Z"
                    },
                    "transit": "2025-07-03T11:45:38Z"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after",
                "planet": "mars",
                "degr": 135
              }
            }
          }
        }
      }
    },
    "/api/astro/transit/solar-ingress/": {
      "post": {
        "operationId": "astro_transit_solar_ingress",
        "summary": "Solar ingress",
        "description": "When the Sun next reaches a given ecliptic longitude.\n\nThe calculation behind every solar ingress question: pass 0 for the Aries ingress, 90 for Cancer, 180 for Libra, 270 for Capricorn — or any degree at all. Crossing 0 degrees of Aries IS the March equinox, and this endpoint returns the same instant /api/astro/seasons/ does.\n\nForward search only. The engine's backward search is unreliable — for a target of 0 degrees it returns a date identical to the forward answer, and for 90 a date a year later — so it is not offered.\n\nDistinct from /api/astro/sankranti/, which gives the SIDEREAL Sankranti dates used by the Hindu calendar. The two differ by the ayanamsa.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Transits & annual charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "body": "sun",
                    "target_longitude": 0,
                    "direction": "after",
                    "crossing": "2025-03-20T09:01:29Z"
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "jupiter",
                    "examples": [
                      "sun"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "saturn",
                    "examples": [
                      "sun"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet": {
                    "type": "string",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "mean_node",
                      "true_node",
                      "chiron"
                    ],
                    "default": "sun",
                    "examples": [
                      "sun"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset the returned times are expressed in.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "when": {
                    "type": "string",
                    "description": "Forward only; see the module docstring on `before`.",
                    "enum": [
                      "after"
                    ],
                    "default": "after",
                    "examples": [
                      "after"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "description": "Ecliptic longitude to cross, 0-360 from 0 Aries.",
                    "minimum": 0,
                    "maximum": 360,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2025-01-01T00:00:00+00:00",
                "tz": 0,
                "when": "after",
                "x2cross": 0
              }
            }
          }
        }
      }
    },
    "/api/astro/translate/": {
      "post": {
        "operationId": "astro_translate",
        "summary": "Text translation",
        "description": "A thin wrapper over Google Cloud Translation, offered so that chart text produced elsewhere in this API can be shown in another language without you holding a separate Google key. It performs no astrological calculation of its own.\n\nPost `text` with an optional `target_language` (an ISO code, defaulting to `hi` for Hindi) and an optional `source_language` (defaulting to `en`); omit or blank the source and Google will detect it. The response is a flat object with `original_text`, `translated_text`, `source_language` (the detected code when you did not supply one) and `target_language`. Note that, unlike most endpoints here, it is not wrapped in a `data` envelope. A failure reaching or parsing the upstream service is returned as a 502.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Utilities"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "original_text": "Sun in Aries",
                  "translated_text": "मेष राशि में सूर्य",
                  "source_language": "en",
                  "target_language": "hi"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "source_language": {
                    "type": "string",
                    "default": "en",
                    "examples": [
                      "string"
                    ]
                  },
                  "target_language": {
                    "type": "string",
                    "default": "hi",
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "text"
                ],
                "additionalProperties": true
              },
              "example": {
                "text": "Sun in Aries"
              }
            }
          }
        }
      }
    },
    "/api/astro/trimsamsa/": {
      "post": {
        "operationId": "astro_trimsamsa",
        "summary": "Trimsamsa (D30)",
        "description": "The trimsamsa, the thirtieth divisional chart: each sign divided into thirty parts of 1° each.\n\nRead for misfortune, hardship and character. Note the classical trimsamsa divisions are unequal and exclude the luminaries in some traditions, so compare against your own reference before relying on it.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. Send a date and a place; `ayanamsa` defaults to LAHIRI and all 48 are accepted.\n\nThe chart is fixed by the route, so a `chart_name` in the body is ignored - this endpoint cannot return anything but the chart it is named for. /api/astro/chart/ is where to go for the other 24 divisions.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 251.425,
                        "latitude": 0,
                        "nakshatra": "Moola",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Sagittarius",
                        "house": 1
                      },
                      {
                        "name": "moon",
                        "longitude": 14.333333333333336,
                        "latitude": 4.37,
                        "nakshatra": "Bharani",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Aries",
                        "house": 5
                      },
                      {
                        "name": "mars",
                        "longitude": 65.24166666666667,
                        "latitude": 0.535,
                        "nakshatra": "Mrigasira",
                        "pada": 4,
                        "kakshya": "jupiter",
                        "zodiac_name": "Gemini",
                        "house": 7
                      },
                      {
                        "name": "mercury",
                        "longitude": 75.23333333333335,
                        "latitude": 1.574,
                        "nakshatra": "Aardra",
                        "pada": 3,
                        "kakshya": "venus",
                        "zodiac_name": "Gemini",
                        "house": 7
                      },
                      {
                        "name": "jupiter",
                        "longitude": 344.1583333333333,
                        "latitude": 0.529,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Pisces",
                        "house": 4
                      },
                      {
                        "name": "venus",
                        "longitude": 238.67499999999995,
                        "latitude": -3.391,
                        "nakshatra": "Jyeshtha",
                        "pada": 4,
                        "kakshya": "ascendant",
                        "zodiac_name": "Scorpio",
                        "house": 12
                      },
                      {
                        "name": "saturn",
                        "longitude": 343.4083333333333,
                        "latitude": -2.651,
                        "nakshatra": "Uttaraabhaadra",
                        "pada": 4,
                        "kakshya": "sun",
                        "zodiac_name": "Pisces",
                        "house": 4
                      },
                      {
                        "name": "northtruenode",
                        "longitude": 316.975,
                        "latitude": 0,
                        "nakshatra": "Satabhishak",
                        "pada": 4,
                        "kakshya": "venus",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "southtruenode",
                        "longitude": 316.975,
                        "latitude": 0,
                        "nakshatra": "Satabhishak",
                        "pada": 4,
                        "kakshya": "venus",
                        "zodiac_name": "Aquarius",
                        "house": 3
                      },
                      {
                        "name": "uranus",
                        "longitude": 162.71666666666664,
                        "latitude": -0.154,
                        "nakshatra": "Hasta",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "neptune",
                        "longitude": 162.98333333333335,
                        "latitude": -1.412,
                        "nakshatra": "Hasta",
                        "pada": 1,
                        "kakshya": "sun",
                        "zodiac_name": "Virgo",
                        "house": 10
                      },
                      {
                        "name": "pluto",
                        "longitude": 158.36666666666667,
                        "latitude": -4.3,
                        "nakshatra": "Uttara Phalguni",
                        "pada": 4,
                        "kakshya": "mars",
                        "zodiac_name": "Virgo",
                        "house": 10
                      }
                    ],
                    "ascendant": {
                      "longitude": 245.63333333333335,
                      "zodiac_name": "Sagittarius",
                      "nakshatra": "Makha",
                      "pada": 4
                    },
                    "ayanamsa": {
                      "name": "LAHIRI",
                      "corrected": false,
                      "value_degrees": 24.229599,
                      "formatted": "24°13'47\""
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "datetime": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ayanamsa": "LAHIRI"
              }
            }
          }
        }
      }
    },
    "/api/astro/upagraha/": {
      "post": {
        "operationId": "astro_upagraha",
        "summary": "Upagrahas",
        "description": "The shadow points, in the two families they come from.\n\n`from_sun` holds the five derived arithmetically from the Sun's sidereal longitude - Dhuma, Vyatipata, Parivesha, Indrachaapa and Upaketu - each a fixed offset from the one before, so they depend only on the moment.\n\n`from_day_division` holds the six derived by splitting the daylight or the night into eight planetary parts, including Gulika and Mandi. These depend on the PLACE as well as the moment, which is why the two families are returned separately rather than merged into one list.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "from_sun": {
                      "Dhuma": {
                        "degree": 27,
                        "sign": "Sg",
                        "minutes": 42,
                        "seconds": 39,
                        "nakshatra": "Uttaraashaadha",
                        "pada": 1
                      },
                      "Vyatipata": {
                        "degree": 2,
                        "sign": "Cn",
                        "minutes": 17,
                        "seconds": 20,
                        "nakshatra": "Punarvasu",
                        "pada": 4
                      },
                      "Parivesha": {
                        "degree": 2,
                        "sign": "Cp",
                        "minutes": 17,
                        "seconds": 20,
                        "nakshatra": "Uttaraashaadha",
                        "pada": 2
                      },
                      "Indrachapa": {
                        "degree": 27,
                        "sign": "Ge",
                        "minutes": 42,
                        "seconds": 39,
                        "nakshatra": "Punarvasu",
                        "pada": 3
                      },
                      "Upaketu": {
                        "degree": 14,
                        "sign": "Cn",
                        "minutes": 22,
                        "seconds": 51,
                        "nakshatra": "Pushyami",
                        "pada": 4
                      }
                    },
                    "from_day_division": {
                      "kaala": {
                        "degree": 25,
                        "sign": "Ar",
                        "minutes": 20,
                        "seconds": 59,
                        "nakshatra": "Bharani",
                        "pada": 4
                      },
                      "mrityu": {
                        "degree": 8,
                        "sign": "Ge",
                        "minutes": 58,
                        "seconds": 27,
                        "nakshatra": "Aardra",
                        "pada": 1
                      },
                      "artha_praharaka": {
                        "degree": 27,
                        "sign": "Ge",
                        "minutes": 52,
                        "seconds": 57,
                        "nakshatra": "Punarvasu",
                        "pada": 3
                      },
                      "yama_ghantaka": {
                        "degree": 16,
                        "sign": "Cn",
                        "minutes": 19,
                        "seconds": 57,
                        "nakshatra": "Pushyami",
                        "pada": 4
                      },
                      "maandi": {
                        "degree": 28,
                        "sign": "Aq",
                        "minutes": 39,
                        "seconds": 4,
                        "nakshatra": "Poorvaabhaadra",
                        "pada": 3
                      },
                      "gulika": {
                        "degree": 13,
                        "sign": "Aq",
                        "minutes": 55,
                        "seconds": 21,
                        "nakshatra": "Satabhishak",
                        "pada": 3
                      }
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-01T06:00:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/varga-bala/": {
      "post": {
        "operationId": "astro_varga_bala",
        "summary": "Varga and positional strength",
        "description": "Strength across the divisional charts, plus the positional strengths Shadbala does not break out.\n\nSapthavargaja bala scores a planet over the seven vargas and dwadhasa vargeeya over the twelve — how well a planet sits not just in the rasi chart but across the divisions, which is where Vedic strength assessment differs most from Western practice.\n\nAlso returns kendra bala, ojayugama bala and dreshkon bala, which sthana bala rolls up.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Strength (bala)"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "varga_strength": [
                      {
                        "bala": "sapthavargaja_bala",
                        "measures": "Strength across the seven vargas",
                        "by_planet": {
                          "Sun": 97.5,
                          "Moon": 105,
                          "Mars": 127.5,
                          "Mercury": 63.75,
                          "Jupiter": 112.5,
                          "Venus": 48.75,
                          "Saturn": 93.75
                        }
                      },
                      {
                        "bala": "dwadhasa_vargeeya_bala",
                        "measures": "Strength across the twelve vargas",
                        "by_planet": {
                          "Sun": 4,
                          "Moon": 4,
                          "Mars": 4,
                          "Mercury": 8,
                          "Jupiter": 7,
                          "Venus": 4,
                          "Saturn": 0
                        }
                      }
                    ],
                    "positional_strength": [
                      {
                        "bala": "kendra_bala",
                        "measures": "Strength by angular, succedent or cadent house",
                        "by_planet": {
                          "Sun": 60,
                          "Moon": 30,
                          "Mars": 60,
                          "Mercury": 15,
                          "Jupiter": 30,
                          "Venus": 15,
                          "Saturn": 60
                        }
                      },
                      {
                        "bala": "ojayugama_bala",
                        "measures": "Odd/even sign and navamsa strength",
                        "by_planet": {
                          "Sun": 15,
                          "Moon": 15,
                          "Mars": 30,
                          "Mercury": 15,
                          "Jupiter": 30,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      },
                      {
                        "bala": "dreshkon_bala",
                        "measures": "Strength by decanate and sex of the planet",
                        "by_planet": {
                          "Sun": 0,
                          "Moon": 0,
                          "Mars": 0,
                          "Mercury": 15,
                          "Jupiter": 0,
                          "Venus": 0,
                          "Saturn": 0
                        }
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "asc_house": {
                    "type": "integer",
                    "description": "Ascendant house number. Defaults to 1.",
                    "minimum": 1,
                    "maximum": 12,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "timezone": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30). Identical in meaning to timezone_as_float, which other endpoints call the same thing by a different name.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone": 5.5,
                "asc_house": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/vasa-segments/": {
      "post": {
        "operationId": "astro_vasa_segments",
        "summary": "Agni vasa and Shiva vasa",
        "description": "Where fire and Shiva are held to reside through the day, as timed segments.\n\nTwo muhurta considerations consulted for the same kinds of decision — homa and other fire rituals for agni vasa, anything Shiva-facing for shiva vasa. Both come back as lists of segments rather than a single state for the day, because either can change part-way through it.\n\nEach segment carries its own start and end, so you can say \"Prithvi until 07:01, then Akasha\" instead of picking one label for the whole day and being wrong for half of it. The agni segments flag `is_patala`, which is the state those rituals are specifically avoided in. Hindi labels come through as `state_hi`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Muhurta & timings"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "agni_vasa": [
                      {
                        "state": "Prithvi (Earth)",
                        "is_patala": false,
                        "start_time": "2026-09-08T09:13:55Z",
                        "end_time": "2026-09-09T07:01:45Z"
                      },
                      {
                        "state": "Akasha (Heaven)",
                        "is_patala": false,
                        "start_time": "2026-09-09T07:01:45Z",
                        "end_time": "2026-09-10T05:04:16Z"
                      }
                    ],
                    "shiva_vasa": [
                      {
                        "state": "at Bhojanam (Meal/Meditation)",
                        "start_time": "2026-09-08T09:13:55Z",
                        "end_time": "2026-09-09T07:01:45Z"
                      },
                      {
                        "state": "in Shmashana",
                        "start_time": "2026-09-09T07:01:45Z",
                        "end_time": "2026-09-10T05:04:16Z"
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "dhuma_vyatipata_relation": {
                    "type": "string",
                    "enum": [
                      "360_minus_dhuma",
                      "dhuma_plus_53_20"
                    ],
                    "default": "360_minus_dhuma",
                    "examples": [
                      "360_minus_dhuma"
                    ]
                  },
                  "eccentric_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "eccentricity": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "gulika_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "gulika_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "beginning",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "kala_mrityu_rise_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "mandi_portion": {
                    "type": "string",
                    "enum": [
                      "saturn",
                      "eighth"
                    ],
                    "default": "saturn",
                    "examples": [
                      "saturn"
                    ]
                  },
                  "mandi_rises_at": {
                    "type": "string",
                    "enum": [
                      "beginning",
                      "middle",
                      "end"
                    ],
                    "default": "middle",
                    "examples": [
                      "beginning"
                    ]
                  },
                  "mean_anomaly": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "samvata_type": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tolerance": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "2026-09-09T06:00:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/vimsamsa/": {
      "post": {
        "operationId": "astro_vimsamsa",
        "summary": "Vimsamsa (D20)",
        "description": "The vimsamsa, the twentieth divisional chart: each sign divided into twenty parts of 1°30' each.\n\nRead for spiritual practice and worship - upasana, the deity one is drawn to, and how sustained the practice is.\n\nReturns the same flat shape as /api/astro/planet-positions/: the planets as a list in traditional order with `name`, longitude, sign, nakshatra, pada and house on each, plus the ascendant and the ayanamsa applied. The route pins the chart, so a `chart_name` in the body is ignored rather than honoured - this endpoint cannot return anything but this division.\n\nThe example below is derived from the request schema.",
        "tags": [
          "Divisional charts"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "chart_name": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "aberration": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "apply_correction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "ascendant_pos": {
                    "type": "string",
                    "enum": [
                      "cusp",
                      "start",
                      "end"
                    ],
                    "default": "cusp",
                    "examples": [
                      "cusp"
                    ]
                  },
                  "ayanamsa": {
                    "type": "string",
                    "default": "LAHIRI",
                    "examples": [
                      "string"
                    ]
                  },
                  "background_color": {
                    "type": "string",
                    "description": "Hex color for the SVG background.",
                    "examples": [
                      "string"
                    ]
                  },
                  "chart_style": {
                    "type": "string",
                    "description": "Diagram style when render='svg'. 'north' is the diamond layout with fixed houses and rotating signs; 'south' is the fixed-sign grid with rotating houses.",
                    "enum": [
                      "north",
                      "south"
                    ],
                    "default": "north",
                    "examples": [
                      "north"
                    ]
                  },
                  "correction_deg": {
                    "type": "integer",
                    "minimum": 0,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_direction": {
                    "type": "string",
                    "enum": [
                      "add",
                      "subtract"
                    ],
                    "default": "add",
                    "examples": [
                      "add"
                    ]
                  },
                  "correction_min": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "correction_sec": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 59,
                    "default": 0,
                    "examples": [
                      0
                    ]
                  },
                  "extended_bodies": {
                    "type": "array",
                    "description": "Body groups to include: 'asteroids', 'planetary_moons', 'fictitious_bodies'.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "label_style": {
                    "type": "string",
                    "description": "How planets are labelled: 'english' (Su, Mo, ...), 'sanskrit' (Surya, Chandra, ...) or 'symbol' (☉, ☽, ...).",
                    "enum": [
                      "english",
                      "sanskrit",
                      "symbol"
                    ],
                    "default": "english",
                    "examples": [
                      "english"
                    ]
                  },
                  "line_color": {
                    "type": "string",
                    "description": "Hex color for the chart's grid lines.",
                    "examples": [
                      "string"
                    ]
                  },
                  "notation": {
                    "type": "string",
                    "enum": [
                      "astrological",
                      "degree"
                    ],
                    "default": "degree",
                    "examples": [
                      "astrological"
                    ]
                  },
                  "nutation": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "planet_color": {
                    "type": "string",
                    "description": "Hex color for planet labels, e.g. '#111827'. Defaults to the theme's own colour.",
                    "examples": [
                      "string"
                    ]
                  },
                  "rahu": {
                    "type": "string",
                    "description": "Node type to include. 'true' returns true nodes only, 'mean' returns mean nodes only, 'both' returns both.",
                    "enum": [
                      "true",
                      "mean",
                      "both"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "refraction": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "render": {
                    "type": "string",
                    "description": "Set to 'svg' to also return a rendered chart diagram (see chart_style) and the geometry behind it. Omit this entirely and the response is unchanged.",
                    "enum": [
                      "none",
                      "svg"
                    ],
                    "default": "none",
                    "examples": [
                      "none"
                    ]
                  },
                  "show_degrees": {
                    "type": "boolean",
                    "description": "Print each body's degree within its sign next to its label.",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "sign_color": {
                    "type": "string",
                    "description": "Hex color for sign numbers/abbreviations.",
                    "examples": [
                      "string"
                    ]
                  },
                  "svg_size": {
                    "type": "integer",
                    "description": "Width and height of the square SVG viewBox, in pixels.",
                    "minimum": 100,
                    "maximum": 2000,
                    "default": 400,
                    "examples": [
                      100
                    ]
                  },
                  "theme": {
                    "type": "string",
                    "enum": [
                      "light",
                      "dark"
                    ],
                    "default": "light",
                    "examples": [
                      "light"
                    ]
                  },
                  "true_mean": {
                    "type": "string",
                    "enum": [
                      "True",
                      "Mean"
                    ],
                    "default": "Mean",
                    "examples": [
                      "True"
                    ]
                  },
                  "use_28_nakshatras": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "chart_name",
                  "datetime",
                  "latitude",
                  "longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "chart_name": "string",
                "datetime": "2026-09-01 06:00:00",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "ascendant_pos": "cusp",
                "chart_style": "north",
                "correction_direction": "add",
                "label_style": "english",
                "notation": "astrological",
                "rahu": "true",
                "render": "none",
                "theme": "light",
                "true_mean": "True"
              }
            }
          }
        }
      }
    },
    "/api/astro/western/antiscia/": {
      "post": {
        "operationId": "astro_western_antiscia",
        "summary": "Antiscia and contra-antiscia",
        "description": "The hidden points of a chart: reflections across the solstice axis.\n\nAn antiscion is a planet reflected across the 0 Cancer – 0 Capricorn line, so a planet and its antiscion share the same DECLINATION and, in the old doctrine, a hidden sympathy. The contra-antiscion reflects across the equinoctial axis instead and is read as antipathy.\n\nantiscion = 180 − longitude; contra-antiscion = 360 − longitude. Contacts are what the technique is for — a planet sitting on another's antiscion is a connection invisible in an ordinary aspect grid — so those are computed against Lilly's tight orb of about a degree, scalable with `orb_factor`.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"axis\": \"0 Cancer - 0 Capricorn (solstitial)\", \"note\": \"antiscion = 180 - longitude; contra-antiscion = 360 - longitude. A planet and its antiscion share a declination.\", \"antiscia\": [{\"name\": \"sun\", \"natal_longitude\": 142.125097, \"longitude\": 37.874903, \"speed\": 0.960934, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 7.8749, \"formatted\": \"7°52' Taurus\"}, {\"name\": \"moon\", \"natal_longitude\": 72.660043, \"longitude\": 107.339957, \"speed\": 14.262958, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 17.34, \"formatted\": \"17°20' Cancer\"}, {\"name\": \"mercury\", \"natal_longitude\": 169.176074, \"longitude\": 10.823926, \"speed\": 0.776615, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 10.8239, \"formatted\": \"10°49' Aries\"}, {\"name\": \"venus\", \"natal_longitude\": 121.572681, \"longitude\": 58.427319, \"speed\": 1.22118, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 28.4273, \"formatted\": \"28°25' Taurus\"}, {\"name\": \"mars\", \"natal_longitude\": 51.217023, \"longitude\": 128.782977, \"speed\": 0.576982, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 8.783, \"formatted\": \"8°46' Leo\"}, {\"name\": \"jupiter\", \"natal_longitude\": 119.336805, \"longitude\": 60.663195, \"speed\": 0.214649, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 0.6632, \"formatted\": \"0°39' Gemini\"}, {\"name\": \"saturn\", \"natal_longitude\": 289.878035, \"longitude\": 250.121965, \"speed\": -0.056381, \"retrograde\": true, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 10.122, \"formatted\": \"10°07' Sagittarius\"}, {\"name\": \"uranus\", \"natal_longitude\": 275.978113, \"longitude\": 264.021887, \"speed\": -0.023775, \"retrograde\": true, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 24.0219, \"formatted\": \"24°01' Sagittarius\"}, {\"name\": \"neptune\", \"natal_longitude\": 282.198866, \"longitude\": 257.801134, \"speed\": -0.019063, \"retrograde\": true, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 17.8011, \"formatted\": \"17°48' Sagittarius\"}, {\"name\": \"pluto\", \"natal_longitude\": 225.084319, \"longitude\": 314.915681, \"speed\": 0.011469, \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 14.9157, \"formatted\": \"14°54' Aquarius\"}, {\"name\": \"north_node\", \"natal_longitude\": 307.233496, \"longitude\": 232.766504, \"speed\": 0.014476, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 22.7665, \"formatted\": \"22°45' Scorpio\"}, {\"name\": \"chiron\", \"natal_longitude\": 112.437645, \"longitude\": 67.562355, \"speed\": 0.099053, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 7.5624, \"formatted\": \"7°33' Gemini\"}], \"contra_antiscia\": [{\"name\": \"sun\", \"natal_longitude\": 142.125097, \"longitude\": 217.874903, \"speed\": 0.960934, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 7.8749, \"formatted\": \"7°52' Scorpio\"}, {\"name\": \"moon\", \"natal_longitude\": 72.660043, \"longitude\": 287.339957, \"speed\": 14.262958, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 17.34, \"formatted\": \"17°20' Capricorn\"}, {\"name\": \"mercury\", \"natal_longitude\": 169.176074, \"longitude\": 190.823926, \"speed\": 0.776615, \"retrograde\": false, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 10.8239, \"formatted\": \"10°49' Libra\"}, {\"name\": \"venus\", \"natal_longitude\": 121.572681, \"longitude\": 238.427319, \"speed\": 1.22118, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 28.4273, \"formatted\": \"28°25' Scorpio\"}, {\"name\": \"mars\", \"natal_longitude\": 51.217023, \"longitude\": 308.782977, \"speed\": 0.576982, \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 8.783, \"formatted\": \"8°46' Aquarius\"}, {\"name\": \"jupiter\", \"natal_longitude\": 119.336805, \"longitude\": 240.663195, \"speed\": 0.214649, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 0.6632, \"formatted\": \"0°39' Sagittarius\"}, {\"na"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/western/composite/": {
      "post": {
        "operationId": "astro_western_composite",
        "summary": "Composite chart",
        "description": "The midpoint chart of a relationship, read as its own entity.\n\nWhere synastry compares two charts, a composite MERGES them: each body sits at the midpoint of the two people's positions, and the result is read as the chart of the relationship itself rather than of either person.\n\nMidpoints are taken on the shorter arc, which is the convention and is NOT the same as averaging the two numbers — a pair at 350 and 10 degrees composites to 0, not to 180. Each body reports the two source longitudes it came from, so the midpoint is checkable.\n\nA composite carries no speed and no retrogradation: it is not a moment in time, so nothing in it is moving. Aspects between composite bodies ARE meaningful and are returned.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"chart\": \"composite_midpoint\", \"orb_factor\": 1.0, \"planets\": [{\"name\": \"sun\", \"longitude\": 325.3295, \"from\": {\"person_a\": 49.66766, \"person_b\": 240.991341}, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 25.3295, \"formatted\": \"25°19' Aquarius\"}, {\"name\": \"moon\", \"longitude\": 325.741456, \"from\": {\"person_a\": 238.259725, \"person_b\": 53.223187}, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 25.7415, \"formatted\": \"25°44' Aquarius\"}, {\"name\": \"mercury\", \"longitude\": 317.866522, \"from\": {\"person_a\": 39.452338, \"person_b\": 236.280707}, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 17.8665, \"formatted\": \"17°51' Aquarius\"}, {\"name\": \"venus\", \"longitude\": 288.321938, \"from\": {\"person_a\": 7.250368, \"person_b\": 209.393508}, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 18.3219, \"formatted\": \"18°19' Capricorn\"}, {\"name\": \"mars\", \"longitude\": 354.304998, \"from\": {\"person_a\": 344.690843, \"person_b\": 3.919152}, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 24.305, \"formatted\": \"24°18' Pisces\"}, {\"name\": \"jupiter\", \"longitude\": 79.84236, \"from\": {\"person_a\": 98.630274, \"person_b\": 61.054447}, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 19.8424, \"formatted\": \"19°50' Gemini\"}, {\"name\": \"saturn\", \"longitude\": 283.210836, \"from\": {\"person_a\": 295.313114, \"person_b\": 271.108557}, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 13.2108, \"formatted\": \"13°12' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 274.377978, \"from\": {\"person_a\": 279.296197, \"person_b\": 269.459759}, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 4.378, \"formatted\": \"4°22' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 281.474487, \"from\": {\"person_a\": 284.419553, \"person_b\": 278.52942}, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 11.4745, \"formatted\": \"11°28' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 224.774448, \"from\": {\"person_a\": 226.304012, \"person_b\": 223.244883}, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 14.7744, \"formatted\": \"14°46' Scorpio\"}, {\"name\": \"north_node\", \"longitude\": 325.694721, \"from\": {\"person_a\": 310.874753, \"person_b\": 340.514689}, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 25.6947, \"formatted\": \"25°41' Aquarius\"}, {\"name\": \"chiron\", \"longitude\": 99.523745, \"from\": {\"person_a\": 102.832128, \"person_b\": 96.215362}, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 9.5237, \"formatted\": \"9°31' Cancer\"}], \"count\": 29, \"aspects\": [{\"from\": \"moon\", \"to\": \"north_node\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 0.0467, \"separation\": 0.0467}, {\"from\": \"sun\", \"to\": \"north_node\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 0.3652, \"separation\": 0.3652}, {\"from\": \"sun\", \"to\": \"moon\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 0.412, \"separation\": 0.412}, {\"from\": \"mercury\", \"to\": \"venus\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 0.4554, \"separation\": 29.5446}, {\"from\": \"sun\", \"to\": \"mars\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 1.0245, \"separation\": 28.9755}, {\"from\": \"mars\", \"to\": \"north_node\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 1.3897, \"separation\": 28.6103}, {\"from\": \"moon\", \"to\": \"mars\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 1.4365, \"separation\": 28.5635}, {\"from\": \"venus\", \"to\": \"jupiter\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 1.5204, \"separation\": 151.5204}, {\"from\": \"saturn\", \"to\": \"pluto\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 1.5636, \"separation\": 58.4364}, {\"from\": \"saturn\", \"to\": \"neptune\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 1.7363, \"separation\": 1.7363}, {\"from\": \"neptune\", \"to\": \"chiron\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \"orb\": 1.9507, \"separation\": 178.0493}, {\"from\": \"mercury\", \"to\": \"jupiter\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 1.9758, \"separation\": 121.9758}, {\"from\": \"mercury\", \"to\": \"pluto\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 3.0921, \"separa"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "partner_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "partner_timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "partner_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "partner_date_time": "1988-11-23T07:15:00+05:30",
                "partner_timezone_as_float": 5.5,
                "orb_factor": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/western/davison/": {
      "post": {
        "operationId": "astro_western_davison",
        "summary": "Davison relationship chart",
        "description": "A real chart cast for the midpoint of two births.\n\nDifferent in kind from the composite at /api/astro/western/composite/, and the difference matters. A composite AVERAGES two charts' longitudes, producing midpoints that never existed in the sky. A Davison is an actual chart for an actual moment — the midpoint in time between two births, at the midpoint of the two places — so every planet in it was really there.\n\nThat is why this endpoint needs the partner's coordinates and the composite does not. The place midpoint uses the shorter arc, so a London–Tokyo pair meets across Asia rather than across the Atlantic.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"midpoint_moment\": \"1991-06-02T14:52:30+00:00\", \"midpoint_place\": {\"latitude\": 22.9942, \"longitude\": 74.3325}, \"births\": [{\"date_time\": \"1990-08-15T05:00:00+00:00\", \"latitude\": 26.9124, \"longitude\": 75.7873}, {\"date_time\": \"1992-03-20T00:45:00+00:00\", \"latitude\": 19.076, \"longitude\": 72.8777}], \"planets\": [{\"name\": \"sun\", \"longitude\": 71.578229, \"speed\": 0.957929, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 11.5782, \"formatted\": \"11°34' Gemini\"}, {\"name\": \"moon\", \"longitude\": 307.508426, \"speed\": 11.904364, \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 7.5084, \"formatted\": \"7°30' Aquarius\"}, {\"name\": \"mercury\", \"longitude\": 55.300493, \"speed\": 1.847999, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 25.3005, \"formatted\": \"25°18' Taurus\"}, {\"name\": \"venus\", \"longitude\": 116.50584, \"speed\": 1.027019, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 26.5058, \"formatted\": \"26°30' Cancer\"}, {\"name\": \"mars\", \"longitude\": 124.170506, \"speed\": 0.589123, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 4.1705, \"formatted\": \"4°10' Leo\"}, {\"name\": \"jupiter\", \"longitude\": 129.253955, \"speed\": 0.160347, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 9.254, \"formatted\": \"9°15' Leo\"}, {\"name\": \"saturn\", \"longitude\": 306.624333, \"speed\": -0.026118, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 6.6243, \"formatted\": \"6°37' Aquarius\"}, {\"name\": \"uranus\", \"longitude\": 283.023713, \"speed\": -0.032335, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 13.0237, \"formatted\": \"13°01' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 286.263341, \"speed\": -0.02085, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 16.2633, \"formatted\": \"16°15' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 228.355561, \"speed\": -0.025097, \"retrograde\": true, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 18.3556, \"formatted\": \"18°21' Scorpio\"}, {\"name\": \"north_node\", \"longitude\": 289.391591, \"speed\": 0.02509, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 19.3916, \"formatted\": \"19°23' Capricorn\"}, {\"name\": \"chiron\", \"longitude\": 114.716336, \"speed\": 0.092952, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 24.7163, \"formatted\": \"24°42' Cancer\"}], \"aspects\": [{\"body_1\": \"mercury\", \"body_2\": \"chiron\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 0.5842, \"allowed_orb\": 6.0, \"separation\": 59.4158}, {\"body_1\": \"moon\", \"body_2\": \"saturn\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 0.8841, \"allowed_orb\": 8.0, \"separation\": 0.8841}, {\"body_1\": \"pluto\", \"body_2\": \"north_node\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 1.036, \"allowed_orb\": 6.0, \"separation\": 61.036}, {\"body_1\": \"mercury\", \"body_2\": \"venus\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 1.2053, \"allowed_orb\": 6.0, \"separation\": 61.2053}, {\"body_1\": \"sun\", \"body_2\": \"uranus\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 1.4455, \"allowed_orb\": 3.0, \"separation\": 148.5545}, {\"body_1\": \"moon\", \"body_2\": \"jupiter\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \"orb\": 1.7455, \"allowed_orb\": 8.0, \"separation\": 178.2545}, {\"body_1\": \"venus\", \"body_2\": \"chiron\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 1.7895, \"allowed_orb\": 8.0, \"separation\": 1.7895}, {\"body_1\": \"neptune\", \"body_2\": \"pluto\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 2.0922, \"allowed_orb\": 6.0, \"separation\": 57.9078}, {\"body_1\": \"sun\", \"body_2\": \"jupiter\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 2.3243, \"allowed_orb\": 6.0, \"separation\": 57.6757}, {\"body_1\": \"mars\", \"body_2\": \"saturn\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \"orb\": 2.4538, \"allowed_orb\": 8.0, \"separation\": 177.5462}, {\"body_1\": \"jupiter\", \"body_2\": \"saturn\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "partner_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "partner_latitude": {
                    "type": "number",
                    "format": "double",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      -90
                    ]
                  },
                  "partner_longitude": {
                    "type": "number",
                    "format": "double",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "partner_timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "partner_date_time",
                  "partner_latitude",
                  "partner_longitude"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "partner_date_time": "1992-03-20T06:15:00+05:30",
                "partner_latitude": 19.076,
                "partner_longitude": 72.8777
              }
            }
          }
        }
      }
    },
    "/api/astro/western/draconic/": {
      "post": {
        "operationId": "astro_western_draconic",
        "summary": "Draconic chart",
        "description": "The natal chart measured from the lunar node instead of from 0 Aries.\n\nThe draconic zodiac begins at the Moon's north node, so this is the natal chart rotated until the node sits at the start of Aries. Practitioners read it as the chart's deeper layer and compare it against the natal positions — the contacts between the two sets are the technique.\n\nBoth sets are returned. Note that every aspect INSIDE a draconic chart is identical to the natal chart's, because the whole wheel rotates rigidly; what changes is which signs the planets fall in. A draconic endpoint returning different internal aspects would be wrong.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"draconic\", \"node_longitude\": 307.233496, \"note\": \"Longitudes are measured from the north node, which sits at 0 Aries by construction. Aspects within the chart are unchanged from the natal chart because the whole wheel rotates rigidly; the signs are what change.\", \"planets\": [{\"name\": \"sun\", \"natal_longitude\": 142.125097, \"longitude\": 194.891601, \"speed\": 0.960934, \"retrograde\": false, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 14.8916, \"formatted\": \"14°53' Libra\"}, {\"name\": \"moon\", \"natal_longitude\": 72.660043, \"longitude\": 125.426547, \"speed\": 14.262958, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 5.4265, \"formatted\": \"5°25' Leo\"}, {\"name\": \"mercury\", \"natal_longitude\": 169.176074, \"longitude\": 221.942578, \"speed\": 0.776615, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 11.9426, \"formatted\": \"11°56' Scorpio\"}, {\"name\": \"venus\", \"natal_longitude\": 121.572681, \"longitude\": 174.339185, \"speed\": 1.22118, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 24.3392, \"formatted\": \"24°20' Virgo\"}, {\"name\": \"mars\", \"natal_longitude\": 51.217023, \"longitude\": 103.983527, \"speed\": 0.576982, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 13.9835, \"formatted\": \"13°59' Cancer\"}, {\"name\": \"jupiter\", \"natal_longitude\": 119.336805, \"longitude\": 172.103309, \"speed\": 0.214649, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 22.1033, \"formatted\": \"22°06' Virgo\"}, {\"name\": \"saturn\", \"natal_longitude\": 289.878035, \"longitude\": 342.644539, \"speed\": -0.056381, \"retrograde\": true, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 12.6445, \"formatted\": \"12°38' Pisces\"}, {\"name\": \"uranus\", \"natal_longitude\": 275.978113, \"longitude\": 328.744617, \"speed\": -0.023775, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 28.7446, \"formatted\": \"28°44' Aquarius\"}, {\"name\": \"neptune\", \"natal_longitude\": 282.198866, \"longitude\": 334.96537, \"speed\": -0.019063, \"retrograde\": true, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 4.9654, \"formatted\": \"4°57' Pisces\"}, {\"name\": \"pluto\", \"natal_longitude\": 225.084319, \"longitude\": 277.850823, \"speed\": 0.011469, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 7.8508, \"formatted\": \"7°51' Capricorn\"}, {\"name\": \"north_node\", \"natal_longitude\": 307.233496, \"longitude\": 0.0, \"speed\": 0.014476, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 0.0, \"formatted\": \"0°00' Aries\"}, {\"name\": \"chiron\", \"natal_longitude\": 112.437645, \"longitude\": 165.204149, \"speed\": 0.099053, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 15.2041, \"formatted\": \"15°12' Virgo\"}], \"natal\": [{\"name\": \"sun\", \"longitude\": 142.125097, \"speed\": 0.960934, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 22.1251, \"formatted\": \"22°07' Leo\"}, {\"name\": \"moon\", \"longitude\": 72.660043, \"speed\": 14.262958, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 12.66, \"formatted\": \"12°39' Gemini\"}, {\"name\": \"mercury\", \"longitude\": 169.176074, \"speed\": 0.776615, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 19.1761, \"formatted\": \"19°10' Virgo\"}, {\"name\": \"venus\", \"longitude\": 121.572681, \"speed\": 1.22118, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 1.5727, \"formatted\": \"1°34' Leo\"}, {\"name\": \"mars\", \"longitude\": 51.217023, \"speed\": 0.576982, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 21.217, \"formatted\": \"21°13' Taurus\"}, {\"name\": \"jupiter\", \"longitude\": 119.336805, \"speed\": 0.214649, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 29.3368, \"formatted\": \"29°20' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 289.878035, \"speed\": -0.056381, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 19.878, \"formatted\": \"19°52' Capricorn\"}, {"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/western/harmonic/": {
      "post": {
        "operationId": "astro_western_harmonic",
        "summary": "Harmonic chart",
        "description": "The Nth harmonic: every longitude multiplied by N and re-wrapped.\n\nAddey's technique. Multiplying by N and taking the result modulo 360 turns a division of the circle into a conjunction, so planets an exact fifth of the circle apart become conjunct in the 5th harmonic. It makes a subtle pattern legible.\n\nThe 4th and 8th are most often read, since they collapse the hard aspects; the 5th shows quintiles and the 9th noviles. Harmonic aspects are computed and returned, because finding the new conjunctions is the whole point.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"harmonic\": 5, \"note\": \"Every natal longitude multiplied by 5 and taken modulo 360. Bodies 5 apart in the natal circle become conjunct here.\", \"planets\": [{\"name\": \"sun\", \"natal_longitude\": 142.125097, \"longitude\": 350.625485, \"speed\": 0.960934, \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 20.6255, \"formatted\": \"20°37' Pisces\"}, {\"name\": \"moon\", \"natal_longitude\": 72.660043, \"longitude\": 3.300215, \"speed\": 14.262958, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 3.3002, \"formatted\": \"3°18' Aries\"}, {\"name\": \"mercury\", \"natal_longitude\": 169.176074, \"longitude\": 125.88037, \"speed\": 0.776615, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 5.8804, \"formatted\": \"5°52' Leo\"}, {\"name\": \"venus\", \"natal_longitude\": 121.572681, \"longitude\": 247.863405, \"speed\": 1.22118, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 7.8634, \"formatted\": \"7°51' Sagittarius\"}, {\"name\": \"mars\", \"natal_longitude\": 51.217023, \"longitude\": 256.085115, \"speed\": 0.576982, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 16.0851, \"formatted\": \"16°05' Sagittarius\"}, {\"name\": \"jupiter\", \"natal_longitude\": 119.336805, \"longitude\": 236.684025, \"speed\": 0.214649, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 26.684, \"formatted\": \"26°41' Scorpio\"}, {\"name\": \"saturn\", \"natal_longitude\": 289.878035, \"longitude\": 9.390175, \"speed\": -0.056381, \"retrograde\": true, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 9.3902, \"formatted\": \"9°23' Aries\"}, {\"name\": \"uranus\", \"natal_longitude\": 275.978113, \"longitude\": 299.890565, \"speed\": -0.023775, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 29.8906, \"formatted\": \"29°53' Capricorn\"}, {\"name\": \"neptune\", \"natal_longitude\": 282.198866, \"longitude\": 330.99433, \"speed\": -0.019063, \"retrograde\": true, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 0.9943, \"formatted\": \"0°59' Pisces\"}, {\"name\": \"pluto\", \"natal_longitude\": 225.084319, \"longitude\": 45.421595, \"speed\": 0.011469, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 15.4216, \"formatted\": \"15°25' Taurus\"}, {\"name\": \"north_node\", \"natal_longitude\": 307.233496, \"longitude\": 96.16748, \"speed\": 0.014476, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 6.1675, \"formatted\": \"6°10' Cancer\"}, {\"name\": \"chiron\", \"natal_longitude\": 112.437645, \"longitude\": 202.188225, \"speed\": 0.099053, \"retrograde\": false, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 22.1882, \"formatted\": \"22°11' Libra\"}], \"aspects\": [{\"body_1\": \"mercury\", \"body_2\": \"north_node\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 0.2871, \"allowed_orb\": 2.0, \"separation\": 29.7129}, {\"body_1\": \"mars\", \"body_2\": \"pluto\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 0.6635, \"allowed_orb\": 3.0, \"separation\": 149.3365}, {\"body_1\": \"uranus\", \"body_2\": \"neptune\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 1.1038, \"allowed_orb\": 2.0, \"separation\": 31.1038}, {\"body_1\": \"venus\", \"body_2\": \"saturn\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 1.5268, \"allowed_orb\": 8.0, \"separation\": 121.5268}, {\"body_1\": \"sun\", \"body_2\": \"chiron\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 1.5627, \"allowed_orb\": 3.0, \"separation\": 148.4373}, {\"body_1\": \"venus\", \"body_2\": \"north_node\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 1.6959, \"allowed_orb\": 3.0, \"separation\": 151.6959}, {\"body_1\": \"mercury\", \"body_2\": \"venus\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 1.983, \"allowed_orb\": 8.0, \"separation\": 121.983}, {\"body_1\": \"moon\", \"body_2\": \"mercury\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 2.5802, \"allowed_orb\": 8.0, \"separation\": 122.5802}, {\"body_1\": \"moon\", \"body_2\": \"north_node\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 2.8673, \"allowed_orb\": 8.0, \"separation\": 92.8673}, {\"body_1\": \"jupi"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "harmonic": {
                    "type": "integer",
                    "description": "Which harmonic. 5 is the quintile harmonic, 7 the septile, 9 the novile. The 4th and 8th are the ones most often read.",
                    "minimum": 2,
                    "maximum": 180,
                    "default": 5,
                    "examples": [
                      2
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "harmonic": 5
              }
            }
          }
        }
      }
    },
    "/api/astro/western/heliocentric/": {
      "post": {
        "operationId": "astro_western_heliocentric",
        "summary": "Heliocentric chart",
        "description": "The solar system seen from the Sun rather than from the Earth.\n\nThe Earth takes the Sun's place: it is the body that is somewhere, and the Sun is the centre. So there is no heliocentric Sun, Moon or lunar node — those are Earth-centred constructs, and they are named in `omitted` rather than returned with an invented number.\n\nNo body is ever retrograde here. Retrogradation is an illusion of watching one moving planet from another, so every `retrograde` is false, and that is the correct answer rather than a missing feature.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"centre\": \"sun\", \"planets\": [{\"name\": \"earth\", \"longitude\": 322.125097, \"speed\": 0.960932, \"retrograde\": false, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 22.1251, \"formatted\": \"22°07' Aquarius\"}, {\"name\": \"mercury\", \"longitude\": 266.048574, \"speed\": 2.767625, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 26.0486, \"formatted\": \"26°02' Sagittarius\"}, {\"name\": \"venus\", \"longitude\": 91.966766, \"speed\": 1.616741, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 1.9668, \"formatted\": \"1°58' Cancer\"}, {\"name\": \"mars\", \"longitude\": 4.703217, \"speed\": 0.621477, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 4.7032, \"formatted\": \"4°42' Aries\"}, {\"name\": \"jupiter\", \"longitude\": 115.042891, \"speed\": 0.082106, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 25.0429, \"formatted\": \"25°02' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 292.969663, \"speed\": 0.030364, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 22.9697, \"formatted\": \"22°58' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 278.129858, \"speed\": 0.011499, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 8.1299, \"formatted\": \"8°07' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 283.428057, \"speed\": 0.005989, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 13.4281, \"formatted\": \"13°25' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 227.099255, \"speed\": 0.007081, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 17.0993, \"formatted\": \"17°05' Scorpio\"}, {\"name\": \"chiron\", \"longitude\": 109.782224, \"speed\": 0.028755, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 19.7822, \"formatted\": \"19°46' Cancer\"}], \"aspects\": [{\"body_1\": \"earth\", \"body_2\": \"saturn\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 0.8446, \"allowed_orb\": 2.0, \"separation\": 29.1554}, {\"body_1\": \"mercury\", \"body_2\": \"jupiter\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 1.0057, \"allowed_orb\": 3.0, \"separation\": 151.0057}, {\"body_1\": \"jupiter\", \"body_2\": \"saturn\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \"orb\": 2.0732, \"allowed_orb\": 8.0, \"separation\": 177.9268}, {\"body_1\": \"earth\", \"body_2\": \"chiron\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 2.3429, \"allowed_orb\": 3.0, \"separation\": 147.6571}, {\"body_1\": \"pluto\", \"body_2\": \"chiron\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 2.683, \"allowed_orb\": 8.0, \"separation\": 117.317}, {\"body_1\": \"venus\", \"body_2\": \"mars\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 2.7365, \"allowed_orb\": 8.0, \"separation\": 87.2635}, {\"body_1\": \"earth\", \"body_2\": \"jupiter\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 2.9178, \"allowed_orb\": 3.0, \"separation\": 152.9178}, {\"body_1\": \"saturn\", \"body_2\": \"chiron\", \"aspect\": \"opposition\", \"exact_angle\": 180.0, \"orb\": 3.1874, \"allowed_orb\": 8.0, \"separation\": 176.8126}, {\"body_1\": \"mars\", \"body_2\": \"uranus\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 3.4266, \"allowed_orb\": 8.0, \"separation\": 86.5734}, {\"body_1\": \"neptune\", \"body_2\": \"pluto\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 3.6712, \"allowed_orb\": 6.0, \"separation\": 56.3288}, {\"body_1\": \"earth\", \"body_2\": \"mercury\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 3.9235, \"allowed_orb\": 6.0, \"separation\": 56.0765}, {\"body_1\": \"earth\", \"body_2\": \"pluto\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 5.0258, \"allowed_orb\": 8.0, \"separation\": 95.0258}, {\"body_1\": \"jupiter\", \"body_2\": \"chiron\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 5.2607, \"allowed_orb\": 8.0, \"separation\": 5.2607}, {\"body_1\": \"uranus\", \"body_2\": \"neptune\", \"aspect\": \"conjunction\", \"exact_angle\": 0.0, \"orb\": 5.2982, \"allowed_orb\": 8.0, \"separation\": 5.2982}, {\"body_1\": \"saturn\", \"body_2\": \"pluto\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 5.8704, \"allowed_orb\": 6.0, \"separati"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/astro/western/house-cusps/": {
      "post": {
        "operationId": "astro_western_house_cusps",
        "summary": "Western house cusps",
        "description": "Tropical house cusps, with the ascendant, midheaven and vertex.\n\nEight house systems: placidus (the Western default), koch, porphyry, regiomontanus, campanus, equal, whole_sign and topocentric. Pass `house_system`; it defaults to placidus.\n\nThe ascendant IS the first house cusp and the midheaven IS the tenth, and this endpoint returns them from a single calculation so they cannot disagree. Two exceptions, both correct rather than bugs: under whole_sign the first cusp is 0 degrees of the sign HOLDING the ascendant, not the ascendant itself, and under equal and whole_sign the midheaven floats free of the tenth cusp because those systems divide from the ascendant rather than from the meridian.\n\nTROPICAL, not sidereal — see /api/astro/western/planets/. For Vedic houses use /api/astro/house/ or /api/astro/bhava-cusps/, which are sidereal.\n\nOpposite cusps are exactly 180 degrees apart and the twelve advance in order round the zodiac; both are asserted by tests.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "house_system": "placidus",
                    "houses": [
                      {
                        "house": 1,
                        "degree": 198.47822,
                        "sign": "Libra",
                        "sign_index": 7,
                        "degree_in_sign": 18.4782,
                        "formatted": "18°28' Libra"
                      },
                      {
                        "house": 2,
                        "degree": 227.924979,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 17.925,
                        "formatted": "17°55' Scorpio"
                      },
                      {
                        "house": 3,
                        "degree": 257.82276,
                        "sign": "Sagittarius",
                        "sign_index": 9,
                        "degree_in_sign": 17.8228,
                        "formatted": "17°49' Sagittarius"
                      },
                      {
                        "house": 4,
                        "degree": 288.075708,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 18.0757,
                        "formatted": "18°04' Capricorn"
                      },
                      {
                        "house": 5,
                        "degree": 318.958731,
                        "sign": "Aquarius",
                        "sign_index": 11,
                        "degree_in_sign": 18.9587,
                        "formatted": "18°57' Aquarius"
                      },
                      {
                        "house": 6,
                        "degree": 349.697605,
                        "sign": "Pisces",
                        "sign_index": 12,
                        "degree_in_sign": 19.6976,
                        "formatted": "19°41' Pisces"
                      },
                      {
                        "house": 7,
                        "degree": 18.47822,
                        "sign": "Aries",
                        "sign_index": 1,
                        "degree_in_sign": 18.4782,
                        "formatted": "18°28' Aries"
                      },
                      {
                        "house": 8,
                        "degree": 47.924979,
                        "sign": "Taurus",
                        "sign_index": 2,
                        "degree_in_sign": 17.925,
                        "formatted": "17°55' Taurus"
                      },
                      {
                        "house": 9,
                        "degree": 77.82276,
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 17.8228,
                        "formatted": "17°49' Gemini"
                      },
                      {
                        "house": 10,
                        "degree": 108.075708,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 18.0757,
                        "formatted": "18°04' Cancer"
                      },
                      {
                        "house": 11,
                        "degree": 138.958731,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 18.9587,
                        "formatted": "18°57' Leo"
                      },
                      {
                        "house": 12,
                        "degree": 169.697605,
                        "sign": "Virgo",
                        "sign_index": 6,
                        "degree_in_sign": 19.6976,
                        "formatted": "19°41' Virgo"
                      }
                    ],
                    "ascendant": {
                      "degree": 198.47822,
                      "sign": "Libra",
                      "sign_index": 7,
                      "degree_in_sign": 18.4782,
                      "formatted": "18°28' Libra"
                    },
                    "midheaven": {
                      "degree": 108.075708,
                      "sign": "Cancer",
                      "sign_index": 4,
                      "degree_in_sign": 18.0757,
                      "formatted": "18°04' Cancer"
                    },
                    "vertex": {
                      "degree": 309.637083,
                      "sign": "Aquarius",
                      "sign_index": 11,
                      "degree_in_sign": 9.6371,
                      "formatted": "9°38' Aquarius"
                    }
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "house_system": {
                    "type": "string",
                    "enum": [
                      "campanus",
                      "equal",
                      "koch",
                      "placidus",
                      "porphyry",
                      "regiomontanus",
                      "topocentric",
                      "whole_sign"
                    ],
                    "default": "placidus",
                    "examples": [
                      "campanus"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 19.2056,
                "longitude": 25.2056,
                "house_system": "placidus"
              }
            }
          }
        }
      }
    },
    "/api/astro/western/natal-chart/": {
      "post": {
        "operationId": "astro_western_natal_chart",
        "summary": "Western natal chart",
        "description": "A tropical natal chart: the same twelve bodies, plus every aspect between them.\n\nTROPICAL, not sidereal. Every other chart endpoint here subtracts the ayanamsa — about 24 degrees at present — which moves nearly every planet into the previous sign. Someone born on 15 August is a Leo here and a Cancer on /api/astro/chart/. Both are correct for their own tradition; pick the one your product uses and do not mix them.\n\nTwelve bodies: the ten Western planets, the true north node and Chiron. Each returns its longitude, the sign and degrees within it, a formatted position, its daily motion and whether it is retrograde.\n\nSend a date, a time and a place. Nothing else — the zodiac is fixed by the route.\n\nAspects cover the five Ptolemaic angles — conjunction, sextile, square, trine, opposition — plus quincunx and semisextile. Each carries its exact angle, the `orb` by which it misses exact, and the `allowed_orb` that admitted it, so you can filter tighter than our defaults without recalculating. `applying` is true while the aspect is still forming and false once it has passed exact, derived from the bodies' own daily motion.\n\nOrbs are a matter of convention and astrologers disagree; ours are the widely used defaults and are stated on every hit rather than assumed.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"planets\": [{\"name\": \"sun\", \"longitude\": 142.125, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 22.125, \"formatted\": \"22°07' Leo\", \"speed\": 0.960934, \"retrograde\": false}, {\"name\": \"moon\", \"longitude\": 72.66, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 12.66, \"formatted\": \"12°39' Gemini\", \"speed\": 14.262958, \"retrograde\": false}, {\"name\": \"mercury\", \"longitude\": 169.176, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 19.176, \"formatted\": \"19°10' Virgo\", \"speed\": 0.776615, \"retrograde\": false}, {\"name\": \"venus\", \"longitude\": 121.573, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 1.573, \"formatted\": \"1°34' Leo\", \"speed\": 1.22118, \"retrograde\": false}, {\"name\": \"mars\", \"longitude\": 51.217, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 21.217, \"formatted\": \"21°13' Taurus\", \"speed\": 0.576982, \"retrograde\": false}, {\"name\": \"jupiter\", \"longitude\": 119.337, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 29.337, \"formatted\": \"29°20' Cancer\", \"speed\": 0.214649, \"retrograde\": false}, {\"name\": \"saturn\", \"longitude\": 289.878, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 19.878, \"formatted\": \"19°52' Capricorn\", \"speed\": -0.056381, \"retrograde\": true}, {\"name\": \"uranus\", \"longitude\": 275.978, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 5.978, \"formatted\": \"5°58' Capricorn\", \"speed\": -0.023775, \"retrograde\": true}, {\"name\": \"neptune\", \"longitude\": 282.199, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 12.199, \"formatted\": \"12°11' Capricorn\", \"speed\": -0.019063, \"retrograde\": true}, {\"name\": \"pluto\", \"longitude\": 225.084, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 15.084, \"formatted\": \"15°05' Scorpio\", \"speed\": 0.011469, \"retrograde\": false}, {\"name\": \"north_node\", \"longitude\": 307.233, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 7.233, \"formatted\": \"7°13' Aquarius\", \"speed\": 0.014476, \"retrograde\": false}, {\"name\": \"chiron\", \"longitude\": 112.438, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 22.438, \"formatted\": \"22°26' Cancer\", \"speed\": 0.099053, \"retrograde\": false}], \"aspects\": [{\"from\": \"sun\", \"to\": \"mars\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 0.908, \"allowed_orb\": 8.0, \"applying\": false, \"separation\": 90.908}, {\"from\": \"sun\", \"to\": \"saturn\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 2.247, \"allowed_orb\": 3.0, \"applying\": false, \"separation\": 147.753}, {\"from\": \"sun\", \"to\": \"pluto\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 7.041, \"allowed_orb\": 8.0, \"applying\": false, \"separation\": 82.959}, {\"from\": \"sun\", \"to\": \"chiron\", \"aspect\": \"semisextile\", \"exact_angle\": 30.0, \"orb\": 0.313, \"allowed_orb\": 2.0, \"applying\": true, \"separation\": 29.687}, {\"from\": \"moon\", \"to\": \"mercury\", \"aspect\": \"square\", \"exact_angle\": 90.0, \"orb\": 6.516, \"allowed_orb\": 8.0, \"applying\": true, \"separation\": 96.516}, {\"from\": \"moon\", \"to\": \"neptune\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 0.461, \"allowed_orb\": 3.0, \"applying\": false, \"separation\": 150.461}, {\"from\": \"moon\", \"to\": \"pluto\", \"aspect\": \"quincunx\", \"exact_angle\": 150.0, \"orb\": 2.424, \"allowed_orb\": 3.0, \"applying\": true, \"separation\": 152.424}, {\"from\": \"moon\", \"to\": \"north_node\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 5.427, \"allowed_orb\": 8.0, \"applying\": false, \"separation\": 125.427}, {\"from\": \"mercury\", \"to\": \"mars\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 2.041, \"allowed_orb\": 8.0, \"applying\": true, \"separation\": 117.959}, {\"from\": \"mercury\", \"to\": \"saturn\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 0.702, \"allowed_orb\": 8.0, \"applying\": true, \"separation\": 120.702}, {\"from\": \"mercury\", \"to\": \"neptune\", \"aspect\": \"trine\", \"exact_angle\": 120.0, \"orb\": 6.977, \"allowed_orb\": 8.0, \"applying\": false, \"separation\": 113.023}, {\"from\": \"mercury\", \"to\": \"pluto\", \"aspect\": \"sextile\", \"exact_angle\": 60.0, \"orb\": 4.092, \"allowed_orb\": 6.0, \"applying\": false, \"separation\": 55.908}, {\"from\": \"mercury\", \"to\": \"chiron\", \"asp"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/western/planets/": {
      "post": {
        "operationId": "astro_western_planets",
        "summary": "Western planets (tropical)",
        "description": "Tropical positions of the ten planets, the north node and Chiron.\n\nTROPICAL, not sidereal. Every other chart endpoint here subtracts the ayanamsa — about 24 degrees at present — which moves nearly every planet into the previous sign. Someone born on 15 August is a Leo here and a Cancer on /api/astro/chart/. Both are correct for their own tradition; pick the one your product uses and do not mix them.\n\nTwelve bodies: the ten Western planets, the true north node and Chiron. Each returns its longitude, the sign and degrees within it, a formatted position, its daily motion and whether it is retrograde.\n\nSend a date, a time and a place. Nothing else — the zodiac is fixed by the route.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "zodiac": "tropical",
                    "planets": [
                      {
                        "name": "sun",
                        "longitude": 142.125,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 22.125,
                        "formatted": "22°07' Leo",
                        "speed": 0.960934,
                        "retrograde": false
                      },
                      {
                        "name": "moon",
                        "longitude": 72.66,
                        "sign": "Gemini",
                        "sign_index": 3,
                        "degree_in_sign": 12.66,
                        "formatted": "12°39' Gemini",
                        "speed": 14.262958,
                        "retrograde": false
                      },
                      {
                        "name": "mercury",
                        "longitude": 169.176,
                        "sign": "Virgo",
                        "sign_index": 6,
                        "degree_in_sign": 19.176,
                        "formatted": "19°10' Virgo",
                        "speed": 0.776615,
                        "retrograde": false
                      },
                      {
                        "name": "venus",
                        "longitude": 121.573,
                        "sign": "Leo",
                        "sign_index": 5,
                        "degree_in_sign": 1.573,
                        "formatted": "1°34' Leo",
                        "speed": 1.22118,
                        "retrograde": false
                      },
                      {
                        "name": "mars",
                        "longitude": 51.217,
                        "sign": "Taurus",
                        "sign_index": 2,
                        "degree_in_sign": 21.217,
                        "formatted": "21°13' Taurus",
                        "speed": 0.576982,
                        "retrograde": false
                      },
                      {
                        "name": "jupiter",
                        "longitude": 119.337,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 29.337,
                        "formatted": "29°20' Cancer",
                        "speed": 0.214649,
                        "retrograde": false
                      },
                      {
                        "name": "saturn",
                        "longitude": 289.878,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 19.878,
                        "formatted": "19°52' Capricorn",
                        "speed": -0.056381,
                        "retrograde": true
                      },
                      {
                        "name": "uranus",
                        "longitude": 275.978,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 5.978,
                        "formatted": "5°58' Capricorn",
                        "speed": -0.023775,
                        "retrograde": true
                      },
                      {
                        "name": "neptune",
                        "longitude": 282.199,
                        "sign": "Capricorn",
                        "sign_index": 10,
                        "degree_in_sign": 12.199,
                        "formatted": "12°11' Capricorn",
                        "speed": -0.019063,
                        "retrograde": true
                      },
                      {
                        "name": "pluto",
                        "longitude": 225.084,
                        "sign": "Scorpio",
                        "sign_index": 8,
                        "degree_in_sign": 15.084,
                        "formatted": "15°05' Scorpio",
                        "speed": 0.011469,
                        "retrograde": false
                      },
                      {
                        "name": "north_node",
                        "longitude": 307.233,
                        "sign": "Aquarius",
                        "sign_index": 11,
                        "degree_in_sign": 7.233,
                        "formatted": "7°13' Aquarius",
                        "speed": 0.014476,
                        "retrograde": false
                      },
                      {
                        "name": "chiron",
                        "longitude": 112.438,
                        "sign": "Cancer",
                        "sign_index": 4,
                        "degree_in_sign": 22.438,
                        "formatted": "22°26' Cancer",
                        "speed": 0.099053,
                        "retrograde": false
                      }
                    ]
                  },
                  "status": 200,
                  "is_error": false,
                  "message": "successful"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "date_time",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-08-15T10:30:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873
              }
            }
          }
        }
      }
    },
    "/api/astro/western/progressions/": {
      "post": {
        "operationId": "astro_western_progressions",
        "summary": "Secondary progressions",
        "description": "Secondary progressions: a day of ephemeris for a year of life.\n\nThe chart is advanced by reading the sky one DAY after birth for each YEAR lived, so a fortieth birthday is read from the fortieth day of life. It is the oldest predictive technique in Western astrology, and the reason a progressed Moon moves about a degree a month while progressed Pluto barely moves at all across a whole lifetime.\n\nGive the date you want the chart for in `progressed_to`; the endpoint works out the elapsed years and the ephemeris date itself and reports both, so the conversion is visible rather than implied. Returns the progressed positions, the natal ones beside them, and every aspect from the progressed chart to the natal — which is how progressions are actually read.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"method\": \"secondary_progression\", \"years_elapsed\": 35.999124, \"ephemeris_days_advanced\": 35.999124, \"orb_factor\": 1.0, \"natal\": [{\"name\": \"sun\", \"longitude\": 49.66766, \"speed\": 0.96609, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 19.6677, \"formatted\": \"19°40' Taurus\"}, {\"name\": \"moon\", \"longitude\": 238.259725, \"speed\": 11.874218, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 28.2597, \"formatted\": \"28°15' Scorpio\"}, {\"name\": \"mercury\", \"longitude\": 39.452338, \"speed\": -0.452198, \"retrograde\": true, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 9.4523, \"formatted\": \"9°27' Taurus\"}, {\"name\": \"venus\", \"longitude\": 7.250368, \"speed\": 1.132131, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 7.2504, \"formatted\": \"7°15' Aries\"}, {\"name\": \"mars\", \"longitude\": 344.690843, \"speed\": 0.744344, \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 14.6908, \"formatted\": \"14°41' Pisces\"}, {\"name\": \"jupiter\", \"longitude\": 98.630274, \"speed\": 0.182781, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 8.6303, \"formatted\": \"8°37' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 295.313114, \"speed\": -0.009099, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 25.3131, \"formatted\": \"25°18' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 279.296197, \"speed\": -0.021248, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 9.2962, \"formatted\": \"9°17' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 284.419553, \"speed\": -0.012489, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 14.4196, \"formatted\": \"14°25' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 226.304012, \"speed\": -0.028026, \"retrograde\": true, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 16.304, \"formatted\": \"16°18' Scorpio\"}, {\"name\": \"north_node\", \"longitude\": 310.874753, \"speed\": -0.221102, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 10.8748, \"formatted\": \"10°52' Aquarius\"}, {\"name\": \"chiron\", \"longitude\": 102.832128, \"speed\": 0.075226, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 12.8321, \"formatted\": \"12°49' Cancer\"}], \"progressed\": [{\"name\": \"sun\", \"longitude\": 84.224892, \"speed\": 0.955093, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 24.2249, \"formatted\": \"24°13' Gemini\"}, {\"name\": \"moon\", \"longitude\": 346.693577, \"speed\": 13.397564, \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 16.6936, \"formatted\": \"16°41' Pisces\"}, {\"name\": \"mercury\", \"longitude\": 65.862213, \"speed\": 1.720516, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 5.8622, \"formatted\": \"5°51' Gemini\"}, {\"name\": \"venus\", \"longitude\": 48.894988, \"speed\": 1.176077, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 18.895, \"formatted\": \"18°53' Taurus\"}, {\"name\": \"mars\", \"longitude\": 11.113068, \"speed\": 0.718832, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 11.1131, \"formatted\": \"11°06' Aries\"}, {\"name\": \"jupiter\", \"longitude\": 105.911114, \"speed\": 0.216696, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 15.9111, \"formatted\": \"15°54' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 294.026077, \"speed\": -0.058739, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 24.0261, \"formatted\": \"24°01' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 278.161325, \"speed\": -0.038952, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 8.1613, \"formatted\": \"8°09' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 283.714578, \"speed\": -0.025047, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 13.7146, \"formatted\": \"13°42' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 225.39949, \"speed\": -0.020141, \"retrograde\": true, \"sig"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "progressed_to": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The date to progress the chart to. One day of ephemeris time is read for each year between birth and this date.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "progressed_to"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "progressed_to": "2026-05-10T00:00:00+00:00",
                "orb_factor": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/western/synastry/": {
      "post": {
        "operationId": "astro_western_synastry",
        "summary": "Synastry",
        "description": "Every aspect between two people's charts.\n\nSynastry compares one chart against another body by body, so a contact like 'her Venus trine his Mars' is a relationship between two DIFFERENT charts and has no equivalent inside either one. That is why a natal aspect grid cannot answer it: there a body never aspects itself, while here Sun-to-Sun is one of the most-read contacts there is.\n\nReturns both charts' positions and every cross-aspect, tightest orb first. `orb_factor` scales the whole aspect table if you work to tighter or wider orbs than the conventional ones — 0.5 halves them, 2 doubles them.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"orb_factor\": 1.0, \"person_a\": [{\"name\": \"sun\", \"longitude\": 49.66766, \"speed\": 0.96609, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 19.6677, \"formatted\": \"19°40' Taurus\"}, {\"name\": \"moon\", \"longitude\": 238.259725, \"speed\": 11.874218, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 28.2597, \"formatted\": \"28°15' Scorpio\"}, {\"name\": \"mercury\", \"longitude\": 39.452338, \"speed\": -0.452198, \"retrograde\": true, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 9.4523, \"formatted\": \"9°27' Taurus\"}, {\"name\": \"venus\", \"longitude\": 7.250368, \"speed\": 1.132131, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 7.2504, \"formatted\": \"7°15' Aries\"}, {\"name\": \"mars\", \"longitude\": 344.690843, \"speed\": 0.744344, \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 14.6908, \"formatted\": \"14°41' Pisces\"}, {\"name\": \"jupiter\", \"longitude\": 98.630274, \"speed\": 0.182781, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 8.6303, \"formatted\": \"8°37' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 295.313114, \"speed\": -0.009099, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 25.3131, \"formatted\": \"25°18' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 279.296197, \"speed\": -0.021248, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 9.2962, \"formatted\": \"9°17' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 284.419553, \"speed\": -0.012489, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 14.4196, \"formatted\": \"14°25' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 226.304012, \"speed\": -0.028026, \"retrograde\": true, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 16.304, \"formatted\": \"16°18' Scorpio\"}, {\"name\": \"north_node\", \"longitude\": 310.874753, \"speed\": -0.221102, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 10.8748, \"formatted\": \"10°52' Aquarius\"}, {\"name\": \"chiron\", \"longitude\": 102.832128, \"speed\": 0.075226, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 12.8321, \"formatted\": \"12°49' Cancer\"}], \"person_b\": [{\"name\": \"sun\", \"longitude\": 240.991341, \"speed\": 1.010456, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 0.9913, \"formatted\": \"0°59' Sagittarius\"}, {\"name\": \"moon\", \"longitude\": 53.223187, \"speed\": 14.269097, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 23.2232, \"formatted\": \"23°13' Taurus\"}, {\"name\": \"mercury\", \"longitude\": 236.280707, \"speed\": 1.58798, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 26.2807, \"formatted\": \"26°16' Scorpio\"}, {\"name\": \"venus\", \"longitude\": 209.393508, \"speed\": 1.232018, \"retrograde\": false, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 29.3935, \"formatted\": \"29°23' Libra\"}, {\"name\": \"mars\", \"longitude\": 3.919152, \"speed\": 0.292498, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 3.9192, \"formatted\": \"3°55' Aries\"}, {\"name\": \"jupiter\", \"longitude\": 61.054447, \"speed\": -0.136364, \"retrograde\": true, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 1.0544, \"formatted\": \"1°03' Gemini\"}, {\"name\": \"saturn\", \"longitude\": 271.108557, \"speed\": 0.107531, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 1.1086, \"formatted\": \"1°06' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 269.459759, \"speed\": 0.054838, \"retrograde\": false, \"sign\": \"Sagittarius\", \"sign_index\": 9, \"degree_in_sign\": 29.4598, \"formatted\": \"29°27' Sagittarius\"}, {\"name\": \"neptune\", \"longitude\": 278.52942, \"speed\": 0.03151, \"retrograde\": false, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 8.5294, \"formatted\": \"8°31' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 223.244883, \"speed\": 0.039039, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 13.2449, \"formatted\": \"13°14' Scorpio\"}, {\"na"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "partner_date_time": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "default": 0,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "default": 0,
                    "examples": [
                      75.7873
                    ]
                  },
                  "orb_factor": {
                    "type": "number",
                    "format": "double",
                    "description": "Scale every aspect orb. 0.5 halves them, 2 doubles them.",
                    "minimum": 0.1,
                    "maximum": 2,
                    "default": 1,
                    "examples": [
                      0.1
                    ]
                  },
                  "partner_timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      -12
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "default": 0,
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "partner_date_time"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "partner_date_time": "1988-11-23T07:15:00+05:30",
                "partner_timezone_as_float": 5.5,
                "orb_factor": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/western/transits/": {
      "post": {
        "operationId": "astro_western_transits",
        "summary": "Transits to natal",
        "description": "Today's sky against a birth chart.\n\nEvery aspect from the transiting planets at `transit_date_time` to the natal planets at `date_time` — the everyday question of Western practice, and one a single-chart endpoint cannot answer however many times you call it.\n\nReported transit-first, so `transit: saturn, natal: sun, aspect: square` reads as transiting Saturn square natal Sun, which is the direction practitioners state it in. Both charts come back in full alongside the aspects.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Western astrology"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"zodiac\": \"tropical\", \"orb_factor\": 1.0, \"natal\": [{\"name\": \"sun\", \"longitude\": 49.66766, \"speed\": 0.96609, \"retrograde\": false, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 19.6677, \"formatted\": \"19°40' Taurus\"}, {\"name\": \"moon\", \"longitude\": 238.259725, \"speed\": 11.874218, \"retrograde\": false, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 28.2597, \"formatted\": \"28°15' Scorpio\"}, {\"name\": \"mercury\", \"longitude\": 39.452338, \"speed\": -0.452198, \"retrograde\": true, \"sign\": \"Taurus\", \"sign_index\": 2, \"degree_in_sign\": 9.4523, \"formatted\": \"9°27' Taurus\"}, {\"name\": \"venus\", \"longitude\": 7.250368, \"speed\": 1.132131, \"retrograde\": false, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 7.2504, \"formatted\": \"7°15' Aries\"}, {\"name\": \"mars\", \"longitude\": 344.690843, \"speed\": 0.744344, \"retrograde\": false, \"sign\": \"Pisces\", \"sign_index\": 12, \"degree_in_sign\": 14.6908, \"formatted\": \"14°41' Pisces\"}, {\"name\": \"jupiter\", \"longitude\": 98.630274, \"speed\": 0.182781, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 8.6303, \"formatted\": \"8°37' Cancer\"}, {\"name\": \"saturn\", \"longitude\": 295.313114, \"speed\": -0.009099, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 25.3131, \"formatted\": \"25°18' Capricorn\"}, {\"name\": \"uranus\", \"longitude\": 279.296197, \"speed\": -0.021248, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 9.2962, \"formatted\": \"9°17' Capricorn\"}, {\"name\": \"neptune\", \"longitude\": 284.419553, \"speed\": -0.012489, \"retrograde\": true, \"sign\": \"Capricorn\", \"sign_index\": 10, \"degree_in_sign\": 14.4196, \"formatted\": \"14°25' Capricorn\"}, {\"name\": \"pluto\", \"longitude\": 226.304012, \"speed\": -0.028026, \"retrograde\": true, \"sign\": \"Scorpio\", \"sign_index\": 8, \"degree_in_sign\": 16.304, \"formatted\": \"16°18' Scorpio\"}, {\"name\": \"north_node\", \"longitude\": 310.874753, \"speed\": -0.221102, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 10.8748, \"formatted\": \"10°52' Aquarius\"}, {\"name\": \"chiron\", \"longitude\": 102.832128, \"speed\": 0.075226, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 12.8321, \"formatted\": \"12°49' Cancer\"}], \"transiting\": [{\"name\": \"sun\", \"longitude\": 165.376696, \"speed\": 0.970991, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 15.3767, \"formatted\": \"15°22' Virgo\"}, {\"name\": \"moon\", \"longitude\": 124.270276, \"speed\": 14.272594, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 4.2703, \"formatted\": \"4°16' Leo\"}, {\"name\": \"mercury\", \"longitude\": 175.395589, \"speed\": 1.743494, \"retrograde\": false, \"sign\": \"Virgo\", \"sign_index\": 6, \"degree_in_sign\": 25.3956, \"formatted\": \"25°23' Virgo\"}, {\"name\": \"venus\", \"longitude\": 208.418004, \"speed\": 0.696534, \"retrograde\": false, \"sign\": \"Libra\", \"sign_index\": 7, \"degree_in_sign\": 28.418, \"formatted\": \"28°25' Libra\"}, {\"name\": \"mars\", \"longitude\": 107.797681, \"speed\": 0.623797, \"retrograde\": false, \"sign\": \"Cancer\", \"sign_index\": 4, \"degree_in_sign\": 17.7977, \"formatted\": \"17°47' Cancer\"}, {\"name\": \"jupiter\", \"longitude\": 135.152632, \"speed\": 0.20484, \"retrograde\": false, \"sign\": \"Leo\", \"sign_index\": 5, \"degree_in_sign\": 15.1526, \"formatted\": \"15°09' Leo\"}, {\"name\": \"saturn\", \"longitude\": 13.258167, \"speed\": -0.064269, \"retrograde\": true, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 13.2582, \"formatted\": \"13°15' Aries\"}, {\"name\": \"uranus\", \"longitude\": 65.693639, \"speed\": 0.002417, \"retrograde\": false, \"sign\": \"Gemini\", \"sign_index\": 3, \"degree_in_sign\": 5.6936, \"formatted\": \"5°41' Gemini\"}, {\"name\": \"neptune\", \"longitude\": 3.489534, \"speed\": -0.025984, \"retrograde\": true, \"sign\": \"Aries\", \"sign_index\": 1, \"degree_in_sign\": 3.4895, \"formatted\": \"3°29' Aries\"}, {\"name\": \"pluto\", \"longitude\": 303.392089, \"speed\": -0.016015, \"retrograde\": true, \"sign\": \"Aquarius\", \"sign_index\": 11, \"degree_in_sign\": 3.3921, \"formatted\": \"3°23' Aquarius\"}, {\"name\": \"north_node\", \"longitude\": 329.807661, \"spee"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date_time": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC, and can return the previous day's result with a 200. '2026-09-01T06:00:00Z' and '2026-09-01 06:00:00' are different instants and give different answers.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_end": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "datetime_start": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planet": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "tz": {
                    "type": "number",
                    "format": "double",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      -12
                    ]
                  },
                  "celestial": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "celestial1": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "celestial2": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "degr": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -89.9,
                    "maximum": 89.9,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "when": {
                    "type": "string",
                    "examples": [
                      "string"
                    ]
                  },
                  "x2cross": {
                    "type": "number",
                    "format": "double",
                    "examples": [
                      0
                    ]
                  }
                },
                "required": [
                  "date_time",
                  "datetime_end",
                  "datetime_start",
                  "keys",
                  "planet",
                  "tz"
                ],
                "additionalProperties": true
              },
              "example": {
                "date_time": "1990-05-10T19:55:00+05:30",
                "timezone_as_float": 5.5,
                "latitude": 26.9124,
                "longitude": 75.7873,
                "transit_date_time": "2026-09-08T00:00:00+00:00",
                "orb_factor": 1
              }
            }
          }
        }
      }
    },
    "/api/astro/yoga_scan/": {
      "post": {
        "operationId": "astro_yoga_scan",
        "summary": "Nitya Yoga year scan",
        "description": "The Nitya Yoga is the twenty-seventh division of the circle formed by adding the Sun's and the Moon's sidereal longitudes together. Each of the twenty-seven — Vishkambha through Vaidhriti — lasts a little under a day, and they matter for electional work: Vyatipata, Vaidhriti, Parigha, Vyaghata, Shoola, Ganda and Atiganda are traditionally avoided, while Siddhi, Siddha, Shubha, Amrita-class and Sukarma yogas are sought. This endpoint takes one yoga by name and returns every occurrence of it in a calendar year.\n\n`yoga_name` is case-sensitive and must match the enum exactly. `year` and `timezone_as_float` define the local year to cover, and no coordinates are needed because the yoga changes at the same instant everywhere. Because the sum of the two longitudes advances by roughly 13 degrees 20 minutes every 22.6 hours, each yoga comes round about fourteen or fifteen times a year.\n\nThe response is `{year, yoga_name, rows}`, where `rows` is a chronological list of `{start, end}` UTC ISO timestamps. Each pair is the genuine begin and end instant of that yoga, found by bisecting the Sun-plus-Moon longitude sum rather than by sampling at sunrise, so the boundaries are accurate to a fraction of a second.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Scans & transitions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "year": 2026,
                    "yoga_name": "Vishkambha",
                    "rows": [
                      {
                        "start": "2026-01-04T20:17:27.999999+00:00",
                        "end": "2026-01-05T17:17:16.999999+00:00"
                      },
                      {
                        "start": "2026-01-30T11:28:35.999999+00:00",
                        "end": "2026-01-31T08:03:35.999999+00:00"
                      },
                      {
                        "start": "2026-02-24T22:56:20.999999+00:00",
                        "end": "2026-02-25T19:58:43.999999+00:00"
                      },
                      {
                        "start": "2026-03-22T10:11:35.999999+00:00",
                        "end": "2026-03-23T06:52:06.999999+00:00"
                      },
                      {
                        "start": "2026-04-17T01:51:55.999999+00:00",
                        "end": "2026-04-17T22:15:28.999999+00:00"
                      },
                      {
                        "start": "2026-05-12T17:49:31.999999+00:00",
                        "end": "2026-05-13T15:24:49.999999+00:00"
                      },
                      {
                        "start": "2026-06-07T04:31:57.999999+00:00",
                        "end": "2026-06-08T03:58:13.999999+00:00"
                      },
                      {
                        "start": "2026-07-02T11:09:21.999999+00:00",
                        "end": "2026-07-03T11:30:01.999999+00:00"
                      },
                      {
                        "start": "2026-07-27T17:24:55.999999+00:00",
                        "end": "2026-07-28T18:03:37.999999+00:00"
                      },
                      {
                        "start": "2026-08-21T23:48:40.999999+00:00",
                        "end": "2026-08-23T00:44:33.999999+00:00"
                      },
                      {
                        "start": "2026-09-16T06:52:40.999999+00:00",
                        "end": "2026-09-17T07:19:46.999999+00:00"
                      },
                      {
                        "start": "2026-10-11T15:35:35.999999+00:00",
                        "end": "2026-10-12T15:02:25.999999+00:00"
                      },
                      {
                        "start": "2026-11-05T23:39:40.999999+00:00",
                        "end": "2026-11-06T22:40:11.999999+00:00"
                      },
                      {
                        "start": "2026-12-01T06:45:12.999999+00:00",
                        "end": "2026-12-02T05:01:50.999999+00:00"
                      },
                      {
                        "start": "2026-12-26T18:52:33.999999+00:00",
                        "end": "2026-12-27T15:23:47.999999+00:00"
                      }
                    ]
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits.",
                    "minimum": 1800,
                    "maximum": 2400,
                    "examples": [
                      2026
                    ]
                  },
                  "yoga_name": {
                    "type": "string",
                    "enum": [
                      "Vishkambha",
                      "Preeti",
                      "Ayushman",
                      "Saubhagya",
                      "Shobhana",
                      "Atiganda",
                      "Sukarma",
                      "Dhriti",
                      "Shoola",
                      "Ganda",
                      "Vriddhi",
                      "Dhruva",
                      "Vyaghata",
                      "Harshana",
                      "Vajra",
                      "Siddhi",
                      "Vyatipata",
                      "Variyana",
                      "Parigha",
                      "Shiva",
                      "Siddha",
                      "Sadhya",
                      "Shubha",
                      "Shukla",
                      "Brahma",
                      "Indra",
                      "Vaidhriti"
                    ],
                    "examples": [
                      "Vishkambha"
                    ]
                  }
                },
                "required": [
                  "timezone_as_float",
                  "year",
                  "yoga_name"
                ],
                "additionalProperties": true
              },
              "example": {
                "timezone_as_float": 5.5,
                "year": 2026,
                "yoga_name": "Vishkambha"
              }
            }
          }
        }
      }
    },
    "/api/astrodatabank/celebrities/": {
      "post": {
        "operationId": "astrodatabank_celebrities",
        "summary": "Celebrity chart search",
        "description": "A searchable database of birth charts for public figures and dated historical events, with each record already reduced to divisional charts, house positions, aspects and arudhas so you can query by chart feature rather than by date. It is the tool for research questions such as which charts have Saturn in the tenth house, or which astrologers were born with Mars and Mercury conjunct.\n\nEvery filter is optional and they combine with AND. Biographical filters cover `name_search` (each word must appear, so 'Amitabh Bachchan' matches a record stored as 'Bachchan, Amitabh'), `name_starts_with`, `birth_date_from`/`birth_date_to`, `birth_month_day` as 'MM-DD', `gender`, `countries`, `categories` (a substring match against the AstroDatabank category strings such as 'Vocation: Sports: Football') and `rodden_rating` — the standard scale for how well a birth time is sourced, from AA for a birth certificate down to DD for conflicting or unverified data. Chart filters cover `planets_in_houses`, `planets_in_signs`, `planets_in_nakshatras`, `conjunct` (two planets in the same house), `graha_aspects` and `rashi_aspects` (planet-to-planet, one aspecting the other), `bhava_arudhas`, `combust_planets` and `retrograde_planets`. `chart` selects which divisional chart the position filters apply to — RashiChart by default, or Hora, Drekkana, Chaturthamsa, Navamsa or Dasamsa — and `nodes` chooses true or mean nodes for any Rahu or Ketu condition.\n\nResults are paginated: `page` from 1 and `page_size` from 1 to 100, defaulting to 20, ordered by `order_by` (`birth_date_asc` by default, or name ascending or descending, which sorts on the given name rather than the stored 'Last, First' form). The response is `{results, total, page, page_size, total_pages}`; each result carries id, display name, gender, birth date and time, city, country, latitude, longitude, Rodden rating, data source, category list, image URL, the Rashi ascendant and the localised birth datetime. Take the `id` to the detail endpoint for the full chart data.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Celebrity data"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"results\": [{\"id\": 65055, \"idx\": 65088, \"name\": \"\\\"Akron\\\" Frey\", \"gender\": \"male\", \"birth_date\": \"1948-05-01\", \"birth_time\": \"21:07\", \"city\": \"Münsterlingen\", \"country\": \"Switzerland\", \"latitude\": 47.633333, \"longitude\": 9.233333, \"rodden_rating\": \"A\", \"data_source\": \"From memory\", \"categories\": [\"Vocation: Occult Fields: Astrologer (Pro)\", \"Vocation: Occult Fields: Parapsychology\", \"Vocation: Writers: Astrology\"], \"image_url\": null, \"ascendant\": {\"pada\": 1, \"longitude\": 216.1815167580023, \"nakshatra\": \"Anooraadha\", \"zodiac_name\": \"Scorpio\"}, \"computed_datetime\": {\"timezone_as_float\": 1.0, \"localized_datetime\": \"1948-05-01T21:07:00+01:00\"}}, {\"id\": 72901, \"idx\": 72934, \"name\": \"\\\"Crazylegs\\\" Hirsch\", \"gender\": \"male\", \"birth_date\": \"1923-06-17\", \"birth_time\": \"22:45\", \"city\": \"Wauwatosa\", \"country\": \"Wisconsin\", \"latitude\": 43.05, \"longitude\": -88.0, \"rodden_rating\": \"AA\", \"data_source\": \"Quoted BC/BR\", \"categories\": [\"Traits: Body: Size (Height: 6 ft 2 in/ 1.88 m)\", \"Traits: Body: Weight (190 lb/ 86 kg)\", \"Traits: Personality: Courageous (Football after doctors said impossible)\", \"Diagnoses: Body Part Problems: Accident/Injury (Car accident, loss of body control)\", \"Lifestyle: Work: Same Job more than 10 yrs (20 years as pro player)\", \"Lifestyle: Work: Work in team/ Tandem (Football teams)\", \"Personal: Death: Long life  more than 80 yrs\", \"Vocation: Sports: Football (Pro, receiver)\", \"Vocation: Sports Business: Coach/ Manager/ Owner (Athletic director with university)\", \"Notable: Awards: Vocational award (Several football records)\", \"Notable: Famous: Founder/ originator (Games first flanker, revolutionary)\", \"Notable: Famous: Top 5% of Profession\"], \"image_url\": null, \"ascendant\": {\"pada\": 4, \"longitude\": 278.94668597910663, \"nakshatra\": \"Uttaraashaadha\", \"zodiac_name\": \"Capricorn\"}, \"computed_datetime\": {\"timezone_as_float\": -5.0, \"localized_datetime\": \"1923-06-17T22:45:00-05:00\"}}, {\"id\": 63457, \"idx\": 63492, \"name\": \"\\\"Fatty\\\" Arbuckle\", \"gender\": \"male\", \"birth_date\": \"1887-03-24\", \"birth_time\": \"12:00\", \"city\": \"Smith Center\", \"country\": \"Kansas\", \"latitude\": 39.783333, \"longitude\": -98.783333, \"rodden_rating\": \"DD\", \"data_source\": \"Conflicting/unverified\", \"categories\": [\"Traits: Body: Weight (Obese)\", \"Diagnoses: Body Part Problems: Heart (Terminal attack)\", \"Lifestyle: Financial: Gain - Financial success in field (Largest contract for that time period)\", \"Passions: Criminal Perpetrator: Homicide involvement (Death of actress at his party)\", \"Vocation: Entertainment: Comedy\", \"Vocation: Politics: Government employee (Representative and ministerial positions)\", \"Notable: Book Collection: American Book\"], \"image_url\": null, \"ascendant\": {\"pada\": 1, \"longitude\": 80.28605482949072, \"nakshatra\": \"Punarvasu\", \"zodiac_name\": \"Gemini\"}, \"computed_datetime\": {\"timezone_as_float\": -6.0, \"localized_datetime\": \"1887-03-24T12:00:00-06:00\"}}, {\"id\": 28322, \"idx\": 28331, \"name\": \"\\\"Playboy\\\" Buddy Rose\", \"gender\": \"male\", \"birth_date\": \"1952-11-27\", \"birth_time\": \"21:06\", \"city\": \"Omaha\", \"country\": \"Nebraska\", \"latitude\": 41.266667, \"longitude\": -95.933333, \"rodden_rating\": \"A\", \"data_source\": \"From memory\", \"categories\": [\"Lifestyle: Financial: Gain - Financial success in field\", \"Vocation: Sports: Wrestling\"], \"image_url\": null, \"ascendant\": {\"pada\": 3, \"longitude\": 100.06064481940373, \"nakshatra\": \"Pushyami\", \"zodiac_name\": \"Cancer\"}, \"computed_datetime\": {\"timezone_as_float\": -6.0, \"localized_datetime\": \"1952-11-27T21:06:00-06:00\"}}, {\"id\": 2385, \"idx\": 2355, \"name\": \"10th Prince of Thurn and Taxis Karl August\", \"gender\": \"male\", \"birth_date\": \"1898-07-23\", \"birth_time\": \"15:00\", \"city\": \"Feldafing\", \"country\": \"Germany\", \"latitude\": 47.95, \"longitude\": 11.283333, \"rodden_rating\": \"C\", \"data_source\": \"Accuracy in question\", \"categories\": [\"Family: Parenting: Kids more than 3 (Four)\", \"Personal: Death: Long life  more than 80 yrs (Age 83)\", \"Notable: Famous: Royal family (House of Thurn and Taxis)\"], \"image_url\": null,"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bhava_arudhas": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"arudha\": <one of A1..A12>, \"sign\": <string>}.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "birth_date_from": {
                    "type": "string",
                    "format": "date",
                    "description": "FORMAT constraint: ISO-8601 'YYYY-MM-DD' (DRF default input formats).",
                    "examples": [
                      "string"
                    ]
                  },
                  "birth_date_to": {
                    "type": "string",
                    "format": "date",
                    "description": "FORMAT constraint: ISO-8601 'YYYY-MM-DD' (DRF default input formats).",
                    "examples": [
                      "string"
                    ]
                  },
                  "birth_month_day": {
                    "type": "string",
                    "description": "MM-DD  e.g. 06-08 FORMAT constraint: 'MM-DD', e.g. '06-08'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "categories": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "chart": {
                    "type": "string",
                    "description": "Only these six divisional charts are available for celebrity records. Defaults to RashiChart. Case-sensitive.",
                    "enum": [
                      "RashiChart",
                      "HoraChart",
                      "DrekkanaChart",
                      "ChaturthamsaChart",
                      "NavamsaChart",
                      "DasamsaChart"
                    ],
                    "default": "RashiChart",
                    "examples": [
                      "RashiChart"
                    ]
                  },
                  "combust_planets": {
                    "type": "array",
                    "description": "Array of strings. Deliberately narrower than VALID_PLANETS - only these five are tracked in the combust_planets data.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "Mars",
                        "Mercury",
                        "Venus",
                        "Jupiter",
                        "Saturn"
                      ]
                    }
                  },
                  "conjunct": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"planet_a\": X, \"planet_b\": Y}, both from the 12 VALID_PLANETS (Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu, Uranus, Neptune, Pluto).",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "countries": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "data_source": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "gender": {
                    "type": "string",
                    "enum": [
                      "male",
                      "female",
                      "n/a"
                    ],
                    "examples": [
                      "male"
                    ]
                  },
                  "graha_aspects": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"from_planet\": X, \"to_planet\": Y}, both from HORA_PLANETS = Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu. Uranus/Neptune/Pluto are NOT allowed here.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "name_search": {
                    "type": "string",
                    "description": "Full or partial name search. Works with 'First Last' or 'Last First' order. FREE-FORM. Split on whitespace and each word AND-ed as a case-insensitive `contains`, so 'Amitabh Bachchan' matches the stored 'Bachchan, Amitabh'.",
                    "examples": [
                      "string"
                    ]
                  },
                  "name_starts_with": {
                    "type": "array",
                    "description": "FREE-FORM array of strings, normally single letters. OR-ed; matches either the start of the stored 'Last, First' name or the first name following ', '. Case-insensitive.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "nodes": {
                    "type": "string",
                    "description": "Default 'true'. Selects true vs mean lunar nodes for every Rahu/Ketu-based filter.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "default": "true",
                    "examples": [
                      "true"
                    ]
                  },
                  "order_by": {
                    "type": "string",
                    "description": "name_asc = A→Z, name_desc = Z→A, birth_date_asc/desc = oldest/newest first",
                    "enum": [
                      "name_asc",
                      "name_desc",
                      "birth_date_asc",
                      "birth_date_desc"
                    ],
                    "default": "birth_date_asc",
                    "examples": [
                      "name_asc"
                    ]
                  },
                  "page": {
                    "type": "integer",
                    "minimum": 1,
                    "default": 1,
                    "examples": [
                      1
                    ]
                  },
                  "page_size": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 20,
                    "examples": [
                      1
                    ]
                  },
                  "planets_in_houses": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"planet\": <one of Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn, Rahu, Ketu, Uranus, Neptune, Pluto>, \"house\": <int 1-12>}.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planets_in_nakshatras": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"planet\": <VALID_PLANETS>, \"nakshatra\": <string>}. one of: Ashwini, Bharani, Krittika, Rohini, Mrigasira, Aardra, Punarvasu, Pushyami, Aasresha, Makha, Poorva Phalguni, Uttara Phalguni, Hasta, Chitra, Swaati, Visaakha, Anooraadha, Jyeshtha, Moola, Poorvaashaadha, Uttaraashaadha, Sravanam, Dhanishtha, Satabhishak, Poorvaabhaadra, Uttaraabhaadra, Revati. Case- and spelling-sensitive.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "planets_in_signs": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: {\"planet\": <VALID_PLANETS>, \"sign\": <string>}.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "rashi_aspects": {
                    "type": "array",
                    "description": "ARRAY OF OBJECTS: same shape and same HORA_PLANETS value set as graha_aspects.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "retrograde_planets": {
                    "type": "array",
                    "description": "Array of strings. Rahu/Ketu are resolved to the stored 'True Node'/'Mean Node' keys according to `nodes` and:101-107).",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "Sun",
                        "Moon",
                        "Mars",
                        "Mercury",
                        "Jupiter",
                        "Venus",
                        "Saturn",
                        "Rahu",
                        "Ketu"
                      ]
                    }
                  },
                  "rodden_rating": {
                    "type": "array",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": true
              },
              "example": {
                "chart": "RashiChart",
                "combust_planets": [],
                "gender": "male",
                "nodes": "true",
                "order_by": "name_asc",
                "retrograde_planets": []
              }
            }
          }
        }
      }
    },
    "/api/astrodatabank/celebrities/{id}/": {
      "get": {
        "operationId": "astrodatabank_celebrities_by_pk",
        "summary": "Celebrity detail",
        "description": "Returns everything stored for one record in the celebrity database, addressed by the numeric `id` you get back from the search endpoint. Use it after a search when you want the actual charts rather than the summary line.\n\nThe response repeats the summary fields — name, gender, birth date and time, city, country, coordinates, Rodden rating, data source, categories, image URL, the Rashi ascendant and the localised birth datetime — and adds a nested `data` object holding the precomputed astrology. That includes `chart_data` keyed by divisional chart (RashiChart, HoraChart, DrekkanaChart, ChaturthamsaChart, NavamsaChart, DasamsaChart), each with an ascendant and every celestial body's longitude, latitude, nakshatra, pada, sign and house; `house_hora_data` with the aspect lists per planet; `bhava_arudha_data`; and the combust and retrograde flags. Also present are the collector, the original timezone description and any recorded life events.\n\nAn unknown id returns 404.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Celebrity data"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"id\": 1, \"idx\": 2, \"name\": \"Aviation: Sud Aviation Caravelle Maiden Flight\", \"gender\": \"n/a\", \"birth_date\": \"1955-05-27\", \"birth_time\": \"16:30\", \"city\": \"Toulouse\", \"country\": \"France\", \"latitude\": 43.6, \"longitude\": 1.433333, \"rodden_rating\": \"B\", \"data_source\": \"Timed historic source\", \"categories\": [\"Mundane: Medical/Science: Aviation\", \"Mundane: Misc. Mundane: Release dates\"], \"image_url\": null, \"ascendant\": {\"pada\": 2, \"longitude\": 178.57406129659418, \"nakshatra\": \"Chitra\", \"zodiac_name\": \"Virgo\"}, \"computed_datetime\": {\"timezone_as_float\": 1.0, \"localized_datetime\": \"1955-05-27T16:30:00+01:00\"}, \"data\": {\"_idx\": 2, \"city\": \"Toulouse\", \"name\": \"Aviation: Sud Aviation Caravelle Maiden Flight\", \"events\": [], \"gender\": \"n/a\", \"country\": \"France\", \"latitude\": 43.6, \"timezone\": \"MET h1e (is standard time)\", \"collector\": \"Liefeld\", \"longitude\": 1.433333, \"birth_date\": \"1955-05-27\", \"birth_time\": \"16:30\", \"categories\": [\"Mundane: Medical/Science: Aviation\", \"Mundane: Misc. Mundane: Release dates\"], \"chart_data\": {\"HoraChart\": {\"ascendant\": {\"pada\": 2, \"longitude\": 147.14777777777778, \"nakshatra\": \"Chitra\", \"zodiac_name\": \"Leo\"}, \"celestial\": {\"sun\": {\"pada\": 3, \"house\": 12, \"latitude\": 0.0, \"longitude\": 114.66166666666666, \"nakshatra\": \"Aasresha\", \"zodiac_name\": \"Cancer\"}, \"mars\": {\"pada\": 1, \"house\": 1, \"latitude\": 1.02, \"longitude\": 135.6338888888889, \"nakshatra\": \"Poorva Phalguni\", \"zodiac_name\": \"Leo\"}, \"moon\": {\"pada\": 1, \"house\": 1, \"latitude\": -4.439, \"longitude\": 121.51777777777778, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"pluto\": {\"pada\": 1, \"house\": 1, \"latitude\": 10.307, \"longitude\": 122.33166666666666, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"venus\": {\"pada\": 4, \"house\": 12, \"latitude\": -1.592, \"longitude\": 93.04388888888889, \"nakshatra\": \"Punarvasu\", \"zodiac_name\": \"Cancer\"}, \"saturn\": {\"pada\": 4, \"house\": 12, \"latitude\": 2.495, \"longitude\": 106.58777777777777, \"nakshatra\": \"Pushyami\", \"zodiac_name\": \"Cancer\"}, \"uranus\": {\"pada\": 1, \"house\": 12, \"latitude\": 0.514, \"longitude\": 93.37388888888889, \"nakshatra\": \"Pushyami\", \"zodiac_name\": \"Cancer\"}, \"jupiter\": {\"pada\": 2, \"house\": 12, \"latitude\": 0.509, \"longitude\": 97.46944444444445, \"nakshatra\": \"Pushyami\", \"zodiac_name\": \"Cancer\"}, \"mercury\": {\"pada\": 3, \"house\": 1, \"latitude\": 1.421, \"longitude\": 127.09777777777778, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"neptune\": {\"pada\": 2, \"house\": 1, \"latitude\": 1.766, \"longitude\": 125.30166666666666, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"northmeannode\": {\"pada\": 3, \"house\": 1, \"latitude\": 0.0, \"longitude\": 128.83944444444444, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"northtruenode\": {\"pada\": 2, \"house\": 1, \"latitude\": 0.0, \"longitude\": 126.63944444444445, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"southmeannode\": {\"pada\": 3, \"house\": 1, \"latitude\": 0.0, \"longitude\": 128.83944444444444, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"southtruenode\": {\"pada\": 2, \"house\": 1, \"latitude\": 0.0, \"longitude\": 126.63944444444445, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}}, \"ayanamsa_used\": {\"name\": \"LAHIRI\", \"corrected\": false, \"formatted\": \"23°14'03\\\"\", \"value_degrees\": 23.234153}}, \"RashiChart\": {\"ascendant\": {\"pada\": 2, \"longitude\": 178.57406129659418, \"nakshatra\": \"Chitra\", \"zodiac_name\": \"Virgo\"}, \"celestial\": {\"sun\": {\"pada\": 1, \"house\": 9, \"latitude\": 0.0, \"longitude\": 42.331, \"nakshatra\": \"Rohini\", \"zodiac_name\": \"Taurus\"}, \"mars\": {\"pada\": 1, \"house\": 10, \"latitude\": 1.02, \"longitude\": 67.817, \"nakshatra\": \"Aardra\", \"zodiac_name\": \"Gemini\"}, \"moon\": {\"pada\": 1, \"house\": 12, \"latitude\": -4.439, \"longitude\": 120.759, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"pluto\": {\"pada\": 1, \"house\": 12, \"latitude\": 10.307, \"longitude\": 121.166, \"nakshatra\": \"Makha\", \"zodiac_name\": \"Leo\"}, \"venus\": {\"pada\": 1, \"house\": 8, \"latitude\": -1.592, \"longitude\": 16.522, \"nakshatra\": \"Bharani\", \"zodiac_name\": \"Aries\"}, \"saturn\": {\"pada\": 1, \"house\": 2, \"latitude\": 2.495, \"longitude\": 203.294, \"nakshatra\": \""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/festivals/": {
      "post": {
        "operationId": "festivals",
        "summary": "Festival calendar",
        "description": "Precomputed festival dates across four traditions, read straight from a table rather than calculated on the request, so a whole year comes back in one indexed query. `keys` chooses which lists you want: `festivals` is the main Hindu calendar, `ekadashis` the twenty-four or twenty-six named Ekadashis of the year, and `jain_festivals`, `sikh_festivals` and `christian_festivals` the corresponding calendars.\n\n`year` is required and `month` (1-12) is optional; omit the month to get the whole year. The response is `{data}` keyed by each requested category, each holding a chronological list of events. An event carries `name`, `name_hi` (a Hindi rendering, currently populated only for the main Hindu category and null elsewhere), `month` (the lunar month name), `paksha`, `tithi` (used by the Sikh list), `date` (used where the observance is on a fixed civil date, as the Christian festivals are) and `start_time`/`end_time`, which are the exact instants the governing tithi begins and ends.\n\nDates are precomputed for the years 2006 to 2046 inclusive. Anything outside that range returns empty lists rather than an error. Because the underlying rows are stored rather than derived per request, this endpoint takes no coordinates; if you need a location-sensitive observance day, use the regional calendar endpoints, which resolve each festival to a civil day using local sunrise and sunset.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Festivals & vrats"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"festivals\": [{\"name\": \"Janmashtami\", \"name_hi\": \"जन्माष्टमी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-04T02:26:25+05:30\", \"end_time\": \"2026-09-05T00:14:34+05:30\"}, {\"name\": \"Gugga Navmi\", \"name_hi\": \"गूगा नवमी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-05T00:14:34+05:30\", \"end_time\": \"2026-09-05T21:54:40+05:30\"}, {\"name\": \"Vatsa Dvadashi\", \"name_hi\": \"वत्स द्वादशी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-07T17:05:07+05:30\", \"end_time\": \"2026-09-08T14:43:55+05:30\"}, {\"name\": \"Kushotpaatini Ama\", \"name_hi\": \"कुशोत्पाटिनी अमावस्या\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-09T12:31:45+05:30\", \"end_time\": \"2026-09-10T10:34:16+05:30\"}, {\"name\": \"Hartalika Teej\", \"name_hi\": \"हरतालिका तीज\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-13T07:09:27+05:30\", \"end_time\": \"2026-09-14T07:08:00+05:30\"}, {\"name\": \"Varaha Jayanti\", \"name_hi\": \"वराह जयंती\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-13T07:09:27+05:30\", \"end_time\": \"2026-09-14T07:08:00+05:30\"}, {\"name\": \"Rishi Tarpana (Samvedic)\", \"name_hi\": \"ऋषि तर्पण (सामवेदिक)\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-13T07:09:27+05:30\", \"end_time\": \"2026-09-14T07:08:00+05:30\"}, {\"name\": \"Siddhi Vinayaka Vrata\", \"name_hi\": \"सिद्धि विनायक व्रत\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-14T07:08:00+05:30\", \"end_time\": \"2026-09-15T07:45:17+05:30\"}, {\"name\": \"Ganesh Chaturthi\", \"name_hi\": \"गणेश चतुर्थी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-14T07:08:00+05:30\", \"end_time\": \"2026-09-15T07:45:17+05:30\"}, {\"name\": \"Rishi Panchami\", \"name_hi\": \"ऋषि पंचमी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-15T07:45:17+05:30\", \"end_time\": \"2026-09-16T09:00:28+05:30\"}, {\"name\": \"Balarama Jayanti\", \"name_hi\": \"बलराम जयंती\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-16T09:00:28+05:30\", \"end_time\": \"2026-09-17T10:49:00+05:30\"}, {\"name\": \"Radhashtami\", \"name_hi\": \"राधाष्टमी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-18T13:02:12+05:30\", \"end_time\": \"2026-09-19T15:28:04+05:30\"}, {\"name\": \"Radha Ashtami\", \"name_hi\": \"राधा अष्टमी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-18T13:02:12+05:30\", \"end_time\": \"2026-09-19T15:28:04+05:30\"}, {\"name\": \"Mahaluxmi Vrata begins\", \"name_hi\": \"महालक्ष्मी व्रत प्रारंभ\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-18T13:02:12+05:30\", \"end_time\": \"2026-09-19T15:28:04+05:30\"}, {\"name\": \"Vishnu Parivartanotsava\", \"name_hi\": \"विष्णु परिवर्तनोत्सव\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-22T21:44:20+05:30\", \"end_time\": \"2026-09-23T22:51:32+05:30\"}, {\"name\": \"Vamana Jayanti\", \"name_hi\": \"वामन जयंती\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-22T21:44:20+05:30\", \"end_time\": \"2026-09-23T22:51:32+05:30\"}, {\"name\": \"Anant Chaturdashi\", \"name_hi\": \"अनंत चतुर्दशी\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-24T23:19:27+05:30\", \"end_time\": \"2026-09-25T23:07:49+05:30\"}, {\"name\": \"Ganesh Visarjan\", \"name_hi\": \"गणेश विसर्जन\", \"month\": \"Bhadrapada\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-24T23:19:27+05:30\", \"end_time\": \"2026-09-25T23:07:49+05:30\"}, {\"name\": \"Pitrupaksha Begins\", \"name_hi\": \"पितृपक्ष प्रारंभ\", \"month\": \"Ashwin\", \"paksha\": null, \"tithi\": null, \"date\": null, \"start_time\": \"2026-09-26T22:19:32+05:30\", \"end_time\": \"2026-09"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Which festival calendars to return. 'festivals' is the main Hindu calendar; the others are separate traditions. Ask for several in one call - the response is keyed by category and the cost is the same.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "festivals",
                        "ekadashis",
                        "jain_festivals",
                        "sikh_festivals",
                        "christian_festivals"
                      ]
                    }
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits. Four-digit year. Dates are precomputed for 2006 to 2046; outside that range the response is empty.",
                    "examples": [
                      2026
                    ]
                  },
                  "month": {
                    "type": "integer",
                    "description": "Month of birth as a number, 1-12. January is 1. Optional 1-12. Omit it to get the whole year.",
                    "minimum": 1,
                    "maximum": 12,
                    "examples": [
                      9
                    ]
                  }
                },
                "required": [
                  "keys",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2026,
                "month": 9,
                "keys": [
                  "festivals",
                  "ekadashis"
                ]
              }
            }
          }
        }
      }
    },
    "/api/hazard/earthquake/": {
      "get": {
        "operationId": "hazard_earthquake",
        "summary": "Earthquake events",
        "description": "A pass-through proxy for the United States Geological Survey FDSN earthquake event service. This is a historical and near-real-time seismology dataset, not an astrological calculation; it is here so that mundane and event-correlation work can pull the events and the chart data through one API.\n\nEvery query parameter is forwarded to USGS unchanged, so the full FDSN vocabulary applies: `starttime` and `endtime` in ISO 8601 (defaulting to the last thirty days), a bounding box via `minlatitude`/`maxlatitude`/`minlongitude`/`maxlongitude` or a circle via `latitude`/`longitude` with `maxradius` or `maxradiuskm`, `minmagnitude`/`maxmagnitude`, `mindepth`/`maxdepth`, `minsig`/`maxsig`, PAGER `alertlevel`, `eventtype`, `reviewstatus`, `limit` up to 20000, `offset` and `orderby`.\n\nThe response is the USGS GeoJSON FeatureCollection as returned: a `metadata` object with the result `count`, and a `features` list in which each entry has a `geometry` giving [longitude, latitude, depth in km] and a `properties` object with magnitude, place description, epoch-millisecond `time`, felt reports, Mercalli and Community intensity, significance, a tsunami flag and the USGS event page URL. The `format` parameter is ignored and always forced to geojson. If USGS cannot be reached the endpoint returns 503.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Natural hazards"
        ],
        "parameters": [
          {
            "name": "alertlevel",
            "in": "query",
            "required": false,
            "description": "Limit to events with a specific PAGER alert level",
            "schema": {
              "type": "string",
              "description": "Limit to events with a specific PAGER alert level",
              "enum": [
                "green",
                "orange",
                "red",
                "yellow"
              ],
              "examples": [
                "green"
              ]
            }
          },
          {
            "name": "catalog",
            "in": "query",
            "required": false,
            "description": "Limit to events from a specific catalog",
            "schema": {
              "type": "string",
              "description": "Limit to events from a specific catalog"
            }
          },
          {
            "name": "contributor",
            "in": "query",
            "required": false,
            "description": "Limit to events contributed by a specific contributor",
            "schema": {
              "type": "string",
              "description": "Limit to events contributed by a specific contributor"
            }
          },
          {
            "name": "endtime",
            "in": "query",
            "required": false,
            "description": "End of time window (ISO8601). Default: present time",
            "schema": {
              "type": "string",
              "description": "End of time window (ISO8601). Default: present time ISO date, or a date-time. Inclusive.",
              "examples": [
                "2024-12-31"
              ]
            }
          },
          {
            "name": "eventid",
            "in": "query",
            "required": false,
            "description": "Select a specific event by ID (implies includeallorigins and includeallmagnitudes)",
            "schema": {
              "type": "string",
              "description": "Select a specific event by ID (implies includeallorigins and includeallmagnitudes) FREE-FORM USGS event ID (e.g. 'us7000abcd'. Selecting one implies includeallorigins and includeallmagnitudes. Proxied verbatim."
            }
          },
          {
            "name": "eventtype",
            "in": "query",
            "required": false,
            "description": "Limit to events of a specific type (e.g. 'earthquake' filters non-earthquake events)",
            "schema": {
              "type": "string",
              "description": "Limit to events of a specific type (e.g. 'earthquake' filters non-earthquake events)"
            }
          },
          {
            "name": "includeallmagnitudes",
            "in": "query",
            "required": false,
            "description": "Include all magnitudes for each event (default: false)",
            "schema": {
              "type": "boolean",
              "description": "Include all magnitudes for each event (default: false)"
            }
          },
          {
            "name": "includeallorigins",
            "in": "query",
            "required": false,
            "description": "Include all origins for each event (default: false)",
            "schema": {
              "type": "boolean",
              "description": "Include all origins for each event (default: false)"
            }
          },
          {
            "name": "includearrivals",
            "in": "query",
            "required": false,
            "description": "Include phase arrivals (default: false, NOT CURRENTLY IMPLEMENTED)",
            "schema": {
              "type": "boolean",
              "description": "Include phase arrivals (default: false, NOT CURRENTLY IMPLEMENTED)"
            }
          },
          {
            "name": "includedeleted",
            "in": "query",
            "required": false,
            "description": "Include deleted events (default: false). Use 'only' to return only deleted events",
            "schema": {
              "type": "string",
              "description": "Include deleted events (default: false). Use 'only' to return only deleted events The endpoint's own parameter description documents it as boolean-plus-'only' (\"Include deleted events (default: false). Use 'only' to return only deleted events\". There is no local check - the value is proxied to USGS, which owns the validation.",
              "enum": [
                "true",
                "false",
                "only"
              ]
            }
          },
          {
            "name": "includesuperseded",
            "in": "query",
            "required": false,
            "description": "Include superseded products (default: false). Only works with eventid",
            "schema": {
              "type": "boolean",
              "description": "Include superseded products (default: false). Only works with eventid"
            }
          },
          {
            "name": "latitude",
            "in": "query",
            "required": false,
            "description": "Center latitude for circle search [-90, 90]. Requires longitude and maxradius/maxradiuskm",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Center latitude for circle search [-90, 90]. Requires longitude and maxradius/maxradiuskm Centre of a circular search, used with longitude and maxradiuskm.",
              "examples": [
                26.9124
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max number of events to return [1, 20000]",
            "schema": {
              "type": "integer",
              "description": "Max number of events to return [1, 20000] How many records to return per page.",
              "examples": [
                20
              ]
            }
          },
          {
            "name": "longitude",
            "in": "query",
            "required": false,
            "description": "Center longitude for circle search [-180, 180]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Center longitude for circle search [-180, 180]",
              "examples": [
                75.7873
              ]
            }
          },
          {
            "name": "maxalertlevel",
            "in": "query",
            "required": false,
            "description": "Limit to events with PAGER alert level ≤ this value",
            "schema": {
              "type": "string",
              "description": "Limit to events with PAGER alert level ≤ this value",
              "enum": [
                "green",
                "orange",
                "red",
                "yellow"
              ],
              "examples": [
                "green"
              ]
            }
          },
          {
            "name": "maxcdi",
            "in": "query",
            "required": false,
            "description": "Maximum Community Determined Intensity (DYFI) [0, 12]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Maximum Community Determined Intensity (DYFI) [0, 12]"
            }
          },
          {
            "name": "maxdepth",
            "in": "query",
            "required": false,
            "description": "Max depth in km [-100, 1000]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max depth in km [-100, 1000]"
            }
          },
          {
            "name": "maxgap",
            "in": "query",
            "required": false,
            "description": "Max azimuthal gap in degrees [0, 360]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max azimuthal gap in degrees [0, 360]"
            }
          },
          {
            "name": "maxlatitude",
            "in": "query",
            "required": false,
            "description": "Bounding box northern boundary [-90, 90]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Bounding box northern boundary [-90, 90]"
            }
          },
          {
            "name": "maxlongitude",
            "in": "query",
            "required": false,
            "description": "Bounding box eastern boundary [-360, 360]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Bounding box eastern boundary [-360, 360]"
            }
          },
          {
            "name": "maxmagnitude",
            "in": "query",
            "required": false,
            "description": "Max magnitude",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max magnitude",
              "examples": [
                9
              ]
            }
          },
          {
            "name": "maxmmi",
            "in": "query",
            "required": false,
            "description": "Maximum Modified Mercalli Intensity (ShakeMap) [0, 12]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Maximum Modified Mercalli Intensity (ShakeMap) [0, 12]"
            }
          },
          {
            "name": "maxradius",
            "in": "query",
            "required": false,
            "description": "Max radius in degrees from center point [0, 180]. Mutually exclusive with maxradiuskm",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max radius in degrees from center point [0, 180]. Mutually exclusive with maxradiuskm"
            }
          },
          {
            "name": "maxradiuskm",
            "in": "query",
            "required": false,
            "description": "Max radius in km from center point [0, 20001.6]. Mutually exclusive with maxradius",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max radius in km from center point [0, 20001.6]. Mutually exclusive with maxradius Search radius in kilometres around latitude/longitude.",
              "examples": [
                500
              ]
            }
          },
          {
            "name": "maxsig",
            "in": "query",
            "required": false,
            "description": "Max significance",
            "schema": {
              "type": "integer",
              "description": "Max significance"
            }
          },
          {
            "name": "minalertlevel",
            "in": "query",
            "required": false,
            "description": "Limit to events with PAGER alert level ≥ this value",
            "schema": {
              "type": "string",
              "description": "Limit to events with PAGER alert level ≥ this value",
              "enum": [
                "green",
                "orange",
                "red",
                "yellow"
              ],
              "examples": [
                "green"
              ]
            }
          },
          {
            "name": "mincdi",
            "in": "query",
            "required": false,
            "description": "Minimum Community Determined Intensity (DYFI)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Minimum Community Determined Intensity (DYFI)"
            }
          },
          {
            "name": "mindepth",
            "in": "query",
            "required": false,
            "description": "Min depth in km [-100, 1000]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min depth in km [-100, 1000]"
            }
          },
          {
            "name": "minfelt",
            "in": "query",
            "required": false,
            "description": "Minimum number of DYFI responses [1, ∞]",
            "schema": {
              "type": "integer",
              "description": "Minimum number of DYFI responses [1, ∞]"
            }
          },
          {
            "name": "mingap",
            "in": "query",
            "required": false,
            "description": "Min azimuthal gap in degrees [0, 360]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min azimuthal gap in degrees [0, 360]"
            }
          },
          {
            "name": "minlatitude",
            "in": "query",
            "required": false,
            "description": "Bounding box southern boundary [-90, 90]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Bounding box southern boundary [-90, 90]"
            }
          },
          {
            "name": "minlongitude",
            "in": "query",
            "required": false,
            "description": "Bounding box western boundary [-360, 360]. Rectangles may cross the date line by using minlongitude < -180 or maxlongitude > 180",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Bounding box western boundary [-360, 360]. Rectangles may cross the date line by using minlongitude < -180 or maxlongitude > 180"
            }
          },
          {
            "name": "minmagnitude",
            "in": "query",
            "required": false,
            "description": "Min magnitude",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min magnitude Richter magnitude floor. 6 and above is a major earthquake.",
              "examples": [
                6
              ]
            }
          },
          {
            "name": "minsig",
            "in": "query",
            "required": false,
            "description": "Min significance",
            "schema": {
              "type": "integer",
              "description": "Min significance"
            }
          },
          {
            "name": "nodata",
            "in": "query",
            "required": false,
            "description": "HTTP status code returned when no data is found (204 or 404)",
            "schema": {
              "type": "integer",
              "description": "HTTP status code returned when no data is found (204 or 404)",
              "enum": [
                204,
                404
              ],
              "examples": [
                204
              ]
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Return results starting at this count (1-based)",
            "schema": {
              "type": "integer",
              "description": "Return results starting at this count (1-based) How many records to skip, for paging.",
              "examples": [
                0
              ]
            }
          },
          {
            "name": "orderby",
            "in": "query",
            "required": false,
            "description": "Order results by field",
            "schema": {
              "type": "string",
              "description": "Order results by field",
              "enum": [
                "magnitude",
                "magnitude-asc",
                "time",
                "time-asc"
              ],
              "examples": [
                "magnitude"
              ]
            }
          },
          {
            "name": "productcode",
            "in": "query",
            "required": false,
            "description": "Return the event associated with this product code",
            "schema": {
              "type": "string",
              "description": "Return the event associated with this product code FREE-FORM USGS product code. Proxied verbatim."
            }
          },
          {
            "name": "producttype",
            "in": "query",
            "required": false,
            "description": "Limit to events with this product type (e.g. moment-tensor, focal-mechanism, shakemap, losspager, dyfi)",
            "schema": {
              "type": "string",
              "description": "Limit to events with this product type (e.g. moment-tensor, focal-mechanism, shakemap, losspager, dyfi)"
            }
          },
          {
            "name": "reviewstatus",
            "in": "query",
            "required": false,
            "description": "Limit to events with a specific review status",
            "schema": {
              "type": "string",
              "description": "Limit to events with a specific review status",
              "enum": [
                "automatic",
                "reviewed"
              ],
              "examples": [
                "automatic"
              ]
            }
          },
          {
            "name": "starttime",
            "in": "query",
            "required": false,
            "description": "Start of time window (ISO8601, e.g. 2022-01-01 or 2022-01-01T00:00:00). Default: NOW - 30 days",
            "schema": {
              "type": "string",
              "description": "Start of time window (ISO8601, e.g. 2022-01-01 or 2022-01-01T00:00:00). Default: NOW - 30 days ISO date, or a date-time. Inclusive.",
              "examples": [
                "2024-01-01"
              ]
            }
          },
          {
            "name": "updatedafter",
            "in": "query",
            "required": false,
            "description": "Limit to events updated after this time (ISO8601)",
            "schema": {
              "type": "string",
              "description": "Limit to events updated after this time (ISO8601) FORMAT constraint. ISO 8601. Forwarded verbatim to USGS."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"type\": \"FeatureCollection\", \"metadata\": {\"generated\": 1788775941000, \"url\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson\", \"title\": \"USGS Earthquakes\", \"status\": 200, \"api\": \"2.7.0\", \"count\": 10949}, \"features\": [{\"type\": \"Feature\", \"properties\": {\"mag\": 1.3, \"place\": \"78 km WNW of Tyonek, Alaska\", \"time\": 1788775260489, \"updated\": 1788775310002, \"tz\": null, \"url\": \"https://earthquake.usgs.gov/earthquakes/eventpage/aka2026rsrmqf\", \"detail\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=aka2026rsrmqf&format=geojson\", \"felt\": null, \"cdi\": null, \"mmi\": null, \"alert\": null, \"status\": \"automatic\", \"tsunami\": 0, \"sig\": 26, \"net\": \"ak\", \"code\": \"a2026rsrmqf\", \"ids\": \",aka2026rsrmqf,\", \"sources\": \",ak,\", \"types\": \",origin,phase-data,\", \"nst\": 17, \"dmin\": 0, \"rms\": 0.3, \"gap\": 92, \"magType\": \"ml\", \"type\": \"earthquake\", \"title\": \"M 1.3 - 78 km WNW of Tyonek, Alaska\"}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [-152.516, 61.307, 4.2]}, \"id\": \"aka2026rsrmqf\"}, {\"type\": \"Feature\", \"properties\": {\"mag\": 2.2, \"place\": \"36 km W of Happy Valley, Alaska\", \"time\": 1788774950719, \"updated\": 1788775176753, \"tz\": null, \"url\": \"https://earthquake.usgs.gov/earthquakes/eventpage/aka2026rsridv\", \"detail\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=aka2026rsridv&format=geojson\", \"felt\": null, \"cdi\": null, \"mmi\": null, \"alert\": null, \"status\": \"automatic\", \"tsunami\": 0, \"sig\": 74, \"net\": \"ak\", \"code\": \"a2026rsridv\", \"ids\": \",aka2026rsridv,\", \"sources\": \",ak,\", \"types\": \",origin,phase-data,\", \"nst\": 68, \"dmin\": 0.3, \"rms\": 0.6, \"gap\": 53, \"magType\": \"ml\", \"type\": \"earthquake\", \"title\": \"M 2.2 - 36 km W of Happy Valley, Alaska\"}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [-152.39, 59.98, 79.6]}, \"id\": \"aka2026rsridv\"}, {\"type\": \"Feature\", \"properties\": {\"mag\": 1.7, \"place\": \"28 km NNW of Pāhala, Hawaii\", \"time\": 1788774479410, \"updated\": 1788774689400, \"tz\": null, \"url\": \"https://earthquake.usgs.gov/earthquakes/eventpage/hv75030377\", \"detail\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=hv75030377&format=geojson\", \"felt\": null, \"cdi\": null, \"mmi\": null, \"alert\": null, \"status\": \"automatic\", \"tsunami\": 0, \"sig\": 44, \"net\": \"hv\", \"code\": \"75030377\", \"ids\": \",hv75030377,\", \"sources\": \",hv,\", \"types\": \",origin,phase-data,\", \"nst\": 17, \"dmin\": 0.0364, \"rms\": 0.200000003, \"gap\": 68, \"magType\": \"md\", \"type\": \"earthquake\", \"title\": \"M 1.7 - 28 km NNW of Pāhala, Hawaii\"}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [-155.594665527344, 19.4323329925537, 37.8300018310547]}, \"id\": \"hv75030377\"}, {\"type\": \"Feature\", \"properties\": {\"mag\": 0.7, \"place\": \"6 km WNW of Cobb, CA\", \"time\": 1788774330340, \"updated\": 1788775642619, \"tz\": null, \"url\": \"https://earthquake.usgs.gov/earthquakes/eventpage/nc75431077\", \"detail\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=nc75431077&format=geojson\", \"felt\": null, \"cdi\": null, \"mmi\": null, \"alert\": null, \"status\": \"automatic\", \"tsunami\": 0, \"sig\": 8, \"net\": \"nc\", \"code\": \"75431077\", \"ids\": \",nc75431077,\", \"sources\": \",nc,\", \"types\": \",nearby-cities,origin,phase-data,scitech-link,\", \"nst\": 8, \"dmin\": 0.002696, \"rms\": 0.01, \"gap\": 122, \"magType\": \"md\", \"type\": \"earthquake\", \"title\": \"M 0.7 - 6 km WNW of Cobb, CA\"}, \"geometry\": {\"type\": \"Point\", \"coordinates\": [-122.793663024902, 38.8376655578613, 1.87999999523163]}, \"id\": \"nc75431077\"}, {\"type\": \"Feature\", \"properties\": {\"mag\": 1.5, \"place\": \"29 km W of Toyah, Texas\", \"time\": 1788773169470, \"updated\": 1788773302767, \"tz\": null, \"url\": \"https://earthquake.usgs.gov/earthquakes/eventpage/tx2026rpuovc\", \"detail\": \"https://earthquake.usgs.gov/fdsnws/event/1/query?eventid=tx2026rpuovc&format=geojson\", \"felt\": null, \"cdi\": null, \"mmi\": null, \"alert\": null, \"status\": \"automatic\", \"tsunami\": 0, \"sig\": 35, \"net\": \"tx\", \"code\": \"2026rpuovc\", \"ids\": \",tx2026rpuovc,\", \"sources\": \",tx,\", \"types\": \",origin,phase-data,\", \"nst\": 5, \"dmin\": 0.2, \"rms\": 1.2, \"gap\": 215, \"magType\": \"ml\", \"type\": \"earthquake\", \"title\": \"M 1."
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/hazard/forest-fires/": {
      "get": {
        "operationId": "hazard_forest_fires",
        "summary": "Forest fires",
        "description": "A stored dataset of large forest fire detections, organised by the Indian forest administrative hierarchy. It is a historical event log, not an astrological calculation, and is provided for mundane and correlation work alongside the chart endpoints.\n\nFilter with `state`, `district`, `circle`, `division` and `fire_name`, all case-insensitive substring matches, and with `start_date`/`end_date` against the first detection time (accepting either YYYY-MM-DD or a full ISO timestamp). `sort` takes 'newest' (the default), 'oldest', 'name_asc' or 'name_desc' on the fire name. Paging uses `page` and `itemsPerPage`, fifty per page by default and up to five hundred.\n\nThe response is a standard paged envelope of `count`, `next`, `previous` and `results`. Each result gives an id, `first_detection` and `last_detection` timestamps, the state, district, forest circle, division and range, a fire name and the point coordinates as `latitude` and `longitude`. Administrative fields are null for detections outside a mapped forest division.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Natural hazards"
        ],
        "parameters": [
          {
            "name": "circle",
            "in": "query",
            "required": false,
            "description": "Filter by circle name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by circle name (case-insensitive contains)"
            }
          },
          {
            "name": "district",
            "in": "query",
            "required": false,
            "description": "Filter by district name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by district name (case-insensitive contains)"
            }
          },
          {
            "name": "division",
            "in": "query",
            "required": false,
            "description": "Filter by division name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by division name (case-insensitive contains)"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by end date/time (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)",
            "schema": {
              "type": "string",
              "description": "Filter by end date/time (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS) FORMAT constraint: 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:MM:SS'. Compared with `first_detection__lte`."
            }
          },
          {
            "name": "fire_name",
            "in": "query",
            "required": false,
            "description": "Filter by fire name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by fire name (case-insensitive contains) FREE-FORM; case-insensitive `icontains` substring match on the fire name."
            }
          },
          {
            "name": "itemsPerPage",
            "in": "query",
            "required": false,
            "description": "Number of items per page",
            "schema": {
              "type": "integer",
              "description": "Number of items per page"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number",
            "schema": {
              "type": "integer",
              "description": "Page number"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order: 'newest' (default), 'oldest', 'name_asc' (fire name A-Z), or 'name_desc' (Z-A)",
            "schema": {
              "type": "string",
              "description": "Sort order: 'newest' (default), 'oldest', 'name_asc' (fire name A-Z), or 'name_desc' (Z-A) Case-insensitive and whitespace-stripped. Default 'newest'. ANY unrecognised value silently falls back to 'newest' rather than erroring. 'name_asc'/'name_desc' sort by fire_name. Nulls are always pushed last.",
              "enum": [
                "newest",
                "oldest",
                "name_asc",
                "name_desc"
              ]
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by start date/time (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)",
            "schema": {
              "type": "string",
              "description": "Filter by start date/time (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS) FORMAT constraint: 'YYYY-MM-DD' or 'YYYY-MM-DDTHH:MM:SS'. Compared with `first_detection__gte`."
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Filter by state name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by state name (case-insensitive contains)"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"count\": 100, \"next\": \"http://127.0.0.1:8011/api/hazard/forest-fires/?page=2\", \"previous\": null, \"results\": [{\"id\": 66, \"first_detection\": \"2025-06-09T13:30:00+05:30\", \"last_detection\": \"2025-06-09T13:30:00+05:30\", \"state\": \"UTTAR PRADESH\", \"district\": \"AGRA\", \"circle\": null, \"division\": null, \"range_name\": null, \"fire_name\": \"AGRA -1\", \"longitude\": 78.26051634, \"latitude\": 26.83035862}, {\"id\": 9, \"first_detection\": \"2025-04-29T01:48:00+05:30\", \"last_detection\": \"2025-04-29T01:48:00+05:30\", \"state\": \"RAJASTHAN\", \"district\": \"SIROHI\", \"circle\": \"CCF JODHPUR CIRCLE\", \"division\": \"SIROHI DIVISION\", \"range_name\": \"ABU ROAD RANGE\", \"fire_name\": \"ABU ROAD -5\", \"longitude\": 72.88706718, \"latitude\": 24.50238094}, {\"id\": 65, \"first_detection\": \"2025-04-28T02:07:00+05:30\", \"last_detection\": \"2025-04-29T01:48:00+05:30\", \"state\": \"HIMACHAL PRADESH\", \"district\": \"HAMIRPUR\", \"circle\": \"HAMIRPUR CIRCLE\", \"division\": \"HAMIRPUR DIVISION\", \"range_name\": \"AGHAR RANGE\", \"fire_name\": \"AGHAR -2\", \"longitude\": 76.54487903, \"latitude\": 31.61348206}, {\"id\": 20, \"first_detection\": \"2025-04-27T13:36:00+05:30\", \"last_detection\": \"2025-04-27T13:36:00+05:30\", \"state\": \"ANDHRA PRADESH\", \"district\": \"ALLURI SITHARAMA RAJU\", \"circle\": \"RAJAHMUNDRY CIRCLE\", \"division\": \"RAMPACHODAVARAM DIVISION\", \"range_name\": \"ADDATEEGALA RANGE\", \"fire_name\": \"ADDATEEGALA -8\", \"longitude\": 81.84477321, \"latitude\": 17.71221588}, {\"id\": 64, \"first_detection\": \"2025-04-26T13:54:00+05:30\", \"last_detection\": \"2025-04-26T13:54:00+05:30\", \"state\": \"HIMACHAL PRADESH\", \"district\": \"HAMIRPUR\", \"circle\": \"HAMIRPUR CIRCLE\", \"division\": \"HAMIRPUR DIVISION\", \"range_name\": \"AGHAR RANGE\", \"fire_name\": \"AGHAR -1\", \"longitude\": 76.56248482, \"latitude\": 31.57775419}, {\"id\": 70, \"first_detection\": \"2025-04-23T13:10:00+05:30\", \"last_detection\": \"2025-04-23T13:10:00+05:30\", \"state\": \"MADHYA PRADESH\", \"district\": \"SHEOPUR\", \"circle\": \"KUNO VAN PRANI SHEOPUR CIRCLE\", \"division\": \"KUNO PALPUR VAN PRANI SHEOPUR DIVISION\", \"range_name\": \"AGRA WEST RANGE\", \"fire_name\": \"AGRA WEST -4\", \"longitude\": 77.20371276, \"latitude\": 25.993098}, {\"id\": 100, \"first_detection\": \"2025-04-20T14:06:00+05:30\", \"last_detection\": \"2025-04-20T14:06:00+05:30\", \"state\": \"MAHARASHTRA\", \"district\": \"AHMEDNAGAR\", \"circle\": \"WILDLIFE WEST CIRCLE\", \"division\": \"CCF WILDLIFE PUNE DIVISION\", \"range_name\": \"REHEKURI RANGE\", \"fire_name\": \"AHMEDNAGAR -36\", \"longitude\": 75.14123428, \"latitude\": 18.52634684}, {\"id\": 99, \"first_detection\": \"2025-04-19T14:25:00+05:30\", \"last_detection\": \"2025-04-19T14:25:00+05:30\", \"state\": \"MAHARASHTRA\", \"district\": \"AHMEDNAGAR\", \"circle\": \"NASHIK CIRCLE\", \"division\": \"AHMEDNAGAR DIVISION\", \"range_name\": \"PARNER RANGE\", \"fire_name\": \"AHMEDNAGAR -35\", \"longitude\": 74.32290649, \"latitude\": 19.14418074}, {\"id\": 69, \"first_detection\": \"2025-04-17T02:13:00+05:30\", \"last_detection\": \"2025-04-17T02:13:00+05:30\", \"state\": \"MADHYA PRADESH\", \"district\": \"SHEOPUR\", \"circle\": \"KUNO VAN PRANI SHEOPUR CIRCLE\", \"division\": \"KUNO PALPUR VAN PRANI SHEOPUR DIVISION\", \"range_name\": \"AGRA WEST RANGE\", \"fire_name\": \"AGRA WEST -3\", \"longitude\": 77.20165544, \"latitude\": 25.95699487}, {\"id\": 98, \"first_detection\": \"2025-04-16T02:31:00+05:30\", \"last_detection\": \"2025-04-16T02:31:00+05:30\", \"state\": \"MAHARASHTRA\", \"district\": \"AHMEDNAGAR\", \"circle\": \"NASHIK CIRCLE\", \"division\": \"SANGAMNER DIVISION\", \"range_name\": \"RAJUR RANGE\", \"fire_name\": \"AHMEDNAGAR -34\", \"longitude\": 73.90079744, \"latitude\": 19.6026871}, {\"id\": 97, \"first_detection\": \"2025-04-16T02:31:00+05:30\", \"last_detection\": \"2025-04-16T02:31:00+05:30\", \"state\": \"MAHARASHTRA\", \"district\": \"AHMEDNAGAR\", \"circle\": \"NASHIK CIRCLE\", \"division\": \"AHMEDNAGAR DIVISION\", \"range_name\": \"PARNER RANGE\", \"fire_name\": \"AHMEDNAGAR -33\", \"longitude\": 74.57595382, \"latitude\": 18.97076079}, {\"id\": 96, \"first_detection\": \"2025-04-14T14:19:00+05:30\", \"last_detection\": \"2025-04-14T14:19:00+05:30\", \"state\": \"MAHARASHTRA\", \"district\": \"AHMEDNAGAR\", \"circle\": \"NASHIK CIRCLE\", \"division\": \"AHME"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/hazard/plane-crashes/": {
      "get": {
        "operationId": "hazard_plane_crashes",
        "summary": "Plane crashes",
        "description": "A stored dataset of aviation accidents with a written account of each, going back to the 1920s. It is a historical event record rather than an astrological calculation, and sits alongside the chart endpoints so that a crash's time and place can be fed straight into a chart.\n\nFilter with `country`, `region`, `aircraft`, `operator`, `crash_cause`, `flight_phase` and `flight_type`, all case-insensitive substring matches, with `start_date` and `end_date` on the accident date, and with `min_fatalities`. `sort` accepts 'newest' (the default), 'oldest', 'name_asc' and 'name_desc' on the aircraft type, and 'fatalities_desc' or 'fatalities_asc'. Paging uses `page` and `itemsPerPage`, fifty per page by default and up to five hundred.\n\nThe response is a paged envelope of `count`, `next`, `previous` and `results`. Each result carries the date and a local time string, the aircraft type and operator, the phase of flight and flight type, a crash site classification and free-text location, country and region, latitude and longitude, crew, passenger, other and total fatality counts, a stated `crash_cause` and a `circumstances` paragraph describing what happened.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Natural hazards"
        ],
        "parameters": [
          {
            "name": "aircraft",
            "in": "query",
            "required": false,
            "description": "Filter by aircraft (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by aircraft (case-insensitive contains) FREE-FORM; case-insensitive `icontains` substring match on the aircraft type."
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Filter by country (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by country (case-insensitive contains)"
            }
          },
          {
            "name": "crash_cause",
            "in": "query",
            "required": false,
            "description": "Filter by crash cause (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by crash cause (case-insensitive contains)"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by end date (YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "description": "Filter by end date (YYYY-MM-DD) FORMAT constraint: 'YYYY-MM-DD'. Compared with `date__lte`."
            }
          },
          {
            "name": "flight_phase",
            "in": "query",
            "required": false,
            "description": "Filter by flight phase (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by flight phase (case-insensitive contains)"
            }
          },
          {
            "name": "flight_type",
            "in": "query",
            "required": false,
            "description": "Filter by flight type (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by flight type (case-insensitive contains)"
            }
          },
          {
            "name": "itemsPerPage",
            "in": "query",
            "required": false,
            "description": "Number of items per page",
            "schema": {
              "type": "integer",
              "description": "Number of items per page"
            }
          },
          {
            "name": "min_fatalities",
            "in": "query",
            "required": false,
            "description": "Filter by minimum total fatalities",
            "schema": {
              "type": "integer",
              "description": "Filter by minimum total fatalities"
            }
          },
          {
            "name": "operator",
            "in": "query",
            "required": false,
            "description": "Filter by operator (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by operator (case-insensitive contains) FREE-FORM; case-insensitive `icontains` substring match on the operator/airline."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number",
            "schema": {
              "type": "integer",
              "description": "Page number"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Filter by region (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by region (case-insensitive contains)"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order: 'newest' (default), 'oldest', 'name_asc' (aircraft A-Z), 'name_desc' (Z-A), 'fatalities_desc' (highest fatalities first), or 'fatalities_asc' (lowest first)",
            "schema": {
              "type": "string",
              "description": "Sort order: 'newest' (default), 'oldest', 'name_asc' (aircraft A-Z), 'name_desc' (Z-A), 'fatalities_desc' (highest fatalities first), or 'fatalities_asc' (lowest first) Case-insensitive and stripped. Default 'newest'. 'name_asc'/'name_desc' sort by AIRCRAFT (name_field='aircraft', not by a person's name. Unrecognised values silently fall back to 'newest'.",
              "enum": [
                "newest",
                "oldest",
                "name_asc",
                "name_desc",
                "fatalities_desc",
                "fatalities_asc"
              ]
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by start date (YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "description": "Filter by start date (YYYY-MM-DD) FORMAT constraint: 'YYYY-MM-DD'. Compared with `date__gte`."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"count\": 100, \"next\": \"http://127.0.0.1:8011/api/hazard/plane-crashes/?page=2\", \"previous\": null, \"results\": [{\"id\": 100, \"date\": \"1926-09-29\", \"time\": \"23:55:00\", \"aircraft\": \"Farman F.60 Goliath\", \"operator\": \"French Air Force - Armée de l'Air\", \"flight_phase\": \"Flight\", \"flight_type\": \"Training\", \"crash_site\": \"Plain, Valley\", \"crash_location\": \"Bonneval Eure-et-Loir\", \"country\": \"France\", \"region\": \"Europe\", \"latitude\": 48.18118, \"longitude\": 1.386218, \"crew_fatalities\": 5, \"pax_fatalities\": 0, \"other_fatalities\": 0, \"total_fatalities\": 5, \"circumstances\": \"The crew was performing a night training flight on behalf of the 3rd Squadron of the 22nd regiment based in Chartres. While flying in the region of Bonneval, some 20 km south of Chartres, the aircraft caught fire. The pilot reduced his altitude and attempted an emergency landing. From a height of 50 meters, the aircraft stalled and crashed in a huge explosion. All five occupants were killed. Crew: Lt Jules Gindre, pilot, Sgt Pierre Pacaud, navigator, Sgt Roger Duchatelle, navigator, Sgt Raymond Rigault, mechanic, Pvt Jean Frémont, radio.\", \"crash_cause\": \"Technical failure\"}, {\"id\": 99, \"date\": \"1926-09-21\", \"time\": \"11:45:00\", \"aircraft\": \"De Havilland DH.4\", \"operator\": \"United States Army Air Corps - USAAC\", \"flight_phase\": \"Takeoff (climb)\", \"flight_type\": \"Military\", \"crash_site\": \"Airport (less than 10 km from airport)\", \"crash_location\": \"Kenley AFB Surrey\", \"country\": \"United Kingdom\", \"region\": \"Europe\", \"latitude\": 51.32609, \"longitude\": -0.101269, \"crew_fatalities\": 0, \"pax_fatalities\": 1, \"other_fatalities\": null, \"total_fatalities\": 1, \"circumstances\": \"Shortly after takeoff from RAF Kenley, while climbing, the engine failed. The aircraft stalled and crashed into trees, bursting into flames. The aircraft was destroyed and both occupants were seriously injured. The pilot died from his injuries five days later. The aircraft was based at RAF Kenley and operated on behalf of the US Embassy in London. Crew: Maj Clarence Leonard Tinker. Passenger: Cdr Robert Andrew Burg. †\", \"crash_cause\": \"Technical failure\"}, {\"id\": 98, \"date\": \"1926-09-16\", \"time\": \"20:20:00\", \"aircraft\": \"De Havilland DH.4\", \"operator\": \"Robertson Aircraft Corporation\", \"flight_phase\": \"Flight\", \"flight_type\": \"Postal (mail)\", \"crash_site\": \"Plain, Valley\", \"crash_location\": \"Ottawa Illinois\", \"country\": \"United States of America\", \"region\": \"North America\", \"latitude\": 41.346844, \"longitude\": -88.842645, \"crew_fatalities\": 0, \"pax_fatalities\": 0, \"other_fatalities\": 0, \"total_fatalities\": 0, \"circumstances\": \"The pilot Charles Lindbergh was performing a mail flight from Peoria to Chicago. En route, weather conditions worsened and he lost his orientation. Few minutes later, fuel exhausted and he eventually took the decision to bail out and abandoned the aircraft that crashed in a corn field. While the aircraft was destroyed, the aviator was unhurt.\", \"crash_cause\": \"Technical failure\"}, {\"id\": 97, \"date\": \"1926-08-20\", \"time\": \"16:05:00\", \"aircraft\": \"Hanriot HD.1\", \"operator\": \"Swiss Air Force\", \"flight_phase\": \"Flight\", \"flight_type\": \"Training\", \"crash_site\": \"Airport (less than 10 km from airport)\", \"crash_location\": \"Basel-Sternenfeld Basel City\", \"country\": \"Switzerland\", \"region\": \"Europe\", \"latitude\": 47.555943, \"longitude\": 7.588639, \"crew_fatalities\": 1, \"pax_fatalities\": 0, \"other_fatalities\": 0, \"total_fatalities\": 1, \"circumstances\": \"The pilot was performing a training flight at Basel-Sternenfeld Airport. While completing manoeuvre, he lost control of the aircraft that entered a dive and crashed near the airfield. The pilot was killed.\", \"crash_cause\": \"Human factor\"}, {\"id\": 96, \"date\": \"1926-08-18\", \"time\": \"14:30:00\", \"aircraft\": \"Blériot 155\", \"operator\": \"Air Union France\", \"flight_phase\": \"Flight\", \"flight_type\": \"Scheduled Revenue Flight\", \"crash_site\": \"Plain, Valley\", \"crash_location\": \"Ashford Kent\", \"country\": \"United Kingdom\", \"region\": \"Europe\", \"latitude\": 51.1493"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/hazard/suicide-attacks/": {
      "get": {
        "operationId": "hazard_suicide_attacks",
        "summary": "Suicide attacks",
        "description": "A stored dataset of suicide bombing incidents with location and casualty figures. It is a historical event record rather than an astrological calculation; it is here so that mundane analysis can draw event data and chart data from the same API.\n\nRecords are located by city and province rather than by country, and the loaded data is centred on Pakistan (Balochistan, Khyber Pakhtunkhwa, Punjab, Sindh). Filter with `city` and `province`, both case-insensitive substring matches, with `start_date` and `end_date` on the incident date, and with `min_killed`, `max_killed`, `min_injured` and `no_of_suicide_blasts`. `sort` accepts 'newest' (the default), 'oldest', 'killed_desc', 'killed_asc', 'injured_desc' and 'injured_asc'. Paging uses `page` and `itemsPerPage`, fifty per page by default and up to five hundred.\n\nThe response is a paged envelope of `count`, `next`, `previous` and `results`. Each result gives an id, the date, a local time string, city, province, latitude and longitude, a free-text `location` naming the exact spot, `killed_min` and `killed_max` (reported casualty figures often being a range), `injured_min` and the number of blasts in the incident.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Natural hazards"
        ],
        "parameters": [
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "Filter by city name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by city name (case-insensitive contains)"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by end date (YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "description": "Filter by end date (YYYY-MM-DD) FORMAT constraint: 'YYYY-MM-DD'. Compared with `date__lte`."
            }
          },
          {
            "name": "itemsPerPage",
            "in": "query",
            "required": false,
            "description": "Number of items per page",
            "schema": {
              "type": "integer",
              "description": "Number of items per page"
            }
          },
          {
            "name": "max_killed",
            "in": "query",
            "required": false,
            "description": "Filter by maximum killed (max count)",
            "schema": {
              "type": "integer",
              "description": "Filter by maximum killed (max count)"
            }
          },
          {
            "name": "min_injured",
            "in": "query",
            "required": false,
            "description": "Filter by minimum injured (min count)",
            "schema": {
              "type": "integer",
              "description": "Filter by minimum injured (min count)"
            }
          },
          {
            "name": "min_killed",
            "in": "query",
            "required": false,
            "description": "Filter by minimum killed (max count)",
            "schema": {
              "type": "integer",
              "description": "Filter by minimum killed (max count)"
            }
          },
          {
            "name": "no_of_suicide_blasts",
            "in": "query",
            "required": false,
            "description": "Filter by exact number of suicide blasts",
            "schema": {
              "type": "integer",
              "description": "Filter by exact number of suicide blasts"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number",
            "schema": {
              "type": "integer",
              "description": "Page number"
            }
          },
          {
            "name": "province",
            "in": "query",
            "required": false,
            "description": "Filter by province name (case-insensitive contains)",
            "schema": {
              "type": "string",
              "description": "Filter by province name (case-insensitive contains)"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order: 'newest' (default), 'oldest', 'killed_desc'/'killed_asc' (by killed count), or 'injured_desc'/'injured_asc' (by injured count)",
            "schema": {
              "type": "string",
              "description": "Sort order: 'newest' (default), 'oldest', 'killed_desc'/'killed_asc' (by killed count), or 'injured_desc'/'injured_asc' (by injured count) Case-insensitive and stripped. Default 'newest'. There is NO name_asc/name_desc here because no name_field is passed. 'killed_*' sorts on killed_max, 'injured_*' on injured_min. Unrecognised values silently fall back to 'newest'.",
              "enum": [
                "newest",
                "oldest",
                "killed_desc",
                "killed_asc",
                "injured_desc",
                "injured_asc"
              ]
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by start date (YYYY-MM-DD)",
            "schema": {
              "type": "string",
              "description": "Filter by start date (YYYY-MM-DD) FORMAT constraint: 'YYYY-MM-DD'. Compared with `date__gte`."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"count\": 284, \"next\": \"http://127.0.0.1:8011/api/hazard/suicide-attacks/?page=2\", \"previous\": null, \"results\": [{\"id\": 284, \"date\": \"2017-11-25\", \"time\": \"7:00 AM\", \"city\": \"Quetta\", \"latitude\": 30.139626, \"longitude\": 66.981476, \"province\": \"Balochistan\", \"location\": \"Sariab Road, near Bus terminal\", \"killed_min\": 4, \"killed_max\": 4, \"injured_min\": 16, \"no_of_suicide_blasts\": 1}, {\"id\": 283, \"date\": \"2017-11-24\", \"time\": \"7:00 AM\", \"city\": \"Peshawar\", \"latitude\": 33.970623, \"longitude\": 71.43862, \"province\": \"KPK\", \"location\": \"Near Zarghuni Masjid, Phase-2 Hayatabad\", \"killed_min\": 1, \"killed_max\": 3, \"injured_min\": 6, \"no_of_suicide_blasts\": 1}, {\"id\": 282, \"date\": \"2017-11-09\", \"time\": \"7:00 AM\", \"city\": \"Quetta\", \"latitude\": 30.221057, \"longitude\": 67.002524, \"province\": \"Balochistan\", \"location\": \"Quetta's Chaman Housing Scheme on airport road\", \"killed_min\": 2, \"killed_max\": 2, \"injured_min\": 8, \"no_of_suicide_blasts\": 1}, {\"id\": 281, \"date\": \"2017-08-12\", \"time\": \"5:00 PM\", \"city\": \"Quetta\", \"latitude\": 30.203658, \"longitude\": 67.004469, \"province\": \"Balochistan\", \"location\": \"Pishin bus stop\", \"killed_min\": 15, \"killed_max\": 15, \"injured_min\": 40, \"no_of_suicide_blasts\": 1}, {\"id\": 280, \"date\": \"2017-07-24\", \"time\": \"3:55 PM\", \"city\": \"Lahore\", \"latitude\": 31.500875, \"longitude\": 74.33312, \"province\": \"Punjab\", \"location\": \"near Arfa Karim IT Tower Ferozepur Road\", \"killed_min\": 26, \"killed_max\": 27, \"injured_min\": 56, \"no_of_suicide_blasts\": 1}, {\"id\": 279, \"date\": \"2017-07-10\", \"time\": \"11:43 AM\", \"city\": \"Chaman\", \"latitude\": 30.90983, \"longitude\": 66.452402, \"province\": \"Balochistan\", \"location\": \"Boghra Road\", \"killed_min\": 1, \"killed_max\": 3, \"injured_min\": 1, \"no_of_suicide_blasts\": 1}, {\"id\": 278, \"date\": \"2017-06-23\", \"time\": \"1:30 PM\", \"city\": \"Quetta\", \"latitude\": 33.88423, \"longitude\": 70.10878, \"province\": \"Balochistan\", \"location\": \"Parachinar town in the restive tribal bel\", \"killed_min\": 30, \"killed_max\": 85, \"injured_min\": 100, \"no_of_suicide_blasts\": 3}, {\"id\": 277, \"date\": \"2017-05-12\", \"time\": \"2:30 PM\", \"city\": \"Quetta\", \"latitude\": 29.800833, \"longitude\": 66.848056, \"province\": \"Baluchistan\", \"location\": \"Town of Mastung\", \"killed_min\": 25, \"killed_max\": 28, \"injured_min\": 35, \"no_of_suicide_blasts\": 1}, {\"id\": 276, \"date\": \"2017-04-05\", \"time\": \"7:15 AM\", \"city\": \"Lahore\", \"latitude\": 31.463017, \"longitude\": 74.435675, \"province\": \"Punjab\", \"location\": \"Bedian Road\", \"killed_min\": 6, \"killed_max\": 7, \"injured_min\": 19, \"no_of_suicide_blasts\": null}, {\"id\": 275, \"date\": \"2017-02-21\", \"time\": \"9:00 AM\", \"city\": \"Tangi, Charsadda District\", \"latitude\": 34.3, \"longitude\": 71.653889, \"province\": \"KPK\", \"location\": \"Court\", \"killed_min\": 6, \"killed_max\": 7, \"injured_min\": 15, \"no_of_suicide_blasts\": 2}, {\"id\": 274, \"date\": \"2017-02-16\", \"time\": \"6:00 PM\", \"city\": \"Sehwan town\", \"latitude\": 26.419314, \"longitude\": 67.859373, \"province\": \"Sindh\", \"location\": \"Lal Shahbaz Qalandar shrine\", \"killed_min\": 70, \"killed_max\": 72, \"injured_min\": 150, \"no_of_suicide_blasts\": 1}, {\"id\": 272, \"date\": \"2017-02-15\", \"time\": \"3:30 PM\", \"city\": \"Hayatabad\", \"latitude\": 33.986111, \"longitude\": 71.456944, \"province\": \"KPK\", \"location\": \"Hayatabad Medical Complex\", \"killed_min\": 1, \"killed_max\": 1, \"injured_min\": 4, \"no_of_suicide_blasts\": 1}, {\"id\": 273, \"date\": \"2017-02-15\", \"time\": \"9:00 AM\", \"city\": \"Mosal Kor, Mohmand Agency\", \"latitude\": 34.553808, \"longitude\": 71.434141, \"province\": \"FATA\", \"location\": \"Office of political agent\", \"killed_min\": 1, \"killed_max\": 1, \"injured_min\": 0, \"no_of_suicide_blasts\": 1}, {\"id\": 271, \"date\": \"2017-02-15\", \"time\": \"8:00 AM\", \"city\": \"Ghallanai, Mohmand Agency\", \"latitude\": 34.5, \"longitude\": 71.333333, \"province\": \"FATA\", \"location\": \"main gate of Mohmand Agency headquarters, Ghallanai\", \"killed_min\": 5, \"killed_max\": 8, \"injured_min\": 0, \"no_of_suicide_blasts\": 1}, {\"id\": 270, \"date\": \"2017-02-13\", \"time\": \"6:00 PM\", \"city\": \"Lahore\", \"latitude\": 31.555382, \"longitude\": 74.3"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/hazard/tsunami/events/": {
      "get": {
        "operationId": "hazard_tsunami_events",
        "summary": "Tsunami events",
        "description": "A pass-through proxy for the NOAA National Centers for Environmental Information Global Historical Tsunami Database. This is a historical geophysical catalogue, not an astrological calculation, and it reaches back to the second millennium BC — years before the common era appear as negative numbers.\n\nQuery parameters are forwarded to NOAA unchanged. The main ones are `year`, `minYear` and `maxYear`, `day` and `month`, `country`, `area` and `regionCode` (numeric ocean-basin codes such as 85 for Japan, 50 for the Mediterranean and 89 for the west coast of South America; several can be given comma-separated), a latitude and longitude box, `minCauseCode`/`maxCauseCode` (0 unknown, 1 earthquake, 6 volcano, 8 landslide, 9 meteorological, 10 explosion, 11 astronomical tide, among others), `minEventValidity`/`maxEventValidity` on a scale from -1 erroneous to 4 definite, and thresholds on wave height, earthquake magnitude, deaths, injuries, houses destroyed and damage in millions of dollars. Several of those also come in an 'amount order' form, a coarse 0-4 banding used where an exact figure was never recorded. Paging uses `page`, `itemsPerPage` and `order` (for example `year:asc`).\n\nThe response is NOAA's own envelope with an `items` list. Each item carries an id, the date parts, `eventValidity`, `causeCode`, the linked earthquake or volcano event ids, country and `locationName`, `regionCode`, latitude and longitude, `maxWaterHeight` in metres, the number of recorded runups, tsunami intensity and the death and damage order bands for both the source region and the event as a whole.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Natural hazards"
        ],
        "parameters": [
          {
            "name": "area",
            "in": "query",
            "required": false,
            "description": "State, Province or Prefecture of the tsunami source",
            "schema": {
              "type": "string",
              "description": "State, Province or Prefecture of the tsunami source"
            }
          },
          {
            "name": "assocDeposits",
            "in": "query",
            "required": false,
            "description": "Filter by associated tsunami deposits",
            "schema": {
              "type": "string",
              "description": "Filter by associated tsunami deposits"
            }
          },
          {
            "name": "causeCode",
            "in": "query",
            "required": false,
            "description": "Cause code(s), comma-separated. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11",
            "schema": {
              "type": "string",
              "description": "Cause code(s), comma-separated. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11 Comma-separated list, e.g. '2,9,11'. 0 Unknown; 1 Earthquake; 2 Questionable Earthquake; 3 Earthquake and Landslide; 4 Volcano and Earthquake; 5 Volcano/Earthquake/Landslide; 6 Volcano; 7 Volcano and Landslide; 8 Landslide; 9 Meteorological; 10 Explosion; 11 Astronomical Tide.",
              "enum": [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10",
                "11"
              ]
            }
          },
          {
            "name": "commentsEnd",
            "in": "query",
            "required": false,
            "description": "Comments end with",
            "schema": {
              "type": "string",
              "description": "Comments end with FREE-FORM text - 'comments end with'."
            }
          },
          {
            "name": "commentsInclude",
            "in": "query",
            "required": false,
            "description": "Comments include",
            "schema": {
              "type": "string",
              "description": "Comments include FREE-FORM text - 'comments include'."
            }
          },
          {
            "name": "commentsMatch",
            "in": "query",
            "required": false,
            "description": "Comments match exactly",
            "schema": {
              "type": "string",
              "description": "Comments match exactly FREE-FORM text - 'comments match exactly'."
            }
          },
          {
            "name": "commentsNot",
            "in": "query",
            "required": false,
            "description": "Comments do not include",
            "schema": {
              "type": "string",
              "description": "Comments do not include FREE-FORM text - 'comments do not include'."
            }
          },
          {
            "name": "commentsStart",
            "in": "query",
            "required": false,
            "description": "Comments start with",
            "schema": {
              "type": "string",
              "description": "Comments start with FREE-FORM text - 'comments start with'."
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Country where the tsunami source occurred (e.g. Japan)",
            "schema": {
              "type": "string",
              "description": "Country where the tsunami source occurred (e.g. Japan)"
            }
          },
          {
            "name": "day",
            "in": "query",
            "required": false,
            "description": "Day of the event (1–31)",
            "schema": {
              "type": "integer",
              "description": "Day of the event (1–31)"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": false,
            "description": "Exact event ID",
            "schema": {
              "type": "integer",
              "description": "Exact event ID"
            }
          },
          {
            "name": "itemsPerPage",
            "in": "query",
            "required": false,
            "description": "Number of items per page",
            "schema": {
              "type": "integer",
              "description": "Number of items per page"
            }
          },
          {
            "name": "locEnd",
            "in": "query",
            "required": false,
            "description": "Location name ends with",
            "schema": {
              "type": "string",
              "description": "Location name ends with FREE-FORM text - 'location name ends with'."
            }
          },
          {
            "name": "locInclude",
            "in": "query",
            "required": false,
            "description": "Location name includes",
            "schema": {
              "type": "string",
              "description": "Location name includes FREE-FORM text - 'location name includes'."
            }
          },
          {
            "name": "locMatch",
            "in": "query",
            "required": false,
            "description": "Location name matches exactly",
            "schema": {
              "type": "string",
              "description": "Location name matches exactly FREE-FORM text - 'location name matches exactly'."
            }
          },
          {
            "name": "locNot",
            "in": "query",
            "required": false,
            "description": "Location name does not include",
            "schema": {
              "type": "string",
              "description": "Location name does not include FREE-FORM text - 'location name does not include'."
            }
          },
          {
            "name": "locStart",
            "in": "query",
            "required": false,
            "description": "Location name starts with",
            "schema": {
              "type": "string",
              "description": "Location name starts with FREE-FORM text - 'location name starts with'. Proxied to NOAA."
            }
          },
          {
            "name": "maxCauseCode",
            "in": "query",
            "required": false,
            "description": "Max cause code. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11",
            "schema": {
              "type": "integer",
              "description": "Max cause code. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11"
            }
          },
          {
            "name": "maxDamageAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Max damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "maxDamageAmountOrderTotal",
            "in": "query",
            "required": false,
            "description": "Max total damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Max total damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "maxDamageMillionsDollars",
            "in": "query",
            "required": false,
            "description": "Max damage in millions of dollars",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max damage in millions of dollars"
            }
          },
          {
            "name": "maxDamageMillionsDollarsTotal",
            "in": "query",
            "required": false,
            "description": "Max total damage in millions of dollars (tsunami + source event)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max total damage in millions of dollars (tsunami + source event)"
            }
          },
          {
            "name": "maxDeaths",
            "in": "query",
            "required": false,
            "description": "Max deaths from the tsunami",
            "schema": {
              "type": "integer",
              "description": "Max deaths from the tsunami"
            }
          },
          {
            "name": "maxDeathsAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "maxDeathsAmountOrderTotal",
            "in": "query",
            "required": false,
            "description": "Max total deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max total deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "maxDeathsTotal",
            "in": "query",
            "required": false,
            "description": "Max total deaths from tsunami and source event",
            "schema": {
              "type": "integer",
              "description": "Max total deaths from tsunami and source event"
            }
          },
          {
            "name": "maxEqMagnitude",
            "in": "query",
            "required": false,
            "description": "Max earthquake magnitude [0.0, 9.9]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max earthquake magnitude [0.0, 9.9]"
            }
          },
          {
            "name": "maxEventValidity",
            "in": "query",
            "required": false,
            "description": "Max event validity. −1-erroneous, 0-None, 1-very doubtful, 2-questionable, 3-probable, 4-definite",
            "schema": {
              "type": "integer",
              "description": "Max event validity. −1-erroneous, 0-None, 1-very doubtful, 2-questionable, 3-probable, 4-definite"
            }
          },
          {
            "name": "maxHousesDestroyed",
            "in": "query",
            "required": false,
            "description": "Max houses destroyed",
            "schema": {
              "type": "integer",
              "description": "Max houses destroyed"
            }
          },
          {
            "name": "maxHousesDestroyedAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "maxId",
            "in": "query",
            "required": false,
            "description": "Maximum event ID",
            "schema": {
              "type": "integer",
              "description": "Maximum event ID"
            }
          },
          {
            "name": "maxInjuries",
            "in": "query",
            "required": false,
            "description": "Max injuries from the tsunami",
            "schema": {
              "type": "integer",
              "description": "Max injuries from the tsunami"
            }
          },
          {
            "name": "maxInjuriesAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "maxLatitude",
            "in": "query",
            "required": false,
            "description": "Max latitude [−90, 90]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max latitude [−90, 90]"
            }
          },
          {
            "name": "maxLongitude",
            "in": "query",
            "required": false,
            "description": "Max longitude [−180, 180]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max longitude [−180, 180]"
            }
          },
          {
            "name": "maxMaxWaterHeight",
            "in": "query",
            "required": false,
            "description": "Max maximum water height above sea level (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max maximum water height above sea level (m)"
            }
          },
          {
            "name": "maxNumRunups",
            "in": "query",
            "required": false,
            "description": "Max number of runup locations associated with the event",
            "schema": {
              "type": "integer",
              "description": "Max number of runup locations associated with the event"
            }
          },
          {
            "name": "maxRunupHoriz",
            "in": "query",
            "required": false,
            "description": "Max maximum horizontal inland flooding distance (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max maximum horizontal inland flooding distance (m)"
            }
          },
          {
            "name": "maxYear",
            "in": "query",
            "required": false,
            "description": "Maximum year",
            "schema": {
              "type": "integer",
              "description": "Maximum year"
            }
          },
          {
            "name": "minCauseCode",
            "in": "query",
            "required": false,
            "description": "Min cause code. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11",
            "schema": {
              "type": "integer",
              "description": "Min cause code. 0-Unknown, 1-Earthquake, 2-Questionable Earthquake, 3-Earthquake and Landslide, 4-Volcano and Earthquake, 5-Volcano/Earthquake/Landslide, 6-Volcano, 7-Volcano and Landslide, 8-Landslide, 9-Meteorological, 10-Explosion, 11-Astronomical Tide. Example: 2,9,11"
            }
          },
          {
            "name": "minDamageAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Min damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "minDamageAmountOrderTotal",
            "in": "query",
            "required": false,
            "description": "Min total damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Min total damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "minDamageMillionsDollars",
            "in": "query",
            "required": false,
            "description": "Min damage in millions of dollars",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min damage in millions of dollars"
            }
          },
          {
            "name": "minDamageMillionsDollarsTotal",
            "in": "query",
            "required": false,
            "description": "Min total damage in millions of dollars (tsunami + source event)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min total damage in millions of dollars (tsunami + source event)"
            }
          },
          {
            "name": "minDeaths",
            "in": "query",
            "required": false,
            "description": "Min deaths from the tsunami",
            "schema": {
              "type": "integer",
              "description": "Min deaths from the tsunami"
            }
          },
          {
            "name": "minDeathsAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "minDeathsAmountOrderTotal",
            "in": "query",
            "required": false,
            "description": "Min total deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min total deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "minDeathsTotal",
            "in": "query",
            "required": false,
            "description": "Min total deaths from tsunami and source event",
            "schema": {
              "type": "integer",
              "description": "Min total deaths from tsunami and source event"
            }
          },
          {
            "name": "minEqMagnitude",
            "in": "query",
            "required": false,
            "description": "Min earthquake magnitude [0.0, 9.9]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min earthquake magnitude [0.0, 9.9]"
            }
          },
          {
            "name": "minEventValidity",
            "in": "query",
            "required": false,
            "description": "Min event validity. −1-erroneous, 0-None, 1-very doubtful, 2-questionable, 3-probable, 4-definite",
            "schema": {
              "type": "integer",
              "description": "Min event validity. −1-erroneous, 0-None, 1-very doubtful, 2-questionable, 3-probable, 4-definite"
            }
          },
          {
            "name": "minHousesDestroyed",
            "in": "query",
            "required": false,
            "description": "Min houses destroyed",
            "schema": {
              "type": "integer",
              "description": "Min houses destroyed"
            }
          },
          {
            "name": "minHousesDestroyedAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "minId",
            "in": "query",
            "required": false,
            "description": "Minimum event ID",
            "schema": {
              "type": "integer",
              "description": "Minimum event ID"
            }
          },
          {
            "name": "minInjuries",
            "in": "query",
            "required": false,
            "description": "Min injuries from the tsunami",
            "schema": {
              "type": "integer",
              "description": "Min injuries from the tsunami"
            }
          },
          {
            "name": "minInjuriesAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "minLatitude",
            "in": "query",
            "required": false,
            "description": "Min latitude [−90, 90]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min latitude [−90, 90]"
            }
          },
          {
            "name": "minLongitude",
            "in": "query",
            "required": false,
            "description": "Min longitude [−180, 180]",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min longitude [−180, 180]"
            }
          },
          {
            "name": "minMaxWaterHeight",
            "in": "query",
            "required": false,
            "description": "Min maximum water height above sea level (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min maximum water height above sea level (m)"
            }
          },
          {
            "name": "minNumRunups",
            "in": "query",
            "required": false,
            "description": "Min number of runup locations associated with the event",
            "schema": {
              "type": "integer",
              "description": "Min number of runup locations associated with the event"
            }
          },
          {
            "name": "minRunupHoriz",
            "in": "query",
            "required": false,
            "description": "Min maximum horizontal inland flooding distance (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min maximum horizontal inland flooding distance (m)"
            }
          },
          {
            "name": "minYear",
            "in": "query",
            "required": false,
            "description": "Minimum year",
            "schema": {
              "type": "integer",
              "description": "Minimum year"
            }
          },
          {
            "name": "month",
            "in": "query",
            "required": false,
            "description": "Month of the event (1–12)",
            "schema": {
              "type": "integer",
              "description": "Month of the event (1–12)"
            }
          },
          {
            "name": "oceanicTsunami",
            "in": "query",
            "required": false,
            "description": "Filter by oceanic tsunami (true/false)",
            "schema": {
              "type": "boolean",
              "description": "Filter by oceanic tsunami (true/false)"
            }
          },
          {
            "name": "op",
            "in": "query",
            "required": false,
            "description": "Logical operator for filters",
            "schema": {
              "type": "string",
              "description": "Logical operator for filters"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort order. Examples: year:asc, month:desc",
            "schema": {
              "type": "string",
              "description": "Sort order. Examples: year:asc, month:desc FORMAT constraint rather than a fixed enum: '<field>:asc' or '<field>:desc', e.g. 'year:asc', 'month:desc'. The field name must be one NOAA recognises; not validated locally."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Page number",
            "schema": {
              "type": "integer",
              "description": "Page number"
            }
          },
          {
            "name": "regionCode",
            "in": "query",
            "required": false,
            "description": "Region code(s). 87 - Alaska (including Aleutian Islands), 40 - Black Sea and Caspian Sea, 74 - Caribbean Sea, 78 - Central Africa, 84 - China/North and South Korea/Philippines/Taiwan, 81 - E Coast Australia/New Zealand/South Pacific Is., 75 - East Coast USA and Canada, 76 - Gulf of America/Mexico, 80 - Hawaii/Johnston Atoll/Midway I, 60 - Indian Ocean (including west coast of Australia), 83 - Indonesia (Pacific Ocean) and Malaysia, 85 - Japan, 86 - Kamchatka and Kuril Islands, 50 - Mediterranean Sea, 82 - New Caledonia/New Guinea/Solomon Is./Vanuatu, 73 - Northeast Atlantic Ocean, 72 - Northwest Atlantic Ocean, 30 - Red Sea and Persian Gulf, 70 - Southeast Atlantic Ocean, 71 - Southwest Atlantic Ocean, 77 - West Coast of Africa, 88 - West Coast of North and Central America, 89 - West Coast of South America. Example: 87,30,89",
            "schema": {
              "type": "string",
              "description": "Region code(s). 87 - Alaska (including Aleutian Islands), 40 - Black Sea and Caspian Sea, 74 - Caribbean Sea, 78 - Central Africa, 84 - China/North and South Korea/Philippines/Taiwan, 81 - E Coast Australia/New Zealand/South Pacific Is., 75 - East Coast USA and Canada, 76 - Gulf of America/Mexico, 80 - Hawaii/Johnston Atoll/Midway I, 60 - Indian Ocean (including west coast of Australia), 83 - Indonesia (Pacific Ocean) and Malaysia, 85 - Japan, 86 - Kamchatka and Kuril Islands, 50 - Mediterranean Sea, 82 - New Caledonia/New Guinea/Solomon Is./Vanuatu, 73 - Northeast Atlantic Ocean, 72 - Northwest Atlantic Ocean, 30 - Red Sea and Persian Gulf, 70 - Southeast Atlantic Ocean, 71 - Southwest Atlantic Ocean, 77 - West Coast of Africa, 88 - West Coast of North and Central America, 89 - West Coast of South America. Example: 87,30,89 Comma-separated list of numeric region codes, e.g. '87,30,89'. Meanings: 30 Red Sea and Persian Gulf; 40 Black Sea and Caspian Sea; 50 Mediterranean Sea; 60 Indian Ocean (incl. west coast of Australia); 70 Southeast Atlantic Ocean; 71 Southwest Atlantic Ocean; 72 Northwest Atlantic Ocean; 73 Northeast Atlantic Ocean; 74 Caribbean Sea; 75 East Coast USA and Canada; 76 Gulf of America/Mexico; 77 West Coast of Africa; 78 Central Africa; 80 Hawaii/Johnston Atoll/Midway I; 81 E Coast Australia/New Zealand/South Pacific Is.; 82 New Caledonia/New Guinea/Solomon Is./Vanuatu; 83 Indonesia (Pacific Ocean) and Malaysia; 84 China/North and South Korea/Philippines/Taiwan; 85 Japan; 86 Kamchatka and Kuril Islands; 87 Alaska (incl. Aleutian Islands); 88 West Coast of North and Central America; 89 West Coast of South America. Proxied verbatim to NOAA NCEI.",
              "enum": [
                "30",
                "40",
                "50",
                "60",
                "70",
                "71",
                "72",
                "73",
                "74",
                "75",
                "76",
                "77",
                "78",
                "80",
                "81",
                "82",
                "83",
                "84",
                "85",
                "86",
                "87",
                "88",
                "89"
              ]
            }
          },
          {
            "name": "runupArea",
            "in": "query",
            "required": false,
            "description": "State/Province/Prefecture of the runup location",
            "schema": {
              "type": "string",
              "description": "State/Province/Prefecture of the runup location"
            }
          },
          {
            "name": "runupCountry",
            "in": "query",
            "required": false,
            "description": "Country of the runup location",
            "schema": {
              "type": "string",
              "description": "Country of the runup location"
            }
          },
          {
            "name": "runupDoubtful",
            "in": "query",
            "required": false,
            "description": "Validity of runup: n-OK, y-Doubtful, m-Meteorological, a-Atmospheric",
            "schema": {
              "type": "string",
              "description": "Validity of runup: n-OK, y-Doubtful, m-Meteorological, a-Atmospheric Single letter: n = OK, y = Doubtful, m = Meteorological, a = Atmospheric.",
              "enum": [
                "n",
                "y",
                "m",
                "a"
              ]
            }
          },
          {
            "name": "runupLocEnd",
            "in": "query",
            "required": false,
            "description": "Runup location name ends with",
            "schema": {
              "type": "string",
              "description": "Runup location name ends with FREE-FORM text - 'runup location name ends with'."
            }
          },
          {
            "name": "runupLocInclude",
            "in": "query",
            "required": false,
            "description": "Runup location name includes",
            "schema": {
              "type": "string",
              "description": "Runup location name includes FREE-FORM text - 'runup location name includes'."
            }
          },
          {
            "name": "runupLocMatch",
            "in": "query",
            "required": false,
            "description": "Runup location name matches exactly",
            "schema": {
              "type": "string",
              "description": "Runup location name matches exactly FREE-FORM text - 'runup location name matches exactly'."
            }
          },
          {
            "name": "runupLocNot",
            "in": "query",
            "required": false,
            "description": "Runup location name does not include",
            "schema": {
              "type": "string",
              "description": "Runup location name does not include FREE-FORM text - 'runup location name does not include'."
            }
          },
          {
            "name": "runupLocStart",
            "in": "query",
            "required": false,
            "description": "Runup location name starts with",
            "schema": {
              "type": "string",
              "description": "Runup location name starts with FREE-FORM text - 'runup location name starts with'."
            }
          },
          {
            "name": "runupMaxDamageAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max runup damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Max runup damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "runupMaxDamageMillionsDollars",
            "in": "query",
            "required": false,
            "description": "Max damage at runup location (millions $)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max damage at runup location (millions $)"
            }
          },
          {
            "name": "runupMaxDeaths",
            "in": "query",
            "required": false,
            "description": "Max deaths at the runup location",
            "schema": {
              "type": "integer",
              "description": "Max deaths at the runup location"
            }
          },
          {
            "name": "runupMaxDeathsAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max runup deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max runup deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMaxDistance",
            "in": "query",
            "required": false,
            "description": "Max distance from source to runup (km)",
            "schema": {
              "type": "integer",
              "description": "Max distance from source to runup (km)"
            }
          },
          {
            "name": "runupMaxHeight",
            "in": "query",
            "required": false,
            "description": "Max maximum water height at runup location (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max maximum water height at runup location (m)"
            }
          },
          {
            "name": "runupMaxHousesDestroyed",
            "in": "query",
            "required": false,
            "description": "Max houses destroyed at runup location",
            "schema": {
              "type": "integer",
              "description": "Max houses destroyed at runup location"
            }
          },
          {
            "name": "runupMaxHousesDestroyedAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max runup houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max runup houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMaxInjuries",
            "in": "query",
            "required": false,
            "description": "Max injuries at the runup location",
            "schema": {
              "type": "integer",
              "description": "Max injuries at the runup location"
            }
          },
          {
            "name": "runupMaxInjuriesAmountOrder",
            "in": "query",
            "required": false,
            "description": "Max runup injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Max runup injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMaxTravelTime",
            "in": "query",
            "required": false,
            "description": "Max travel time (minutes)",
            "schema": {
              "type": "integer",
              "description": "Max travel time (minutes)"
            }
          },
          {
            "name": "runupMaxTroughHt",
            "in": "query",
            "required": false,
            "description": "Max maximum water trough below sea level (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Max maximum water trough below sea level (m)"
            }
          },
          {
            "name": "runupMeasureType",
            "in": "query",
            "required": false,
            "description": "Type of measurement: 1-Eyewitness water height, 2-Tide Gauge, 3-Deep Ocean Gauge, 4-Post-survey water height, 5-Runup Height post-survey, 6-Atmospheric Wave, 7-Seiche, 8-Runup Height in Harbor, 9-Splash mark, 10-Flow Depth",
            "schema": {
              "type": "integer",
              "description": "Type of measurement: 1-Eyewitness water height, 2-Tide Gauge, 3-Deep Ocean Gauge, 4-Post-survey water height, 5-Runup Height post-survey, 6-Atmospheric Wave, 7-Seiche, 8-Runup Height in Harbor, 9-Splash mark, 10-Flow Depth"
            }
          },
          {
            "name": "runupMinDamageAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min runup damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)",
            "schema": {
              "type": "integer",
              "description": "Min runup damage description. 0-None, 1-LIMITED (<$1M), 2-MODERATE ($1–5M), 3-SEVERE ($5–25M), 4-EXTREME (>$25M)"
            }
          },
          {
            "name": "runupMinDamageMillionsDollars",
            "in": "query",
            "required": false,
            "description": "Min damage at runup location (millions $)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min damage at runup location (millions $)"
            }
          },
          {
            "name": "runupMinDeaths",
            "in": "query",
            "required": false,
            "description": "Min deaths at the runup location",
            "schema": {
              "type": "integer",
              "description": "Min deaths at the runup location"
            }
          },
          {
            "name": "runupMinDeathsAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min runup deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min runup deaths description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMinDistance",
            "in": "query",
            "required": false,
            "description": "Min distance from source to runup (km)",
            "schema": {
              "type": "integer",
              "description": "Min distance from source to runup (km)"
            }
          },
          {
            "name": "runupMinHeight",
            "in": "query",
            "required": false,
            "description": "Min maximum water height at runup location (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min maximum water height at runup location (m)"
            }
          },
          {
            "name": "runupMinHousesDestroyed",
            "in": "query",
            "required": false,
            "description": "Min houses destroyed at runup location",
            "schema": {
              "type": "integer",
              "description": "Min houses destroyed at runup location"
            }
          },
          {
            "name": "runupMinHousesDestroyedAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min runup houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min runup houses destroyed description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMinInjuries",
            "in": "query",
            "required": false,
            "description": "Min injuries at the runup location",
            "schema": {
              "type": "integer",
              "description": "Min injuries at the runup location"
            }
          },
          {
            "name": "runupMinInjuriesAmountOrder",
            "in": "query",
            "required": false,
            "description": "Min runup injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)",
            "schema": {
              "type": "integer",
              "description": "Min runup injuries description. 0-None, 1-Few (~1–50), 2-Some (~51–100), 3-Many (~101–1000), 4-Very many (>1000)"
            }
          },
          {
            "name": "runupMinTravelTime",
            "in": "query",
            "required": false,
            "description": "Min travel time (minutes)",
            "schema": {
              "type": "integer",
              "description": "Min travel time (minutes)"
            }
          },
          {
            "name": "runupMinTroughHt",
            "in": "query",
            "required": false,
            "description": "Min maximum water trough below sea level (m)",
            "schema": {
              "type": "number",
              "format": "double",
              "description": "Min maximum water trough below sea level (m)"
            }
          },
          {
            "name": "runupRegion",
            "in": "query",
            "required": false,
            "description": "Runup region code(s). 87 - Alaska (including Aleutian Islands), 40 - Black Sea and Caspian Sea, 74 - Caribbean Sea, 78 - Central Africa, 84 - China/North and South Korea/Philippines/Taiwan, 81 - E Coast Australia/New Zealand/South Pacific Is., 75 - East Coast USA and Canada, 76 - Gulf of America/Mexico, 80 - Hawaii/Johnston Atoll/Midway I, 60 - Indian Ocean (including west coast of Australia), 83 - Indonesia (Pacific Ocean) and Malaysia, 85 - Japan, 86 - Kamchatka and Kuril Islands, 50 - Mediterranean Sea, 82 - New Caledonia/New Guinea/Solomon Is./Vanuatu, 73 - Northeast Atlantic Ocean, 72 - Northwest Atlantic Ocean, 30 - Red Sea and Persian Gulf, 70 - Southeast Atlantic Ocean, 71 - Southwest Atlantic Ocean, 77 - West Coast of Africa, 88 - West Coast of North and Central America, 89 - West Coast of South America. Example: 87,30,89",
            "schema": {
              "type": "string",
              "description": "Runup region code(s). 87 - Alaska (including Aleutian Islands), 40 - Black Sea and Caspian Sea, 74 - Caribbean Sea, 78 - Central Africa, 84 - China/North and South Korea/Philippines/Taiwan, 81 - E Coast Australia/New Zealand/South Pacific Is., 75 - East Coast USA and Canada, 76 - Gulf of America/Mexico, 80 - Hawaii/Johnston Atoll/Midway I, 60 - Indian Ocean (including west coast of Australia), 83 - Indonesia (Pacific Ocean) and Malaysia, 85 - Japan, 86 - Kamchatka and Kuril Islands, 50 - Mediterranean Sea, 82 - New Caledonia/New Guinea/Solomon Is./Vanuatu, 73 - Northeast Atlantic Ocean, 72 - Northwest Atlantic Ocean, 30 - Red Sea and Persian Gulf, 70 - Southeast Atlantic Ocean, 71 - Southwest Atlantic Ocean, 77 - West Coast of Africa, 88 - West Coast of North and Central America, 89 - West Coast of South America. Example: 87,30,89 Comma-separated numeric region codes - identical value set and meanings as regionCode, but applied to the runup location instead of the tsunami source.",
              "enum": [
                "30",
                "40",
                "50",
                "60",
                "70",
                "71",
                "72",
                "73",
                "74",
                "75",
                "76",
                "77",
                "78",
                "80",
                "81",
                "82",
                "83",
                "84",
                "85",
                "86",
                "87",
                "88",
                "89"
              ]
            }
          },
          {
            "name": "tsuAssoc",
            "in": "query",
            "required": false,
            "description": "Tsunami association filter",
            "schema": {
              "type": "string",
              "description": "Tsunami association filter"
            }
          },
          {
            "name": "year",
            "in": "query",
            "required": false,
            "description": "Exact year of the event",
            "schema": {
              "type": "integer",
              "description": "Exact year of the event"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"items\": [{\"id\": 1, \"year\": -2000, \"eventValidity\": 1, \"causeCode\": 1, \"earthquakeEventId\": 2, \"numDeposits\": 0, \"country\": \"SYRIA\", \"locationName\": \"SYRIAN COASTS\", \"regionCode\": 50, \"latitude\": 35.683, \"longitude\": 35.8, \"numRunups\": 1, \"tsIntensity\": 6, \"deathsAmountOrder\": 3, \"damageAmountOrder\": 4, \"deathsAmountOrderTotal\": 3, \"damageAmountOrderTotal\": 4, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 3, \"year\": -1610, \"eventValidity\": 4, \"causeCode\": 6, \"earthquakeEventId\": 5877, \"volcanoEventId\": 1351, \"numDeposits\": 28, \"country\": \"GREECE\", \"locationName\": \"THERA ISLAND (SANTORINI)\", \"regionCode\": 50, \"latitude\": 36.4, \"longitude\": 25.4, \"maxWaterHeight\": 90, \"numRunups\": 2, \"tsIntensity\": 6, \"deathsAmountOrder\": 3, \"damageAmountOrder\": 3, \"deathsAmountOrderTotal\": 3, \"damageAmountOrderTotal\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 4, \"year\": -1365, \"eventValidity\": 1, \"causeCode\": 2, \"earthquakeEventId\": 9712, \"numDeposits\": 0, \"country\": \"SYRIA\", \"locationName\": \"SYRIAN COASTS\", \"regionCode\": 50, \"latitude\": 35.683, \"longitude\": 35.8, \"numRunups\": 1, \"tsIntensity\": 6, \"damageAmountOrder\": 2, \"damageAmountOrderTotal\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 5, \"year\": -1300, \"eventValidity\": 2, \"causeCode\": 0, \"eqMagnitude\": 6, \"numDeposits\": 0, \"country\": \"TURKEY\", \"locationName\": \"IONIAN COASTS, TROAD\", \"regionCode\": 50, \"latitude\": 39.96, \"longitude\": 26.24, \"numRunups\": 0, \"tsIntensity\": 5, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 6, \"year\": -760, \"eventValidity\": 2, \"causeCode\": 0, \"numDeposits\": 0, \"country\": \"ISRAEL\", \"locationName\": \"ISRAEL AND LEBANON COASTS\", \"regionCode\": 50, \"numRunups\": 0, \"tsIntensity\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 7, \"year\": -590, \"eventValidity\": 2, \"causeCode\": 1, \"earthquakeEventId\": 7793, \"numDeposits\": 0, \"country\": \"LEBANON\", \"locationName\": \"LEBANON COASTS\", \"regionCode\": 50, \"latitude\": 33.27, \"longitude\": 35.22, \"numRunups\": 0, \"tsIntensity\": 6, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 8, \"year\": -525, \"eventValidity\": 2, \"causeCode\": 1, \"earthquakeEventId\": 7794, \"numDeposits\": 0, \"country\": \"LEBANON\", \"locationName\": \"LEBANON COASTS\", \"regionCode\": 50, \"latitude\": 33.56, \"longitude\": 35.37, \"numRunups\": 0, \"tsIntensity\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 9, \"year\": -479, \"eventValidity\": 2, \"causeCode\": 1, \"eqMagnitude\": 7, \"earthquakeEventId\": 17, \"numDeposits\": 1, \"country\": \"GREECE\", \"locationName\": \"NORTH AEGEAN\", \"regionCode\": 50, \"latitude\": 39.7, \"longitude\": 23.3, \"numRunups\": 1, \"tsIntensity\": 3, \"deathsAmountOrder\": 3, \"deathsAmountOrderTotal\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 10, \"year\": -426, \"month\": 6, \"eventValidity\": 4, \"causeCode\": 1, \"eqMagnitude\": 7.1, \"earthquakeEventId\": 5878, \"numDeposits\": 0, \"country\": \"GREECE\", \"locationName\": \"CORINTHOS-PATRAS GULF\", \"regionCode\": 50, \"latitude\": 38.9, \"longitude\": 22.7, \"numRunups\": 12, \"tsIntensity\": 5, \"deathsAmountOrder\": 3, \"damageAmountOrder\": 2, \"housesDestroyedAmountOrder\": 2, \"deathsTotal\": 2500, \"deathsAmountOrderTotal\": 4, \"damageAmountOrderTotal\": 3, \"housesDestroyedAmountOrderTotal\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 11, \"year\": -373, \"eventValidity\": 4, \"causeCode\": 3, \"eqMagnitude\": 7.3, \"earthquakeEventId\": 20, \"numDeposits\": 1, \"country\": \"GREECE\", \"locationName\": \"CORINTHOS-PATRAS GULF\", \"regionCode\": 50, \"latitude\": 38.25, \"longitude\": 22.25, \"numRunups\": 1, \"tsIntensity\": 5, \"deathsAmountOrder\": 3, \"damageAmountOrder\": 3, \"housesDestroyedAmountOrder\": 3, \"deathsAmountOrderTotal\": 3, \"damageAmountOrderTotal\": 3, \"housesDestroyedAmountOrderTotal\": 3, \"publish\": true, \"oceanicTsunami\": true}, {\"id\": 12, \"year\": -330, \"eventValidity\": 1, \"causeCode\": 1, \"eqMagnitude\": 7, \"earthquakeEventId\": 22, \"numDeposits\": 0, \"country\": \"GREECE\", \"locationName\": \"E. SPORADES ISLANDS, AEGEAN ISLANDS\", \"regionCode\": 50, \"latitude\": 40, \"longitude\": 25, \"numRunups\": 0, \"publish\": true, \"oceanicTsu"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/nakshatra_dasha/": {
      "post": {
        "operationId": "nakshatra_dasha",
        "summary": "Nakshatra dashas",
        "description": "A dasha is a timeline that divides a life into periods, each ruled by a planet. The nakshatra dashas start from the lunar mansion the Moon occupied at birth: that fixes which planet's period was running at birth and how much of it remained, and the rest of the cycle follows in a fixed order. Vimshottari, the 120-year scheme, is the one in general use; the others suit charts where their own applicability conditions are met.\n\n`dasha_type` selects the scheme, and the schemes differ in total length and in which planets take part. VimshottariDasha runs 120 years over nine planets; AshtottariDasha 108 over eight (Ketu is omitted); ChaturaseetiSamaDasha 84, as seven equal twelve-year periods; DwadashottariDasha 112; DwisaptatiDasha 72, as eight equal nine-year periods; PanchottariDasha 105; SataabdikaDasha 100; ShodashottariDasha 116; ShattrimsaSamaDasha and YoginiDasha both 36 over eight periods of one to eight years, differing in how the first lord is chosen; and BudhiGatiDasha 120 over a ten-step sequence. Note that YoginiDasha reports its periods by ruling planet rather than by the eight yogini names.\n\n`dasha_period` chooses the depth: mahadasha, antardasha, pratyantardasha, sookshmasha, pranadasha, dehdasha, or 'all' for the nested structure. `dasha_start` ('current', 'next' or 'previous') and `dasha_direction` ('forward' or 'backward') position the sequence relative to the birth moment, and `days_in_year` sets the year length used to convert periods into dates — pass 365.256364 for the sidereal year or 360 for the traditional savana reckoning, which shifts every date. `max_levels` caps the nesting depth and is the main lever on response size, since a full six-level Vimshottari expansion runs to hundreds of thousands of rows.\n\nThe response is `{data: {<dasha_type>: …}}`. Each period is `{mahadasha_lord, start_date, end_date}` at the top level, with the sub-period lords added at deeper levels, plus a `_metadata` block giving the calculation time and a count per level. Setting `save_to_file` true changes the response entirely: the body becomes a compressed file download in the format named by `compression_type` rather than JSON.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "mahadasha": [
                    {
                      "mahadasha_lord": "saturn",
                      "start_date": "2006-06-11 07:29:39.202770+00:00",
                      "end_date": "2025-06-11 04:23:46.345170+00:00"
                    },
                    {
                      "mahadasha_lord": "mercury",
                      "start_date": "2025-06-11 04:23:46.345170+00:00",
                      "end_date": "2042-06-11 12:59:33.788370+00:00"
                    },
                    {
                      "mahadasha_lord": "ketu",
                      "start_date": "2042-06-11 12:59:33.788370+00:00",
                      "end_date": "2049-06-11 08:03:42.735570+00:00"
                    },
                    {
                      "mahadasha_lord": "venus",
                      "start_date": "2049-06-11 08:03:42.735570+00:00",
                      "end_date": "2069-06-11 11:06:59.727570+00:00"
                    },
                    {
                      "mahadasha_lord": "sun",
                      "start_date": "2069-06-11 11:06:59.727570+00:00",
                      "end_date": "2075-06-12 00:01:58.825170+00:00"
                    },
                    {
                      "mahadasha_lord": "moon",
                      "start_date": "2075-06-12 00:01:58.825170+00:00",
                      "end_date": "2085-06-11 13:33:37.321170+00:00"
                    },
                    {
                      "mahadasha_lord": "mars",
                      "start_date": "2085-06-11 13:33:37.321170+00:00",
                      "end_date": "2092-06-11 08:37:46.268370+00:00"
                    },
                    {
                      "mahadasha_lord": "rahu",
                      "start_date": "2092-06-11 08:37:46.268370+00:00",
                      "end_date": "2110-06-12 23:22:43.561170+00:00"
                    },
                    {
                      "mahadasha_lord": "jupiter",
                      "start_date": "2110-06-12 23:22:43.561170+00:00",
                      "end_date": "2126-06-13 01:49:21.154770+00:00"
                    }
                  ],
                  "antardasha": [],
                  "pratyantardasha": [],
                  "sookshmasha": [],
                  "pranadasha": [],
                  "dehdasha": [],
                  "_metadata": {
                    "calculation_time_ms": 1,
                    "max_levels": 1,
                    "compression_type": "gzip",
                    "created_at": "2026-09-07T15:42:29.844572",
                    "total_periods": 9,
                    "mahadasha_count": 9,
                    "antardasha_count": 0,
                    "pratyantardasha_count": 0,
                    "sookshmasha_count": 0,
                    "pranadasha_count": 0,
                    "dehdasha_count": 0
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dasha_direction": {
                    "type": "string",
                    "description": "Exact lower-case. Engine default 'forward'.",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_period": {
                    "type": "string",
                    "description": "Exact lower-case. 'all' returns the full nested tree; any other listed value extracts just that level from the computed tree and returns [] if that level is absent. Note the spellings 'sookshmasha' (not sookshmadasha) and 'dehdasha' (not dehadasha).",
                    "enum": [
                      "mahadasha",
                      "antardasha",
                      "pratyantardasha",
                      "sookshmasha",
                      "pranadasha",
                      "dehdasha",
                      "all"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Exact lower-case. Chooses where the sub-period sequence starts relative to the parent lord. Engine default 'current'.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_type": {
                    "type": "string",
                    "description": "The value is used verbatim as a CoreEngine registry key, so it must be the exact CamelCase class name. Note the registry key is spelled 'BudhiGatiDasha' even though the module is.",
                    "enum": [
                      "VimshottariDasha",
                      "AshtottariDasha",
                      "ChaturaseetiSamaDasha",
                      "DwadashottariDasha",
                      "DwisaptatiDasha",
                      "PanchottariDasha",
                      "SataabdikaDasha",
                      "ShodashottariDasha",
                      "YoginiDasha",
                      "ShattrimsaSamaDasha",
                      "BudhiGatiDasha"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "examples": [
                      360
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "compressed_output": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "compression_type": {
                    "type": "string",
                    "description": "Default 'gzip'. Only has an effect when save_to_file=true, in which case the response body is the raw compressed file with Content-Type application/gzip | application/x-bzip2 | application/x-xz | application/json respectively.",
                    "enum": [
                      "gzip",
                      "bzip2",
                      "lzma",
                      "none"
                    ],
                    "default": "gzip",
                    "examples": [
                      "gzip"
                    ]
                  },
                  "max_levels": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 6,
                    "default": 6,
                    "examples": [
                      1
                    ]
                  },
                  "output_dir": {
                    "type": "string",
                    "default": "dasha_output",
                    "examples": [
                      "string"
                    ]
                  },
                  "save_to_file": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "use_cache": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "use_nested": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "dasha_direction",
                  "dasha_period",
                  "dasha_start",
                  "dasha_type",
                  "datetime",
                  "days_in_year",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "dasha_type": "VimshottariDasha",
                "dasha_period": "all",
                "datetime": "2024-11-21T09:21:43.577Z",
                "latitude": 26.1046,
                "longitude": 74.319,
                "timezone_as_float": 5.5,
                "days_in_year": 365.256364,
                "dasha_start": "current",
                "dasha_direction": "forward",
                "compressed_output": true,
                "max_levels": 1,
                "use_cache": true,
                "use_nested": true,
                "save_to_file": true,
                "compression_type": "gzip",
                "output_dir": "dasha_output",
                "ultra_fast": true
              }
            }
          }
        }
      }
    },
    "/api/panchpakshi/": {
      "post": {
        "operationId": "panchpakshi",
        "summary": "Pancha Pakshi (day in ten yamas)",
        "description": "Pancha Pakshi is a South Indian timing system that assigns every person one of five birds — vulture, owl, crow, cock or peacock — and divides the day into ten periods called yamas, five between sunrise and sunset and five between sunset and the next sunrise. In the full tradition each bird passes through five states of activity (ruling, eating, walking, sleeping and dying) across those periods, and work is timed to the periods when your own bird is strong. This endpoint returns the two inputs that scheme is built on: the yama boundaries for a given day and place, and the birth bird for a given moment.\n\n`datetime`, `latitude`, `longitude` and `timezone_as_float` set the day and the place. `fixed` chooses how the day is divided: false uses real local sunrise and sunset, so daytime and nighttime yamas have different lengths and shift through the year; true uses a flat 06:00 to 18:00 day, which gives ten equal 2 hour 24 minute periods and is what the traditional tables assume.\n\nThe response is `{yamas, birth panchpakshi}`. `yamas` has `daytime` and `nighttime`, each a list of five `{start, end}` local timestamps in 'YYYY-MM-DD HH:MM:SS' form. `birth panchpakshi` is a single string, one of Vulture, Owl, Crow, Cock or Peacock, derived from the Moon's nakshatra group at that instant together with the paksha: the same nakshatra group yields a different bird in the waxing and waning fortnights, except for the middle group, which gives Crow in both.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Pancha Pakshi"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "yamas": {
                      "daytime": [
                        {
                          "start": "2024-11-21 06:00:00",
                          "end": "2024-11-21 08:24:00"
                        },
                        {
                          "start": "2024-11-21 08:24:00",
                          "end": "2024-11-21 10:48:00"
                        },
                        {
                          "start": "2024-11-21 10:48:00",
                          "end": "2024-11-21 13:12:00"
                        },
                        {
                          "start": "2024-11-21 13:12:00",
                          "end": "2024-11-21 15:36:00"
                        },
                        {
                          "start": "2024-11-21 15:36:00",
                          "end": "2024-11-21 18:00:00"
                        }
                      ],
                      "nighttime": [
                        {
                          "start": "2024-11-21 18:00:00",
                          "end": "2024-11-21 20:24:00"
                        },
                        {
                          "start": "2024-11-21 20:24:00",
                          "end": "2024-11-21 22:48:00"
                        },
                        {
                          "start": "2024-11-21 22:48:00",
                          "end": "2024-11-22 01:12:00"
                        },
                        {
                          "start": "2024-11-22 01:12:00",
                          "end": "2024-11-22 03:36:00"
                        },
                        {
                          "start": "2024-11-22 03:36:00",
                          "end": "2024-11-22 06:00:00"
                        }
                      ]
                    },
                    "birth panchpakshi": "Cock"
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "fixed": {
                    "type": "boolean",
                    "examples": [
                      false
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "nakshatras": {
                    "type": "string",
                    "description": "DEAD PARAMETER at the HTTP layer - PanchpakshiView calls get_birth_panchpakshi(date_time=... only. In the engine the only meaningful value is the literal 'special', which selects the 28-entry nakshatras_special table over the default 27-entry one.",
                    "enum": [
                      "special"
                    ],
                    "examples": [
                      "string"
                    ]
                  }
                },
                "required": [
                  "datetime",
                  "fixed",
                  "latitude",
                  "longitude",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "fixed": true,
                "datetime": "2024-11-21T09:39:20.910Z",
                "latitude": 26.1046,
                "longitude": 74.319,
                "timezone_as_float": 5.5
              }
            }
          }
        }
      }
    },
    "/api/planetary_details/": {
      "post": {
        "operationId": "planetary_details",
        "summary": "Planetary details",
        "description": "A single call that runs nine separate ephemeris scans over a date range and returns them together. It is the endpoint to reach for when you want everything that happens to the planets between two dates rather than a snapshot: sign and nakshatra changes, retrograde spells, declination alignments and out-of-bounds excursions.\n\n`start_date` and `end_date` bound the window, `planet_name` and `sign` narrow the three planet-specific sections, and `longitude` is the ecliptic degree tested by the position search. Supplying `geo_latitude` and `geo_longitude` adds an extra section for ascendant ingress and is otherwise omitted. Note that the window is scanned in full, so a multi-year range is considerably slower than a few days.\n\nThe response holds, under keys with spaces in their names, `sign transitions`, `planet at position` (when the named planet sits at the given longitude in the given sign), `planet ingress exit` (entry and exit times for the named planet in the named sign only), `planet nakshatra ingress exit` (keyed by all twenty-seven nakshatras, each a list of `{start_date, end_date}` windows), `planet sankranti times` (keyed by every supported body, including the Uranian points and planetary moons), `planet retrogression dates` (keyed by planet, each a list of `{start, end}`), `planet krantisamya dates` (a list of `{Planet_1, Planet_2, DateTime, Alignment}` where Alignment is North-North, South-South or Opposite, that is, equal or mirrored declination), `abhijit nakshatra periods` and `planet oob range` (the spells when the body is beyond the Sun's maximum declination). Empty lists mean nothing of that kind happened inside your window.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Planets & positions"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"sign transitions\": {}, \"planet at position\": {\"mercury\": {\"positions\": []}}, \"planet ingress exit\": {\"mercury\": {}}, \"planet nakshatra ingress exit\": {\"mercury\": {\"Ashwini\": [], \"Bharani\": [], \"Krittika\": [], \"Rohini\": [], \"Mrigasira\": [], \"Aardra\": [], \"Punarvasu\": [], \"Pushyami\": [], \"Aasresha\": [], \"Makha\": [], \"Poorva Phalguni\": [], \"Uttara Phalguni\": [], \"Hasta\": [], \"Chitra\": [], \"Swaati\": [], \"Visaakha\": [], \"Anooraadha\": [], \"Jyeshtha\": [{\"start_date\": \"2024-11-21 08:33:35\", \"end_date\": \"2024-11-22 08:33:35\"}], \"Moola\": [], \"Poorvaashaadha\": [], \"Uttaraashaadha\": [], \"Sravanam\": [], \"Dhanishtha\": [], \"Satabhishak\": [], \"Poorvaabhaadra\": [], \"Uttaraabhaadra\": [], \"Revati\": []}}, \"planet sankranti times\": {\"sun\": [], \"moon\": [], \"mercury\": [], \"venus\": [], \"mars\": [], \"jupiter\": [], \"saturn\": [], \"uranus\": [], \"neptune\": [], \"pluto\": [], \"truenode\": [], \"meannode\": [], \"chiron\": [], \"pholus\": [], \"ceres\": [], \"pallas\": [], \"juno\": [], \"vesta\": [], \"cupido\": [], \"hades\": [], \"zeus\": [], \"kronos\": [], \"apollon\": [], \"admetos\": [], \"vulkanus\": [], \"poseidon\": [], \"selena\": [], \"phobos\": [], \"deimos\": [], \"io\": [], \"europa\": [], \"ganymede\": [], \"callisto\": [], \"titan\": [], \"triton\": [], \"charon\": []}, \"planet retrogression dates\": {\"jupiter\": [{\"start\": \"2024-11-21 08:33:35\", \"end\": \"2024-11-22 08:33:35\"}], \"mars\": [], \"meannode\": [{\"start\": \"2024-11-21 08:33:35\", \"end\": \"2024-11-22 08:33:35\"}], \"mercury\": [], \"moon\": [], \"neptune\": [{\"start\": \"2024-11-21 08:33:35\", \"end\": \"2024-11-22 08:33:35\"}], \"pluto\": [], \"saturn\": [], \"sun\": [], \"truenode\": [{\"start\": \"2024-11-21 08:33:35\", \"end\": \"2024-11-22 08:33:35\"}], \"uranus\": [{\"start\": \"2024-11-21 08:33:35\", \"end\": \"2024-11-22 08:33:35\"}], \"venus\": []}, \"planet krantisamya dates\": [{\"Planet_1\": \"sun\", \"Planet_2\": \"truenode\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"meannode\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"zeus\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"Opposite\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"kronos\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"apollon\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"Opposite\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"admetos\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"vulkanus\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"poseidon\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"Opposite\"}, {\"Planet_1\": \"sun\", \"Planet_2\": \"selena\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"mercury\", \"Planet_2\": \"venus\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"mars\", \"Planet_2\": \"phobos\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"mars\", \"Planet_2\": \"deimos\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"jupiter\", \"Planet_2\": \"io\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"jupiter\", \"Planet_2\": \"europa\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"jupiter\", \"Planet_2\": \"ganymede\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"jupiter\", \"Planet_2\": \"callisto\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"saturn\", \"Planet_2\": \"titan\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"neptune\", \"Planet_2\": \"triton\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"pluto\", \"Planet_2\": \"charon\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"South-South\"}, {\"Planet_1\": \"truenode\", \"Planet_2\": \"meannode\", \"DateTime\": \"2024-11-21 08:33:35\", \"Alignment\": \"North-North\"}, {\"Planet_1\": \"truenode\", \"Planet_2\": \"zeus\", \"DateTime\": \"2024-11-21 08:33"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "end_date": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "planet_name": {
                    "type": "string",
                    "description": "One of: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, truenode, meannode. Lowercase. Other swisseph body names are accepted by validation but have no data and will fail.",
                    "enum": [
                      "sun",
                      "moon",
                      "mercury",
                      "venus",
                      "mars",
                      "jupiter",
                      "saturn",
                      "uranus",
                      "neptune",
                      "pluto",
                      "truenode",
                      "meannode"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "sign": {
                    "type": "string",
                    "description": "CASE-SENSITIVE - Title-case English sign names exactly as spelled; 'aries' fails. Also used at to filter the ingress/exit result down to the requested sign.",
                    "enum": [
                      "Aries",
                      "Taurus",
                      "Gemini",
                      "Cancer",
                      "Leo",
                      "Virgo",
                      "Libra",
                      "Scorpio",
                      "Sagittarius",
                      "Capricorn",
                      "Aquarius",
                      "Pisces"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "start_date": {
                    "type": "string",
                    "format": "date-time",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "geo_latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Observer geographic latitude (-90 to 90). Required for ascendant entry data.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      -90
                    ]
                  },
                  "geo_longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Observer geographic longitude (-180 to 180). Required for ascendant entry data.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      -180
                    ]
                  }
                },
                "required": [
                  "end_date",
                  "longitude",
                  "planet_name",
                  "sign",
                  "start_date"
                ],
                "additionalProperties": true
              },
              "example": {
                "start_date": "2024-11-21T08:33:35.539Z",
                "end_date": "2024-11-22T08:33:35.539Z",
                "longitude": 76.125,
                "planet_name": "mercury",
                "sign": "Taurus"
              }
            }
          }
        }
      }
    },
    "/api/raasi_dasha/": {
      "post": {
        "operationId": "raasi_dasha",
        "summary": "Rashi dashas",
        "description": "Rashi dashas divide a life into periods ruled by signs rather than by planets. Where the nakshatra dashas start from the Moon's birth star and cycle through the planets, these start from a seed sign — usually the ascendant, sometimes the stronger of the first and seventh, sometimes the ninth — and cycle through the twelve signs, with each sign's length derived from where its lord sits. They belong mostly to the Jaimini stream and are used for concrete outward events, whereas Vimshottari is generally read for inner experience.\n\n`dasha_type` selects among twenty schemes. NarayanaRaasi, CharaRaasi, DrigRaasi, SudasaRaasi, KendradhiRaasi, TrikonaRaasi, SthiraRaasi, ShoolaRaasi, NirayanaRaasi, VarnadaRaasi, MandookaRaasi, ParyaayaRaasi, BrahmaRaasi, ChakraRaasi, LagnamsakaRaasi, NavmasaRaasi, YogardhaRaasi, SandhyaRaasi, TaraLagnaRaasi and KalachakraRaasi each pick a different seed sign, direction and period length; several are meant to be applied only when their own applicability conditions hold, and an inapplicable chart can legitimately produce an empty period list.\n\nThe request mirrors the nakshatra dasha endpoint. `datetime`, `latitude`, `longitude` and `node` build the chart; `dasha_period` chooses the depth from mahadasha down to dehdasha or 'all'; `dasha_start` and `dasha_direction` position the sequence; `days_in_year` sets the year length used to turn periods into dates; `max_levels` caps the nesting and is the main control on response size.\n\nThe response is `{data: {<dasha_type>: …}}`, with each period given as a lord (a sign name at the top level) together with `start_date` and `end_date`, nested by level when you ask for 'all'. As on the nakshatra endpoint, setting `save_to_file` true replaces the JSON body with a compressed file download.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Dasha tools"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "BrahmaRaasi": []
                  },
                  "message": "successful",
                  "is_error": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dasha_direction": {
                    "type": "string",
                    "description": "Exact lower-case. Engine default 'forward'.",
                    "enum": [
                      "forward",
                      "backward"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_period": {
                    "type": "string",
                    "description": "Exact lower-case; identical list to /api/nakshatra_dasha/.",
                    "enum": [
                      "mahadasha",
                      "antardasha",
                      "pratyantardasha",
                      "sookshmasha",
                      "pranadasha",
                      "dehdasha",
                      "all"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_start": {
                    "type": "string",
                    "description": "Exact lower-case. Engine default 'current'.",
                    "enum": [
                      "current",
                      "next",
                      "previous"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "dasha_type": {
                    "type": "string",
                    "description": "The value is used verbatim as a CoreEngine registry key: exact CamelCase, all ending in 'Raasi'. Note the spellings 'NavmasaRaasi' (not Navamsa) and 'ParyaayaRaasi'.",
                    "enum": [
                      "BrahmaRaasi",
                      "ChakraRaasi",
                      "CharaRaasi",
                      "DrigRaasi",
                      "KalachakraRaasi",
                      "KendradhiRaasi",
                      "LagnamsakaRaasi",
                      "MandookaRaasi",
                      "NarayanaRaasi",
                      "NavmasaRaasi",
                      "NirayanaRaasi",
                      "ParyaayaRaasi",
                      "SandhyaRaasi",
                      "ShoolaRaasi",
                      "SthiraRaasi",
                      "SudasaRaasi",
                      "TaraLagnaRaasi",
                      "TrikonaRaasi",
                      "VarnadaRaasi",
                      "YogardhaRaasi"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "datetime": {
                    "type": "string",
                    "format": "date-time",
                    "description": "The moment to calculate for, ISO 8601. ALWAYS include an offset or a trailing Z - a value with no zone is read as Asia/Kolkata (UTC+05:30), not UTC. Same meaning as date_time, which other endpoints call the same thing by a different name.",
                    "examples": [
                      "2026-09-01 06:00:00"
                    ]
                  },
                  "days_in_year": {
                    "type": "number",
                    "format": "double",
                    "minimum": 360,
                    "maximum": 365.256364,
                    "examples": [
                      360
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "minimum": -90,
                    "maximum": 90,
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "minimum": -180,
                    "maximum": 180,
                    "examples": [
                      75.7873
                    ]
                  },
                  "node": {
                    "type": "string",
                    "description": "Exact lower-case; interpolated into the chart celestial key ('northtruenode'/'northmeannode'.",
                    "enum": [
                      "true",
                      "mean"
                    ],
                    "examples": [
                      "string"
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "minimum": -12,
                    "maximum": 14,
                    "examples": [
                      5.5
                    ]
                  },
                  "compressed_output": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "compression_type": {
                    "type": "string",
                    "description": "Default 'gzip'. Only meaningful with save_to_file=true.",
                    "enum": [
                      "gzip",
                      "bzip2",
                      "lzma",
                      "none"
                    ],
                    "default": "gzip",
                    "examples": [
                      "gzip"
                    ]
                  },
                  "max_levels": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 6,
                    "default": 6,
                    "examples": [
                      1
                    ]
                  },
                  "output_dir": {
                    "type": "string",
                    "default": "dasha_output",
                    "examples": [
                      "string"
                    ]
                  },
                  "save_to_file": {
                    "type": "boolean",
                    "default": false,
                    "examples": [
                      false
                    ]
                  },
                  "use_cache": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  },
                  "use_nested": {
                    "type": "boolean",
                    "default": true,
                    "examples": [
                      false
                    ]
                  }
                },
                "required": [
                  "dasha_direction",
                  "dasha_period",
                  "dasha_start",
                  "dasha_type",
                  "datetime",
                  "days_in_year",
                  "latitude",
                  "longitude",
                  "node",
                  "timezone_as_float"
                ],
                "additionalProperties": true
              },
              "example": {
                "node": "true",
                "dasha_type": "BrahmaRaasi",
                "dasha_period": "mahadasha",
                "datetime": "2025-05-27T05:12:46.849Z",
                "latitude": 26.9124,
                "longitude": 75.7873,
                "timezone_as_float": 5.5,
                "days_in_year": 365.256364,
                "dasha_start": "current",
                "dasha_direction": "forward"
              }
            }
          }
        }
      }
    },
    "/api/vrat-upavas/": {
      "post": {
        "operationId": "vrat_upavas",
        "summary": "Vrat and upavas",
        "description": "Vrat and upavas are the recurring fasting and observance days of the Hindu month, each tied to a particular tithi. This endpoint returns every occurrence of the types you ask for across a whole year, read from a precomputed table rather than calculated on the request, so a year of eighteen observance types is one indexed query.\n\nEach type is defined purely by which tithi numbers it matches, in the 1-30 scheme where 1-15 are Shukla Pratipada to Purnima, 16-29 are Krishna Pratipada to Chaturdashi and 30 is Amavasya. So `ekadashi` returns both Ekadashis of every month, `pradosham` both Trayodashis, `shivarathri` the Krishna Chaturdashi of every month (the monthly Masik Shivaratri, not only Maha Shivaratri), `sashti` and `durgashtami` and `vinayaka_chathurthi` the Shukla sixth, eighth and fourth, `kaalashtami` and `sankatahara_chathurthi` their Krishna counterparts, `amavasya` and `pournami` the new and full Moons, `sathyanarayana_puja` the full Moon, `chandra_dharshan` and `moondraam_pirai` the first and third days of the waxing Moon, and `srartha_yoga`, `ashtaka`, `manvaadhi` and `yugadhi` their own small sets of tithis. Be aware that `mahalaya_paksha` matches every tithi from 15 to 30, which means the whole dark fortnight of every lunar month rather than just the Bhadrapada Pitru Paksha.\n\n`year` and `keys` are required. Passing `latitude`, `longitude` and `timezone_as_float` as well adds two live-computed fields to each event: `moonrise`, the evening moonrise falling inside that event's tithi window at your location, and, for `vinayaka_chathurthi` rows only, `puja_muhurat` with `start`, `end` and `duration_minutes` for the Madhyahna Ganesha Puja window. Both come back null if they cannot be computed, and neither is present at all if you omit the coordinates.\n\nThe response is `{data}` keyed by each requested type, each holding a chronological list of `{date, month, tithi, paksha, start_time, end_time}` where the times are the exact instants the tithi begins and ends. Dates are precomputed for 2006 to 2046 inclusive; a year outside that range returns empty lists rather than an error.\n\nThe example below was captured from a live server and returned 2xx.",
        "tags": [
          "Festivals & vrats"
        ],
        "responses": {
          "200": {
            "description": "Successful calculation. One credit is charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "_truncated": true,
                  "_note": "Response shortened for the catalogue.",
                  "preview": "{\"data\": {\"ekadashi\": [{\"date\": \"2026-01-14\", \"month\": \"Magha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-01-13T15:19:08+05:30\", \"end_time\": \"2026-01-14T17:53:57+05:30\"}, {\"date\": \"2026-01-29\", \"month\": \"Phalguna\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-01-28T16:37:06+05:30\", \"end_time\": \"2026-01-29T13:56:12+05:30\"}, {\"date\": \"2026-02-13\", \"month\": \"Phalguna\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-02-12T12:23:19+05:30\", \"end_time\": \"2026-02-13T14:27:04+05:30\"}, {\"date\": \"2026-02-27\", \"month\": \"Chaitra\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-02-27T00:34:31+05:30\", \"end_time\": \"2026-02-27T22:33:54+05:30\"}, {\"date\": \"2026-03-15\", \"month\": \"Chaitra\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-03-14T08:12:06+05:30\", \"end_time\": \"2026-03-15T09:17:39+05:30\"}, {\"date\": \"2026-03-29\", \"month\": \"Vaisakha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-03-28T08:46:49+05:30\", \"end_time\": \"2026-03-29T07:47:32+05:30\"}, {\"date\": \"2026-04-13\", \"month\": \"Vaisakha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-04-13T01:18:00+05:30\", \"end_time\": \"2026-04-14T01:09:45+05:30\"}, {\"date\": \"2026-04-27\", \"month\": \"Jyeshtha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-04-26T18:08:02+05:30\", \"end_time\": \"2026-04-27T18:17:03+05:30\"}, {\"date\": \"2026-05-13\", \"month\": \"Jyeshtha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-05-12T14:53:26+05:30\", \"end_time\": \"2026-05-13T13:30:53+05:30\"}, {\"date\": \"2026-05-26\", \"month\": \"Ashadha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-05-26T05:11:58+05:30\", \"end_time\": \"2026-05-27T06:22:50+05:30\"}, {\"date\": \"2026-05-27\", \"month\": \"Ashadha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-05-26T05:11:58+05:30\", \"end_time\": \"2026-05-27T06:22:50+05:30\"}, {\"date\": \"2026-06-11\", \"month\": \"Ashadha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-06-11T00:58:46+05:30\", \"end_time\": \"2026-06-11T22:37:13+05:30\"}, {\"date\": \"2026-06-25\", \"month\": \"Ashadha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-06-24T18:13:24+05:30\", \"end_time\": \"2026-06-25T20:10:27+05:30\"}, {\"date\": \"2026-07-25\", \"month\": \"Shravana\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-07-24T09:13:54+05:30\", \"end_time\": \"2026-07-25T11:35:24+05:30\"}, {\"date\": \"2026-08-09\", \"month\": \"Shravana\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-08-08T14:00:14+05:30\", \"end_time\": \"2026-08-09T11:05:59+05:30\"}, {\"date\": \"2026-08-23\", \"month\": \"Bhadrapada\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-08-23T02:01:28+05:30\", \"end_time\": \"2026-08-24T04:19:48+05:30\"}, {\"date\": \"2026-09-07\", \"month\": \"Bhadrapada\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-09-06T19:30:12+05:30\", \"end_time\": \"2026-09-07T17:05:07+05:30\"}, {\"date\": \"2026-09-22\", \"month\": \"Ashwin\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-09-21T20:01:57+05:30\", \"end_time\": \"2026-09-22T21:44:20+05:30\"}, {\"date\": \"2026-10-06\", \"month\": \"Ashwin\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-10-06T02:08:30+05:30\", \"end_time\": \"2026-10-07T00:35:31+05:30\"}, {\"date\": \"2026-10-22\", \"month\": \"Kartika\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-10-21T14:12:55+05:30\", \"end_time\": \"2026-10-22T14:49:06+05:30\"}, {\"date\": \"2026-11-05\", \"month\": \"Kartika\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-11-04T11:04:18+05:30\", \"end_time\": \"2026-11-05T10:36:40+05:30\"}, {\"date\": \"2026-11-21\", \"month\": \"Margashirsha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Sukla\", \"start_time\": \"2026-11-20T07:16:41+05:30\", \"end_time\": \"2026-11-21T06:32:32+05:30\"}, {\"date\": \"2026-12-04\", \"month\": \"Margashirsha\", \"tithi\": \"Ekadashi\", \"paksha\": \"Krishna\", \"start_time\": \"2026-12-03T23:04:36+05:30\", \"end_time\": \"2026-12-04T23:45:50+05:30\"}, {\"date\": \"2026-12-20\", \"month\": \"Pausha\", \"tithi\": \"Ekadashi\", \"paksha\""
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "keys": {
                    "type": "array",
                    "description": "Which calculations to return, as a list of names. See the key table for this endpoint; an unrecognised name rejects the whole request. One call costs one credit however many keys you ask for, so request everything you need at once rather than making several calls. Which observances to return. Ask for several in one call - the response is keyed by type and the cost is the same.",
                    "examples": [
                      []
                    ],
                    "items": {
                      "type": "string",
                      "enum": [
                        "amavasya",
                        "ashtaka",
                        "chandra_dharshan",
                        "durgashtami",
                        "ekadashi",
                        "kaalashtami",
                        "mahalaya_paksha",
                        "manvaadhi",
                        "moondraam_pirai",
                        "pournami",
                        "pradosham",
                        "sankatahara_chathurthi",
                        "sashti",
                        "sathyanarayana_puja",
                        "shivarathri",
                        "srartha_yoga",
                        "vinayaka_chathurthi",
                        "yugadhi"
                      ]
                    }
                  },
                  "year": {
                    "type": "integer",
                    "description": "Year of birth as a number, e.g. 1990. Four digits. Four-digit year. Dates are precomputed for 2006 to 2046; outside that range the response is empty.",
                    "examples": [
                      2026
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Latitude of the place, in decimal degrees. Positive is north, negative is south. Example: 26.9124 for Jaipur, 40.7128 for New York. Minutes and seconds are not accepted - convert first.",
                    "examples": [
                      26.9124
                    ]
                  },
                  "longitude": {
                    "type": "number",
                    "format": "double",
                    "description": "Longitude of the place, in decimal degrees. Positive is east, negative is west. Example: 75.7873 for Jaipur, -74.0060 for New York. Note the sign: a missing minus puts New York in China.",
                    "examples": [
                      75.7873
                    ]
                  },
                  "timezone_as_float": {
                    "type": "number",
                    "format": "double",
                    "description": "UTC offset of the place, in hours, as a decimal. Example: 5.5 for India (UTC+05:30), -5 for New York in winter, 5.75 for Nepal. This is NOT validated against date_time - if the two disagree you get a successful response for the wrong moment, so derive both from the same source. Use the offset in force on that date, not today's: a summer birth in a country with daylight saving needs the summer offset.",
                    "examples": [
                      5.5
                    ]
                  }
                },
                "required": [
                  "keys",
                  "year"
                ],
                "additionalProperties": true
              },
              "example": {
                "year": 2026,
                "month": 9,
                "keys": [
                  "ekadashi",
                  "amavasya",
                  "pradosham"
                ]
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Your secret key, e.g. `yt_live_a1b2c3d4_…`. Created at https://occultapi.com/keys and shown once. Send it on every request."
      }
    },
    "schemas": {
      "Envelope": {
        "type": "object",
        "description": "Every JSON response uses this envelope. `data` carries the result; `is_error` is the field to branch on.",
        "properties": {
          "data": {
            "description": "The calculation result. Shape varies by endpoint.",
            "type": [
              "object",
              "array",
              "null"
            ]
          },
          "status": {
            "type": "integer",
            "examples": [
              200
            ]
          },
          "is_error": {
            "type": "boolean",
            "examples": [
              false
            ]
          },
          "message": {
            "type": "string",
            "examples": [
              "successful"
            ]
          }
        },
        "required": [
          "data",
          "is_error",
          "message"
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The request body was invalid. `message` names each field at fault. Never charged.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "object"
                },
                "status": {
                  "type": "integer"
                },
                "is_error": {
                  "type": "boolean",
                  "const": true
                },
                "message": {
                  "type": "string",
                  "examples": [
                    "(field errors)"
                  ]
                }
              },
              "examples": [
                {
                  "data": {},
                  "is_error": true,
                  "message": "field errors"
                }
              ]
            }
          }
        }
      },
      "Unauthorized": {
        "description": "The key is missing, wrong, revoked or expired. Never charged.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "object"
                },
                "status": {
                  "type": "integer"
                },
                "is_error": {
                  "type": "boolean",
                  "const": true
                },
                "message": {
                  "type": "string",
                  "examples": [
                    "invalid_api_key"
                  ]
                }
              },
              "examples": [
                {
                  "data": {},
                  "is_error": true,
                  "message": "invalid_api_key"
                }
              ]
            }
          }
        }
      },
      "PaymentRequired": {
        "description": "The key is valid but the balance is empty. Recharge; do not regenerate the key. Never charged.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "object"
                },
                "status": {
                  "type": "integer"
                },
                "is_error": {
                  "type": "boolean",
                  "const": true
                },
                "message": {
                  "type": "string",
                  "examples": [
                    "insufficient_credits"
                  ]
                }
              },
              "examples": [
                {
                  "data": {},
                  "is_error": true,
                  "message": "insufficient_credits"
                }
              ]
            }
          }
        }
      },
      "Forbidden": {
        "description": "The endpoint is not enabled for API keys, or the key lacks its scope. Never charged.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "object"
                },
                "status": {
                  "type": "integer"
                },
                "is_error": {
                  "type": "boolean",
                  "const": true
                },
                "message": {
                  "type": "string",
                  "examples": [
                    "endpoint_not_allowed"
                  ]
                }
              },
              "examples": [
                {
                  "data": {},
                  "is_error": true,
                  "message": "endpoint_not_allowed"
                }
              ]
            }
          }
        }
      },
      "RateLimited": {
        "description": "Too many requests in one minute. Retry after the seconds given in the `Retry-After` header. Never charged.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "object"
                },
                "status": {
                  "type": "integer"
                },
                "is_error": {
                  "type": "boolean",
                  "const": true
                },
                "message": {
                  "type": "string",
                  "examples": [
                    "api_key_rate_limited"
                  ]
                }
              },
              "examples": [
                {
                  "data": {},
                  "is_error": true,
                  "message": "api_key_rate_limited"
                }
              ]
            }
          }
        }
      }
    }
  },
  "externalDocs": {
    "url": "https://occultapi.com/docs",
    "description": "Reference"
  }
}