{"openapi":"3.1.0","info":{"title":"Astraluno public API","version":"1.0.0","description":"Read-only astrology computations. No birth data is stored or logged. 60 compute requests/min/IP; 120 light requests/min/IP. No keys. Free corpus."},"servers":[{"url":"https://astraluno.com"}],"paths":{"/api/v1/chart":{"post":{"operationId":"chart","summary":"chart","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"birth_date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"birth_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d)?$"},"time_precision":{"type":"string","enum":["exact","approximate","unknown"]},"approx_window_minutes":{"anyOf":[{"type":"number","const":15},{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":120}]},"utc_offset_override_sec":{"type":"integer","minimum":-86400,"maximum":86400},"ambiguity":{"type":"string","enum":["earlier","later"]},"lang":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35},"place":{"anyOf":[{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["id"],"additionalProperties":false},{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"}},"required":["latitude","longitude","timezone"],"additionalProperties":false}]}},"required":["birth_date","time_precision","place"],"additionalProperties":false},"example":{"birth_date":"1990-05-17","birth_time":"14:35","time_precision":"exact","place":{"id":3173435},"lang":"en"}}}},"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"snapshot":{"type":"object","properties":{"schemaVersion":{"type":"string","const":"1.0.0"},"engine":{"type":"object","properties":{"name":{"type":"string","const":"astraluno"},"version":{"type":"string","const":"0.1.0"},"adapterVersion":{"type":"string","const":"astronomy-engine-2.1.19/astraluno-1"}},"required":["name","version","adapterVersion"],"additionalProperties":false},"method":{"type":"object","properties":{"zodiac":{"type":"string","const":"tropical"},"frame":{"type":"string","const":"apparent-geocentric-true-ecliptic-equinox-of-date"},"houseSystem":{"type":"string","const":"whole-sign"},"bodies":{"type":"array","items":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]}},"aspectSet":{"type":"array","items":{"type":"string","enum":["conjunction","sextile","square","trine","opposition"]}},"orbPreset":{"type":"string","const":"orbs-v1"},"tolerancePreset":{"type":"string","const":"tolerances-v1"},"timeScale":{"type":"string","const":"utc-tt-leaps-v1/ut1-approx-utc"}},"required":["zodiac","frame","houseSystem","bodies","aspectSet","orbPreset","tolerancePreset","timeScale"],"additionalProperties":false},"tzdbVersion":{"type":"string"},"input":{"type":"object","properties":{"localDate":{"type":"string"},"localTime":{"type":["string","null"]},"timePrecision":{"type":"string","enum":["exact","approximate","unknown"]},"approxWindowMinutes":{"type":["number","null"]},"place":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"label":{"type":"string"},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"tz":{"type":"string"}},"required":["id","label","lat","lon","tz"],"additionalProperties":false},"utcOffsetOverrideSec":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"ambiguityChoice":{"anyOf":[{"type":"string","enum":["earlier","later"]},{"type":"null"}]}},"required":["localDate","localTime","timePrecision","approxWindowMinutes","place","utcOffsetOverrideSec","ambiguityChoice"],"additionalProperties":false},"timeResolution":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"instant"},"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"offsetSec":{"type":"number"},"isDst":{"type":"boolean"},"abbr":{"type":"string"},"offsetSource":{"type":"string","enum":["tzdb","lmt-birthplace","manual"]}},"required":["kind","utc","offsetSec","isDst","abbr","offsetSource"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"interval"},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"utcSegments":{"type":"array","items":{"type":"object","properties":{"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"offsetSec":{"type":"number"},"isDst":{"type":"boolean"},"abbr":{"type":"string"},"offsetSource":{"type":"string","enum":["tzdb","lmt-birthplace","manual"]}},"required":["fromUtc","toUtc","offsetSec","isDst","abbr","offsetSource"],"additionalProperties":false}},"technicalReference":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"isBirthTime":{"type":"boolean","const":false},"purpose":{"type":"string","const":"internal-only"}},"required":["utc","isBirthTime","purpose"],"additionalProperties":false}},"required":["kind","fromUtc","toUtc","fromLocal","toLocal","utcSegments","technicalReference"],"additionalProperties":false}]},"inputHash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bodies":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"position":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"exact"},"longitude":{"type":"number","minimum":0,"exclusiveMaximum":360},"latitude":{"type":"number","minimum":-90,"maximum":90},"speed":{"type":"number"},"retrograde":{"type":"boolean"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number","minimum":0,"exclusiveMaximum":30},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","longitude","latitude","speed","retrograde","sign","degreeInSign","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"latitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"speedRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"retrograde":{"type":"string","enum":["direct","retrograde","mixed"]},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","sign","degreeRange","longitudeRange","latitudeRange","speedRange","retrograde","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["sign","fromLocal","toLocal","fromUtc","toUtc"],"additionalProperties":false}},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"latitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"speedRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"retrograde":{"type":"string","enum":["direct","retrograde","mixed"]},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","options","longitudeRange","latitudeRange","speedRange","retrograde","nearSignBoundary","toleranceDegrees"],"additionalProperties":false}]}},"required":["body","position"],"additionalProperties":false}},"angles":{"anyOf":[{"type":"object","properties":{"ascendant":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"exact"},"longitude":{"type":"number","minimum":0,"exclusiveMaximum":360},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number","minimum":0,"exclusiveMaximum":30},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","longitude","sign","degreeInSign","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","sign","degreeRange","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["sign","fromLocal","toLocal","fromUtc","toUtc"],"additionalProperties":false}},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","options","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unavailable"},"reason":{"type":"string"}},"required":["status","reason"],"additionalProperties":false}]},"mc":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"exact"},"longitude":{"type":"number","minimum":0,"exclusiveMaximum":360},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number","minimum":0,"exclusiveMaximum":30},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","longitude","sign","degreeInSign","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","sign","degreeRange","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["sign","fromLocal","toLocal","fromUtc","toUtc"],"additionalProperties":false}},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","options","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unavailable"},"reason":{"type":"string"}},"required":["status","reason"],"additionalProperties":false}]}},"required":["ascendant","mc"],"additionalProperties":false},{"type":"null"}]},"houses":{"anyOf":[{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"ascendantSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"houses":{"type":"array","items":{"type":"object","properties":{"house":{"type":"integer","minimum":1,"maximum":12},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"startLongitude":{"type":"number","minimum":0,"exclusiveMaximum":360}},"required":["house","sign","startLongitude"],"additionalProperties":false}},"bodyHouses":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"options":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}}},"required":["body","options"],"additionalProperties":false}}},"required":["status","ascendantSign","houses","bodyHouses"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"ascendantSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"houses":{"type":"array","items":{"type":"object","properties":{"house":{"type":"integer","minimum":1,"maximum":12},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"startLongitude":{"type":"number","minimum":0,"exclusiveMaximum":360}},"required":["house","sign","startLongitude"],"additionalProperties":false}},"bodyHouses":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"options":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}}},"required":["body","options"],"additionalProperties":false}}},"required":["ascendantSign","houses","bodyHouses"],"additionalProperties":false}}},"required":["status","options"],"additionalProperties":false}]},{"type":"null"}]},"aspects":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"certainty":{"type":"string","const":"exact-time"},"a":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"b":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"type":{"type":"string","enum":["conjunction","sextile","square","trine","opposition"]},"angle":{"type":"number"},"orb":{"type":"number"},"orbLimit":{"type":"number"},"phase":{"type":"string","enum":["applying","exact","separating"]}},"required":["certainty","a","b","type","angle","orb","orbLimit","phase"],"additionalProperties":false},{"type":"object","properties":{"certainty":{"type":"string","enum":["certain","possible"]},"a":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"b":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"type":{"type":"string","enum":["conjunction","sextile","square","trine","opposition"]},"angle":{"type":"number"},"orbRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"orbLimit":{"type":"number"},"phase":{"type":"string","const":"indeterminate"}},"required":["certainty","a","b","type","angle","orbRange","orbLimit","phase"],"additionalProperties":false}]}},"uncertainties":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"targets":{"type":"array","items":{"type":"string"}},"detail":{"type":"string"}},"required":["code","targets","detail"],"additionalProperties":false}},"bigThree":{"type":"object","properties":{"sun":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},"moon":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},"ascendant":{"anyOf":[{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},{"type":"null"}]}},"required":["sun","moon","ascendant"],"additionalProperties":false}},"required":["schemaVersion","engine","method","tzdbVersion","input","timeResolution","inputHash","bodies","angles","houses","aspects","uncertainties","bigThree"],"additionalProperties":false},"summary":{"type":"object","properties":{"bigThree":{"type":"object","properties":{"sun":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},"moon":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},"ascendant":{"anyOf":[{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"required":["status","sign"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}}},"required":["status","options"],"additionalProperties":false}]},{"type":"null"}]}},"required":["sun","moon","ascendant"],"additionalProperties":false},"placements":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"position":{"anyOf":[{"anyOf":[{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"exact"},"longitude":{"type":"number","minimum":0,"exclusiveMaximum":360},"latitude":{"type":"number","minimum":-90,"maximum":90},"speed":{"type":"number"},"retrograde":{"type":"boolean"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number","minimum":0,"exclusiveMaximum":30},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","longitude","latitude","speed","retrograde","sign","degreeInSign","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"latitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"speedRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"retrograde":{"type":"string","enum":["direct","retrograde","mixed"]},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","sign","degreeRange","longitudeRange","latitudeRange","speedRange","retrograde","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["sign","fromLocal","toLocal","fromUtc","toUtc"],"additionalProperties":false}},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"latitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"speedRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"retrograde":{"type":"string","enum":["direct","retrograde","mixed"]},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","options","longitudeRange","latitudeRange","speedRange","retrograde","nearSignBoundary","toleranceDegrees"],"additionalProperties":false}]},{"oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"exact"},"longitude":{"type":"number","minimum":0,"exclusiveMaximum":360},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number","minimum":0,"exclusiveMaximum":30},"nearSignBoundary":{"type":"boolean"},"toleranceDegrees":{"type":"number"}},"required":["status","longitude","sign","degreeInSign","nearSignBoundary","toleranceDegrees"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"certain"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","sign","degreeRange","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"uncertain"},"options":{"type":"array","items":{"type":"object","properties":{"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["sign","fromLocal","toLocal","fromUtc","toUtc"],"additionalProperties":false}},"longitudeRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"toleranceDegrees":{"type":"number"},"nearSignBoundary":{"type":"boolean"}},"required":["status","options","longitudeRange","toleranceDegrees","nearSignBoundary"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unavailable"},"reason":{"type":"string"}},"required":["status","reason"],"additionalProperties":false}]}]},{"type":"null"}]},"houseOptions":{"type":"array","items":{"type":"integer","minimum":1,"maximum":12}},"meanings":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"key":{"type":"string"},"url":{"type":"string","format":"uri"},"oneLiner":{"type":["string","null"]}},"required":["kind","key","url","oneLiner"],"additionalProperties":false}}},"required":["body","position","houseOptions","meanings"],"additionalProperties":false}},"majorAspects":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"certainty":{"type":"string","const":"exact-time"},"a":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"b":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"type":{"type":"string","enum":["conjunction","sextile","square","trine","opposition"]},"angle":{"type":"number"},"orb":{"type":"number"},"orbLimit":{"type":"number"},"phase":{"type":"string","enum":["applying","exact","separating"]}},"required":["certainty","a","b","type","angle","orb","orbLimit","phase"],"additionalProperties":false},{"type":"object","properties":{"certainty":{"type":"string","enum":["certain","possible"]},"a":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"b":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto","ascendant","mc"]},"type":{"type":"string","enum":["conjunction","sextile","square","trine","opposition"]},"angle":{"type":"number"},"orbRange":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":false},"orbLimit":{"type":"number"},"phase":{"type":"string","const":"indeterminate"}},"required":["certainty","a","b","type","angle","orbRange","orbLimit","phase"],"additionalProperties":false}]}},"uncertainty":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"targets":{"type":"array","items":{"type":"string"}},"detail":{"type":"string"}},"required":["code","targets","detail"],"additionalProperties":false}}},"required":["bigThree","placements","majorAspects","uncertainty"],"additionalProperties":false},"links":{"type":"object","properties":{"placements":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string"},"pages":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"key":{"type":"string"},"url":{"type":"string","format":"uri"},"oneLiner":{"type":["string","null"]}},"required":["kind","key","url","oneLiner"],"additionalProperties":false}}},"required":["body","pages"],"additionalProperties":false}},"open_in_astraluno":{"type":"string","format":"uri"}},"required":["placements","open_in_astraluno"],"additionalProperties":false}},"required":["language","source","url","timezone","degree_strings","snapshot","summary","links"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/sun-sign":{"get":{"operationId":"sun_sign","summary":"sun-sign","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"example":"1990-05-17"},{"name":"time","in":"query","required":false,"schema":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d)?$"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"example":"Europe/Rome"}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"status":{"type":"string","enum":["certain","cusp"]},"sign":{"anyOf":[{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},{"type":"null"}]},"possibilities":{"type":"array","items":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]}},"position":{"anyOf":[{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"longitude":{"type":"number"},"latitude":{"type":"number"},"speed":{"type":"number"},"retrograde":{"type":"boolean"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number"},"toleranceDegrees":{"type":"number"}},"required":["body","longitude","latitude","speed","retrograde","sign","degreeInSign","toleranceDegrees"],"additionalProperties":false},{"type":"null"}]},"ingresses":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},"fromSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"toSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"longitude":{"type":"number"},"retrograde":{"type":"boolean"}},"required":["body","at","fromSign","toSign","longitude","retrograde"],"additionalProperties":false}},"timeResolution":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"instant"},"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"offsetSec":{"type":"number"},"isDst":{"type":"boolean"},"abbr":{"type":"string"},"offsetSource":{"type":"string","enum":["tzdb","lmt-birthplace","manual"]}},"required":["kind","utc","offsetSec","isDst","abbr","offsetSource"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"interval"},"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"fromLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"toLocal":{"type":"object","properties":{"y":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"m":{"type":"integer","minimum":1,"maximum":12},"d":{"type":"integer","minimum":1,"maximum":31},"h":{"type":"integer","minimum":0,"maximum":23},"min":{"type":"integer","minimum":0,"maximum":59},"s":{"type":"integer","minimum":0,"maximum":59}},"required":["y","m","d","h","min","s"],"additionalProperties":false},"utcSegments":{"type":"array","items":{"type":"object","properties":{"fromUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"toUtc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"offsetSec":{"type":"number"},"isDst":{"type":"boolean"},"abbr":{"type":"string"},"offsetSource":{"type":"string","enum":["tzdb","lmt-birthplace","manual"]}},"required":["fromUtc","toUtc","offsetSec","isDst","abbr","offsetSource"],"additionalProperties":false}},"technicalReference":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"isBirthTime":{"type":"boolean","const":false},"purpose":{"type":"string","const":"internal-only"}},"required":["utc","isBirthTime","purpose"],"additionalProperties":false}},"required":["kind","fromUtc","toUtc","fromLocal","toLocal","utcSegments","technicalReference"],"additionalProperties":false}]},"notes":{"type":"array","items":{"type":"string"}}},"required":["language","source","url","timezone","degree_strings","status","sign","possibilities","position","ingresses","timeResolution","notes"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/sky":{"get":{"operationId":"sky","summary":"sky","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35}},{"name":"at","in":"query","required":false,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"example":"2026-10-13T12:00:00Z"},{"name":"timezone","in":"query","required":false,"schema":{"default":"UTC","type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"example":"Europe/Rome"}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"sky":{"type":"object","properties":{"schemaVersion":{"type":"string","const":"1.0.0"},"engineVersion":{"type":"string"},"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"frame":{"type":"string","const":"apparent-geocentric-true-ecliptic-equinox-of-date"},"bodies":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"longitude":{"type":"number"},"latitude":{"type":"number"},"speed":{"type":"number"},"retrograde":{"type":"boolean"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number"},"toleranceDegrees":{"type":"number"}},"required":["body","longitude","latitude","speed","retrograde","sign","degreeInSign","toleranceDegrees"],"additionalProperties":false}},"moon":{"type":"object","properties":{"phaseAngle":{"type":"number"},"illumination":{"type":"number","minimum":0,"maximum":1},"physicalPhaseAngle":{"type":"number"},"illuminationMethod":{"type":"string","const":"sun-moon-earth-triangle"}},"required":["phaseAngle","illumination","physicalPhaseAngle","illuminationMethod"],"additionalProperties":false}},"required":["schemaVersion","engineVersion","utc","frame","bodies","moon"],"additionalProperties":false},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"uncertainty":{"type":"string"}},"required":["language","source","url","timezone","degree_strings","sky","at","uncertainty"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/retrogrades":{"get":{"operationId":"retrogrades","summary":"retrogrades","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35}},{"name":"planet","in":"query","required":true,"schema":{"type":"string","enum":["mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"example":"mercury"},{"name":"year","in":"query","required":true,"schema":{"type":"integer","minimum":1900,"maximum":2099},"example":2027}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"planet":{"type":"string","enum":["mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"year":{"type":"number"},"periods":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"stationRetrograde":{"type":"object","properties":{"body":{"type":"string","enum":["mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"type":{"type":"string","enum":["retrograde","direct"]},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},"longitude":{"type":"number"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number"},"angularToleranceDegrees":{"type":"number"}},"required":["body","type","at","longitude","sign","degreeInSign","angularToleranceDegrees"],"additionalProperties":false},"stationDirect":{"type":"object","properties":{"body":{"type":"string","enum":["mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"type":{"type":"string","enum":["retrograde","direct"]},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},"longitude":{"type":"number"},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number"},"angularToleranceDegrees":{"type":"number"}},"required":["body","type","at","longitude","sign","degreeInSign","angularToleranceDegrees"],"additionalProperties":false},"preShadowStart":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},{"type":"null"}]},"postShadowEnd":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},{"type":"null"}]},"shadowSearchLimitDays":{"type":"number","const":400}},"required":["body","stationRetrograde","stationDirect","preShadowStart","postShadowEnd","shadowSearchLimitDays"],"additionalProperties":false}}},"required":["language","source","url","timezone","degree_strings","planet","year","periods"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/ingresses":{"get":{"operationId":"ingresses","summary":"ingresses","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35}},{"name":"planet","in":"query","required":true,"schema":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"example":"venus"},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"example":"2027-01-01"},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"example":"2028-01-01"}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"planet":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"events":{"type":"array","items":{"type":"object","properties":{"body":{"type":"string","enum":["sun","moon","mercury","venus","mars","jupiter","saturn","uranus","neptune","pluto"]},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},"fromSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"toSign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"longitude":{"type":"number"},"retrograde":{"type":"boolean"}},"required":["body","at","fromSign","toSign","longitude","retrograde"],"additionalProperties":false}}},"required":["language","source","url","timezone","degree_strings","planet","from","to","events"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/lunations":{"get":{"operationId":"lunations","summary":"lunations","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"example":"2027-01-01"},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"example":"2027-02-01"},{"name":"timezone","in":"query","required":false,"schema":{"default":"UTC","type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"example":"Europe/Rome"}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"events":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["new","first-quarter","full","last-quarter"]},"at":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"uncertaintyMinutes":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"precisionHint":{"type":"string","enum":["time","date","window"]},"uncertaintyMethod":{"type":"string","enum":["angular-over-speed","station-curvature","unbounded"]},"windowFromUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"windowToUtc":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"local":{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},"windowFromLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]},"windowToLocal":{"anyOf":[{"type":"object","properties":{"utc":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"local":{"type":"string"},"timezone":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},"offsetSec":{"type":"number"}},"required":["utc","local","timezone","offsetSec"],"additionalProperties":false},{"type":"null"}]}},"required":["utc","uncertaintyMinutes","precisionHint","uncertaintyMethod","windowFromUtc","windowToUtc","local","windowFromLocal","windowToLocal"],"additionalProperties":false},"sign":{"type":"string","enum":["aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces"]},"degreeInSign":{"type":"number"},"phaseAngle":{"type":"number"}},"required":["type","at","sign","degreeInSign","phaseAngle"],"additionalProperties":false}}},"required":["language","source","url","timezone","degree_strings","from","to","events"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/places":{"get":{"operationId":"places","summary":"places","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":100,"pattern":"^[^\\x00-\\x1f]*$"},"example":"Milano"},{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35},"example":"en"},{"name":"limit","in":"query","required":false,"schema":{"default":8,"type":"integer","minimum":1,"maximum":20},"example":8}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"places":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"label":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"tz":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"}},"required":["id","label","lat","lon","tz"],"additionalProperties":false}},"selectionGuidance":{"type":"string"}},"required":["language","source","url","timezone","degree_strings","places","selectionGuidance"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/readings/{kind}/{key}":{"get":{"operationId":"readings__kind___key_","summary":"readings/{kind}/{key}","description":"Read-only, free, no API key. Tropical, geocentric, Whole Sign. No birth data is stored or logged; request bodies and queries never enter logs or stats. Angular numbers also have D°MM′ strings in degree_strings (JSON pointers). Respect uncertainty windows and all sign possibilities. Dates include the IANA timezone used.","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["body","angle","sign","house","aspect","element","modality","body-in-sign","body-in-house","ascendant-in-sign"]},"example":"body-in-sign"},{"name":"key","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9-]+$"},"example":"venus-in-leo"},{"name":"lang","in":"query","required":false,"schema":{"default":"en","description":"Language code. Published: en, it. Other codes fall back to English with a language.note.","type":"string","maxLength":35},"example":"en"}],"responses":{"200":{"description":"Computed result with source and citation URL","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"language":{"type":"object","properties":{"requested":{"type":"string"},"effective":{"type":"string","enum":["en","es","fr","it"]},"note":{"type":["string","null"]}},"required":["requested","effective","note"],"additionalProperties":false},"source":{"type":"string","const":"Astraluno"},"url":{"type":"string","format":"uri"},"timezone":{"anyOf":[{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_+-]+(?:\\/[A-Za-z0-9_+-]+)*$"},{"type":"null"}]},"degree_strings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"D°MM′ strings keyed by JSON pointer to every angular number in this response, including ranges. The engine snapshot is unchanged."},"reading":{"type":"object","properties":{"kind":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"oneLiner":{"type":"string"},"sections":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"url":{"type":"string","format":"uri"}},"required":["kind","key","title","oneLiner","sections","url"],"additionalProperties":false}},"required":["language","source","url","timezone","degree_strings","reading"],"additionalProperties":false}}}},"400":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"413":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"415":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Structured validation, engine or rate-limit error. Birth data is never stored or logged.","headers":{"Retry-After":{"description":"Seconds until retry (429)","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["code","message","details"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"openapi","responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}